fix(continuation): auto-continue GPT permission-seeking replies

Resume GPT sessions when the last assistant reply ends in a permission-seeking tail, while honoring stop-continuation and avoiding duplicate continuation across todo and atlas flows.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-03-11 21:19:29 +09:00
parent 3f364cc8df
commit a1b060841f
22 changed files with 617 additions and 4 deletions
+1
View File
@@ -170,6 +170,7 @@ export function createEventHandler(args: {
await Promise.resolve(hooks.claudeCodeHooks?.event?.(input));
await Promise.resolve(hooks.backgroundNotificationHook?.event?.(input));
await Promise.resolve(hooks.sessionNotification?.(input));
await Promise.resolve(hooks.gptPermissionContinuation?.handler?.(input));
await Promise.resolve(hooks.todoContinuationEnforcer?.handler?.(input));
await Promise.resolve(hooks.unstableAgentBabysitter?.event?.(input));
await Promise.resolve(hooks.contextWindowMonitor?.event?.(input));
+15 -1
View File
@@ -3,6 +3,7 @@ import type { BackgroundManager } from "../../features/background-agent"
import type { PluginContext } from "../types"
import {
createGptPermissionContinuationHook,
createTodoContinuationEnforcer,
createBackgroundNotificationHook,
createStopContinuationGuardHook,
@@ -14,6 +15,7 @@ import { safeCreateHook } from "../../shared/safe-create-hook"
import { createUnstableAgentBabysitter } from "../unstable-agent-babysitter"
export type ContinuationHooks = {
gptPermissionContinuation: ReturnType<typeof createGptPermissionContinuationHook> | null
stopContinuationGuard: ReturnType<typeof createStopContinuationGuardHook> | null
compactionContextInjector: ReturnType<typeof createCompactionContextInjector> | null
compactionTodoPreserver: ReturnType<typeof createCompactionTodoPreserverHook> | null
@@ -55,6 +57,13 @@ export function createContinuationHooks(args: {
}))
: null
const gptPermissionContinuation = isHookEnabled("gpt-permission-continuation")
? safeHook("gpt-permission-continuation", () =>
createGptPermissionContinuationHook(ctx, {
isContinuationStopped: stopContinuationGuard?.isStopped,
}))
: null
const compactionContextInjector = isHookEnabled("compaction-context-injector")
? safeHook("compaction-context-injector", () =>
createCompactionContextInjector({ ctx, backgroundManager }))
@@ -66,9 +75,11 @@ export function createContinuationHooks(args: {
const todoContinuationEnforcer = isHookEnabled("todo-continuation-enforcer")
? safeHook("todo-continuation-enforcer", () =>
createTodoContinuationEnforcer(ctx, {
createTodoContinuationEnforcer(ctx, {
backgroundManager,
isContinuationStopped: stopContinuationGuard?.isStopped,
shouldSkipContinuation: (sessionID: string) =>
gptPermissionContinuation?.wasRecentlyInjected(sessionID) ?? false,
}))
: null
@@ -111,12 +122,15 @@ export function createContinuationHooks(args: {
backgroundManager,
isContinuationStopped: (sessionID: string) =>
stopContinuationGuard?.isStopped(sessionID) ?? false,
shouldSkipContinuation: (sessionID: string) =>
gptPermissionContinuation?.wasRecentlyInjected(sessionID) ?? false,
agentOverrides: pluginConfig.agents,
autoCommit: pluginConfig.start_work?.auto_commit,
}))
: null
return {
gptPermissionContinuation,
stopContinuationGuard,
compactionContextInjector,
compactionTodoPreserver,