diff --git a/src/features/background-agent/manager.ts b/src/features/background-agent/manager.ts index 2ae6b3f..a98af78 100644 --- a/src/features/background-agent/manager.ts +++ b/src/features/background-agent/manager.ts @@ -59,6 +59,7 @@ export class BackgroundManager { parentSessionID: input.parentSessionID, parentMessageID: input.parentMessageID, description: input.description, + prompt: input.prompt, agent: input.agent, status: "running", startedAt: new Date(), @@ -316,7 +317,7 @@ export class BackgroundManager { if (!messagesResult.error && messagesResult.data) { const messages = messagesResult.data as Array<{ info?: { role?: string } - parts?: Array<{ type?: string; tool?: string; name?: string }> + parts?: Array<{ type?: string; tool?: string; name?: string; text?: string }> }> const assistantMsgs = messages.filter( (m) => m.info?.role === "assistant" @@ -324,6 +325,7 @@ export class BackgroundManager { let toolCalls = 0 let lastTool: string | undefined + let lastMessage: string | undefined for (const msg of assistantMsgs) { const parts = msg.parts ?? [] @@ -332,6 +334,9 @@ export class BackgroundManager { toolCalls++ lastTool = part.tool || part.name || "unknown" } + if (part.type === "text" && part.text) { + lastMessage = part.text + } } } @@ -341,6 +346,10 @@ export class BackgroundManager { task.progress.toolCalls = toolCalls task.progress.lastTool = lastTool task.progress.lastUpdate = new Date() + if (lastMessage) { + task.progress.lastMessage = lastMessage + task.progress.lastMessageAt = new Date() + } } } catch (error) { log("[background-agent] Poll error for task:", { taskId: task.id, error }) diff --git a/src/features/background-agent/types.ts b/src/features/background-agent/types.ts index 6068d4c..1d5356a 100644 --- a/src/features/background-agent/types.ts +++ b/src/features/background-agent/types.ts @@ -8,6 +8,8 @@ export interface TaskProgress { toolCalls: number lastTool?: string lastUpdate: Date + lastMessage?: string + lastMessageAt?: Date } export interface BackgroundTask { @@ -16,6 +18,7 @@ export interface BackgroundTask { parentSessionID: string parentMessageID: string description: string + prompt: string agent: string status: BackgroundTaskStatus startedAt: Date diff --git a/src/tools/background-task/tools.ts b/src/tools/background-task/tools.ts index d580551..dabb40f 100644 --- a/src/tools/background-task/tools.ts +++ b/src/tools/background-task/tools.ts @@ -62,21 +62,51 @@ function delay(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)) } +function truncateText(text: string, maxLength: number): string { + if (text.length <= maxLength) return text + return text.slice(0, maxLength) + "..." +} + function formatTaskStatus(task: BackgroundTask): string { const duration = formatDuration(task.startedAt, task.completedAt) - const progress = task.progress - ? `\nTool calls: ${task.progress.toolCalls}\nLast tool: ${task.progress.lastTool ?? "N/A"}` - : "" + const promptPreview = truncateText(task.prompt, 500) + + let progressSection = "" + if (task.progress) { + progressSection = `\nTool calls: ${task.progress.toolCalls}\nLast tool: ${task.progress.lastTool ?? "N/A"}` + } - return `Task Status + let lastMessageSection = "" + if (task.progress?.lastMessage) { + const truncated = truncateText(task.progress.lastMessage, 500) + const messageTime = task.progress.lastMessageAt + ? task.progress.lastMessageAt.toISOString() + : "N/A" + lastMessageSection = ` -Task ID: ${task.id} -Description: ${task.description} -Agent: ${task.agent} -Status: ${task.status} -Duration: ${duration}${progress} +## Last Message (${messageTime}) -Session ID: ${task.sessionID}` +\`\`\` +${truncated} +\`\`\`` + } + + return `# Task Status + +| Field | Value | +|-------|-------| +| Task ID | \`${task.id}\` | +| Description | ${task.description} | +| Agent | ${task.agent} | +| Status | **${task.status}** | +| Duration | ${duration} | +| Session ID | \`${task.sessionID}\` |${progressSection} + +## Original Prompt + +\`\`\` +${promptPreview} +\`\`\`${lastMessageSection}` } async function formatTaskResult(task: BackgroundTask, client: OpencodeClient): Promise {