Skip to content

Commit 593de2a

Browse files
committed
fix(agents): preserve compatible CLI session runtime pins
1 parent 81c553e commit 593de2a

4 files changed

Lines changed: 60 additions & 1 deletion

File tree

src/auto-reply/reply/agent-runner-execution.test.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Tests agent runner execution setup, command args, and model fallback routing.
22
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
33
import { OAuthRefreshFailureError } from "../../agents/auth-profiles/oauth-refresh-failure.js";
4+
import { testing as cliBackendsTesting } from "../../agents/cli-backends.js";
45
import { FailoverError } from "../../agents/failover-error.js";
56
import { LiveSessionModelSwitchError } from "../../agents/live-model-switch-error.js";
67
import { MissingProviderAuthError } from "../../agents/model-auth.js";
@@ -48,6 +49,10 @@ const GENERIC_RUN_FAILURE_TEXT =
4849
"⚠️ Something went wrong while processing your request. Please try again, or use /new to start a fresh session.";
4950

5051
describe("resolveSessionRuntimeOverrideForProvider", () => {
52+
afterEach(() => {
53+
cliBackendsTesting.resetDepsForTest();
54+
});
55+
5156
it("ignores unsupported session runtime pins", () => {
5257
expect(
5358
resolveSessionRuntimeOverrideForProvider({
@@ -56,6 +61,48 @@ describe("resolveSessionRuntimeOverrideForProvider", () => {
5661
}),
5762
).toBeUndefined();
5863
});
64+
65+
it("keeps CLI runtime pins only when the runtime serves the selected provider", () => {
66+
cliBackendsTesting.setDepsForTest({
67+
resolveRuntimeCliBackends: () => [],
68+
resolvePluginSetupCliBackend: ({ backend, config }) =>
69+
backend === "claude-cli" && config
70+
? {
71+
pluginId: "anthropic",
72+
backend: {
73+
id: "claude-cli",
74+
modelProvider: "anthropic",
75+
config: { command: "claude" },
76+
bundleMcp: false,
77+
},
78+
}
79+
: undefined,
80+
});
81+
const cfg = {
82+
agents: {
83+
defaults: {
84+
cliBackends: {
85+
"claude-cli": { command: "claude" },
86+
},
87+
},
88+
},
89+
};
90+
91+
expect(
92+
resolveSessionRuntimeOverrideForProvider({
93+
provider: "anthropic",
94+
entry: { agentRuntimeOverride: "claude-cli" },
95+
cfg,
96+
}),
97+
).toBe("claude-cli");
98+
expect(
99+
resolveSessionRuntimeOverrideForProvider({
100+
provider: "openai",
101+
entry: { agentRuntimeOverride: "claude-cli" },
102+
cfg,
103+
}),
104+
).toBeUndefined();
105+
});
59106
});
60107

61108
function makeTestModel(id: string, contextTokens: number): ModelDefinitionConfig {

src/auto-reply/reply/agent-runner-execution.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ import { ensureSelectedAgentHarnessPlugin } from "../../agents/harness/runtime-p
4747
import { LiveSessionModelSwitchError } from "../../agents/live-model-switch-error.js";
4848
import { isMissingProviderAuthError } from "../../agents/model-auth.js";
4949
import { runWithModelFallback, isFallbackSummaryError } from "../../agents/model-fallback.js";
50-
import { resolveCliRuntimeExecutionProvider } from "../../agents/model-runtime-aliases.js";
50+
import {
51+
isCliRuntimeAliasForProvider,
52+
resolveCliRuntimeExecutionProvider,
53+
} from "../../agents/model-runtime-aliases.js";
5154
import {
5255
isCliProvider,
5356
resolveModelRefFromString,
@@ -1387,6 +1390,7 @@ function emitModelFallbackStepLifecycle(params: {
13871390
export function resolveSessionRuntimeOverrideForProvider(params: {
13881391
provider: string;
13891392
entry?: Pick<SessionEntry, "agentRuntimeOverride">;
1393+
cfg?: OpenClawConfig;
13901394
}): string | undefined {
13911395
const provider = normalizeLowercaseStringOrEmpty(params.provider);
13921396
const runtime = normalizeLowercaseStringOrEmpty(params.entry?.agentRuntimeOverride);
@@ -1396,6 +1400,9 @@ export function resolveSessionRuntimeOverrideForProvider(params: {
13961400
if (provider === "openai" && runtime === "codex") {
13971401
return "codex";
13981402
}
1403+
if (isCliRuntimeAliasForProvider({ provider, runtime, cfg: params.cfg })) {
1404+
return runtime;
1405+
}
13991406
return undefined;
14001407
}
14011408

@@ -1977,6 +1984,7 @@ export async function runAgentTurnWithFallback(params: {
19771984
resolveSessionRuntimeOverrideForProvider({
19781985
provider,
19791986
entry: params.getActiveSessionEntry(),
1987+
cfg: runtimeConfig,
19801988
}),
19811989
prepareAgentHarnessRuntime: async ({ provider, model, agentHarnessRuntimeOverride }) => {
19821990
await agentTurnTiming.measure("fallback_prepare_harness", () =>
@@ -2061,6 +2069,7 @@ export async function runAgentTurnWithFallback(params: {
20612069
const resolvedSessionRuntimeOverride = resolveSessionRuntimeOverrideForProvider({
20622070
provider,
20632071
entry: params.getActiveSessionEntry(),
2072+
cfg: runtimeConfig,
20642073
});
20652074
const resolvedSelectedAuthProfile = resolveRunAuthProfile(candidateRun, provider, {
20662075
config: runtimeConfig,

src/auto-reply/reply/dispatch-from-config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,7 @@ const resolveHarnessSourceVisibleRepliesDefault = (params: {
634634
const agentHarnessRuntimeOverride = resolveSessionRuntimeOverrideForProvider({
635635
provider: candidate.provider,
636636
entry: params.entry,
637+
cfg: params.cfg,
637638
});
638639
const harness = selectAgentHarness({
639640
provider: candidate.provider,

src/auto-reply/reply/followup-runner.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ export function createFollowupRunner(params: {
774774
resolveSessionRuntimeOverrideForProvider({
775775
provider,
776776
entry: activeSessionEntry,
777+
cfg: runtimeConfig,
777778
}),
778779
prepareAgentHarnessRuntime: async ({ provider, model, agentHarnessRuntimeOverride }) => {
779780
await ensureSelectedAgentHarnessPlugin({
@@ -808,6 +809,7 @@ export function createFollowupRunner(params: {
808809
const sessionRuntimeOverride = resolveSessionRuntimeOverrideForProvider({
809810
provider,
810811
entry: activeSessionEntry,
812+
cfg: runtimeConfig,
811813
});
812814
const cliExecutionProvider =
813815
(sessionRuntimeOverride && isCliProvider(sessionRuntimeOverride, runtimeConfig)

0 commit comments

Comments
 (0)