File size: 2,214 Bytes
4440aec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Covers abort-cutoff clearing against missing persisted rows.
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { describe, expect, it } from "vitest";
import { loadSessionEntry } from "../../config/sessions/session-accessor.js";
import type { SessionEntry } from "../../config/sessions/types.js";
import { clearAbortCutoffInSessionRuntime } from "./abort-cutoff.runtime.js";

async function withTempStore<T>(run: (storePath: string) => Promise<T>): Promise<T> {
  const dir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-abort-cutoff-"));
  try {
    return await run(path.join(dir, "sessions.json"));
  } finally {
    await fs.rm(dir, { recursive: true, force: true });
  }
}

describe("clearAbortCutoffInSessionRuntime", () => {
  it("recreates a complete persisted row when clearing abort cutoff state", async () => {
    await withTempStore(async (storePath) => {
      const sessionKey = "agent:main:explicit:cutoff-missing-row";
      const entry: SessionEntry = {
        sessionId: "cutoff-session",
        updatedAt: 1,
        modelProvider: "anthropic",
        model: "claude-opus-4-6",
        abortCutoffMessageSid: "msg-42",
        abortCutoffTimestamp: 123,
      };
      const sessionStore: Record<string, SessionEntry> = { [sessionKey]: entry };

      const cleared = await clearAbortCutoffInSessionRuntime({
        sessionEntry: entry,
        sessionStore,
        sessionKey,
        storePath,
      });

      const persisted = loadSessionEntry({ storePath, sessionKey });
      expect(cleared).toBe(true);
      expect(sessionStore[sessionKey]?.sessionId).toBe("cutoff-session");
      expect(sessionStore[sessionKey]?.modelProvider).toBe("anthropic");
      expect(sessionStore[sessionKey]?.abortCutoffMessageSid).toBeUndefined();
      expect(sessionStore[sessionKey]?.abortCutoffTimestamp).toBeUndefined();
      expect(persisted?.sessionId).toBe("cutoff-session");
      expect(persisted?.modelProvider).toBe("anthropic");
      expect(persisted?.model).toBe("claude-opus-4-6");
      expect(persisted?.abortCutoffMessageSid).toBeUndefined();
      expect(persisted?.abortCutoffTimestamp).toBeUndefined();
    });
  });
});