openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
64 lines (63 loc) • 3.56 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import "./redact-BtvPPfTi.js";
import "./utils-P__uGsPB.js";
import { i as listAgentEntries, n as hasAgentRosterProperty } from "./agent-scope-config-DcbEhP0R.js";
//#region src/config/agent-roster-provenance.ts
function rosterEntryBoundaryContainsInclude(value) {
if (!isRecord(value)) return false;
if (Object.hasOwn(value, "$include")) return true;
return [value.id, value.default].some((field) => isRecord(field) && Object.hasOwn(field, "$include"));
}
function authoredRosterBoundaryContainsInclude(value) {
if (isRecord(value) && Object.hasOwn(value, "$include")) return true;
if (Array.isArray(value)) return value.some(rosterEntryBoundaryContainsInclude);
if (!isRecord(value)) return false;
return Object.values(value).some(rosterEntryBoundaryContainsInclude);
}
function readRosterValue(raw) {
if (!isRecord(raw) || !isRecord(raw.agents)) return;
if (Object.hasOwn(raw.agents, "entries")) return raw.agents.entries;
return Object.hasOwn(raw.agents, "list") ? raw.agents.list : void 0;
}
/**
* Roster include ownership decision table:
* - Include-owned: an include contributes membership or default metadata at agents.entries/list,
* an entry object, an id/default field, a nested entries/list $include, or an ambiguous
* byte-identical roster contribution.
* - Locally owned: ancestor includes contribute only unrelated config, or an include is nested
* inside entry-internal identity/model/etc. fields that cannot change membership or default;
* canonical roster writes preserve those entry-internal authored include nodes in place.
*/
function includeContributionOwnsAgentRoster(event) {
if (event.path.length === 0) return hasAgentRosterProperty(event.value);
if (event.path.length === 1 && event.path[0] === "agents") return isRecord(event.value) && (Object.hasOwn(event.value, "entries") || Object.hasOwn(event.value, "list"));
if (event.path[0] !== "agents") return false;
if (event.path[1] === "entries") return event.path.length <= 3 || event.path[3] === "default";
if (event.path[1] === "list") return event.path.length <= 3 || event.path[3] === "id" || event.path[3] === "default";
return false;
}
function includeContributionOwnsBindings(event) {
if (event.path.length === 0) return isRecord(event.value) && Object.hasOwn(event.value, "bindings");
return event.path[0] === "bindings";
}
/** Whether include/env resolution produced a non-empty roster before raw migrations. */
function hasResolvedRosterBeforeMigrations(snapshot) {
return listAgentEntries(snapshot.sourceConfigBeforeMigrations ?? {}).length > 0;
}
/** Whether an include, rather than the authored root, owns agents.entries. */
function configIncludeOwnsAgentRosterValues(params) {
const resolved = params.sourceConfigBeforeMigrations;
if (!hasAgentRosterProperty(resolved)) return false;
if (authoredRosterBoundaryContainsInclude(readRosterValue(params.parsed))) return true;
return params.includeContributesRoster === true;
}
/** Whether an include, rather than the authored root, owns agents.entries. */
function configIncludeOwnsAgentRoster(snapshot) {
return configIncludeOwnsAgentRosterValues({
parsed: snapshot.parsed,
sourceConfigBeforeMigrations: snapshot.sourceConfigBeforeMigrations,
includeContributesRoster: snapshot.agentRosterIncludeOwned
});
}
//#endregion
export { includeContributionOwnsBindings as a, includeContributionOwnsAgentRoster as i, configIncludeOwnsAgentRosterValues as n, hasResolvedRosterBeforeMigrations as r, configIncludeOwnsAgentRoster as t };