* feat(sessions): add channelIdleMinutes config for per-channel session idle durations
Add new `channelIdleMinutes` config option to allow different session idle
timeouts per channel. For example, Discord sessions can now be configured
to last 7 days (10080 minutes) while other channels use shorter defaults.
Config example:
sessions:
channelIdleMinutes:
discord: 10080 # 7 days
The channel-specific idle is passed as idleMinutesOverride to the existing
resolveSessionResetPolicy, integrating cleanly with the new reset policy
architecture.
* fix
* feat: add per-channel session reset overrides (#1353) (thanks @cash-echo-bot)
---------
Co-authored-by: Cash Williams <cashwilliams@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
|
|
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import { saveSessionStore } from "../../config/sessions.js";
|
|
import { getSessionSnapshot } from "./session-snapshot.js";
|
|
|
|
describe("getSessionSnapshot", () => {
|
|
it("uses channel reset overrides when configured", async () => {
|
|
vi.useFakeTimers();
|
|
vi.setSystemTime(new Date(2026, 0, 18, 5, 0, 0));
|
|
try {
|
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-snapshot-"));
|
|
const storePath = path.join(root, "sessions.json");
|
|
const sessionKey = "agent:main:whatsapp:dm:S1";
|
|
|
|
await saveSessionStore(storePath, {
|
|
[sessionKey]: {
|
|
sessionId: "snapshot-session",
|
|
updatedAt: new Date(2026, 0, 18, 3, 30, 0).getTime(),
|
|
lastChannel: "whatsapp",
|
|
},
|
|
});
|
|
|
|
const cfg = {
|
|
session: {
|
|
store: storePath,
|
|
reset: { mode: "daily", atHour: 4, idleMinutes: 240 },
|
|
resetByChannel: {
|
|
whatsapp: { mode: "idle", idleMinutes: 360 },
|
|
},
|
|
},
|
|
} as Parameters<typeof getSessionSnapshot>[0];
|
|
|
|
const snapshot = getSessionSnapshot(cfg, "whatsapp:+15550001111", true, {
|
|
sessionKey,
|
|
});
|
|
|
|
expect(snapshot.resetPolicy.mode).toBe("idle");
|
|
expect(snapshot.resetPolicy.idleMinutes).toBe(360);
|
|
expect(snapshot.fresh).toBe(true);
|
|
expect(snapshot.dailyResetAt).toBeUndefined();
|
|
} finally {
|
|
vi.useRealTimers();
|
|
}
|
|
});
|
|
});
|