From 9e98cef1825a143b40f0c5a9c82f4aec49030e50 Mon Sep 17 00:00:00 2001 From: Oussama Douhou Date: Tue, 13 Jan 2026 06:27:56 +0100 Subject: [PATCH] fix(background-agent): inherit parent session directory for background tasks Background tasks were defaulting to $HOME instead of the parent session's working directory. This caused background agents to scan the entire home directory instead of the project directory, leading to: - High CPU/memory load from scanning unrelated files - Permission errors on system directories - Task failures and timeouts The fix retrieves the parent session's directory before creating a new background session and passes it via the query.directory parameter. Files modified: - manager.ts: Look up parent session directory in launch() - call-omo-agent/tools.ts: Same fix for sync mode - look-at/tools.ts: Same fix for look_at tool - sisyphus-task/tools.ts: Same fix + interface update for directory prop - index.ts: Pass directory to sisyphusTask factory --- src/features/background-agent/manager.ts | 12 ++++++++++++ src/index.ts | 1 + src/tools/call-omo-agent/tools.ts | 12 ++++++++++++ src/tools/look-at/tools.ts | 8 ++++++++ src/tools/sisyphus-task/tools.ts | 11 ++++++++++- 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/features/background-agent/manager.ts b/src/features/background-agent/manager.ts index 0dea79cb9..e44e26bbe 100644 --- a/src/features/background-agent/manager.ts +++ b/src/features/background-agent/manager.ts @@ -75,11 +75,23 @@ export class BackgroundManager { await this.concurrencyManager.acquire(concurrencyKey) + const parentSession = await this.client.session.get({ + path: { id: input.parentSessionID }, + }).catch((err) => { + log(`[background-agent] Failed to get parent session: ${err}`) + return null + }) + const parentDirectory = parentSession?.data?.directory ?? this.directory + log(`[background-agent] Parent dir: ${parentSession?.data?.directory}, using: ${parentDirectory}`) + const createResult = await this.client.session.create({ body: { parentID: input.parentSessionID, title: `Background: ${input.description}`, }, + query: { + directory: parentDirectory, + }, }).catch((error) => { this.concurrencyManager.release(concurrencyKey) throw error diff --git a/src/index.ts b/src/index.ts index 995c5ea48..92c4fb539 100644 --- a/src/index.ts +++ b/src/index.ts @@ -238,6 +238,7 @@ const OhMyOpenCodePlugin: Plugin = async (ctx) => { const sisyphusTask = createSisyphusTask({ manager: backgroundManager, client: ctx.client, + directory: ctx.directory, userCategories: pluginConfig.categories, gitMasterConfig: pluginConfig.git_master, }); diff --git a/src/tools/call-omo-agent/tools.ts b/src/tools/call-omo-agent/tools.ts index c9ea38144..43cd42cf0 100644 --- a/src/tools/call-omo-agent/tools.ts +++ b/src/tools/call-omo-agent/tools.ts @@ -145,11 +145,23 @@ async function executeSync( sessionID = args.session_id } else { log(`[call_omo_agent] Creating new session with parent: ${toolContext.sessionID}`) + const parentSession = await ctx.client.session.get({ + path: { id: toolContext.sessionID }, + }).catch((err) => { + log(`[call_omo_agent] Failed to get parent session:`, err) + return null + }) + log(`[call_omo_agent] Parent session dir: ${parentSession?.data?.directory}, fallback: ${ctx.directory}`) + const parentDirectory = parentSession?.data?.directory ?? ctx.directory + const createResult = await ctx.client.session.create({ body: { parentID: toolContext.sessionID, title: `${args.description} (@${args.subagent_type} subagent)`, }, + query: { + directory: parentDirectory, + }, }) if (createResult.error) { diff --git a/src/tools/look-at/tools.ts b/src/tools/look-at/tools.ts index 606e5457f..1f92ef748 100644 --- a/src/tools/look-at/tools.ts +++ b/src/tools/look-at/tools.ts @@ -65,11 +65,19 @@ Be thorough on what was requested, concise on everything else. If the requested information is not found, clearly state what is missing.` log(`[look_at] Creating session with parent: ${toolContext.sessionID}`) + const parentSession = await ctx.client.session.get({ + path: { id: toolContext.sessionID }, + }).catch(() => null) + const parentDirectory = parentSession?.data?.directory ?? ctx.directory + const createResult = await ctx.client.session.create({ body: { parentID: toolContext.sessionID, title: `look_at: ${args.goal.substring(0, 50)}`, }, + query: { + directory: parentDirectory, + }, }) if (createResult.error) { diff --git a/src/tools/sisyphus-task/tools.ts b/src/tools/sisyphus-task/tools.ts index c082f8b1b..b76be69ef 100644 --- a/src/tools/sisyphus-task/tools.ts +++ b/src/tools/sisyphus-task/tools.ts @@ -89,6 +89,7 @@ function resolveCategoryConfig( export interface SisyphusTaskToolOptions { manager: BackgroundManager client: OpencodeClient + directory: string userCategories?: CategoriesConfig gitMasterConfig?: GitMasterConfig } @@ -113,7 +114,7 @@ export function buildSystemContent(input: BuildSystemContentInput): string | und } export function createSisyphusTask(options: SisyphusTaskToolOptions): ToolDefinition { - const { manager, client, userCategories, gitMasterConfig } = options + const { manager, client, directory, userCategories, gitMasterConfig } = options return tool({ description: SISYPHUS_TASK_DESCRIPTION, @@ -400,11 +401,19 @@ System notifies on completion. Use \`background_output\` with task_id="${task.id let syncSessionID: string | undefined try { + const parentSession = await client.session.get({ + path: { id: ctx.sessionID }, + }).catch(() => null) + const parentDirectory = parentSession?.data?.directory ?? directory + const createResult = await client.session.create({ body: { parentID: ctx.sessionID, title: `Task: ${args.description}`, }, + query: { + directory: parentDirectory, + }, }) if (createResult.error) {