fix(coding-agent): preserve run prompt during tool refresh

closes #6162
This commit is contained in:
Mario Zechner
2026-06-30 14:08:48 +02:00
parent e547bb9f41
commit fd6659dd5d
7 changed files with 217 additions and 77 deletions
@@ -21,6 +21,7 @@ import type {
AgentMessage,
AgentState,
AgentTool,
PrepareNextTurnContext,
ThinkingLevel,
} from "@earendil-works/pi-agent-core";
import type { AssistantMessage, ImageContent, Message, Model, TextContent } from "@earendil-works/pi-ai/compat";
@@ -331,6 +332,7 @@ export class AgentSession {
// Base system prompt (without extension appends) - used to apply fresh appends each turn
private _baseSystemPrompt = "";
private _baseSystemPromptOptions!: BuildSystemPromptOptions;
private _systemPromptOverride?: string;
constructor(config: AgentSessionConfig) {
this.agent = config.agent;
@@ -464,16 +466,20 @@ export class AgentSession {
}
private _installAgentNextTurnRefresh(): void {
const previousPrepareNextTurn = this.agent.prepareNextTurn;
this.agent.prepareNextTurn = async (turn, signal) => {
const previousSnapshot = await previousPrepareNextTurn?.(turn, signal);
const previousPrepareNextTurnWithContext =
this.agent.prepareNextTurnWithContext ??
(this.agent.prepareNextTurn
? async (_turn: PrepareNextTurnContext, signal?: AbortSignal) => await this.agent.prepareNextTurn?.(signal)
: undefined);
this.agent.prepareNextTurnWithContext = async (turn, signal) => {
const previousSnapshot = await previousPrepareNextTurnWithContext?.(turn, signal);
const previousContext = previousSnapshot?.context ?? turn.context;
return {
...previousSnapshot,
context: {
...previousContext,
systemPrompt: this.agent.state.systemPrompt,
systemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,
tools: this.agent.state.tools.slice(),
},
model: this.agent.state.model,
@@ -844,7 +850,7 @@ export class AgentSession {
// Rebuild base system prompt with new tool set
this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
this.agent.state.systemPrompt = this._baseSystemPrompt;
this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
}
/** Whether compaction or branch summarization is currently running */
@@ -972,6 +978,7 @@ export class AgentSession {
await this.agent.continue();
}
} finally {
this._systemPromptOverride = undefined;
this._flushPendingBashMessages();
}
}
@@ -1143,10 +1150,12 @@ export class AgentSession {
}
}
// Apply extension-modified system prompt, or reset to base
if (result?.systemPrompt) {
if (result?.systemPrompt !== undefined) {
this._systemPromptOverride = result.systemPrompt;
this.agent.state.systemPrompt = result.systemPrompt;
} else {
// Ensure we're using the base prompt (in case previous turn had modifications)
this._systemPromptOverride = undefined;
this.agent.state.systemPrompt = this._baseSystemPrompt;
}
} catch (error) {