From b4df1a49b23f7bf76b543396079ebf66b66a874e Mon Sep 17 00:00:00 2001 From: jay Date: Fri, 15 May 2026 05:12:54 +0200 Subject: [PATCH] feat: render preview in status + auto-delivery note --- controller.ts | 25 ++++++++++++++++--------- index.ts | 11 +++-------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/controller.ts b/controller.ts index 73db02f..71c0540 100644 --- a/controller.ts +++ b/controller.ts @@ -271,20 +271,27 @@ export class FanoutController { if (!job.modelUsed && msg.model) job.modelUsed = msg.model; if (msg.stopReason) job.stopReason = msg.stopReason; if (msg.errorMessage) job.errorMessage = msg.errorMessage; - - // Cache last assistant text output for live preview - let previewUpdated = false; + + // Cache last assistant text output for live preview (capped to keep meta.json small) for (const part of msg.content) { if (part.type === "text") { - job.lastPreview = part.text; - previewUpdated = true; + job.lastPreview = part.text.slice(0, 5000); break; } } - - // Persist cache to enable live previews after restart - if (previewUpdated) { - this.persist(job); + this.persist(job); + } + } + // Also cache assistant text from tool result events + if (event.type === "tool_result_end" && event.message) { + const msg = event.message as Message; + if (msg.role === "assistant") { + for (const part of msg.content) { + if (part.type === "text") { + job.lastPreview = part.text.slice(0, 5000); + this.persist(job); + break; + } } } } diff --git a/index.ts b/index.ts index 46fc44f..eba2e02 100644 --- a/index.ts +++ b/index.ts @@ -51,7 +51,7 @@ export default function (pi: ExtensionAPI) { promptGuidelines: [ "Use fanout_dispatch to run multiple agents in parallel without blocking the main session.", "After dispatching, you may do other work. Check status later with fanout_status.", - "When jobs complete, the system will send a follow-up message. Retrieve output with fanout_collect.", + "Completed jobs deliver their output automatically via follow-up messages. Use fanout_collect if you need the full, untruncated result or to archive old jobs.", ], execute: async ( @@ -130,13 +130,8 @@ export default function (pi: ExtensionAPI) { let jobLine = `- ${j.id} | ${j.agent} | ${j.status}` + (j.exitCode !== undefined ? ` (exit ${j.exitCode})` : "") + - (j.turns ? ` | ${j.turns} turns` : ""); - if (j.preview) { - jobLine += `\n \`\`\`\n${j.preview - .split("\n") - .map((line) => ` ${line}`) - .join("\n")}\n \`\`\``; - } + (j.turns ? ` | ${j.turns} turns` : "") + + (j.preview ? `\n Preview: ${j.preview.slice(0, 120).replace(/\n/g, " ")}${j.preview.length > 120 ? "…" : ""}` : ""); return jobLine; }) .join("\n")