openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
123 lines (122 loc) • 4.98 kB
JavaScript
import { t as createLazyImportLoader } from "./lazy-promise-DGqyc4Y4.js";
import { y as resolveDefaultAgentId } from "./agent-scope-config-DcbEhP0R.js";
import { O as parseAgentSessionKey } from "./session-key-BnWWjqNc.js";
import "./agent-scope-DbtJyKUL.js";
import { r as logVerbose } from "./globals-CTaGxEqj.js";
import { t as getGlobalHookRunner } from "./hook-runner-global-0kfmMG4T.js";
import "./session-accessor-YsytfDtG.js";
import { b as loadTranscriptEvents } from "./session-accessor.sqlite-transcript-store-B0zw3fAU.js";
import { E as resolveSessionStorePathForScope } from "./session-accessor.sqlite-entry-CWk3jL7s.js";
import { t as formatSqliteSessionFileMarker } from "./legacy-sqlite-marker-COPKCuIN.js";
import { u as selectSessionTranscriptLeafControlledPath } from "./transcript-tree-BH69pMSi.js";
import { n as createInternalHookEvent, u as triggerInternalHook } from "./internal-hooks-Dgwjgwuj.js";
//#region src/auto-reply/reply/commands-reset-hooks.ts
const routeReplyRuntimeLoader = createLazyImportLoader(() => import("./route-reply.runtime.js"));
function loadRouteReplyRuntime() {
return routeReplyRuntimeLoader.load();
}
function parseTranscriptMessages(entries) {
return (selectSessionTranscriptLeafControlledPath(entries) ?? entries).flatMap((entry) => {
if (entry && typeof entry === "object" && !Array.isArray(entry) && entry.type === "message" && entry.message) return [entry.message];
return [];
});
}
async function readBeforeResetMessages(params) {
if (!params.sessionId || !params.sessionKey || !params.storePath) {
logVerbose("before_reset: no session identity available, firing hook with empty messages");
return [];
}
try {
return parseTranscriptMessages(await loadTranscriptEvents({
...params.agentId ? { agentId: params.agentId } : {},
sessionId: params.sessionId,
sessionKey: params.sessionKey,
storePath: params.storePath
}));
} catch (err) {
logVerbose(`before_reset: failed to read transcript identity ${params.sessionKey}/${params.sessionId}; firing hook with empty messages (${String(err)})`);
return [];
}
}
async function emitResetCommandHooks(params) {
const hookAgentId = parseAgentSessionKey(params.sessionKey)?.agentId ?? params.agentId ?? resolveDefaultAgentId(params.cfg);
const hookStorePath = hookAgentId && params.storePath ? resolveSessionStorePathForScope({
agentId: hookAgentId,
sessionKey: params.sessionKey,
storePath: params.storePath
}) : params.storePath;
const hookEvent = createInternalHookEvent("command", params.action, params.sessionKey ?? "", {
agentId: hookAgentId,
sessionEntry: params.sessionEntry,
previousSessionEntry: params.previousSessionEntry,
previousSessionMemory: params.previousSessionMemory,
commandSource: params.command.surface,
senderId: params.command.senderId,
workspaceDir: params.workspaceDir,
storePath: hookStorePath,
cfg: params.cfg
});
await triggerInternalHook(hookEvent);
params.command.resetHookTriggered = true;
let routedReply = false;
if (hookEvent.messages.length > 0) {
const channel = params.ctx.OriginatingChannel || params.command.channel;
const to = params.ctx.OriginatingTo || params.command.from || params.command.to;
if (channel && to) {
const { routeReply } = await loadRouteReplyRuntime();
const result = await routeReply({
payload: { text: hookEvent.messages.join("\n\n") },
channel,
to,
agentId: hookAgentId,
sessionKey: params.sessionKey,
accountId: params.ctx.AccountId,
requesterSenderId: params.command.senderId,
requesterSenderName: params.ctx.SenderName,
requesterSenderUsername: params.ctx.SenderUsername,
requesterSenderE164: params.ctx.SenderE164,
threadId: params.ctx.MessageThreadId,
cfg: params.cfg,
replyKind: "final"
});
if (result.delivered) await params.onObservedReplyDelivery?.();
routedReply = result.delivered || result.suppressed === true;
}
}
const hookRunner = getGlobalHookRunner();
if (hookRunner?.hasHooks("before_reset")) {
const prevEntry = params.previousSessionEntry;
const agentId = hookAgentId;
const storePath = hookStorePath;
const sessionFile = agentId && prevEntry?.sessionId && storePath ? formatSqliteSessionFileMarker({
agentId,
sessionId: prevEntry.sessionId,
storePath
}) : params.sessionKey;
const messages = params.previousSessionResetMessages ?? await readBeforeResetMessages({
agentId,
sessionId: prevEntry?.sessionId,
sessionKey: params.sessionKey,
storePath
});
(async () => {
try {
await hookRunner.runBeforeReset({
sessionFile,
messages,
reason: params.action
}, {
agentId,
sessionKey: params.sessionKey,
sessionId: prevEntry?.sessionId,
workspaceDir: params.workspaceDir
});
} catch (err) {
logVerbose(`before_reset hook failed: ${String(err)}`);
}
})();
}
return { routedReply };
}
//#endregion
export { readBeforeResetMessages as n, emitResetCommandHooks as t };