From 551dbc95f28d0ef9ffa2c2fe4494709b8ebb7229 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Fri, 6 Feb 2026 11:21:53 +0900 Subject: [PATCH] feat(hooks): register task-continuation-enforcer in plugin lifecycle Integrates at 4 points: creation (gated by task_system), session recovery callbacks, event handler, and stop-continuation command. --- src/hooks/index.ts | 1 + src/index.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/hooks/index.ts b/src/hooks/index.ts index bffb447e..b97c6863 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -1,4 +1,5 @@ export { createTodoContinuationEnforcer, type TodoContinuationEnforcer } from "./todo-continuation-enforcer"; +export { createTaskContinuationEnforcer, type TaskContinuationEnforcer } from "./task-continuation-enforcer"; export { createContextWindowMonitorHook } from "./context-window-monitor"; export { createSessionNotification } from "./session-notification"; export { createSessionRecoveryHook, type SessionRecoveryHook, type SessionRecoveryOptions } from "./session-recovery"; diff --git a/src/index.ts b/src/index.ts index baf4f959..cde0398c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,7 @@ import type { Plugin, ToolDefinition } from "@opencode-ai/plugin"; import { createTodoContinuationEnforcer, + createTaskContinuationEnforcer, createContextWindowMonitorHook, createSessionRecoveryHook, createSessionNotification, @@ -478,6 +479,21 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { }); const taskSystemEnabled = pluginConfig.experimental?.task_system ?? false; + + const taskContinuationEnforcer = isHookEnabled("task-continuation-enforcer") && taskSystemEnabled + ? createTaskContinuationEnforcer(ctx, pluginConfig, { + backgroundManager, + isContinuationStopped: stopContinuationGuard?.isStopped, + }) + : null; + + if (sessionRecovery && taskContinuationEnforcer) { + sessionRecovery.setOnAbortCallback(taskContinuationEnforcer.markRecovering); + sessionRecovery.setOnRecoveryCompleteCallback( + taskContinuationEnforcer.markRecoveryComplete, + ); + } + const taskToolsRecord: Record = taskSystemEnabled ? { task_create: createTaskCreateTool(pluginConfig, ctx), @@ -627,6 +643,7 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { await backgroundNotificationHook?.event(input); await sessionNotification?.(input); await todoContinuationEnforcer?.handler(input); + await taskContinuationEnforcer?.handler(input); await unstableAgentBabysitter?.event(input); await contextWindowMonitor?.event(input); await directoryAgentsInjector?.event(input); @@ -810,6 +827,7 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { if (command === "stop-continuation" && sessionID) { stopContinuationGuard?.stop(sessionID); todoContinuationEnforcer?.cancelAllCountdowns(); + taskContinuationEnforcer?.cancelAllCountdowns(); ralphLoop?.cancelLoop(sessionID); clearBoulderState(ctx.directory); log("[stop-continuation] All continuation mechanisms stopped", {