openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
127 lines (126 loc) • 4.66 kB
JavaScript
import { n as GatewayErrorDetailCodes, t as ErrorCodes } from "./gateway-error-details-w0nAGBBp.js";
import { $r as validateSessionsCompanionStateParams, Qr as validateSessionsCompanionResetParams, Zr as validateSessionsCompanionAskParams, _g as formatValidationErrors } from "./src-BiL5aQto.js";
import { d as errorShape } from "./error-codes-Bo8q2D1o.js";
import { i as resolveSessionStoreKey } from "./session-store-key-8xEjWSNi.js";
import { n as resolveRequestedSessionAgentId } from "./session-request-agent-CCRSEGCB.js";
import { t as SessionCompanionAskError } from "./session-companion-ask-NbxUgDmR.js";
//#region src/gateway/session-companion-rpc.ts
function resolveCompanionTarget(params, context) {
const cfg = context.getRuntimeConfig();
const requested = resolveRequestedSessionAgentId(cfg, params.sessionKey, params.agentId);
if (!requested.ok) return requested;
return {
ok: true,
agentId: requested.agentId,
sessionKey: resolveSessionStoreKey({
cfg,
sessionKey: params.sessionKey,
storeAgentId: requested.agentId
})
};
}
const sessionCompanionHandlers = {
"sessions.companion.ask": async ({ params, respond, client, context, signal }) => {
if (!validateSessionsCompanionAskParams(params)) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, `invalid sessions.companion.ask params: ${formatValidationErrors(validateSessionsCompanionAskParams.errors)}`));
return;
}
const { sessionKey, agentId, question } = params;
if (!question.trim()) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "question must contain non-whitespace text"));
return;
}
if (!client?.connId) {
respond(false, void 0, errorShape(ErrorCodes.FORBIDDEN, "Side chat questions require a connected client."));
return;
}
if (!context.sessionCompanion) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "Side chat is unavailable."));
return;
}
const target = resolveCompanionTarget({
sessionKey,
agentId
}, context);
if (!target.ok) {
respond(false, void 0, target.error);
return;
}
try {
respond(true, await context.sessionCompanion.ask({
sessionKey: target.sessionKey,
agentId: target.agentId,
question,
connId: client.connId,
...signal ? { signal } : {}
}));
} catch (error) {
if (!(error instanceof SessionCompanionAskError)) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "Side chat could not answer right now."));
return;
}
if (error.reason === "busy") {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, error.message, {
details: { code: GatewayErrorDetailCodes.SESSION_COMPANION_BUSY },
retryable: true
}));
return;
}
const retryable = error.reason === "rate-limited" || error.reason === "context-unavailable";
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, error.message, {
details: { reason: error.reason },
retryable,
...error.retryAfterMs ? { retryAfterMs: error.retryAfterMs } : {}
}));
}
},
"sessions.companion.state": ({ params, respond, context }) => {
if (!validateSessionsCompanionStateParams(params)) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, `invalid sessions.companion.state params: ${formatValidationErrors(validateSessionsCompanionStateParams.errors)}`));
return;
}
if (!context.sessionCompanion) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "Side chat is unavailable."));
return;
}
const { sessionKey, agentId } = params;
const target = resolveCompanionTarget({
sessionKey,
agentId
}, context);
if (!target.ok) {
respond(false, void 0, target.error);
return;
}
respond(true, context.sessionCompanion.state({
agentId: target.agentId,
sessionKey: target.sessionKey
}));
},
"sessions.companion.reset": ({ params, respond, context }) => {
if (!validateSessionsCompanionResetParams(params)) {
respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, `invalid sessions.companion.reset params: ${formatValidationErrors(validateSessionsCompanionResetParams.errors)}`));
return;
}
if (!context.sessionCompanion) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, "Side chat is unavailable."));
return;
}
const { sessionKey, agentId } = params;
const target = resolveCompanionTarget({
sessionKey,
agentId
}, context);
if (!target.ok) {
respond(false, void 0, target.error);
return;
}
context.sessionCompanion.reset({
agentId: target.agentId,
sessionKey: target.sessionKey
});
respond(true, { ok: true });
}
};
//#endregion
export { sessionCompanionHandlers };