From e3798ca91f23a69c6833443005ec8a252f292efc Mon Sep 17 00:00:00 2001 From: Dustin Spicuzza Date: Tue, 11 Aug 2026 05:12:34 -0400 Subject: [PATCH] fix(coding-agent): inherit subagent session config (#7897) --- .../examples/extensions/subagent/README.md | 2 ++ .../examples/extensions/subagent/index.ts | 24 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/coding-agent/examples/extensions/subagent/README.md b/packages/coding-agent/examples/extensions/subagent/README.md index f98b64586..9290342dc 100644 --- a/packages/coding-agent/examples/extensions/subagent/README.md +++ b/packages/coding-agent/examples/extensions/subagent/README.md @@ -137,6 +137,8 @@ model: claude-haiku-4-5 System prompt for the agent goes here. ``` +When `model` is omitted, the subagent inherits the dispatching session's active model and thinking level. + **Locations:** - `~/.pi/agent/agents/*.md` - User-level (always loaded) - `.pi/agents/*.md` - Project-level (only with `agentScope: "project"` or `"both"`) diff --git a/packages/coding-agent/examples/extensions/subagent/index.ts b/packages/coding-agent/examples/extensions/subagent/index.ts index 832dcc742..fa3b09e38 100644 --- a/packages/coding-agent/examples/extensions/subagent/index.ts +++ b/packages/coding-agent/examples/extensions/subagent/index.ts @@ -16,7 +16,7 @@ import { spawn } from "node:child_process"; import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; -import type { AgentToolResult } from "@earendil-works/pi-agent-core"; +import type { AgentToolResult, ThinkingLevel } from "@earendil-works/pi-agent-core"; import type { Message } from "@earendil-works/pi-ai"; import { StringEnum } from "@earendil-works/pi-ai"; import { @@ -264,8 +264,14 @@ function getPiInvocation(args: string[]): { command: string; args: string[] } { type OnUpdateCallback = (partial: AgentToolResult) => void; +interface DispatchDefaults { + model?: string; + thinkingLevel?: ThinkingLevel; +} + async function runSingleAgent( defaultCwd: string, + dispatchDefaults: DispatchDefaults, agents: AgentConfig[], agentName: string, task: string, @@ -292,7 +298,12 @@ async function runSingleAgent( } const args: string[] = ["--mode", "json", "-p", "--no-session"]; - if (agent.model) args.push("--model", agent.model); + const inheritsDispatchConfig = !agent.model; + const model = agent.model ?? dispatchDefaults.model; + if (model) args.push("--model", model); + if (inheritsDispatchConfig && dispatchDefaults.thinkingLevel) { + args.push("--thinking", dispatchDefaults.thinkingLevel); + } if (agent.tools && agent.tools.length > 0) args.push("--tools", agent.tools.join(",")); let tmpPromptDir: string | null = null; @@ -306,7 +317,7 @@ async function runSingleAgent( messages: [], stderr: "", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 }, - model: agent.model, + model, step, }; @@ -471,6 +482,10 @@ export default function (pi: ExtensionAPI) { async execute(_toolCallId, params, signal, onUpdate, ctx) { const agentScope: AgentScope = params.agentScope ?? "user"; + const dispatchDefaults: DispatchDefaults = { + model: ctx.model ? `${ctx.model.provider}/${ctx.model.id}` : undefined, + thinkingLevel: ctx.thinkingLevel, + }; const discovery = discoverAgents(ctx.cwd, agentScope); const agents = discovery.agents; const confirmProjectAgents = params.confirmProjectAgents ?? true; @@ -552,6 +567,7 @@ export default function (pi: ExtensionAPI) { const result = await runSingleAgent( ctx.cwd, + dispatchDefaults, agents, step.agent, taskWithContext, @@ -624,6 +640,7 @@ export default function (pi: ExtensionAPI) { const results = await mapWithConcurrencyLimit(params.tasks, MAX_CONCURRENCY, async (t, index) => { const result = await runSingleAgent( ctx.cwd, + dispatchDefaults, agents, t.agent, t.task, @@ -666,6 +683,7 @@ export default function (pi: ExtensionAPI) { if (params.agent && params.task) { const result = await runSingleAgent( ctx.cwd, + dispatchDefaults, agents, params.agent, params.task,