From ef427d3eae77fca716c203dd8bd84939710c518a Mon Sep 17 00:00:00 2001
From: Adam Malczewski <github@tradam.dev>
Date: Sat, 23 May 2026 04:37:56 +0900
Subject: feat: youtube_transcribe blocks with polling, interruptible with
 background retrieve

- youtube_transcribe now polls until transcript is ready (waits estimated_seconds - 2s, min 2s)
- Times out after 10 minutes of polling
- When user interrupts, polling continues in background with youtube_transcribe_<uuid> job ID
- BackgroundTranscriptStore holds polling jobs, retrieve tool resolves them
- ToolCallDisplay shows 'interrupted' badge (blue) when result contains [USER INTERRUPT]
- Applies to all interruptible tools: run_shell, youtube_transcribe, retrieve
---
 packages/frontend/src/lib/components/ToolCallDisplay.svelte | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'packages/frontend/src/lib/components/ToolCallDisplay.svelte')

diff --git a/packages/frontend/src/lib/components/ToolCallDisplay.svelte b/packages/frontend/src/lib/components/ToolCallDisplay.svelte
index 213ba17..7c7aef6 100644
--- a/packages/frontend/src/lib/components/ToolCallDisplay.svelte
+++ b/packages/frontend/src/lib/components/ToolCallDisplay.svelte
@@ -70,7 +70,9 @@ const summonAgentId = $derived.by(() => {
 		>Open Tab</button>
 	{/if}
 		{#if toolCall.result !== undefined}
-			{#if isShell && shellResult !== null}
+			{#if toolCall.result.includes("[USER INTERRUPT]")}
+				<span class="badge badge-info badge-sm ml-auto">interrupted</span>
+			{:else if isShell && shellResult !== null}
 				<span class="badge badge-sm ml-auto {shellResult.exitCode === 0 ? 'badge-success' : 'badge-error'}">
 					exit {shellResult.exitCode}
 				</span>
-- 
cgit v1.2.3

