Skip to content

Commit 93bc16e

Browse files
committed
feat: implement resolvePreferredProvider function to determine provider preference
1 parent fe0aa61 commit 93bc16e

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { GitCore, type GitCoreShape } from "../../git/Services/GitCore.ts";
3030
import { TextGeneration, type TextGenerationShape } from "../../git/Services/TextGeneration.ts";
3131
import { OrchestrationEngineLive } from "./OrchestrationEngine.ts";
3232
import { OrchestrationProjectionPipelineLive } from "./ProjectionPipeline.ts";
33-
import { ProviderCommandReactorLive } from "./ProviderCommandReactor.ts";
33+
import { ProviderCommandReactorLive, resolvePreferredProvider } from "./ProviderCommandReactor.ts";
3434
import { OrchestrationEngineService } from "../Services/OrchestrationEngine.ts";
3535
import { ProviderCommandReactor } from "../Services/ProviderCommandReactor.ts";
3636
import * as NodeServices from "@effect/platform-node/NodeServices";
@@ -544,6 +544,11 @@ describe("ProviderCommandReactor", () => {
544544
expect(thread?.session?.providerName).toBe("copilot");
545545
});
546546

547+
it("prefers the locked thread provider over the inferred request provider", () => {
548+
expect(resolvePreferredProvider(undefined, "copilot")).toBe("copilot");
549+
expect(resolvePreferredProvider("codex", "copilot")).toBe("codex");
550+
});
551+
547552
it("infers the provider from the selected model on a pristine thread", async () => {
548553
const harness = await createHarness();
549554
const now = new Date().toISOString();

apps/server/src/orchestration/Layers/ProviderCommandReactor.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ function isBuiltInModelForProvider(provider: ProviderKind, model: string | undef
146146
);
147147
}
148148

149+
export function resolvePreferredProvider(
150+
currentProvider: ProviderKind | undefined,
151+
threadProvider: ProviderKind,
152+
): ProviderKind {
153+
return currentProvider ?? threadProvider;
154+
}
155+
149156
const make = Effect.gen(function* () {
150157
const orchestrationEngine = yield* OrchestrationEngineService;
151158
const providerService = yield* ProviderService;
@@ -274,8 +281,10 @@ const make = Effect.gen(function* () {
274281
detail: `Model '${options.model}' does not belong to provider '${threadProvider}' for thread '${threadId}'.`,
275282
});
276283
}
277-
const preferredProvider: ProviderKind =
278-
currentProvider ?? requestedProvider ?? defaultThreadProvider;
284+
const preferredProvider: ProviderKind = resolvePreferredProvider(
285+
currentProvider,
286+
threadProvider,
287+
);
279288
const desiredModel = options?.model ?? thread.model;
280289
const effectiveCwd = resolveThreadWorkspaceCwd({
281290
thread,

0 commit comments

Comments
 (0)