mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-26 04:15:48 -06:00
refactor(config): remove stale materialization modes (#129132)
Amp-Thread-ID: https://ampcode.com/threads/T-01a037b7-5ca3-75bc-86b8-37330b30aaf8 Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
committed by
GitHub
parent
fddb81c314
commit
e961989f65
@@ -40,7 +40,6 @@ import { formatConfigIssueSummary } from "./issue-format.js";
|
||||
import { migrateLegacyContextBudgetConfig } from "./legacy.context-budget.js";
|
||||
import { inheritLegacyDefaultAgentId } from "./legacy.default-agent-owner.js";
|
||||
import { migratePersistedImplicitMainRoster } from "./legacy.roster.js";
|
||||
import { materializeRuntimeConfig } from "./materialize.js";
|
||||
import { copyConfigResolutionFacts } from "./resolution-facts.js";
|
||||
import { applyConfigOverrides } from "./runtime-overrides.js";
|
||||
import { resolveShellEnvExpectedKeys } from "./shell-env-expected-keys.js";
|
||||
@@ -275,14 +274,3 @@ export function createConfigIoContext(options: ConfigIoFactoryOptions = {}): Con
|
||||
export function resolveModelIdNormalizationPolicies(snapshot: PluginMetadataSnapshot | undefined) {
|
||||
return snapshot ? collectManifestModelIdNormalizationPolicies(snapshot.plugins) : undefined;
|
||||
}
|
||||
|
||||
export function materializeConfigForLoad(
|
||||
_context: ConfigIoContext,
|
||||
config: OpenClawConfig,
|
||||
_effectiveConfigRaw: unknown,
|
||||
manifestRegistry: PluginManifestRegistry | undefined,
|
||||
): OpenClawConfig {
|
||||
return materializeRuntimeConfig(config, "load", {
|
||||
manifestRegistry,
|
||||
});
|
||||
}
|
||||
|
||||
+5
-13
@@ -1,7 +1,6 @@
|
||||
import { formatErrorMessage } from "../infra/errors.js";
|
||||
import { DuplicateAgentDirError, findDuplicateAgentDirs } from "./agent-dirs.js";
|
||||
import type { ConfigIoContext } from "./io.context.js";
|
||||
import { materializeConfigForLoad } from "./io.context.js";
|
||||
import { throwInvalidConfig } from "./io.invalid-config.js";
|
||||
import { maybeRecoverSuspiciousConfigReadSync } from "./io.observe-recovery.js";
|
||||
import {
|
||||
@@ -22,6 +21,7 @@ import {
|
||||
warnOnConfigMiskeys,
|
||||
} from "./io.warnings.js";
|
||||
import { migrateLegacyContextBudgetConfig, migratePersistedImplicitMainRoster } from "./legacy.js";
|
||||
import { materializeRuntimeConfig } from "./materialize.js";
|
||||
import type { OpenClawConfig } from "./types.js";
|
||||
import { validateConfigObjectWithPlugins } from "./validation.js";
|
||||
|
||||
@@ -40,12 +40,7 @@ export function loadConfigFromContext(
|
||||
// same runtime defaults an empty {} config gets, or out-of-box behavior
|
||||
// (compaction safeguard, session/cron defaults) silently diverges.
|
||||
return context.finalizeLoadedRuntimeConfig(
|
||||
materializeConfigForLoad(
|
||||
context,
|
||||
coerceConfig(migratePersistedImplicitMainRoster({}).config),
|
||||
{},
|
||||
undefined,
|
||||
),
|
||||
materializeRuntimeConfig(coerceConfig(migratePersistedImplicitMainRoster({}).config)),
|
||||
);
|
||||
}
|
||||
const raw = deps.fs.readFileSync(configPath, "utf-8");
|
||||
@@ -151,12 +146,9 @@ export function loadConfigFromContext(
|
||||
return loadConfigFromContext(context, { skipSuspiciousRecovery: true });
|
||||
}
|
||||
}
|
||||
const cfg = materializeConfigForLoad(
|
||||
context,
|
||||
validated.config,
|
||||
effectiveConfigRaw,
|
||||
pluginMetadata.getManifestRegistry(),
|
||||
);
|
||||
const cfg = materializeRuntimeConfig(validated.config, {
|
||||
manifestRegistry: pluginMetadata.getManifestRegistry(),
|
||||
});
|
||||
context.observeLoadConfigSnapshot(
|
||||
createConfigFileSnapshot({
|
||||
path: configPath,
|
||||
|
||||
@@ -74,7 +74,7 @@ export async function readConfigFileSnapshotInternal(
|
||||
// Missing config is the fresh-install default path: materialize the
|
||||
// same runtime defaults an existing empty {} config gets, so snapshot
|
||||
// consumers see identical out-of-box behavior either way.
|
||||
runtimeConfig: materializeRuntimeConfig(config, "snapshot", {
|
||||
runtimeConfig: materializeRuntimeConfig(config, {
|
||||
manifestRegistry:
|
||||
context.options.pluginValidation === "core-only" ? { plugins: [] } : undefined,
|
||||
}),
|
||||
@@ -295,7 +295,7 @@ export async function readConfigFileSnapshotInternal(
|
||||
}
|
||||
}
|
||||
const snapshotConfig = await deps.measure("config.snapshot.read.materialize", () =>
|
||||
materializeRuntimeConfig(validated.config, "snapshot", {
|
||||
materializeRuntimeConfig(validated.config, {
|
||||
manifestRegistry:
|
||||
pluginMetadata.getSnapshot()?.manifestRegistry ??
|
||||
(context.options.pluginValidation === "core-only" ? { plugins: [] } : undefined),
|
||||
@@ -454,7 +454,7 @@ export async function readBestEffortConfigSnapshotFromContext(
|
||||
}
|
||||
return {
|
||||
config: context.finalizeLoadedRuntimeConfig(
|
||||
materializeRuntimeConfig(result.snapshot.sourceConfig, "load", {
|
||||
materializeRuntimeConfig(result.snapshot.sourceConfig, {
|
||||
manifestRegistry: result.pluginMetadataSnapshot?.manifestRegistry,
|
||||
}),
|
||||
),
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// Verifies snapshot/load materialization parity for prepared-runtime config matching.
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { materializeRuntimeConfig } from "./materialize.js";
|
||||
import type { OpenClawConfig } from "./types.openclaw.js";
|
||||
|
||||
describe("materializeRuntimeConfig", () => {
|
||||
it("materializes snapshot and load identically when defaults must be injected", () => {
|
||||
// A compaction block without a mode is the shape that forces default injection.
|
||||
const config: OpenClawConfig = {
|
||||
agents: {
|
||||
defaults: {
|
||||
compaction: {},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const snapshot = materializeRuntimeConfig(config, "snapshot");
|
||||
const load = materializeRuntimeConfig(config, "load");
|
||||
|
||||
expect(snapshot.agents?.defaults?.compaction?.mode).toBeDefined();
|
||||
expect(snapshot).toEqual(load);
|
||||
});
|
||||
|
||||
it("keeps an explicit compaction mode unchanged in both modes", () => {
|
||||
const config: OpenClawConfig = {
|
||||
agents: {
|
||||
defaults: {
|
||||
compaction: { mode: "safeguard" },
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
expect(materializeRuntimeConfig(config, "snapshot").agents?.defaults?.compaction?.mode).toBe(
|
||||
"safeguard",
|
||||
);
|
||||
expect(materializeRuntimeConfig(config, "load").agents?.defaults?.compaction?.mode).toBe(
|
||||
"safeguard",
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -19,9 +19,6 @@ import type { OpenClawConfig, ResolvedSourceConfig, RuntimeConfig } from "./type
|
||||
// Snapshot and load must materialize identically: prepared-runtime exact-config
|
||||
// resolution compares the startup-published (snapshot) config against the reply-path
|
||||
// (load) config, and any divergence permanently fails that resolve for affected configs.
|
||||
// The mode parameter documents the call site; a per-mode defaults profile existed
|
||||
// until its last divergent ("missing") caller was removed and only invited drift.
|
||||
type ConfigMaterializationMode = "load" | "snapshot";
|
||||
|
||||
export function asResolvedSourceConfig(config: OpenClawConfig): ResolvedSourceConfig {
|
||||
return config as ResolvedSourceConfig;
|
||||
@@ -33,7 +30,6 @@ export function asRuntimeConfig(config: OpenClawConfig): RuntimeConfig {
|
||||
|
||||
export function materializeRuntimeConfig(
|
||||
config: OpenClawConfig,
|
||||
_mode: ConfigMaterializationMode,
|
||||
options: {
|
||||
manifestRegistry?: Pick<PluginManifestRegistry, "plugins">;
|
||||
loadManifestRegistry?: () => Pick<PluginManifestRegistry, "plugins"> | undefined;
|
||||
|
||||
@@ -658,7 +658,7 @@ describe("redactConfigSnapshot", () => {
|
||||
},
|
||||
} satisfies OpenClawConfig;
|
||||
const raw = JSON.stringify(sourceConfig);
|
||||
const runtimeConfig = materializeRuntimeConfig(structuredClone(sourceConfig), "snapshot");
|
||||
const runtimeConfig = materializeRuntimeConfig(structuredClone(sourceConfig));
|
||||
const snapshot = {
|
||||
...makeSnapshot(sourceConfig, raw),
|
||||
config: runtimeConfig,
|
||||
|
||||
@@ -427,7 +427,7 @@ export function validateConfigObject(
|
||||
return {
|
||||
ok: true,
|
||||
config: attachAgentListProjection(
|
||||
materializeRuntimeConfig(result.config, "snapshot", {
|
||||
materializeRuntimeConfig(result.config, {
|
||||
manifestRegistry: opts?.manifestRegistry,
|
||||
}),
|
||||
),
|
||||
|
||||
@@ -218,7 +218,7 @@ function validateConfigObjectWithPluginsBase(
|
||||
}
|
||||
}
|
||||
const config = opts.applyDefaults
|
||||
? materializeRuntimeConfig(parsedConfig, "snapshot", {
|
||||
? materializeRuntimeConfig(parsedConfig, {
|
||||
manifestRegistry:
|
||||
registryInfo?.registry ??
|
||||
(opts.pluginValidation === "core-only" ? { plugins: [] } : undefined),
|
||||
|
||||
Reference in New Issue
Block a user