Skip to content

Commit dee66a9

Browse files
fix(agents): preserve cron heartbeat suppression during compaction
Carry the original embedded-run trigger into overflow compaction so cron-origin sessions do not regain the heartbeat prompt when the system prompt is rebuilt. Made-with: Cursor
1 parent 5e9ea80 commit dee66a9

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

src/agents/pi-embedded-runner/compact.hooks.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,32 @@ beforeEach(() => {
107107
resetCompactHooksHarnessMocks();
108108
});
109109

110+
describe("compaction heartbeat prompt policy", () => {
111+
it("suppresses heartbeat prompt rebuilds for cron-origin compaction", () => {
112+
expect(
113+
compactTesting.shouldInjectHeartbeatPromptDuringCompaction({
114+
isDefaultAgent: true,
115+
sourceTrigger: "cron",
116+
}),
117+
).toBe(false);
118+
});
119+
120+
it("preserves heartbeat prompt rebuilds for non-cron compaction", () => {
121+
expect(
122+
compactTesting.shouldInjectHeartbeatPromptDuringCompaction({
123+
isDefaultAgent: true,
124+
sourceTrigger: "memory",
125+
}),
126+
).toBe(true);
127+
expect(
128+
compactTesting.shouldInjectHeartbeatPromptDuringCompaction({
129+
isDefaultAgent: false,
130+
sourceTrigger: "cron",
131+
}),
132+
).toBe(false);
133+
});
134+
});
135+
110136
describe("compactEmbeddedPiSessionDirect hooks", () => {
111137
beforeEach(() => {
112138
ensureRuntimePluginsLoaded.mockReset();

src/agents/pi-embedded-runner/compact.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ import { resolveGlobalLane, resolveSessionLane } from "./lanes.js";
9999
import { log } from "./logger.js";
100100
import { buildEmbeddedMessageActionDiscoveryInput } from "./message-action-discovery-input.js";
101101
import { buildModelAliasLines, resolveModelAsync } from "./model.js";
102+
import type { EmbeddedRunTrigger } from "./run/params.js";
103+
import { shouldInjectHeartbeatPromptForTrigger } from "./run/trigger-policy.js";
102104
import { buildEmbeddedSandboxInfo } from "./sandbox-info.js";
103105
import { prewarmSessionFile, trackSessionManagerAccess } from "./session-manager-cache.js";
104106
import { truncateSessionAfterCompaction } from "./session-truncation.js";
@@ -153,6 +155,7 @@ export type CompactEmbeddedPiSessionParams = {
153155
tokenBudget?: number;
154156
force?: boolean;
155157
trigger?: "overflow" | "manual";
158+
sourceTrigger?: EmbeddedRunTrigger;
156159
diagId?: string;
157160
attempt?: number;
158161
maxAttempts?: number;
@@ -165,6 +168,13 @@ export type CompactEmbeddedPiSessionParams = {
165168
allowGatewaySubagentBinding?: boolean;
166169
};
167170

171+
function shouldInjectHeartbeatPromptDuringCompaction(params: {
172+
isDefaultAgent: boolean;
173+
sourceTrigger?: EmbeddedRunTrigger;
174+
}): boolean {
175+
return params.isDefaultAgent && shouldInjectHeartbeatPromptForTrigger(params.sourceTrigger);
176+
}
177+
168178
type CompactionMessageMetrics = {
169179
messages: number;
170180
historyTextChars: number;
@@ -958,7 +968,10 @@ export async function compactEmbeddedPiSessionDirect(
958968
ownerDisplay: ownerDisplay.ownerDisplay,
959969
ownerDisplaySecret: ownerDisplay.ownerDisplaySecret,
960970
reasoningTagHint,
961-
heartbeatPrompt: isDefaultAgent
971+
heartbeatPrompt: shouldInjectHeartbeatPromptDuringCompaction({
972+
isDefaultAgent,
973+
sourceTrigger: params.sourceTrigger,
974+
})
962975
? resolveHeartbeatPrompt(params.config?.agents?.defaults?.heartbeat?.prompt)
963976
: undefined,
964977
skillsPrompt,
@@ -1422,6 +1435,7 @@ export const __testing = {
14221435
hasMeaningfulConversationContent,
14231436
containsRealConversationMessages,
14241437
estimateTokensAfterCompaction,
1438+
shouldInjectHeartbeatPromptDuringCompaction,
14251439
buildBeforeCompactionHookMetrics,
14261440
runBeforeCompactionHooks,
14271441
runAfterCompactionHooks,

src/agents/pi-embedded-runner/run.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,7 @@ export async function runEmbeddedPiAgent(
11561156
}),
11571157
runId: params.runId,
11581158
trigger: "overflow",
1159+
sourceTrigger: params.trigger,
11591160
...(observedOverflowTokens !== undefined
11601161
? { currentTokenCount: observedOverflowTokens }
11611162
: {}),

0 commit comments

Comments
 (0)