diff --git a/src/features/background-agent/manager.ts b/src/features/background-agent/manager.ts index b2d4a40ab..3a680dd6a 100644 --- a/src/features/background-agent/manager.ts +++ b/src/features/background-agent/manager.ts @@ -7,6 +7,7 @@ import type { } from "./types" import { TaskHistory } from "./task-history" import { log, getAgentToolRestrictions, promptWithModelSuggestionRetry } from "../../shared" +import { setSessionTools } from "../../shared/session-tools-store" import { ConcurrencyManager } from "./concurrency" import type { BackgroundTaskConfig, TmuxConfig } from "../../config/schema" import { isInsideTmux } from "../../shared/tmux" @@ -141,6 +142,7 @@ export class BackgroundManager { parentMessageID: input.parentMessageID, parentModel: input.parentModel, parentAgent: input.parentAgent, + parentTools: input.parentTools, model: input.model, category: input.category, } @@ -328,12 +330,16 @@ export class BackgroundManager { ...(launchModel ? { model: launchModel } : {}), ...(launchVariant ? { variant: launchVariant } : {}), system: input.skillContent, - tools: { - ...getAgentToolRestrictions(input.agent), - task: false, - call_omo_agent: true, - question: false, - }, + tools: (() => { + const tools = { + ...getAgentToolRestrictions(input.agent), + task: false, + call_omo_agent: true, + question: false, + } + setSessionTools(sessionID, tools) + return tools + })(), parts: [{ type: "text", text: input.prompt }], }, }).catch((error) => { @@ -535,6 +541,9 @@ export class BackgroundManager { existingTask.parentMessageID = input.parentMessageID existingTask.parentModel = input.parentModel existingTask.parentAgent = input.parentAgent + if (input.parentTools) { + existingTask.parentTools = input.parentTools + } // Reset startedAt on resume to prevent immediate completion // The MIN_IDLE_TIME_MS check uses startedAt, so resumed tasks need fresh timing existingTask.startedAt = new Date() @@ -588,12 +597,16 @@ export class BackgroundManager { agent: existingTask.agent, ...(resumeModel ? { model: resumeModel } : {}), ...(resumeVariant ? { variant: resumeVariant } : {}), - tools: { - ...getAgentToolRestrictions(existingTask.agent), - task: false, - call_omo_agent: true, - question: false, - }, + tools: (() => { + const tools = { + ...getAgentToolRestrictions(existingTask.agent), + task: false, + call_omo_agent: true, + question: false, + } + setSessionTools(existingTask.sessionID!, tools) + return tools + })(), parts: [{ type: "text", text: input.prompt }], }, }).catch((error) => { @@ -1252,6 +1265,7 @@ Use \`background_output(task_id="${task.id}")\` to retrieve this result when rea noReply: !allComplete, ...(agent !== undefined ? { agent } : {}), ...(model !== undefined ? { model } : {}), + ...(task.parentTools ? { tools: task.parentTools } : {}), parts: [{ type: "text", text: notification }], }, }) diff --git a/src/features/background-agent/spawner/task-factory.ts b/src/features/background-agent/spawner/task-factory.ts index 7af433d41..e7788be7f 100644 --- a/src/features/background-agent/spawner/task-factory.ts +++ b/src/features/background-agent/spawner/task-factory.ts @@ -13,6 +13,7 @@ export function createTask(input: LaunchInput): BackgroundTask { parentMessageID: input.parentMessageID, parentModel: input.parentModel, parentAgent: input.parentAgent, + parentTools: input.parentTools, model: input.model, } } diff --git a/src/tools/call-omo-agent/background-agent-executor.ts b/src/tools/call-omo-agent/background-agent-executor.ts index 35cb5fe1c..7babb43c0 100644 --- a/src/tools/call-omo-agent/background-agent-executor.ts +++ b/src/tools/call-omo-agent/background-agent-executor.ts @@ -5,6 +5,7 @@ import { log } from "../../shared" import type { CallOmoAgentArgs } from "./types" import type { ToolContextWithMetadata } from "./tool-context-with-metadata" import { getMessageDir } from "./message-storage-directory" +import { getSessionTools } from "../../shared/session-tools-store" export async function executeBackgroundAgent( args: CallOmoAgentArgs, @@ -36,6 +37,7 @@ export async function executeBackgroundAgent( parentSessionID: toolContext.sessionID, parentMessageID: toolContext.messageID, parentAgent, + parentTools: getSessionTools(toolContext.sessionID), }) const waitStart = Date.now() diff --git a/src/tools/call-omo-agent/background-executor.ts b/src/tools/call-omo-agent/background-executor.ts index a89fff40b..5751664ab 100644 --- a/src/tools/call-omo-agent/background-executor.ts +++ b/src/tools/call-omo-agent/background-executor.ts @@ -5,6 +5,7 @@ import { consumeNewMessages } from "../../shared/session-cursor" import { findFirstMessageWithAgent, findNearestMessageWithFields } from "../../features/hook-message-injector" import { getSessionAgent } from "../../features/claude-code-session-state" import { getMessageDir } from "./message-dir" +import { getSessionTools } from "../../shared/session-tools-store" export async function executeBackground( args: CallOmoAgentArgs, @@ -41,6 +42,7 @@ export async function executeBackground( parentSessionID: toolContext.sessionID, parentMessageID: toolContext.messageID, parentAgent, + parentTools: getSessionTools(toolContext.sessionID), }) const WAIT_FOR_SESSION_INTERVAL_MS = 50 diff --git a/src/tools/delegate-task/background-continuation.ts b/src/tools/delegate-task/background-continuation.ts index 71e209705..a6e382930 100644 --- a/src/tools/delegate-task/background-continuation.ts +++ b/src/tools/delegate-task/background-continuation.ts @@ -2,6 +2,7 @@ import type { DelegateTaskArgs, ToolContextWithMetadata } from "./types" import type { ExecutorContext, ParentContext } from "./executor-types" import { storeToolMetadata } from "../../features/tool-metadata-store" import { formatDetailedError } from "./error-formatting" +import { getSessionTools } from "../../shared/session-tools-store" export async function executeBackgroundContinuation( args: DelegateTaskArgs, @@ -19,6 +20,7 @@ export async function executeBackgroundContinuation( parentMessageID: parentContext.messageID, parentModel: parentContext.model, parentAgent: parentContext.agent, + parentTools: getSessionTools(parentContext.sessionID), }) const bgContMeta = { diff --git a/src/tools/delegate-task/background-task.ts b/src/tools/delegate-task/background-task.ts index 35d9af9af..e724695b2 100644 --- a/src/tools/delegate-task/background-task.ts +++ b/src/tools/delegate-task/background-task.ts @@ -3,6 +3,7 @@ import type { ExecutorContext, ParentContext } from "./executor-types" import { getTimingConfig } from "./timing" import { storeToolMetadata } from "../../features/tool-metadata-store" import { formatDetailedError } from "./error-formatting" +import { getSessionTools } from "../../shared/session-tools-store" export async function executeBackgroundTask( args: DelegateTaskArgs, @@ -24,6 +25,7 @@ export async function executeBackgroundTask( parentMessageID: parentContext.messageID, parentModel: parentContext.model, parentAgent: parentContext.agent, + parentTools: getSessionTools(parentContext.sessionID), model: categoryModel, skills: args.load_skills.length > 0 ? args.load_skills : undefined, skillContent: systemContent, diff --git a/src/tools/delegate-task/unstable-agent-task.ts b/src/tools/delegate-task/unstable-agent-task.ts index ae97153bd..9e0bf8533 100644 --- a/src/tools/delegate-task/unstable-agent-task.ts +++ b/src/tools/delegate-task/unstable-agent-task.ts @@ -4,6 +4,7 @@ import { getTimingConfig } from "./timing" import { storeToolMetadata } from "../../features/tool-metadata-store" import { formatDuration } from "./time-formatter" import { formatDetailedError } from "./error-formatting" +import { getSessionTools } from "../../shared/session-tools-store" export async function executeUnstableAgentTask( args: DelegateTaskArgs, @@ -26,6 +27,7 @@ export async function executeUnstableAgentTask( parentMessageID: parentContext.messageID, parentModel: parentContext.model, parentAgent: parentContext.agent, + parentTools: getSessionTools(parentContext.sessionID), model: categoryModel, skills: args.load_skills.length > 0 ? args.load_skills : undefined, skillContent: systemContent,