The initial fix using snapshot.parsed broke configs with $include directives.
This commit adds a new 'resolved' field to ConfigFileSnapshot that contains
the config after $include and ${ENV} substitution but BEFORE runtime defaults
are applied. This is now used by config set/unset to avoid:
1. Breaking configs with $include directives
2. Leaking runtime defaults into the written config file
Also removes applyModelDefaults from writeConfigFile since runtime defaults
should only be applied when loading, not when writing.
130 lines
3.9 KiB
TypeScript
130 lines
3.9 KiB
TypeScript
import type { AgentBinding, AgentsConfig } from "./types.agents.js";
|
|
import type { ApprovalsConfig } from "./types.approvals.js";
|
|
import type { AuthConfig } from "./types.auth.js";
|
|
import type { DiagnosticsConfig, LoggingConfig, SessionConfig, WebConfig } from "./types.base.js";
|
|
import type { BrowserConfig } from "./types.browser.js";
|
|
import type { ChannelsConfig } from "./types.channels.js";
|
|
import type { CronConfig } from "./types.cron.js";
|
|
import type {
|
|
CanvasHostConfig,
|
|
DiscoveryConfig,
|
|
GatewayConfig,
|
|
TalkConfig,
|
|
} from "./types.gateway.js";
|
|
import type { HooksConfig } from "./types.hooks.js";
|
|
import type { MemoryConfig } from "./types.memory.js";
|
|
import type {
|
|
AudioConfig,
|
|
BroadcastConfig,
|
|
CommandsConfig,
|
|
MessagesConfig,
|
|
} from "./types.messages.js";
|
|
import type { ModelsConfig } from "./types.models.js";
|
|
import type { NodeHostConfig } from "./types.node-host.js";
|
|
import type { PluginsConfig } from "./types.plugins.js";
|
|
import type { SkillsConfig } from "./types.skills.js";
|
|
import type { ToolsConfig } from "./types.tools.js";
|
|
|
|
export type OpenClawConfig = {
|
|
meta?: {
|
|
/** Last OpenClaw version that wrote this config. */
|
|
lastTouchedVersion?: string;
|
|
/** ISO timestamp when this config was last written. */
|
|
lastTouchedAt?: string;
|
|
};
|
|
auth?: AuthConfig;
|
|
env?: {
|
|
/** Opt-in: import missing secrets from a login shell environment (exec `$SHELL -l -c 'env -0'`). */
|
|
shellEnv?: {
|
|
enabled?: boolean;
|
|
/** Timeout for the login shell exec (ms). Default: 15000. */
|
|
timeoutMs?: number;
|
|
};
|
|
/** Inline env vars to apply when not already present in the process env. */
|
|
vars?: Record<string, string>;
|
|
/** Sugar: allow env vars directly under env (string values only). */
|
|
[key: string]:
|
|
| string
|
|
| Record<string, string>
|
|
| { enabled?: boolean; timeoutMs?: number }
|
|
| undefined;
|
|
};
|
|
wizard?: {
|
|
lastRunAt?: string;
|
|
lastRunVersion?: string;
|
|
lastRunCommit?: string;
|
|
lastRunCommand?: string;
|
|
lastRunMode?: "local" | "remote";
|
|
};
|
|
diagnostics?: DiagnosticsConfig;
|
|
logging?: LoggingConfig;
|
|
update?: {
|
|
/** Update channel for git + npm installs ("stable", "beta", or "dev"). */
|
|
channel?: "stable" | "beta" | "dev";
|
|
/** Check for updates on gateway start (npm installs only). */
|
|
checkOnStart?: boolean;
|
|
};
|
|
browser?: BrowserConfig;
|
|
ui?: {
|
|
/** Accent color for OpenClaw UI chrome (hex). */
|
|
seamColor?: string;
|
|
assistant?: {
|
|
/** Assistant display name for UI surfaces. */
|
|
name?: string;
|
|
/** Assistant avatar (emoji, short text, or image URL/data URI). */
|
|
avatar?: string;
|
|
};
|
|
};
|
|
skills?: SkillsConfig;
|
|
plugins?: PluginsConfig;
|
|
models?: ModelsConfig;
|
|
nodeHost?: NodeHostConfig;
|
|
agents?: AgentsConfig;
|
|
tools?: ToolsConfig;
|
|
bindings?: AgentBinding[];
|
|
broadcast?: BroadcastConfig;
|
|
audio?: AudioConfig;
|
|
messages?: MessagesConfig;
|
|
commands?: CommandsConfig;
|
|
approvals?: ApprovalsConfig;
|
|
session?: SessionConfig;
|
|
web?: WebConfig;
|
|
channels?: ChannelsConfig;
|
|
cron?: CronConfig;
|
|
hooks?: HooksConfig;
|
|
discovery?: DiscoveryConfig;
|
|
canvasHost?: CanvasHostConfig;
|
|
talk?: TalkConfig;
|
|
gateway?: GatewayConfig;
|
|
memory?: MemoryConfig;
|
|
};
|
|
|
|
export type ConfigValidationIssue = {
|
|
path: string;
|
|
message: string;
|
|
};
|
|
|
|
export type LegacyConfigIssue = {
|
|
path: string;
|
|
message: string;
|
|
};
|
|
|
|
export type ConfigFileSnapshot = {
|
|
path: string;
|
|
exists: boolean;
|
|
raw: string | null;
|
|
parsed: unknown;
|
|
/**
|
|
* Config after $include resolution and ${ENV} substitution, but BEFORE runtime
|
|
* defaults are applied. Use this for config set/unset operations to avoid
|
|
* leaking runtime defaults into the written config file.
|
|
*/
|
|
resolved: OpenClawConfig;
|
|
valid: boolean;
|
|
config: OpenClawConfig;
|
|
hash?: string;
|
|
issues: ConfigValidationIssue[];
|
|
warnings: ConfigValidationIssue[];
|
|
legacyIssues: LegacyConfigIssue[];
|
|
};
|