From bb6a011964540cb6a328516f7306bc1526282373 Mon Sep 17 00:00:00 2001 From: bob_karrot Date: Wed, 11 Feb 2026 14:23:37 +0900 Subject: [PATCH] fix(hooks): guard against non-string tool output in afterToolResult hooks MCP tools can return non-string results (e.g. structured JSON objects). When this happens, output.output is undefined, causing TypeError crashes in edit-error-recovery and delegate-task-retry hooks that call methods like .toLowerCase() without checking the type first. Add typeof string guard in both hooks, consistent with the existing pattern used in tool-output-truncator. --- src/hooks/delegate-task-retry/hook.ts | 1 + src/hooks/edit-error-recovery/hook.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/hooks/delegate-task-retry/hook.ts b/src/hooks/delegate-task-retry/hook.ts index 915da323d..97e27b3f4 100644 --- a/src/hooks/delegate-task-retry/hook.ts +++ b/src/hooks/delegate-task-retry/hook.ts @@ -10,6 +10,7 @@ export function createDelegateTaskRetryHook(_ctx: PluginInput) { output: { title: string; output: string; metadata: unknown } ) => { if (input.tool.toLowerCase() !== "task") return + if (typeof output.output !== "string") return const errorInfo = detectDelegateTaskError(output.output) if (errorInfo) { diff --git a/src/hooks/edit-error-recovery/hook.ts b/src/hooks/edit-error-recovery/hook.ts index 84ac9e9dc..d71540bee 100644 --- a/src/hooks/edit-error-recovery/hook.ts +++ b/src/hooks/edit-error-recovery/hook.ts @@ -43,6 +43,7 @@ export function createEditErrorRecoveryHook(_ctx: PluginInput) { output: { title: string; output: string; metadata: unknown } ) => { if (input.tool.toLowerCase() !== "edit") return + if (typeof output.output !== "string") return const outputLower = output.output.toLowerCase() const hasEditError = EDIT_ERROR_PATTERNS.some((pattern) =>