openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
152 lines (151 loc) • 6.54 kB
JavaScript
import { O as parseAgentSessionKey } from "./session-key-BnWWjqNc.js";
import { n as APPROVALS_SCOPE } from "./operator-scopes-Dw7Gu2cA.js";
import { t as ErrorCodes } from "./gateway-error-details-w0nAGBBp.js";
import { Bi as validateSessionsViewerPresenceSetParams, Ci as validateSessionsMessagesUnsubscribeParams, Si as validateSessionsMessagesSubscribeParams, xi as validateSessionsListParams } from "./src-BiL5aQto.js";
import { d as errorShape } from "./error-codes-Bo8q2D1o.js";
import { i as resolveSessionStoreKey, n as resolveSessionStoreAgentId } from "./session-store-key-8xEjWSNi.js";
import { t as resolveSessionSubscriptionKey } from "./session-subscription-keys-BwUDpvzj.js";
import { n as resolveRequestedSessionAgentId } from "./session-request-agent-CCRSEGCB.js";
import "./session-utils-Cai0_C6U.js";
import { t as assertValidParams } from "./validation-pzrlzFvo.js";
import { m as sessionObserverScopeKey } from "./session-observer-model-D5MYTAfa.js";
import { r as canReviewOperatorApproval } from "./operator-approval-authorization-DgI7PHhT.js";
import { n as sessionsListHandler } from "./sessions-read-tYZGWlo3.js";
import { s as requireSessionKey } from "./sessions-shared-D_lV07q2.js";
//#region src/gateway/server-methods/sessions-subscriptions.ts
const sessionSubscriptionHandlers = {
"sessions.subscribe": async (options) => {
const { client, context, params, respond } = options;
if (!assertValidParams(params, validateSessionsListParams, "sessions.subscribe", respond)) return;
const connId = client?.connId?.trim();
if (connId) context.subscribeSessionEvents(connId);
if (!connId || Object.keys(params).length === 0) {
respond(true, { subscribed: Boolean(connId) }, void 0);
return;
}
await sessionsListHandler({
...options,
params,
respond: (ok, payload, error, meta) => {
respond(ok, ok ? {
subscribed: true,
list: payload
} : void 0, error, meta);
}
});
},
"sessions.viewers.set": ({ params, client, context, respond }) => {
if (!assertValidParams(params, validateSessionsViewerPresenceSetParams, "sessions.viewers.set", respond)) return;
const connId = client?.connId?.trim();
const declarations = context.sessionViewerPresence;
if (!connId || !declarations) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "session viewer presence unavailable"));
return;
}
const cfg = context.getRuntimeConfig();
const canonicalKeys = [];
for (const rawKey of params.sessionKeys) {
const trimmed = rawKey.trim();
if (!trimmed) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "invalid sessions.viewers.set params"));
return;
}
const requested = resolveRequestedSessionAgentId(cfg, trimmed, parseAgentSessionKey(trimmed) ? void 0 : params.agentId);
if (!requested.ok) {
respond(false, void 0, requested.error);
return;
}
const canonicalKey = resolveSessionStoreKey({
cfg,
sessionKey: trimmed,
storeAgentId: requested.agentId
});
canonicalKeys.push(sessionObserverScopeKey(canonicalKey, requested.agentId));
}
respond(true, { sessionKeys: declarations.replace(connId, canonicalKeys) }, void 0);
},
"sessions.messages.subscribe": ({ params, client, context, respond }) => {
if (!assertValidParams(params, validateSessionsMessagesSubscribeParams, "sessions.messages.subscribe", respond)) return;
const connId = client?.connId?.trim();
const p = params;
const key = requireSessionKey(p.key, respond);
if (!key) return;
if (p.includeApprovals === true && !canReviewOperatorApproval(client)) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, `sessions.messages.subscribe includeApprovals requires a paired device and gateway scope: ${APPROVALS_SCOPE}`));
return;
}
const cfg = context.getRuntimeConfig();
const requestedAgent = resolveRequestedSessionAgentId(cfg, key, p.agentId);
if (!requestedAgent.ok) {
respond(false, void 0, requestedAgent.error);
return;
}
const requestedAgentId = requestedAgent.agentId;
const canonicalKey = resolveSessionStoreKey({
cfg,
sessionKey: key,
...requestedAgentId ? { storeAgentId: requestedAgentId } : {}
});
const subscriptionKey = resolveSessionSubscriptionKey(canonicalKey, requestedAgentId ?? resolveSessionStoreAgentId(cfg, canonicalKey));
if (connId) {
let approvalReplay;
if (p.includeApprovals === true) {
const rollbackSubscription = context.subscribeSessionMessageEvents(connId, subscriptionKey, {
includeApprovals: true,
provisional: true
});
try {
approvalReplay = context.listSessionPendingApprovals?.(subscriptionKey, client);
} catch (error) {
rollbackSubscription?.();
context.logGateway.error(`session approval replay failed: ${String(error)}`);
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "session approval replay unavailable"));
return;
}
if (!approvalReplay) {
rollbackSubscription?.();
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "session approval replay unavailable"));
return;
}
rollbackSubscription?.commit?.();
} else context.subscribeSessionMessageEvents(connId, subscriptionKey);
respond(true, {
subscribed: true,
key: canonicalKey,
...p.includeApprovals === true ? { approvalReplay } : {}
}, void 0);
return;
}
respond(true, {
subscribed: false,
key: canonicalKey
}, void 0);
},
"sessions.messages.unsubscribe": ({ params, client, context, respond }) => {
if (!assertValidParams(params, validateSessionsMessagesUnsubscribeParams, "sessions.messages.unsubscribe", respond)) return;
const connId = client?.connId?.trim();
const p = params;
const key = requireSessionKey(p.key, respond);
if (!key) return;
const cfg = context.getRuntimeConfig();
const requestedAgent = resolveRequestedSessionAgentId(cfg, key, p.agentId);
if (!requestedAgent.ok) {
respond(false, void 0, requestedAgent.error);
return;
}
const requestedAgentId = requestedAgent.agentId;
const canonicalKey = resolveSessionStoreKey({
cfg,
sessionKey: key,
...requestedAgentId ? { storeAgentId: requestedAgentId } : {}
});
const subscriptionKey = resolveSessionSubscriptionKey(canonicalKey, requestedAgentId ?? resolveSessionStoreAgentId(cfg, canonicalKey));
if (connId) context.unsubscribeSessionMessageEvents(connId, subscriptionKey);
respond(true, {
subscribed: false,
key: canonicalKey
}, void 0);
}
};
//#endregion
export { sessionSubscriptionHandlers };