openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
221 lines (220 loc) • 10.5 kB
JavaScript
import { r as truncateUtf16Safe } from "./utf16-slice-D_ngcYKd.mjs";
import { r as assertExistingDatabaseIdentity } from "./sqlite-worker-identity-BRNRpRyc.mjs";
import { n as normalizeAgentId } from "./agent-id-D1-Q6vR4.mjs";
import "./session-key-DY3MOX4N.mjs";
import { t as captureOpenClawStateReadContext } from "./openclaw-state-worker-context-BvvgY6-t.mjs";
import { i as resolveSessionAuthProfileOverrideSource, r as resolveCollapsedSessionAuthPinSource } from "./auth-profile-override-provenance-Jztnei-C.mjs";
import { v as isUserModelAuthProfileId, y as parseUserModelAuthProfileId } from "./profile-usage-stats-DpmWbjlU.mjs";
import { N as captureUserProfileAuthorityRead, P as captureUserProfileModelAccountLinksAuthority, q as readUserProfileVersion } from "./user-profiles-internal-B_G1rF82.mjs";
import { o as getPreparedModelRuntimeAuthMaterializations } from "./prepared-model-runtime-auth-DKS2l7Wv.mjs";
import { n as PreparedModelRuntimePublicationSupersededError } from "./prepared-model-runtime.errors-UvN8VA9R.mjs";
import { n as withCurrentReadAuthority, t as settleCurrentReadPreparations } from "./current-read-authority-CySCga_Z.mjs";
import { t as readAcpSessionMetaForEntries } from "./session-meta-readonly-CDWxL7Mp.mjs";
import { r as resolveSessionModelRef } from "./session-model-ref-CS-wdkCn.mjs";
import { n as readSessionRuntimeOwnership } from "./session-utils-model-selection-CfgNTTco.mjs";
import { i as resolveGatewaySessionRuntimeSelectionLocked } from "./session-utils-projection-FyMCsaP_.mjs";
import { o as readUserModelAccountSelectionAsync } from "./user-model-account-operations-D1BrNlr_.mjs";
import { toUSVString } from "node:util";
//#region src/gateway/server-methods/chat-account-selection.ts
async function prepareChatAccountSelection(params) {
const requesterProfileId = params.readRequesterProfileId ? params.readRequesterProfileId() : params.requesterProfileId;
const authProfileId = params.sessionEntry?.authProfileOverride?.trim();
let personal;
let ownerDisplayName;
let isCurrent;
if (authProfileId && isUserModelAuthProfileId(authProfileId)) {
const { admission } = captureOpenClawStateReadContext();
const linksCurrent = requesterProfileId ? captureUserProfileModelAccountLinksAuthority(admission, requesterProfileId) : void 0;
const authority = await captureUserProfileAuthorityRead(admission);
const displayVersion = readUserProfileVersion();
const selection = await readUserModelAccountSelectionAsync({
profileId: requesterProfileId,
authProfileId
}, { path: admission.databasePath });
personal = selection?.personal;
ownerDisplayName = selection?.owner?.displayName;
const locator = parseUserModelAuthProfileId(authProfileId);
const identityCurrent = authority.bind([
requesterProfileId,
locator?.ownerProfileId,
selection?.owner?.profileId
].filter((id) => id !== void 0));
isCurrent = () => {
if (admission.identity.key.startsWith("file:")) assertExistingDatabaseIdentity(admission.databasePath, admission.identity.key, admission.identity.birthtime);
return Boolean(identityCurrent?.()) && linksCurrent?.() !== false && readUserProfileVersion() === displayVersion;
};
}
return () => {
if (isCurrent?.() === false || params.sessionEntry?.authProfileOverride?.trim() !== authProfileId || params.readRequesterProfileId && params.readRequesterProfileId() !== requesterProfileId) throw new PreparedModelRuntimePublicationSupersededError("Personal account changed while preparing its metadata. Retry the request.");
return resolveChatAccountSelection({
...params,
personal,
ownerDisplayName
});
};
}
/** The session owns this preference; it is not a receipt for the account that served a turn. */
function resolveChatAccountSelection(params) {
const authProfileId = params.sessionEntry?.authProfileOverride?.trim();
if (!authProfileId) return {
kind: "automatic",
label: "Automatic account selection"
};
const source = resolveSessionAuthProfileOverrideSource(params.sessionEntry);
if (!isUserModelAuthProfileId(authProfileId)) {
const credential = params.authStore.profiles[authProfileId];
return {
kind: "shared",
authProfileId,
label: truncateUtf16Safe(toUSVString(credential?.displayName?.trim() || authProfileId), 256),
source
};
}
const personal = params.personal;
if (personal) return {
kind: "personal",
authProfileId,
label: personal.label,
source
};
const rawDisplayName = params.ownerDisplayName?.trim();
const displayName = rawDisplayName ? toUSVString(rawDisplayName) : void 0;
return {
kind: "personal",
label: displayName ? truncateUtf16Safe(`${displayName}'s account`, 256) : "Personal account",
source
};
}
//#endregion
//#region src/gateway/server-methods/chat-metadata-session-projection.ts
function readPreparedChatMetadata(projection, readParams, config, acpMeta, readAccountSelection) {
readParams.draftAccountSelection?.assertCurrent();
const { agent } = projection;
const metadata = {
...projection.read(),
...agent.commands !== void 0 ? { commands: agent.commands } : {},
swarmEnabled: agent.swarmEnabled,
accountSelection: readAccountSelection?.() ?? resolveChatAccountSelection({
authStore: agent.authStore,
sessionEntry: readParams.sessionEntry
})
};
const projected = metadata.models ? {
...metadata,
models: projectSessionModelCatalog(readParams, metadata.models, config)
} : metadata;
if (!readParams.sessionKey) return projected;
return {
...projected,
runtimeSelectionLocked: resolveGatewaySessionRuntimeSelectionLocked(readParams.sessionEntry, acpMeta ?? void 0)
};
}
async function prepareSessionAcpMeta(params, cfg) {
if (!params.sessionKey) return null;
const [meta] = await readAcpSessionMetaForEntries({
cfg,
entries: [{
agentId: params.agentId,
sessionKey: params.sessionKey,
entry: params.sessionEntry
}]
});
return meta ?? null;
}
async function prepareChatMetadataModelProjection(params) {
const [{ prepareModelsListResult }, { prepareModelCatalogDecisions }] = await Promise.all([import("./models-list-result-DNp2O-xL.mjs"), import("./model-catalog-decisions-CG8Ke_Vj.mjs")]);
await withCurrentReadAuthority(params, () => {});
const snapshot = params.facts.modelCatalog;
const projector = await prepareModelCatalogDecisions({
cfg: params.facts.owner.config,
agentId: params.facts.agentId,
snapshot,
metadataSnapshot: params.facts.owner.metadataSnapshot,
preparedAuthStore: params.facts.authStore,
accountCatalog: params.facts.owner.accountCatalog,
requesterProfileId: params.requesterProfileId,
preparedRuntimeAuthModes: params.facts.authModes,
preparedRuntimeAuthMaterializations: getPreparedModelRuntimeAuthMaterializations(params.facts.owner),
pluginRegistry: params.facts.owner.pluginRegistry,
isCurrent: params.facts.owner.isCurrent,
observationConfig: params.facts.owner.observationConfig,
...params.preferredProfileId ? { preferredProfileId: params.preferredProfileId } : {},
...params.pinnedProfileId ? { pinnedProfileId: params.pinnedProfileId } : {},
...params.profileProvider ? { profileProvider: params.profileProvider } : {},
...params.runtimeOverride ? { runtimeOverride: params.runtimeOverride } : {}
}, params);
const work = [projector.projectCatalog(params), prepareModelsListResult({
source: {
kind: "gateway",
context: params.context
},
agentId: params.facts.agentId,
params: {
view: "configured",
includeDefaultModels: false
},
preloadedCatalog: {
agentId: params.facts.agentId,
config: params.facts.owner.config,
snapshot
},
preloadedOnly: true,
preparationAuthority: params,
catalogProjector: projector
})];
const [modelCatalog, readModels] = await settleCurrentReadPreparations(work);
await withCurrentReadAuthority(params, () => {});
return {
modelCatalog,
read: () => ({ models: readModels.read().models }),
isCurrent: readModels.isCurrent
};
}
function resolveSessionCatalogProfiles(sessionEntry, config, agentId) {
const profileId = sessionEntry?.authProfileOverride?.trim();
const runtime = sessionEntry?.agentRuntimeOverride?.trim();
const provider = sessionEntry?.providerOverride ?? (runtime ? resolveSessionModelRef(config, sessionEntry, agentId, { allowPluginNormalization: false }).provider : void 0);
const context = {
...provider ? { profileProvider: provider } : {},
...runtime ? { runtimeOverride: runtime } : {}
};
if (!profileId) return context;
const profileSource = resolveCollapsedSessionAuthPinSource(sessionEntry);
return {
preferredProfileId: profileId,
...context,
...profileSource === "user" ? { pinnedProfileId: profileId } : {}
};
}
function sessionProjectionKey(agentId, profiles) {
return [
normalizeAgentId(agentId),
profiles.preferredProfileId ?? "",
profiles.pinnedProfileId ?? "",
profiles.profileProvider ?? "",
profiles.runtimeOverride ?? ""
].join("\0");
}
function hasSessionCatalogContext(profiles) {
return profiles.preferredProfileId !== void 0 || profiles.pinnedProfileId !== void 0 || profiles.profileProvider !== void 0 || profiles.runtimeOverride !== void 0;
}
function projectSessionModelCatalog(readParams, models, config) {
const ownership = readSessionRuntimeOwnership({
...readParams,
config
});
const nativeAuth = ownership?.auth === "native";
const entry = readParams.sessionEntry;
const authProfileSource = resolveCollapsedSessionAuthPinSource(entry);
const workerAuth = readParams.workerInference === "worker" && !entry?.modelOverride?.trim() && !entry?.agentRuntimeOverride?.trim() && !(entry?.authProfileOverride?.trim() && authProfileSource === "user");
if (!nativeAuth && !workerAuth) return models;
const renderedModel = ownership?.modelRef ?? resolveSessionModelRef(config, readParams.sessionEntry, readParams.agentId, { allowPluginNormalization: false });
return models.map((model) => {
if (model.provider !== renderedModel.provider || model.id !== renderedModel.model) return model;
if (workerAuth && model.unavailableReason !== "missing-auth" && model.unavailableReason !== "auth-failed") return model;
const { available: _available, unavailableReason: _reason, unavailableUntil: _until, ...available } = model;
return available;
});
}
//#endregion
export { readPreparedChatMetadata as a, prepareChatAccountSelection as c, projectSessionModelCatalog as i, prepareChatMetadataModelProjection as n, resolveSessionCatalogProfiles as o, prepareSessionAcpMeta as r, sessionProjectionKey as s, hasSessionCatalogContext as t };