From 166fd20a4fdaaaa39d8f999d388f19d0ff27feb7 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 5 Jan 2026 13:50:57 +0900 Subject: [PATCH] feat(hooks): add task-resume-info hook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add hook for injecting task resume information into tool outputs. Enables seamless continuation of background agent sessions. 🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) --- src/hooks/task-resume-info/index.ts | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/hooks/task-resume-info/index.ts diff --git a/src/hooks/task-resume-info/index.ts b/src/hooks/task-resume-info/index.ts new file mode 100644 index 00000000..2c42ae2a --- /dev/null +++ b/src/hooks/task-resume-info/index.ts @@ -0,0 +1,36 @@ +const TARGET_TOOLS = ["task", "Task", "call_omo_agent", "sisyphus_task"] + +const SESSION_ID_PATTERNS = [ + /Session ID: (ses_[a-zA-Z0-9_-]+)/, + /session_id: (ses_[a-zA-Z0-9_-]+)/, + /\s*session_id: (ses_[a-zA-Z0-9_-]+)/, + /sessionId: (ses_[a-zA-Z0-9_-]+)/, +] + +function extractSessionId(output: string): string | null { + for (const pattern of SESSION_ID_PATTERNS) { + const match = output.match(pattern) + if (match) return match[1] + } + return null +} + +export function createTaskResumeInfoHook() { + const toolExecuteAfter = async ( + input: { tool: string; sessionID: string; callID: string }, + output: { title: string; output: string; metadata: unknown } + ) => { + if (!TARGET_TOOLS.includes(input.tool)) return + if (output.output.startsWith("Error:") || output.output.startsWith("Failed")) return + if (output.output.includes("\nto resume:")) return + + const sessionId = extractSessionId(output.output) + if (!sessionId) return + + output.output = output.output.trimEnd() + `\n\nto resume: sisyphus_task(resume="${sessionId}", prompt="...")` + } + + return { + "tool.execute.after": toolExecuteAfter, + } +}