Skip to content

Commit 1d1f5c5

Browse files
authored
Merge pull request #596 from LHMQ878/fix/590-manual-mode-compress-pending
fix: reset compress-pending manual mode after compression
2 parents d455619 + 42ac1a0 commit 1d1f5c5

2 files changed

Lines changed: 129 additions & 1 deletion

File tree

lib/compress/pipeline.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,15 @@ export async function finalizeSession(
8585
entries: NotificationEntry[],
8686
batchTopic: string | undefined,
8787
): Promise<void> {
88-
ctx.state.manualMode = ctx.state.manualMode ? "active" : false
88+
if (ctx.state.manualMode === "compress-pending") {
89+
ctx.state.manualMode = false
90+
await refreshManualMode(
91+
ctx.state,
92+
toolCtx.sessionID,
93+
ctx.logger,
94+
ctx.config.manualMode.enabled,
95+
)
96+
}
8997
applyPendingCompressionDurations(ctx.state)
9098
await saveSessionState(ctx.state, ctx.logger)
9199

tests/finalize-session.test.ts

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import assert from "node:assert/strict"
2+
import test from "node:test"
3+
import { finalizeSession } from "../lib/compress/pipeline"
4+
import type { PluginConfig } from "../lib/config"
5+
import { Logger } from "../lib/logger"
6+
import {
7+
createSessionState,
8+
loadManualModeSetting,
9+
saveManualModeSetting,
10+
type WithParts,
11+
} from "../lib/state"
12+
13+
function buildConfig(manualMode = false): PluginConfig {
14+
return {
15+
enabled: true,
16+
debug: false,
17+
pruneNotification: "off",
18+
pruneNotificationType: "chat",
19+
commands: { enabled: true, protectedTools: [] },
20+
manualMode: { enabled: manualMode, automaticStrategies: true },
21+
turnProtection: { enabled: false, turns: 4 },
22+
experimental: { allowSubAgents: false, customPrompts: false },
23+
protectedFilePatterns: [],
24+
compress: {
25+
mode: "message",
26+
permission: "allow",
27+
showCompression: false,
28+
maxContextLimit: 150000,
29+
minContextLimit: 50000,
30+
nudgeFrequency: 5,
31+
iterationNudgeThreshold: 15,
32+
nudgeForce: "soft",
33+
protectedTools: ["task"],
34+
protectTags: false,
35+
protectUserMessages: false,
36+
},
37+
strategies: {
38+
deduplication: { enabled: true, protectedTools: [] },
39+
purgeErrors: { enabled: true, turns: 4, protectedTools: [] },
40+
},
41+
} as PluginConfig
42+
}
43+
44+
function buildToolContext(state: ReturnType<typeof createSessionState>, manualMode = false) {
45+
return {
46+
client: { session: { get: async () => ({}) } },
47+
state,
48+
logger: new Logger(false),
49+
config: buildConfig(manualMode),
50+
prompts: {
51+
reload() {},
52+
getRuntimePrompts() {
53+
return {} as any
54+
},
55+
},
56+
}
57+
}
58+
59+
test("finalizeSession resets compress-pending to auto mode", async () => {
60+
const sessionId = `finalize-compress-pending-${Date.now()}`
61+
const state = createSessionState()
62+
state.sessionId = sessionId
63+
state.manualMode = "compress-pending"
64+
65+
await finalizeSession(
66+
buildToolContext(state) as any,
67+
{ sessionID: sessionId, metadata: () => {}, ask: async () => {} },
68+
[] as WithParts[],
69+
[],
70+
undefined,
71+
)
72+
73+
assert.equal(state.manualMode, false)
74+
75+
const persisted = await loadManualModeSetting(sessionId, new Logger(false))
76+
assert.equal(persisted, false)
77+
})
78+
79+
test("finalizeSession restores persisted manual mode after compression", async () => {
80+
const sessionId = `finalize-persisted-manual-${Date.now()}`
81+
const logger = new Logger(false)
82+
await saveManualModeSetting(sessionId, true, logger)
83+
84+
const state = createSessionState()
85+
state.sessionId = sessionId
86+
state.manualMode = "compress-pending"
87+
88+
await finalizeSession(
89+
buildToolContext(state) as any,
90+
{ sessionID: sessionId, metadata: () => {}, ask: async () => {} },
91+
[] as WithParts[],
92+
[],
93+
undefined,
94+
)
95+
96+
assert.equal(state.manualMode, "active")
97+
98+
const persisted = await loadManualModeSetting(sessionId, logger)
99+
assert.equal(persisted, true)
100+
})
101+
102+
test("finalizeSession restores configured manual mode after compression", async () => {
103+
const sessionId = `finalize-configured-manual-${Date.now()}`
104+
const state = createSessionState()
105+
state.sessionId = sessionId
106+
state.manualMode = "compress-pending"
107+
108+
await finalizeSession(
109+
buildToolContext(state, true) as any,
110+
{ sessionID: sessionId, metadata: () => {}, ask: async () => {} },
111+
[] as WithParts[],
112+
[],
113+
undefined,
114+
)
115+
116+
assert.equal(state.manualMode, "active")
117+
118+
const persisted = await loadManualModeSetting(sessionId, new Logger(false))
119+
assert.equal(persisted, true)
120+
})

0 commit comments

Comments
 (0)