fix(coding-agent): preserve run prompt during tool refresh
closes #6162
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user