Skip to content

Commit a3ff28b

Browse files
committed
feat(preemptive-compaction): add onBeforeSummarize callback and context injection
- Added BeforeSummarizeCallback type to allow injecting context before session summarization - Added onBeforeSummarize option to PreemptiveCompactionOptions - Created compaction-context-injector module that injects summarization instructions with sections: - User Requests (As-Is) - Final Goal - Work Completed - Remaining Tasks - MUST NOT Do (Critical Constraints) - Wired up callback invocation in preemptive-compaction before calling summarize API - Exported new hook from src/hooks/index.ts 🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
1 parent 8406f3d commit a3ff28b

File tree

4 files changed

+83
-2
lines changed

4 files changed

+83
-2
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import type { SummarizeContext } from "../preemptive-compaction"
2+
import { injectHookMessage } from "../../features/hook-message-injector"
3+
import { log } from "../../shared/logger"
4+
5+
const SUMMARIZE_CONTEXT_PROMPT = `[COMPACTION CONTEXT INJECTION]
6+
7+
When summarizing this session, you MUST include the following sections in your summary:
8+
9+
## 1. User Requests (As-Is)
10+
- List all original user requests exactly as they were stated
11+
- Preserve the user's exact wording and intent
12+
13+
## 2. Final Goal
14+
- What the user ultimately wanted to achieve
15+
- The end result or deliverable expected
16+
17+
## 3. Work Completed
18+
- What has been done so far
19+
- Files created/modified
20+
- Features implemented
21+
- Problems solved
22+
23+
## 4. Remaining Tasks
24+
- What still needs to be done
25+
- Pending items from the original request
26+
- Follow-up tasks identified during the work
27+
28+
## 5. MUST NOT Do (Critical Constraints)
29+
- Things that were explicitly forbidden
30+
- Approaches that failed and should not be retried
31+
- User's explicit restrictions or preferences
32+
- Anti-patterns identified during the session
33+
34+
This context is critical for maintaining continuity after compaction.
35+
`
36+
37+
export function createCompactionContextInjector() {
38+
return async (ctx: SummarizeContext): Promise<void> => {
39+
log("[compaction-context-injector] injecting context", { sessionID: ctx.sessionID })
40+
41+
const success = injectHookMessage(ctx.sessionID, SUMMARIZE_CONTEXT_PROMPT, {
42+
agent: "general",
43+
model: { providerID: ctx.providerID, modelID: ctx.modelID },
44+
path: { cwd: ctx.directory },
45+
})
46+
47+
if (success) {
48+
log("[compaction-context-injector] context injected", { sessionID: ctx.sessionID })
49+
} else {
50+
log("[compaction-context-injector] injection failed", { sessionID: ctx.sessionID })
51+
}
52+
}
53+
}

src/hooks/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ export { createDirectoryAgentsInjectorHook } from "./directory-agents-injector";
88
export { createDirectoryReadmeInjectorHook } from "./directory-readme-injector";
99
export { createEmptyTaskResponseDetectorHook } from "./empty-task-response-detector";
1010
export { createAnthropicAutoCompactHook, type AnthropicAutoCompactOptions } from "./anthropic-auto-compact";
11-
export { createPreemptiveCompactionHook, type PreemptiveCompactionOptions } from "./preemptive-compaction";
11+
export { createPreemptiveCompactionHook, type PreemptiveCompactionOptions, type SummarizeContext, type BeforeSummarizeCallback } from "./preemptive-compaction";
12+
export { createCompactionContextInjector } from "./compaction-context-injector";
1213
export { createThinkModeHook } from "./think-mode";
1314
export { createClaudeCodeHooksHook } from "./claude-code-hooks";
1415
export { createRulesInjectorHook } from "./rules-injector";

src/hooks/preemptive-compaction/index.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,19 @@ import {
88
} from "./constants"
99
import { log } from "../../shared/logger"
1010

11+
export interface SummarizeContext {
12+
sessionID: string
13+
providerID: string
14+
modelID: string
15+
usageRatio: number
16+
directory: string
17+
}
18+
19+
export type BeforeSummarizeCallback = (ctx: SummarizeContext) => Promise<void> | void
20+
1121
export interface PreemptiveCompactionOptions {
1222
experimental?: ExperimentalConfig
23+
onBeforeSummarize?: BeforeSummarizeCallback
1324
}
1425

1526
interface MessageInfo {
@@ -68,6 +79,7 @@ export function createPreemptiveCompactionHook(
6879
options?: PreemptiveCompactionOptions
6980
) {
7081
const experimental = options?.experimental
82+
const onBeforeSummarize = options?.onBeforeSummarize
7183
const enabled = experimental?.preemptive_compaction !== false
7284
const threshold = experimental?.preemptive_compaction_threshold ?? DEFAULT_THRESHOLD
7385

@@ -132,6 +144,16 @@ export function createPreemptiveCompactionHook(
132144
log("[preemptive-compaction] triggering compaction", { sessionID, usageRatio })
133145

134146
try {
147+
if (onBeforeSummarize) {
148+
await onBeforeSummarize({
149+
sessionID,
150+
providerID,
151+
modelID,
152+
usageRatio,
153+
directory: ctx.directory,
154+
})
155+
}
156+
135157
await ctx.client.session.summarize({
136158
path: { id: sessionID },
137159
body: { providerID, modelID },

src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
createClaudeCodeHooksHook,
1515
createAnthropicAutoCompactHook,
1616
createPreemptiveCompactionHook,
17+
createCompactionContextInjector,
1718
createRulesInjectorHook,
1819
createBackgroundNotificationHook,
1920
createAutoUpdateCheckerHook,
@@ -256,7 +257,11 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => {
256257
const anthropicAutoCompact = isHookEnabled("anthropic-auto-compact")
257258
? createAnthropicAutoCompactHook(ctx, { experimental: pluginConfig.experimental })
258259
: null;
259-
const preemptiveCompaction = createPreemptiveCompactionHook(ctx, { experimental: pluginConfig.experimental });
260+
const compactionContextInjector = createCompactionContextInjector();
261+
const preemptiveCompaction = createPreemptiveCompactionHook(ctx, {
262+
experimental: pluginConfig.experimental,
263+
onBeforeSummarize: compactionContextInjector,
264+
});
260265
const rulesInjector = isHookEnabled("rules-injector")
261266
? createRulesInjectorHook(ctx)
262267
: null;

0 commit comments

Comments
 (0)