diff --git a/src/hooks/task-resume-info/index.ts b/src/hooks/task-resume-info/index.ts new file mode 100644 index 000000000..2c42ae2aa --- /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, + } +}