feat(compact): add optional cancellation signal to the compact seam methods

This commit is contained in:
Hypatia May
2026-06-23 15:45:35 +08:00
parent bdaf9f651d
commit f4180bd764
4 changed files with 47 additions and 6 deletions
+31 -2
View File
@@ -11,11 +11,27 @@ import { Session, SessionId } from '@deepseek-ai/dsh-session'
* declaration merge.
*/
class StubCompactService extends CompactService {
override async compactIfNeeded(_session: Session, _systemPrompt?: string, _model?: string): Promise<CompactionResult | null> {
/** Records the signal handed to the most recent call, to prove it threads through. */
lastSignal: AbortSignal | undefined
override async compactIfNeeded(
_session: Session,
_systemPrompt?: string,
_model?: string,
signal?: AbortSignal,
): Promise<CompactionResult | null> {
this.lastSignal = signal
return null
}
override async compactRegion(session: Session, start: number, end: number, _model: string): Promise<CompactionResult> {
override async compactRegion(
session: Session,
start: number,
end: number,
_model: string,
signal?: AbortSignal,
): Promise<CompactionResult> {
this.lastSignal = signal
// Minimal stub honoring the lock + log-only event contract.
const startEvent = session.append('compact/start', { turn: 0 })
const summaryEvent = session.append('compact/summary', {
@@ -75,4 +91,17 @@ describe('CompactService seam', () => {
expect(result.summarySeq).toBeGreaterThan(result.startSeq)
expect(result.endSeq).toBeGreaterThan(result.summarySeq)
})
it('threads the cancellation signal through to the backend', async () => {
const ctx = new Context()
const svc = new StubCompactService(ctx)
const session = new Session(SessionId('s'))
const controller = new AbortController()
await svc.compactRegion(session, 0, 0, 'm', controller.signal)
expect(svc.lastSignal).toBe(controller.signal)
await svc.compactIfNeeded(session, undefined, undefined, controller.signal)
expect(svc.lastSignal).toBe(controller.signal)
})
})