UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

152 lines (151 loc) • 7.36 kB
import { l as normalizeOptionalString } from "./string-coerce-1VuiLaaR.mjs"; import { n as normalizeAgentId } from "./agent-id-D1-Q6vR4.mjs"; import "./session-key-C09ow4h0.mjs"; import { g as resolveSessionAgentId } from "./agent-scope-CG17uXFn.mjs"; import { o as SESSION_READ_SCOPE } from "./operator-scopes-DsrPoRc4.mjs"; import { q as validateChatMetadataParams } from "./src-l2dWvEsN.mjs"; import { W as readUserProfileAliasRevision } from "./user-profiles-internal-DlO1LBbo.mjs"; import { t as ErrorCodes } from "./gateway-error-details-DIefe7Zy.mjs"; import { f as errorShape } from "./error-codes-Dh56LniQ.mjs"; import { c as readOperatorRolePolicyRevision } from "./operator-role-policy-Bsa4SHqC.mjs"; import { r as PreparedModelRuntimePublicationSupersededError } from "./prepared-model-runtime.errors-5KDV2tDJ.mjs"; import { n as resolveRequestedSessionAgentId } from "./session-request-agent-Bxi11ET4.mjs"; import { t as SessionMutationAuthorizationChangedError } from "./session-mutation-authorization-error-CCz8QGWh.mjs"; import { d as hiddenSessionNotFound, u as hasSessionReadAccessChanged } from "./session-sharing-policy-DBD0nzAz.mjs"; import { l as createSessionListEntryFilter } from "./session-sharing-target-read-B1Z4GF6o.mjs"; import "./session-sharing-C16h_pTr.mjs"; import { a as projectModelFastModeCatalog, n as prepareOperatorModelPresentation } from "./operator-model-presentation-tpGai_DS.mjs"; import { t as assertValidParams } from "./validation-Bu27N0nv.mjs"; import { t as retainGatewaySessionEntryReadOnly } from "./session-utils-read-lifetime-BIta580Q.mjs"; import { t as resolveAgentIdOrRespondError } from "./agent-id-shared-D1br86TX.mjs"; import { t as ModelAccountConnectAuthorityError } from "./model-account-connect-DkI_Ubcp.mjs"; import { t as preparePersonalModelAccountSelection } from "./users-model-account-access-sfM3dFUE.mjs"; import { t as prepareAuthenticatedProfile } from "./users-profile-access-8Yv14quX.mjs"; import { isDeepStrictEqual } from "node:util"; //#region src/gateway/server-methods/chat-metadata-contract.ts const chatMetadataSessionFields = [ "sessionId", "lifecycleRevision", "sessionStartedAt", "acp", "agentHarnessId", "agentRuntimeOverride", "modelSelectionLocked", "pluginOwnerId", "providerOverride", "modelOverride", "modelOverrideRouteResolution", "modelOverrideFallbackOriginProvider", "modelOverrideFallbackOriginModel", "authProfileOverride", "authProfileOverrideSource", "authProfileOverrideCompactionCount" ]; //#endregion //#region src/gateway/server-methods/chat-metadata-handler.ts /** Resolve saved-session grants or capture a new draft's current human authority. */ async function resolveChatMetadataReadParams(options, params, draftAccountSelection) { const { respond, context, client, signal } = options; const cfg = context.getRuntimeConfig(); draftAccountSelection?.assertCurrent(); const requester = await prepareAuthenticatedProfile(options); requester.assertCurrent(); const roleRevision = readOperatorRolePolicyRevision(); const aliasRevision = readUserProfileAliasRevision(); const profileInput = client?.authenticatedUserProfile?.profileId; const userInput = client?.authenticatedUserId; const isRequestCurrent = () => !signal?.aborted && readOperatorRolePolicyRevision() === roleRevision && readUserProfileAliasRevision() === aliasRevision && client?.authenticatedUserProfile?.profileId === profileInput && client?.authenticatedUserId === userInput; const assertRequestCurrent = () => { if (!isRequestCurrent() || context.getRuntimeConfig() !== cfg) throw new PreparedModelRuntimePublicationSupersededError("Chat metadata access changed while preparing its metadata. Retry the request."); requester.assertCurrent(); draftAccountSelection?.assertCurrent(); }; if (params.sessionKey) { const sessionKey = params.sessionKey; const requested = resolveRequestedSessionAgentId(cfg, params.sessionKey, normalizeOptionalString(params.agentId)); if (!requested.ok) { respond(false, void 0, requested.error); return; } const requesterProfileId = requester.profileId; const session = retainGatewaySessionEntryReadOnly(params.sessionKey, requested.agentId, (previous, current) => !hasSessionReadAccessChanged(previous, current) && chatMetadataSessionFields.every((field) => isDeepStrictEqual(previous[field], current[field]))); const isCurrent = () => isRequestCurrent() && session.isCurrent(); const assertVisible = () => { const visible = createSessionListEntryFilter({ client, cfg: (context.getCommittedRuntimeConfig ?? context.getRuntimeConfig)() }); if (session.entry && visible?.(session.legacyKey ?? session.canonicalKey, session.entry) === false) throw new SessionMutationAuthorizationChangedError(hiddenSessionNotFound(sessionKey)); }; try { assertVisible(); return { agentId: resolveSessionAgentId({ sessionKey: params.sessionKey, config: session.cfg, agentId: requested.agentId }), sessionKey: session.canonicalKey, storePath: session.readSource?.path ?? session.storePath, sessionEntry: session.entry, isCurrent, assertCurrent: () => { assertVisible(); assertRequestCurrent(); if (!session.isCurrentAtResponse()) throw new PreparedModelRuntimePublicationSupersededError("Session changed while preparing its metadata. Retry the request."); }, release: session.release, requesterProfileId }; } catch (error) { session.release(); throw error; } } const resolved = resolveAgentIdOrRespondError({ rawAgentId: params.agentId, respond, cfg, normalize: (id) => typeof id === "string" && id.trim() ? normalizeAgentId(id) : void 0 }); if (!resolved) return; assertRequestCurrent(); return { agentId: resolved.agentId, requesterProfileId: draftAccountSelection?.owner ?? requester.profileId, isCurrent: isRequestCurrent, assertCurrent: assertRequestCurrent, ...draftAccountSelection ? { draftAccountSelection } : {} }; } async function handleChatMetadataRequest(options) { const { params, respond, context, client } = options; if (!assertValidParams(params, validateChatMetadataParams, "chat.metadata", respond)) return; let scope; try { scope = await resolveChatMetadataReadParams(options, params, !params.sessionKey && params.authProfileId ? await preparePersonalModelAccountSelection(options, params.authProfileId, SESSION_READ_SCOPE) : void 0); if (!scope) return; scope.assertCurrent?.(); const metadata = await context.readChatMetadata(scope); scope.draftAccountSelection?.assertCurrent(); scope.assertCurrent?.(); const cfg = context.getRuntimeConfig(); const policy = prepareOperatorModelPresentation({ cfg, policyConfig: context.getCommittedRuntimeConfig?.() ?? cfg, client })?.forAgent(scope.agentId, metadata.models); respond(true, projectModelFastModeCatalog(policy ? policy.metadata(metadata) : metadata, client)); } catch (error) { if (error instanceof SessionMutationAuthorizationChangedError) { respond(false, void 0, error.error); return; } if (!(error instanceof ModelAccountConnectAuthorityError)) throw error; respond(false, void 0, errorShape(ErrorCodes.FORBIDDEN, error.message)); } finally { scope?.release?.(); } } //#endregion export { resolveChatMetadataReadParams as n, handleChatMetadataRequest as t };