UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

42 lines (41 loc) 2.69 kB
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js"; import { t as sanitizeForLog } from "./ansi-BI9w76Cm.js"; //#region src/agents/embedded-agent-runner/compact-reasons.ts /** * Normalizes and classifies compaction failure reasons for diagnostics. */ const MAX_COMPACTION_REASON_DETAIL_CHARS = 100; const DEFERRED_CONTEXT_ENGINE_COMPACTION_REASON = "deferred to background context-engine maintenance"; function isGenericCompactionCancelledReason(reason) { const normalized = normalizeLowercaseStringOrEmpty(reason); return normalized === "compaction cancelled" || normalized === "error: compaction cancelled"; } /** Prefer a safeguard cancel reason when the runtime only reports generic cancellation. */ function resolveCompactionFailureReason(params) { if (isGenericCompactionCancelledReason(params.reason) && params.safeguardCancelReason) return params.safeguardCancelReason; return params.reason; } /** Bucket a raw compaction reason into stable telemetry/status classes. */ function classifyCompactionReason(reason) { const text = normalizeLowercaseStringOrEmpty(reason); if (!text) return "unknown"; if (text.includes("nothing to compact") || text.includes("no real conversation messages")) return "no_compactable_entries"; if (text.includes("below threshold") || text.includes("already under target")) return "below_threshold"; if (text.includes("already compacted") || text.includes("already_compacted")) return "already_compacted_recently"; if (text.includes("deferred to background")) return "deferred_background"; if (text.includes("still exceeds target")) return "live_context_still_exceeds_target"; if (text.includes("guard")) return "guard_blocked"; if (text.includes("summary")) return "summary_failed"; if (text.includes("timed out") || text.includes("timeout")) return "timeout"; if (text.includes("400") || text.includes("401") || text.includes("403") || text.includes("429")) return "provider_error_4xx"; if (text.includes("500") || text.includes("502") || text.includes("503") || text.includes("504")) return "provider_error_5xx"; return "unknown"; } /** Sanitize an unknown reason into a short log/metric-safe detail suffix. */ function formatUnknownCompactionReasonDetail(reason) { const sanitized = sanitizeForLog((reason ?? "").replace(/\s+/g, " ")).trim().replace(/[^A-Za-z0-9._:@/+~-]+/g, "_").replace(/_+/g, "_").replace(/^_+|_+$/g, ""); if (!sanitized) return; return sanitized.slice(0, MAX_COMPACTION_REASON_DETAIL_CHARS); } //#endregion export { resolveCompactionFailureReason as i, classifyCompactionReason as n, formatUnknownCompactionReasonDetail as r, DEFERRED_CONTEXT_ENGINE_COMPACTION_REASON as t };