File size: 4,177 Bytes
eb3f11e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { realpath } from "node:fs/promises";
import { join } from "node:path";
import { expectDefined } from "@openclaw/normalization-core";
import { afterEach, expect, it } from "vitest";
import { useAutoCleanupTempDirTracker } from "../../../test/helpers/temp-dir.js";
import {
  acquireAgentRunPreparedModelRuntimeMock,
  contextEngineCompactMock,
  loadCompactHooksHarness,
  resetCompactHooksHarnessMocks,
  resolveContextEngineMock,
  resolveModelAsyncMock,
} from "./compact.hooks.harness.js";

const { compactEmbeddedAgentSession } = await loadCompactHooksHarness();
const { AsyncWorkScope } = await import("../../shared/async-work-scope.js");
const [{ upsertSessionEntryCore }, { closeOpenClawAgentDatabasesForTest }] = await Promise.all([
  import("../../config/sessions/session-accessor.js"),
  import("../../state/openclaw-agent-db.js"),
]);
const tempDirs = useAutoCleanupTempDirTracker((cleanup) =>
  afterEach(() => {
    closeOpenClawAgentDatabasesForTest();
    cleanup();
  }),
);

it("uses the admitted config and agent storage throughout queued compaction", async () => {
  const workspaceDir = await realpath(tempDirs.make("openclaw-compaction-generation-"));
  resetCompactHooksHarnessMocks(workspaceDir);
  const sessionTarget = {
    agentId: "main",
    sessionId: "compaction-generation",
    sessionKey: "agent:main:compaction-generation",
    storePath: join(workspaceDir, "sessions.sqlite"),
  };
  await upsertSessionEntryCore(sessionTarget, { sessionId: sessionTarget.sessionId, updatedAt: 1 });
  const admittedAgentDir = join(workspaceDir, "admitted-agent");
  const requestedConfig = {
    agents: { defaults: { compaction: { model: "openai/requested-model" } } },
  };
  const admittedConfig = {
    agents: { defaults: { compaction: { model: "openai/admitted-model" } } },
  };
  const acquire = expectDefined(
    acquireAgentRunPreparedModelRuntimeMock.getMockImplementation(),
    "prepared runtime acquisition",
  );
  acquireAgentRunPreparedModelRuntimeMock.mockImplementationOnce(async (input) =>
    acquire({ ...input, config: admittedConfig, agentDir: admittedAgentDir }),
  );

  const parent = new AsyncWorkScope();
  let result: Awaited<ReturnType<typeof compactEmbeddedAgentSession>>;
  try {
    result = await parent.run(() =>
      compactEmbeddedAgentSession({
        ...sessionTarget,
        sessionTarget,
        sessionFile: sessionTarget.sessionKey,
        workspaceDir,
        allowGatewaySubagentBinding: true,
        provider: "openai",
        model: "gpt-5.6-luna",
        config: requestedConfig,
        enqueue: async (task) => await task(),
      }),
    );
  } finally {
    await AsyncWorkScope.runWhenAllIdle(
      () => [parent],
      () => parent.drain(),
    );
  }

  expect(result).toMatchObject({ ok: true, compacted: true });
  const { snapshot, [Symbol.asyncDispose]: release } = await expectDefined(
    acquireAgentRunPreparedModelRuntimeMock.mock.results[0]?.value,
    "admitted runtime lease",
  );
  const derive = expectDefined(
    acquireAgentRunPreparedModelRuntimeMock.mock.calls[0]?.[1]?.deriveRuntimePluginSelections,
    "admitted compaction selection recipe",
  );
  expect(
    derive({ config: admittedConfig, metadataSnapshot: snapshot.metadataSnapshot }),
  ).toMatchObject([{ provider: "openai", modelId: "admitted-model", agentId: "main" }]);
  expect(resolveContextEngineMock).toHaveBeenCalledWith(admittedConfig, {
    agentDir: admittedAgentDir,
    workspaceDir,
  });
  expect(resolveModelAsyncMock).toHaveBeenCalledWith(
    "openai",
    "admitted-model",
    admittedAgentDir,
    admittedConfig,
    expect.objectContaining({ preparedModelRuntime: snapshot, skipAgentDiscovery: true }),
  );
  expect(contextEngineCompactMock).toHaveBeenCalledWith(
    expect.objectContaining({
      runtimeContext: expect.objectContaining({
        config: admittedConfig,
        agentDir: admittedAgentDir,
        workspaceDir,
        provider: "openai",
        model: "admitted-model",
        sessionTarget,
      }),
    }),
  );
  expect(release).toHaveBeenCalledOnce();
  expect(requestedConfig.agents.defaults.compaction.model).toBe("openai/requested-model");
});