openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
134 lines (133 loc) • 4.57 kB
JavaScript
import { w as hasSessionAutoModelFallbackProvenance } from "./agent-scope-MrLta7Pq.js";
import { u as resolveStorePath } from "./paths-NEwU8m3X.js";
import { t as loadSessionStore } from "./store-load-C4uq6Lrq.js";
import { c as resolveSessionLifecycleTimestamps } from "./sessions-D6zZvoxX.js";
import { c as resolveSessionResetPolicy, o as evaluateSessionFreshness } from "./reset-D9vnBMp0.js";
import { n as clearBootstrapSnapshotOnSessionRollover } from "./bootstrap-cache-CGyy0R7Z.js";
import crypto from "node:crypto";
//#region src/cron/isolated-agent/session.ts
/** Resolves session rollover and carried state for isolated cron runs. */
const FRESH_CRON_CARRIED_PREFERENCE_FIELDS = [
"heartbeatTaskState",
"chatType",
"thinkingLevel",
"fastMode",
"verboseLevel",
"traceLevel",
"reasoningLevel",
"ttsAuto",
"responseUsage",
"label",
"displayName"
];
const AMBIENT_SESSION_CONTEXT_FIELDS = [
"elevatedLevel",
"groupActivation",
"groupActivationNeedsSystemIntro",
"sendPolicy",
"queueMode",
"queueDebounceMs",
"queueCap",
"queueDrop",
"channel",
"groupId",
"subject",
"groupChannel",
"space",
"origin",
"acp"
];
function cloneSessionField(value) {
return globalThis.structuredClone(value);
}
function copySessionFields(target, entry, fields) {
for (const field of fields) if (entry[field] !== void 0) target[field] = cloneSessionField(entry[field]);
}
function preserveNonAutoModelOverride(target, entry) {
const recoveredAutoFallbackOverride = entry.modelOverrideSource === void 0 && hasSessionAutoModelFallbackProvenance(entry);
if (entry.modelOverrideSource !== "auto" && !recoveredAutoFallbackOverride) {
if (entry.modelOverride !== void 0) target.modelOverride = entry.modelOverride;
if (entry.providerOverride !== void 0) target.providerOverride = entry.providerOverride;
if (entry.modelOverrideSource !== void 0) target.modelOverrideSource = entry.modelOverrideSource;
}
}
function preserveUserAuthOverride(target, entry) {
if (entry.authProfileOverrideSource === "user") {
if (entry.authProfileOverride !== void 0) target.authProfileOverride = entry.authProfileOverride;
target.authProfileOverrideSource = entry.authProfileOverrideSource;
if (entry.authProfileOverrideCompactionCount !== void 0) target.authProfileOverrideCompactionCount = entry.authProfileOverrideCompactionCount;
}
}
function sanitizeFreshCronSessionEntry(entry, options) {
const next = {};
copySessionFields(next, entry, FRESH_CRON_CARRIED_PREFERENCE_FIELDS);
if (options.preserveAmbientContext) copySessionFields(next, entry, AMBIENT_SESSION_CONTEXT_FIELDS);
preserveNonAutoModelOverride(next, entry);
preserveUserAuthOverride(next, entry);
return next;
}
/** Resolves or rolls over the cron session entry for one isolated-agent run. */
function resolveCronSession(params) {
const sessionCfg = params.cfg.session;
const storePath = resolveStorePath(sessionCfg?.store, { agentId: params.agentId });
const store = params.store ?? loadSessionStore(storePath);
const entry = store[params.sessionKey];
let sessionId;
let isNewSession;
let systemSent;
if (!params.forceNew && entry?.sessionId) {
const resetPolicy = resolveSessionResetPolicy({
sessionCfg,
resetType: "direct"
});
if (evaluateSessionFreshness({
updatedAt: entry.updatedAt,
...resolveSessionLifecycleTimestamps({
entry,
agentId: params.agentId,
storePath
}),
now: params.nowMs,
policy: resetPolicy
}).fresh) {
sessionId = entry.sessionId;
isNewSession = false;
systemSent = entry.systemSent ?? false;
} else {
sessionId = crypto.randomUUID();
isNewSession = true;
systemSent = false;
}
} else {
sessionId = crypto.randomUUID();
isNewSession = true;
systemSent = false;
}
const previousSessionId = isNewSession ? entry?.sessionId : void 0;
clearBootstrapSnapshotOnSessionRollover({
sessionKey: params.sessionKey,
previousSessionId
});
const baseEntry = entry ? isNewSession ? sanitizeFreshCronSessionEntry(entry, { preserveAmbientContext: !params.forceNew }) : entry : void 0;
return {
storePath,
store,
sessionEntry: {
...baseEntry,
sessionId,
updatedAt: params.nowMs,
sessionStartedAt: isNewSession ? params.nowMs : baseEntry?.sessionStartedAt ?? resolveSessionLifecycleTimestamps({
entry,
agentId: params.agentId,
storePath
}).sessionStartedAt,
lastInteractionAt: isNewSession ? params.nowMs : baseEntry?.lastInteractionAt,
systemSent
},
systemSent,
isNewSession,
previousSessionId
};
}
//#endregion
export { resolveCronSession as t };