Plugins/Hooks: avoid duplicate before_agent_start executions

This commit is contained in:
Vignesh Natarajan
2026-02-21 22:31:51 -08:00
parent 96c985400d
commit 542fc169d2
7 changed files with 174 additions and 41 deletions

View File

@@ -1,6 +1,7 @@
import fs from "node:fs/promises";
import type { ThinkLevel } from "../../auto-reply/thinking.js";
import { getGlobalHookRunner } from "../../plugins/hook-runner-global.js";
import type { PluginHookBeforeAgentStartResult } from "../../plugins/types.js";
import { enqueueCommandInLane } from "../../process/command-queue.js";
import { isMarkdownCapableMessageChannel } from "../../utils/message-channel.js";
import { resolveOpenClawAgentDir } from "../agent-paths.js";
@@ -236,6 +237,7 @@ export async function runEmbeddedPiAgent(
// Legacy compatibility: before_agent_start is also checked for override
// fields if present. New hook takes precedence when both are set.
let modelResolveOverride: { providerOverride?: string; modelOverride?: string } | undefined;
let legacyBeforeAgentStartResult: PluginHookBeforeAgentStartResult | undefined;
const hookRunner = getGlobalHookRunner();
const hookCtx = {
agentId: workspaceResolution.agentId,
@@ -256,14 +258,16 @@ export async function runEmbeddedPiAgent(
}
if (hookRunner?.hasHooks("before_agent_start")) {
try {
const legacyResult = await hookRunner.runBeforeAgentStart(
legacyBeforeAgentStartResult = await hookRunner.runBeforeAgentStart(
{ prompt: params.prompt },
hookCtx,
);
modelResolveOverride = {
providerOverride:
modelResolveOverride?.providerOverride ?? legacyResult?.providerOverride,
modelOverride: modelResolveOverride?.modelOverride ?? legacyResult?.modelOverride,
modelResolveOverride?.providerOverride ??
legacyBeforeAgentStartResult?.providerOverride,
modelOverride:
modelResolveOverride?.modelOverride ?? legacyBeforeAgentStartResult?.modelOverride,
};
} catch (hookErr) {
log.warn(
@@ -564,6 +568,7 @@ export async function runEmbeddedPiAgent(
authStorage,
modelRegistry,
agentId: workspaceResolution.agentId,
legacyBeforeAgentStartResult,
thinkLevel,
verboseLevel: params.verboseLevel,
reasoningLevel: params.reasoningLevel,