2026-02-08 13:57:26 +09:00
|
|
|
import type { DelegateTaskArgs, ToolContextWithMetadata } from "./types"
|
|
|
|
|
import type { ExecutorContext, ParentContext } from "./executor-types"
|
2026-04-16 13:52:20 +09:00
|
|
|
import { publishToolMetadata } from "../../features/tool-metadata-store"
|
2026-02-08 13:57:26 +09:00
|
|
|
import { formatDetailedError } from "./error-formatting"
|
2026-02-14 14:30:30 +09:00
|
|
|
import { getSessionTools } from "../../shared/session-tools-store"
|
2026-04-16 23:13:44 +09:00
|
|
|
import { buildTaskMetadataBlock } from "../../features/tool-metadata-store/task-metadata-contract"
|
2026-04-17 14:42:38 +09:00
|
|
|
import { resolveMetadataModel } from "./resolve-metadata-model"
|
2026-04-16 23:13:44 +09:00
|
|
|
import { getTaskID } from "./task-id"
|
2026-02-08 13:57:26 +09:00
|
|
|
|
|
|
|
|
export async function executeBackgroundContinuation(
|
|
|
|
|
args: DelegateTaskArgs,
|
|
|
|
|
ctx: ToolContextWithMetadata,
|
|
|
|
|
executorCtx: ExecutorContext,
|
|
|
|
|
parentContext: ParentContext
|
|
|
|
|
): Promise<string> {
|
|
|
|
|
const { manager } = executorCtx
|
2026-04-20 15:16:48 +09:00
|
|
|
const taskID = getTaskID(args)
|
2026-02-08 13:57:26 +09:00
|
|
|
|
|
|
|
|
try {
|
2026-04-16 23:13:44 +09:00
|
|
|
if (!taskID) {
|
|
|
|
|
throw new Error("task_id is required to continue a background task")
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-08 13:57:26 +09:00
|
|
|
const task = await manager.resume({
|
2026-04-16 23:13:44 +09:00
|
|
|
sessionId: taskID,
|
2026-02-08 13:57:26 +09:00
|
|
|
prompt: args.prompt,
|
|
|
|
|
parentSessionID: parentContext.sessionID,
|
|
|
|
|
parentMessageID: parentContext.messageID,
|
|
|
|
|
parentModel: parentContext.model,
|
|
|
|
|
parentAgent: parentContext.agent,
|
2026-02-14 14:30:30 +09:00
|
|
|
parentTools: getSessionTools(parentContext.sessionID),
|
2026-02-08 13:57:26 +09:00
|
|
|
})
|
2026-04-20 15:16:48 +09:00
|
|
|
const sessionId = task.sessionID
|
|
|
|
|
const backgroundTaskId = task.id
|
|
|
|
|
const resolvedModel = resolveMetadataModel(task.model, parentContext.model)
|
2026-02-08 13:57:26 +09:00
|
|
|
|
|
|
|
|
const bgContMeta = {
|
|
|
|
|
title: `Continue: ${task.description}`,
|
|
|
|
|
metadata: {
|
|
|
|
|
prompt: args.prompt,
|
|
|
|
|
agent: task.agent,
|
2026-04-20 14:50:18 +09:00
|
|
|
...(task.category !== undefined ? { category: task.category } : {}),
|
2026-04-20 14:50:40 +09:00
|
|
|
...(args.requested_subagent_type !== undefined ? { requested_subagent_type: args.requested_subagent_type } : {}),
|
2026-02-08 13:57:26 +09:00
|
|
|
load_skills: args.load_skills,
|
|
|
|
|
description: args.description,
|
|
|
|
|
run_in_background: args.run_in_background,
|
2026-04-20 15:16:48 +09:00
|
|
|
taskId: sessionId,
|
|
|
|
|
backgroundTaskId,
|
|
|
|
|
sessionId,
|
2026-02-08 13:57:26 +09:00
|
|
|
command: args.command,
|
2026-04-20 15:16:48 +09:00
|
|
|
model: resolvedModel,
|
2026-02-08 13:57:26 +09:00
|
|
|
},
|
|
|
|
|
}
|
2026-04-16 13:52:20 +09:00
|
|
|
await publishToolMetadata(ctx, bgContMeta)
|
2026-02-08 13:57:26 +09:00
|
|
|
|
|
|
|
|
return `Background task continued.
|
|
|
|
|
|
2026-04-20 15:16:48 +09:00
|
|
|
Task ID: ${backgroundTaskId}
|
2026-02-08 13:57:26 +09:00
|
|
|
Description: ${task.description}
|
|
|
|
|
Agent: ${task.agent}
|
|
|
|
|
Status: ${task.status}
|
|
|
|
|
|
|
|
|
|
Agent continues with full previous context preserved.
|
2026-04-20 15:16:48 +09:00
|
|
|
System notifies on completion. Use \`background_output\` with task_id="${backgroundTaskId}" to check.
|
2026-04-06 16:58:39 +09:00
|
|
|
|
|
|
|
|
Do NOT call background_output now. Wait for <system-reminder> notification first.
|
2026-02-08 13:57:26 +09:00
|
|
|
|
2026-04-16 23:13:44 +09:00
|
|
|
${buildTaskMetadataBlock({
|
2026-04-20 15:16:48 +09:00
|
|
|
sessionId,
|
|
|
|
|
taskId: sessionId,
|
|
|
|
|
backgroundTaskId,
|
2026-04-16 23:13:44 +09:00
|
|
|
agent: task.agent,
|
|
|
|
|
})}`
|
2026-02-08 13:57:26 +09:00
|
|
|
} catch (error) {
|
|
|
|
|
return formatDetailedError(error, {
|
|
|
|
|
operation: "Continue background task",
|
|
|
|
|
args,
|
2026-04-20 15:16:48 +09:00
|
|
|
sessionID: taskID,
|
2026-02-08 13:57:26 +09:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|