























@@ -11,6 +11,7 @@ import type {
1111IngestBatchResult,
1212IngestResult,
1313SubagentSpawnPreparation,
14+ContextEngineInfo,
1415} from "./types.js";
15161617/**
@@ -43,7 +44,20 @@ type RegisterContextEngineForOwnerOptions = {
4344};
44454546const LEGACY_SESSION_KEY_COMPAT = Symbol.for("openclaw.contextEngine.sessionKeyCompat");
46-const RESOLVED_CONTEXT_ENGINE_METADATA = new WeakMap<ContextEngine, { owner: string }>();
47+type ResolvedContextEngineMetadata = {
48+owner: string;
49+};
50+51+type RuntimeQuarantineProxyState = {
52+engineId: string;
53+getResolvedFallbackEngine: () => ContextEngine | undefined;
54+};
55+56+const RESOLVED_CONTEXT_ENGINE_METADATA = new WeakMap<
57+ContextEngine,
58+ResolvedContextEngineMetadata
59+>();
60+const RUNTIME_QUARANTINE_PROXY_STATE = new WeakMap<ContextEngine, RuntimeQuarantineProxyState>();
4761const SESSION_KEY_COMPAT_METHODS = [
4862"bootstrap",
4963"maintain",
@@ -545,14 +559,29 @@ export function resolveContextEngineOwnerPluginId(
545559if (!engine) {
546560return undefined;
547561}
548-const owner = RESOLVED_CONTEXT_ENGINE_METADATA.get(engine)?.owner;
562+const owner = resolveEffectiveContextEngineMetadata(engine)?.owner;
549563if (!owner?.startsWith("plugin:")) {
550564return undefined;
551565}
552566const pluginId = owner.slice("plugin:".length).trim();
553567return pluginId || undefined;
554568}
555569570+function resolveEffectiveContextEngineMetadata(
571+engine: ContextEngine,
572+): ResolvedContextEngineMetadata | undefined {
573+const quarantineState = RUNTIME_QUARANTINE_PROXY_STATE.get(engine);
574+if (quarantineState && getContextEngineQuarantine(quarantineState.engineId)) {
575+const fallbackEngine = quarantineState.getResolvedFallbackEngine();
576+return (
577+(fallbackEngine ? RESOLVED_CONTEXT_ENGINE_METADATA.get(fallbackEngine) : undefined) ?? {
578+owner: CORE_CONTEXT_ENGINE_OWNER,
579+}
580+);
581+}
582+return RESOLVED_CONTEXT_ENGINE_METADATA.get(engine);
583+}
584+556585function describeResolvedContextEngineContractError(
557586engineId: string,
558587engine: unknown,
@@ -738,16 +767,35 @@ function wrapContextEngineWithRuntimeQuarantine(params: {
738767factoryCtx: ContextEngineFactoryContext;
739768}): ContextEngine {
740769let fallbackEnginePromise: Promise<ContextEngine> | undefined;
770+let resolvedFallbackEngine: ContextEngine | undefined;
741771const getFallbackEngine = () => {
742772fallbackEnginePromise ??= resolveDefaultContextEngine(
743773params.defaultEngineId,
744774params.factoryCtx,
745-);
775+).then((engine) => {
776+resolvedFallbackEngine = engine;
777+return engine;
778+});
746779return fallbackEnginePromise;
747780};
781+const fallbackInfo = (): ContextEngineInfo => {
782+return (
783+resolvedFallbackEngine?.info ?? {
784+id: params.defaultEngineId,
785+name:
786+params.defaultEngineId === "legacy"
787+ ? "Legacy Context Engine"
788+ : `${params.defaultEngineId} Context Engine`,
789+}
790+);
791+};
792+const isQuarantined = () => Boolean(getContextEngineQuarantine(params.engineId));
748793749-return new Proxy(params.engine, {
794+const proxy = new Proxy(params.engine, {
750795get(target, property, receiver) {
796+if (property === "info" && isQuarantined()) {
797+return fallbackInfo();
798+}
751799const value = Reflect.get(target, property, receiver);
752800if (typeof value !== "function" || !GUARDED_CONTEXT_ENGINE_METHODS.has(property)) {
753801return typeof value === "function" ? value.bind(target) : value;
@@ -759,7 +807,7 @@ function wrapContextEngineWithRuntimeQuarantine(params: {
759807if (aborted) {
760808throw aborted;
761809}
762-if (getContextEngineQuarantine(params.engineId)) {
810+if (isQuarantined()) {
763811return await invokeFallbackContextEngineMethod({
764812 getFallbackEngine,
765813 methodName,
@@ -780,7 +828,7 @@ function wrapContextEngineWithRuntimeQuarantine(params: {
780828 error,
781829defaultEngineId: params.defaultEngineId,
782830});
783-if (methodName === "prepareSubagentSpawn") {
831+if (methodName === "compact" || methodName === "prepareSubagentSpawn") {
784832throw error;
785833}
786834try {
@@ -796,8 +844,12 @@ function wrapContextEngineWithRuntimeQuarantine(params: {
796844};
797845},
798846});
847+RUNTIME_QUARANTINE_PROXY_STATE.set(proxy, {
848+engineId: params.engineId,
849+getResolvedFallbackEngine: () => resolvedFallbackEngine,
850+});
851+return proxy;
799852}
800-801853// ---------------------------------------------------------------------------
802854// Resolution
803855// ---------------------------------------------------------------------------
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。