



















@@ -1,3 +1,4 @@
1+import { createHash } from "node:crypto";
12import type { OpenClawConfig } from "./types.js";
2334export type RuntimeConfigSnapshotRefreshParams = {
@@ -65,12 +66,24 @@ export type RuntimeConfigWriteNotification = {
6566sourceConfig: OpenClawConfig;
6667runtimeConfig: OpenClawConfig;
6768persistedHash: string;
69+revision: number;
70+fingerprint: string;
71+sourceFingerprint: string | null;
6872writtenAtMs: number;
6973afterWrite?: ConfigWriteAfterWrite;
7074};
717576+export type RuntimeConfigSnapshotMetadata = {
77+revision: number;
78+fingerprint: string;
79+sourceFingerprint: string | null;
80+updatedAtMs: number;
81+};
82+7283let runtimeConfigSnapshot: OpenClawConfig | null = null;
7384let runtimeConfigSourceSnapshot: OpenClawConfig | null = null;
85+let runtimeConfigSnapshotMetadata: RuntimeConfigSnapshotMetadata | null = null;
86+let runtimeConfigSnapshotRevision = 0;
7487let runtimeConfigSnapshotRefreshHandler: RuntimeConfigSnapshotRefreshHandler | null = null;
7588const runtimeConfigWriteListeners = new Set<(event: RuntimeConfigWriteNotification) => void>();
7689@@ -99,17 +112,37 @@ function configSnapshotsMatch(left: OpenClawConfig, right: OpenClawConfig): bool
99112}
100113}
101114115+export function hashRuntimeConfigValue(value: OpenClawConfig): string {
116+return createHash("sha256").update(stableConfigStringify(value)).digest("base64url");
117+}
118+119+function createRuntimeConfigSnapshotMetadata(
120+config: OpenClawConfig,
121+sourceConfig?: OpenClawConfig,
122+): RuntimeConfigSnapshotMetadata {
123+runtimeConfigSnapshotRevision += 1;
124+return {
125+revision: runtimeConfigSnapshotRevision,
126+fingerprint: hashRuntimeConfigValue(config),
127+sourceFingerprint: sourceConfig ? hashRuntimeConfigValue(sourceConfig) : null,
128+updatedAtMs: Date.now(),
129+};
130+}
131+102132export function setRuntimeConfigSnapshot(
103133config: OpenClawConfig,
104134sourceConfig?: OpenClawConfig,
105135): void {
106136runtimeConfigSnapshot = config;
107137runtimeConfigSourceSnapshot = sourceConfig ?? null;
138+runtimeConfigSnapshotMetadata = createRuntimeConfigSnapshotMetadata(config, sourceConfig);
108139}
109140110141export function resetConfigRuntimeState(): void {
111142runtimeConfigSnapshot = null;
112143runtimeConfigSourceSnapshot = null;
144+runtimeConfigSnapshotMetadata = null;
145+runtimeConfigSnapshotRevision = 0;
113146}
114147115148export function clearRuntimeConfigSnapshot(): void {
@@ -124,6 +157,48 @@ export function getRuntimeConfigSourceSnapshot(): OpenClawConfig | null {
124157return runtimeConfigSourceSnapshot;
125158}
126159160+export function getRuntimeConfigSnapshotMetadata(): RuntimeConfigSnapshotMetadata | null {
161+return runtimeConfigSnapshotMetadata;
162+}
163+164+export function resolveRuntimeConfigCacheKey(config: OpenClawConfig): string {
165+const metadata = runtimeConfigSnapshotMetadata;
166+if (metadata && config === runtimeConfigSnapshot) {
167+return `runtime:${metadata.revision}:${metadata.fingerprint}`;
168+}
169+return `config:${hashRuntimeConfigValue(config)}`;
170+}
171+172+export function createRuntimeConfigWriteNotification(params: {
173+configPath: string;
174+sourceConfig: OpenClawConfig;
175+runtimeConfig: OpenClawConfig;
176+persistedHash: string;
177+writtenAtMs?: number;
178+afterWrite?: ConfigWriteAfterWrite;
179+}): RuntimeConfigWriteNotification {
180+const metadata =
181+params.runtimeConfig === runtimeConfigSnapshot && runtimeConfigSnapshotMetadata
182+ ? runtimeConfigSnapshotMetadata
183+ : {
184+revision: runtimeConfigSnapshotRevision,
185+fingerprint: hashRuntimeConfigValue(params.runtimeConfig),
186+sourceFingerprint: hashRuntimeConfigValue(params.sourceConfig),
187+updatedAtMs: Date.now(),
188+};
189+return {
190+configPath: params.configPath,
191+sourceConfig: params.sourceConfig,
192+runtimeConfig: params.runtimeConfig,
193+persistedHash: params.persistedHash,
194+revision: metadata.revision,
195+fingerprint: metadata.fingerprint,
196+sourceFingerprint: metadata.sourceFingerprint,
197+writtenAtMs: params.writtenAtMs ?? Date.now(),
198+afterWrite: params.afterWrite,
199+};
200+}
201+127202export function selectApplicableRuntimeConfig(params: {
128203inputConfig?: OpenClawConfig;
129204runtimeConfig?: OpenClawConfig | null;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。