openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
133 lines (132 loc) • 5.44 kB
JavaScript
import { t as ErrorCodes } from "./gateway-error-details-w0nAGBBp.js";
import { Cr as validateSessionDiscussionOpenParams, Sr as validateSessionDiscussionInfoResult, _g as formatValidationErrors, wr as validateSessionDiscussionOpenResult, xr as validateSessionDiscussionInfoParams } from "./src-BiL5aQto.js";
import { d as errorShape } from "./error-codes-Bo8q2D1o.js";
import { a as resolveStoredSessionKeyForAgentStore } from "./session-store-key-8xEjWSNi.js";
import { n as resolveRequestedSessionAgentId } from "./session-request-agent-CCRSEGCB.js";
import { t as formatForLog } from "./ws-log-Dkg9wKNU.js";
import { t as getSessionDiscussionProvider } from "./session-discussion-registry-DuqCrPaE.js";
import { t as assertValidParams } from "./validation-pzrlzFvo.js";
import { o as maybeGenerateSessionTitle, r as hasExplicitSessionName } from "./dashboard-session-title-DoHAIULX.js";
import { n as emitSessionsChanged } from "./session-change-event-DzmH4zlz.js";
import { i as loadAccessorSessionEntryForGatewayTarget } from "./sessions-shared-D_lV07q2.js";
//#region src/gateway/server-methods/session-discussion.ts
const DISCUSSION_TITLE_TIMEOUT_MS = 1e4;
async function maybeGenerateTitleBeforeDiscussionOpen(params) {
try {
const cfg = params.context.getRuntimeConfig();
const resolved = loadAccessorSessionEntryForGatewayTarget({
cfg,
key: params.sessionKey,
agentId: params.agentId
});
const { entry } = resolved;
const sessionId = entry?.sessionId;
if (!entry || !sessionId || hasExplicitSessionName(entry)) return;
const observedTitleRequest = maybeGenerateSessionTitle({
cfg,
agentId: resolved.target.agentId,
entry,
sessionId,
sessionKey: resolved.canonicalKey,
storePath: resolved.storePath,
userMessage: ""
}).then(async (attempt) => {
if (attempt.kind === "in-flight") {
await attempt.settled.catch(() => {});
return false;
}
return attempt.kind === "persisted";
}).catch((error) => {
params.context.logGateway.warn(`dashboard session title generation failed: ${formatForLog(error)}`);
return false;
});
let timeout;
let persisted = false;
try {
persisted = await Promise.race([observedTitleRequest, new Promise((resolve) => {
timeout = setTimeout(() => resolve(false), DISCUSSION_TITLE_TIMEOUT_MS);
timeout.unref?.();
})]);
} finally {
if (timeout) clearTimeout(timeout);
}
if (persisted) emitSessionsChanged(params.context, {
sessionKey: resolved.canonicalKey,
agentId: resolved.target.agentId,
reason: "chat.title"
});
} catch (error) {
params.context.logGateway.warn(`dashboard session title generation failed: ${formatForLog(error)}`);
}
}
const sessionDiscussionHandlers = {
"session.discussion.info": async ({ params, respond, context }) => {
if (!assertValidParams(params, validateSessionDiscussionInfoParams, "session.discussion.info", respond)) return;
const requestedAgent = resolveRequestedSessionAgentId(context.getRuntimeConfig(), params.sessionKey, params.agentId);
if (!requestedAgent.ok) {
respond(false, void 0, requestedAgent.error);
return;
}
const provider = getSessionDiscussionProvider();
if (!provider) {
respond(true, { state: "none" }, void 0);
return;
}
try {
const sessionKey = resolveStoredSessionKeyForAgentStore({
cfg: context.getRuntimeConfig(),
agentId: requestedAgent.agentId,
sessionKey: params.sessionKey
});
const result = await provider.info({
sessionKey,
agentId: requestedAgent.agentId
});
if (!validateSessionDiscussionInfoResult(result)) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, `invalid session.discussion.info result: ${formatValidationErrors(validateSessionDiscussionInfoResult.errors)}`));
return;
}
respond(true, result, void 0);
} catch (error) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, error instanceof Error ? error.message : "session discussion provider failed"));
}
},
"session.discussion.open": async ({ params, respond, context }) => {
if (!assertValidParams(params, validateSessionDiscussionOpenParams, "session.discussion.open", respond)) return;
const requestedAgent = resolveRequestedSessionAgentId(context.getRuntimeConfig(), params.sessionKey, params.agentId);
if (!requestedAgent.ok) {
respond(false, void 0, requestedAgent.error);
return;
}
const provider = getSessionDiscussionProvider();
if (!provider) {
respond(true, { state: "none" }, void 0);
return;
}
try {
await maybeGenerateTitleBeforeDiscussionOpen({
context,
sessionKey: params.sessionKey,
agentId: requestedAgent.agentId
});
const sessionKey = resolveStoredSessionKeyForAgentStore({
cfg: context.getRuntimeConfig(),
agentId: requestedAgent.agentId,
sessionKey: params.sessionKey
});
const result = await provider.open({
sessionKey,
agentId: requestedAgent.agentId
});
if (!validateSessionDiscussionOpenResult(result)) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, `invalid session.discussion.open result: ${formatValidationErrors(validateSessionDiscussionOpenResult.errors)}`));
return;
}
respond(true, result, void 0);
} catch (error) {
respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, error instanceof Error ? error.message : "session discussion provider failed"));
}
}
};
//#endregion
export { sessionDiscussionHandlers };