mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-09 11:03:58 +00:00
Cap configured session context overrides by the selected model's known context window, refresh provider/model metadata consistently, and preserve the fixed Anthropic 1M context contract. Fixes #39857 Co-authored-by: Kros Dai <7087+xdanger@users.noreply.github.com>
60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import { createMergePatch, projectSourceOntoRuntimeShape } from "./io.write-prepare.js";
|
|
import { applyMergePatch } from "./merge-patch.js";
|
|
import { getRuntimeConfigSnapshot, getRuntimeConfigSourceSnapshot } from "./runtime-snapshot.js";
|
|
import type { OpenClawConfig } from "./types.js";
|
|
|
|
function isCompatibleTopLevelRuntimeProjectionShape(params: {
|
|
runtimeSnapshot: OpenClawConfig;
|
|
candidate: OpenClawConfig;
|
|
}): boolean {
|
|
const runtime = params.runtimeSnapshot as Record<string, unknown>;
|
|
const candidate = params.candidate as Record<string, unknown>;
|
|
for (const key of Object.keys(runtime)) {
|
|
if (!Object.hasOwn(candidate, key)) {
|
|
return false;
|
|
}
|
|
const runtimeValue = runtime[key];
|
|
const candidateValue = candidate[key];
|
|
const runtimeType = Array.isArray(runtimeValue)
|
|
? "array"
|
|
: runtimeValue === null
|
|
? "null"
|
|
: typeof runtimeValue;
|
|
const candidateType = Array.isArray(candidateValue)
|
|
? "array"
|
|
: candidateValue === null
|
|
? "null"
|
|
: typeof candidateValue;
|
|
if (runtimeType !== candidateType) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/** Projects a runtime-derived config back onto the active authored source snapshot. */
|
|
export function projectConfigOntoRuntimeSourceSnapshot(config: OpenClawConfig): OpenClawConfig {
|
|
const runtimeConfigSnapshot = getRuntimeConfigSnapshot();
|
|
const runtimeConfigSourceSnapshot = getRuntimeConfigSourceSnapshot();
|
|
if (!runtimeConfigSnapshot || !runtimeConfigSourceSnapshot) {
|
|
return config;
|
|
}
|
|
if (config === runtimeConfigSnapshot) {
|
|
return runtimeConfigSourceSnapshot;
|
|
}
|
|
if (
|
|
!isCompatibleTopLevelRuntimeProjectionShape({
|
|
runtimeSnapshot: runtimeConfigSnapshot,
|
|
candidate: config,
|
|
})
|
|
) {
|
|
return config;
|
|
}
|
|
const projectedSource = projectSourceOntoRuntimeShape(
|
|
runtimeConfigSourceSnapshot,
|
|
runtimeConfigSnapshot,
|
|
) as OpenClawConfig;
|
|
const runtimePatch = createMergePatch(runtimeConfigSnapshot, config);
|
|
return applyMergePatch(projectedSource, runtimePatch) as OpenClawConfig;
|
|
}
|