Skip to content

Commit a85f2b5

Browse files
authored
Merge pull request #2289 from netease-youdao/liuzhq/fix-compress-loading
fix(cowork): clear stalled compaction retry maintenance
2 parents 3656684 + 4cd8bd0 commit a85f2b5

2 files changed

Lines changed: 49 additions & 4 deletions

File tree

src/main/libs/agentEngine/openclawRuntimeAdapter.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4161,6 +4161,51 @@ test('compaction stream shows context maintenance state while keeping the sessio
41614161
expect(adapter.activeTurns.has(session.id)).toBe(true);
41624162
});
41634163

4164+
test('compaction retry wait clears context maintenance when no follow-up arrives', async () => {
4165+
vi.useFakeTimers();
4166+
try {
4167+
const { session, store } = createReconcileStore([
4168+
{ id: 'msg-1', type: 'user', content: 'continue the task', timestamp: 1, metadata: {} },
4169+
]);
4170+
const adapter = new OpenClawRuntimeAdapter(store, {});
4171+
const sessionKey = `agent:main:lobsterai:${session.id}`;
4172+
const maintenanceSpy = vi.fn();
4173+
const completeSpy = vi.fn();
4174+
4175+
session.status = 'running';
4176+
adapter.on('contextMaintenance', maintenanceSpy);
4177+
adapter.on('complete', completeSpy);
4178+
adapter.activeTurns.set(session.id, createActiveTurn(session.id, sessionKey, 'run-compaction-timeout'));
4179+
4180+
adapter.handleAgentEvent({
4181+
runId: 'run-compaction-timeout',
4182+
sessionKey,
4183+
stream: 'compaction',
4184+
data: { phase: 'start' },
4185+
}, 1);
4186+
4187+
adapter.handleAgentEvent({
4188+
runId: 'run-compaction-timeout',
4189+
sessionKey,
4190+
stream: 'compaction',
4191+
data: { phase: 'end', completed: true, willRetry: true },
4192+
}, 2);
4193+
4194+
expect(maintenanceSpy).toHaveBeenLastCalledWith(session.id, true);
4195+
expect(adapter.activeTurns.has(session.id)).toBe(true);
4196+
4197+
await vi.advanceTimersByTimeAsync(120_000);
4198+
await Promise.resolve();
4199+
4200+
expect(maintenanceSpy).toHaveBeenLastCalledWith(session.id, false);
4201+
expect(completeSpy).toHaveBeenCalledWith(session.id, 'run-compaction-timeout');
4202+
expect(session.status).toBe('completed');
4203+
expect(adapter.activeTurns.has(session.id)).toBe(false);
4204+
} finally {
4205+
vi.useRealTimers();
4206+
}
4207+
});
4208+
41644209
test('chat error clears context maintenance after compaction starts', () => {
41654210
const { session, store } = createReconcileStore([
41664211
{ id: 'msg-1', type: 'user', content: 'continue the task', timestamp: 1, metadata: {} },

src/main/libs/agentEngine/openclawRuntimeAdapter.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6521,10 +6521,10 @@ export class OpenClawRuntimeAdapter extends EventEmitter implements CoworkRuntim
65216521
this.updateContextCompactionMessage(sessionId, turn, compactionStatus, Date.now());
65226522
}
65236523
if (turn && willRetry) {
6524-
turn.pendingRecoverableFollowup = true;
6525-
turn.pendingOpenClawRetry = true;
6526-
turn.lastRecoverableFinalAtMs = Date.now();
6527-
this.emitContextMaintenance(sessionId, true);
6524+
this.waitForRecoverableOpenClawRetry(sessionId, turn, turn.runId, {
6525+
reason: 'context compaction requested retry',
6526+
graceMs: OpenClawRuntimeAdapter.VISIBLE_FINAL_CONTINUATION_GRACE_MS,
6527+
});
65286528
} else {
65296529
this.emitContextMaintenance(sessionId, false);
65306530
}

0 commit comments

Comments
 (0)