openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
67 lines (66 loc) • 3.58 kB
JavaScript
import { r as asNullableRecord } from "./record-coerce-TIsquoVR.mjs";
import { t as VERSION } from "./version-D0DaWqMn.mjs";
import { a as resolveUpdateRehearsalRoot } from "./update-rehearsal-paths-FgHeU_TR.mjs";
import { I as materializeModelPolicyAllowlist } from "./agent-scope-config-BEk6-ThS.mjs";
import { t as cloneConfigWithResolutionFacts } from "./resolution-facts-NmRQ-VhX.mjs";
import { a as writeConfigMachineState } from "./config-machine-state-write-BAE6QBnV.mjs";
import { i as unsetConfigValueAtPath, t as getConfigValueAtPath } from "./config-paths-fD3fLAoh.mjs";
import { n as materializeUtilityModelSeparation } from "./utility-model-separation-migration-BUIjKcGN.mjs";
import { isDeepStrictEqual } from "node:util";
//#region src/config/io.meta.ts
/** Metadata keys automatically stamped on config writes. */
const AUTO_MANAGED_CONFIG_META_PATHS = [
["meta", "lastTouchedVersion"],
[
"meta",
"migrations",
"modelPolicyAllowlist"
],
[
"meta",
"migrations",
"utilityModelSeparation"
]
];
function hasWebhookMigrationProgress(previous, next) {
const before = previous.meta?.migrations?.webhookListeners;
const after = next.meta?.migrations?.webhookListeners;
return before !== true && after !== void 0 && !isDeepStrictEqual(before, after);
}
/** Publish migration pins beside includes so the root marker and pins roll back together. */
function projectWebhookMigrationIncludeWrite(previous, next) {
if (!hasWebhookMigrationProgress(previous, next)) return;
const completed = next.meta?.migrations?.webhookListeners;
const before = previous.meta?.migrations?.webhookListeners;
const paths = Object.entries(completed === true ? {} : completed ?? {}).flatMap(([channelId, fields]) => typeof before === "object" && Object.hasOwn(before, channelId) ? [] : fields.filter((field) => {
const value = getConfigValueAtPath(next, field);
return field[0] === "channels" && field[1] === channelId && (field.length === 3 || field.length === 5 && field[2] === "accounts") && getConfigValueAtPath(previous, field) === void 0 && (field.at(-1) === "legacyWebhook" ? asNullableRecord(value) !== null : field.at(-1) === "enabled" && value === true);
}));
const config = cloneConfigWithResolutionFacts(next);
for (const field of paths) unsetConfigValueAtPath(config, field, previous);
return {
config,
paths
};
}
function stampConfigWriteMetadata(cfg, version = VERSION, previousConfig, env = process.env) {
const migrationStamped = previousConfig === void 0 ? cfg : materializeUtilityModelSeparation(materializeModelPolicyAllowlist(cfg, previousConfig).config, previousConfig).config;
if (resolveUpdateRehearsalRoot(env)) {
const { meta: beforeMeta, ...before } = cfg;
const { meta: afterMeta, ...after } = migrationStamped;
return !(beforeMeta?.migrations?.modelPolicyAllowlist && !afterMeta?.migrations?.modelPolicyAllowlist || beforeMeta?.migrations?.utilityModelSeparation && !afterMeta?.migrations?.utilityModelSeparation) && isDeepStrictEqual(before, after) ? cfg : migrationStamped;
}
return {
...migrationStamped,
meta: {
...migrationStamped.meta,
lastTouchedVersion: version
}
};
}
/** Persist machine-owned metadata only after the matching config file commit succeeds. */
function recordConfigWriteMetadata(now = (/* @__PURE__ */ new Date()).toISOString()) {
writeConfigMachineState("config.lastTouchedAt", now);
}
//#endregion
export { stampConfigWriteMetadata as a, recordConfigWriteMetadata as i, hasWebhookMigrationProgress as n, projectWebhookMigrationIncludeWrite as r, AUTO_MANAGED_CONFIG_META_PATHS as t };