|
| 1 | +// Covers CLI turn compaction lifecycle and external CLI resume-state cleanup. |
1 | 2 | import fs from "node:fs/promises"; |
2 | 3 | import os from "node:os"; |
3 | 4 | import path from "node:path"; |
@@ -42,6 +43,8 @@ function buildContextEngine(params: { |
42 | 43 | } |
43 | 44 |
|
44 | 45 | async function writeSessionFile(params: { sessionFile: string; sessionId: string }) { |
| 46 | + // The lifecycle compacts canonical OpenClaw session JSONL, so tests write the |
| 47 | + // same session/message envelope the real store appends. |
45 | 48 | await fs.mkdir(path.dirname(params.sessionFile), { recursive: true }); |
46 | 49 | await fs.writeFile( |
47 | 50 | params.sessionFile, |
@@ -116,6 +119,8 @@ describe("runCliTurnCompactionLifecycle", () => { |
116 | 119 | const compactCalls: Array<Parameters<ContextEngine["compact"]>[0]> = []; |
117 | 120 | const maintenance = vi.fn(async () => ({ changed: false, bytesFreed: 0, rewrittenEntries: 0 })); |
118 | 121 | const settingsCwds: string[] = []; |
| 122 | + // Compaction settings should be resolved against the task cwd, not the |
| 123 | + // bootstrap workspace, because CLI prompts may run from nested repos. |
119 | 124 | setCliCompactionTestDeps({ |
120 | 125 | resolveContextEngine: async () => buildContextEngine({ compactCalls }), |
121 | 126 | createPreparedEmbeddedAgentSettingsManager: async (params) => { |
@@ -183,6 +188,8 @@ describe("runCliTurnCompactionLifecycle", () => { |
183 | 188 | expect(maintenanceCall?.sessionKey).toBe(sessionKey); |
184 | 189 | expect(maintenanceCall?.sessionFile).toBe(sessionFile); |
185 | 190 | expect(updatedEntry?.compactionCount).toBe(1); |
| 191 | + // Once OpenClaw rewrites the transcript, external CLI resume ids are stale |
| 192 | + // and must be cleared so the next turn starts from the compacted prompt. |
186 | 193 | expect(updatedEntry?.cliSessionBindings?.["claude-cli"]).toBeUndefined(); |
187 | 194 | expect(updatedEntry?.cliSessionIds?.["claude-cli"]).toBeUndefined(); |
188 | 195 | expect(updatedEntry?.claudeCliSessionId).toBeUndefined(); |
|
0 commit comments