feat(compaction): add delegated agent sessions section with resume directive

Adds §8 to compaction prompt instructing the LLM to preserve spawned agent
session IDs and resume them post-compaction instead of starting fresh.
Injects actual TaskHistory data when BackgroundManager is available.
This commit is contained in:
YeonGyu-Kim 2026-02-13 17:40:29 +09:00
parent a413e57676
commit 0946a6c8f3
2 changed files with 63 additions and 2 deletions

View File

@ -1,3 +1,4 @@
import type { BackgroundManager } from "../../features/background-agent"
import { import {
createSystemDirective, createSystemDirective,
SystemDirectiveTypes, SystemDirectiveTypes,
@ -47,9 +48,25 @@ When summarizing this session, you MUST include the following sections in your s
This section is CRITICAL for reviewer agents (momus, oracle) to maintain continuity. This section is CRITICAL for reviewer agents (momus, oracle) to maintain continuity.
## 8. Delegated Agent Sessions
- List ALL background agent tasks spawned during this session
- For each: agent name, category, status, description, and **session_id**
- **RESUME, DON'T RESTART.** Each listed session retains full context. After compaction, use \`session_id\` to continue existing agent sessions instead of spawning new ones. This saves tokens, preserves learned context, and prevents duplicate work.
This context is critical for maintaining continuity after compaction. This context is critical for maintaining continuity after compaction.
` `
export function createCompactionContextInjector() { export function createCompactionContextInjector(backgroundManager?: BackgroundManager) {
return (): string => COMPACTION_CONTEXT_PROMPT return (sessionID?: string): string => {
let prompt = COMPACTION_CONTEXT_PROMPT
if (backgroundManager && sessionID) {
const history = backgroundManager.taskHistory.formatForCompaction(sessionID)
if (history) {
prompt += `\n### Active/Recent Delegated Sessions\n${history}\n`
}
}
return prompt
}
} }

View File

@ -15,6 +15,7 @@ mock.module("../../shared/system-directive", () => ({
})) }))
import { createCompactionContextInjector } from "./index" import { createCompactionContextInjector } from "./index"
import { TaskHistory } from "../../features/background-agent/task-history"
describe("createCompactionContextInjector", () => { describe("createCompactionContextInjector", () => {
describe("Agent Verification State preservation", () => { describe("Agent Verification State preservation", () => {
@ -69,4 +70,47 @@ describe("createCompactionContextInjector", () => {
expect(prompt).toContain("Do NOT invent") expect(prompt).toContain("Do NOT invent")
expect(prompt).toContain("Quote constraints verbatim") expect(prompt).toContain("Quote constraints verbatim")
}) })
describe("Delegated Agent Sessions", () => {
it("includes delegated sessions section in compaction prompt", async () => {
//#given
const injector = createCompactionContextInjector()
//#when
const prompt = injector()
//#then
expect(prompt).toContain("Delegated Agent Sessions")
expect(prompt).toContain("RESUME, DON'T RESTART")
expect(prompt).toContain("session_id")
})
it("injects actual task history when backgroundManager and sessionID provided", async () => {
//#given
const mockManager = { taskHistory: new TaskHistory() } as any
mockManager.taskHistory.record("ses_parent", { id: "t1", sessionID: "ses_child", agent: "explore", description: "Find patterns", status: "completed", category: "quick" })
const injector = createCompactionContextInjector(mockManager)
//#when
const prompt = injector("ses_parent")
//#then
expect(prompt).toContain("Active/Recent Delegated Sessions")
expect(prompt).toContain("**explore**")
expect(prompt).toContain("[quick]")
expect(prompt).toContain("`ses_child`")
})
it("does not inject task history section when no entries exist", async () => {
//#given
const mockManager = { taskHistory: new TaskHistory() } as any
const injector = createCompactionContextInjector(mockManager)
//#when
const prompt = injector("ses_empty")
//#then
expect(prompt).not.toContain("Active/Recent Delegated Sessions")
})
})
}) })