diff --git a/apps/server/integration/OrchestrationEngineHarness.integration.ts b/apps/server/integration/OrchestrationEngineHarness.integration.ts index a634e8882c6a6b09b658982ac04d7525d5908d25..07cfe01e704afb5babb4bf81860b4af4c999e494 100644 --- a/apps/server/integration/OrchestrationEngineHarness.integration.ts +++ b/apps/server/integration/OrchestrationEngineHarness.integration.ts @@ -188,7 +188,7 @@ export interface OrchestrationIntegrationHarness { } interface MakeOrchestrationIntegrationHarnessOptions { - readonly provider?: "codex" | "claudeCode"; + readonly provider?: "codex" | "cursor"; readonly realCodex?: boolean; } diff --git a/apps/server/integration/TestProviderAdapter.integration.ts b/apps/server/integration/TestProviderAdapter.integration.ts index 25ce8773bd77ce3fd4dbb81c9dd6941a5e9ff8b1..e86b3e8491adfddadaa37504df5e8f56e2c5d3ec 100644 --- a/apps/server/integration/TestProviderAdapter.integration.ts +++ b/apps/server/integration/TestProviderAdapter.integration.ts @@ -35,7 +35,7 @@ export interface TestTurnResponse { export type FixtureProviderRuntimeEvent = { readonly type: string; readonly eventId: EventId; - readonly provider: "codex" | "claudeCode" | "cursor"; + readonly provider: "codex" | "cursor"; readonly createdAt: string; readonly threadId: string; readonly turnId?: string | undefined; @@ -178,7 +178,7 @@ function normalizeFixtureEvent(rawEvent: Record): ProviderRunti export interface TestProviderAdapterHarness { readonly adapter: ProviderAdapterShape; - readonly provider: "codex" | "claudeCode"; + readonly provider: "codex" | "cursor"; readonly queueTurnResponse: ( threadId: ThreadId, response: TestTurnResponse, @@ -198,7 +198,7 @@ export interface TestProviderAdapterHarness { } interface MakeTestProviderAdapterHarnessOptions { - readonly provider?: "codex" | "claudeCode"; + readonly provider?: "codex" | "cursor"; } function nowIso(): string { @@ -206,7 +206,7 @@ function nowIso(): string { } function sessionNotFound( - provider: "codex" | "claudeCode", + provider: "codex" | "cursor", threadId: ThreadId, ): ProviderAdapterSessionNotFoundError { return new ProviderAdapterSessionNotFoundError({ @@ -216,7 +216,7 @@ function sessionNotFound( } function missingSessionEffect( - provider: "codex" | "claudeCode", + provider: "codex" | "cursor", threadId: ThreadId, ): Effect.Effect { return Effect.fail(sessionNotFound(provider, threadId)); diff --git a/apps/server/integration/orchestrationEngine.integration.test.ts b/apps/server/integration/orchestrationEngine.integration.test.ts index 606087f0ac35bae6525d32f407a2ef5073183c2d..c8219b260a81eda498225587213ab1261cc3b3b8 100644 --- a/apps/server/integration/orchestrationEngine.integration.test.ts +++ b/apps/server/integration/orchestrationEngine.integration.test.ts @@ -32,7 +32,7 @@ const PROJECT_ID = asProjectId("project-1"); const THREAD_ID = ThreadId.makeUnsafe("thread-1"); const FIXTURE_TURN_ID = "fixture-turn"; const APPROVAL_REQUEST_ID = asApprovalRequestId("req-approval-1"); -type IntegrationProvider = "codex" | "claudeCode"; +type IntegrationProvider = "codex" | "cursor"; function nowIso() { return new Date().toISOString(); @@ -842,416 +842,3 @@ it.live( }), ), ); - -it.live("starts a claudeCode session on first turn when provider is requested", () => - withHarness( - (harness) => - Effect.gen(function* () { - yield* seedProjectAndThread(harness); - - yield* harness.adapterHarness.queueTurnResponseForNextSession({ - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-start-1", "2026-02-24T10:10:00.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "message.delta", - ...runtimeBase("evt-claude-start-2", "2026-02-24T10:10:00.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - delta: "Claude first turn.\n", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-start-3", "2026-02-24T10:10:00.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-initial", - messageId: "msg-user-claude-initial", - text: "Use Claude", - provider: "claudeCode", - }); - - const thread = yield* harness.waitForThread( - THREAD_ID, - (entry) => - entry.session?.providerName === "claudeCode" && - entry.session.status === "ready" && - entry.messages.some( - (message) => message.role === "assistant" && message.text === "Claude first turn.\n", - ), - ); - assert.equal(thread.session?.providerName, "claudeCode"); - }), - "claudeCode", - ), -); - -it.live("recovers claudeCode sessions after provider stopAll using persisted resume state", () => - withHarness( - (harness) => - Effect.gen(function* () { - yield* seedProjectAndThread(harness); - - yield* harness.adapterHarness.queueTurnResponseForNextSession({ - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-recover-1", "2026-02-24T10:11:00.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "message.delta", - ...runtimeBase("evt-claude-recover-2", "2026-02-24T10:11:00.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - delta: "Turn before restart.\n", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-recover-3", "2026-02-24T10:11:00.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-recover-1", - messageId: "msg-user-claude-recover-1", - text: "Before restart", - provider: "claudeCode", - }); - - yield* harness.waitForThread( - THREAD_ID, - (entry) => entry.latestTurn?.turnId === "turn-1" && entry.session?.threadId === "thread-1", - ); - - yield* harness.providerService.stopAll(); - yield* waitForSync( - () => harness.adapterHarness.listActiveSessionIds(), - (sessionIds) => sessionIds.length === 0, - "provider stopAll", - ); - - yield* harness.adapterHarness.queueTurnResponseForNextSession({ - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-recover-4", "2026-02-24T10:11:01.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "message.delta", - ...runtimeBase("evt-claude-recover-5", "2026-02-24T10:11:01.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - delta: "Turn after restart.\n", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-recover-6", "2026-02-24T10:11:01.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-recover-2", - messageId: "msg-user-claude-recover-2", - text: "After restart", - }); - yield* waitForSync( - () => harness.adapterHarness.getStartCount(), - (count) => count === 2, - "claude provider recovery start", - ); - - const recoveredThread = yield* harness.waitForThread( - THREAD_ID, - (entry) => - entry.session?.providerName === "claudeCode" && - entry.messages.some( - (message) => message.role === "user" && message.text === "After restart", - ) && - !entry.activities.some((activity) => activity.kind === "provider.turn.start.failed"), - ); - assert.equal(recoveredThread.session?.providerName, "claudeCode"); - assert.equal(recoveredThread.session?.threadId, "thread-1"); - }), - "claudeCode", - ), -); - -it.live("forwards claudeCode approval responses to the provider session", () => - withHarness( - (harness) => - Effect.gen(function* () { - yield* seedProjectAndThread(harness); - - yield* harness.adapterHarness.queueTurnResponseForNextSession({ - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-approval-1", "2026-02-24T10:12:00.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "approval.requested", - ...runtimeBase("evt-claude-approval-2", "2026-02-24T10:12:00.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - requestId: APPROVAL_REQUEST_ID, - requestKind: "command", - detail: "Approve Claude tool call", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-approval-3", "2026-02-24T10:12:00.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-approval", - messageId: "msg-user-claude-approval", - text: "Need approval", - provider: "claudeCode", - }); - - const thread = yield* harness.waitForThread(THREAD_ID, (entry) => - entry.activities.some((activity) => activity.kind === "approval.requested"), - ); - assert.equal(thread.session?.threadId, "thread-1"); - - yield* harness.engine.dispatch({ - type: "thread.approval.respond", - commandId: CommandId.makeUnsafe("cmd-claude-approval-respond"), - threadId: THREAD_ID, - requestId: APPROVAL_REQUEST_ID, - decision: "accept", - createdAt: nowIso(), - }); - - yield* harness.waitForPendingApproval( - "req-approval-1", - (row) => row.status === "resolved" && row.decision === "accept", - ); - - const approvalResponses = yield* waitForSync( - () => harness.adapterHarness.getApprovalResponses(THREAD_ID), - (responses) => responses.length === 1, - "claude provider approval response", - ); - assert.equal(approvalResponses[0]?.decision, "accept"); - }), - "claudeCode", - ), -); - -it.live("forwards thread.turn.interrupt to claudeCode provider sessions", () => - withHarness( - (harness) => - Effect.gen(function* () { - yield* seedProjectAndThread(harness); - - yield* harness.adapterHarness.queueTurnResponseForNextSession({ - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-interrupt-1", "2026-02-24T10:13:00.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "message.delta", - ...runtimeBase("evt-claude-interrupt-2", "2026-02-24T10:13:00.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - delta: "Long running output.\n", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-interrupt-3", "2026-02-24T10:13:00.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-interrupt", - messageId: "msg-user-claude-interrupt", - text: "Start long turn", - provider: "claudeCode", - }); - - const thread = yield* harness.waitForThread( - THREAD_ID, - (entry) => entry.session?.threadId === "thread-1", - ); - assert.equal(thread.session?.threadId, "thread-1"); - - yield* harness.engine.dispatch({ - type: "thread.turn.interrupt", - commandId: CommandId.makeUnsafe("cmd-turn-interrupt-claude"), - threadId: THREAD_ID, - createdAt: nowIso(), - }); - yield* harness.waitForDomainEvent((event) => event.type === "thread.turn-interrupt-requested"); - - const interruptCalls = yield* waitForSync( - () => harness.adapterHarness.getInterruptCalls(THREAD_ID), - (calls) => calls.length === 1, - "claude provider interrupt call", - ); - assert.equal(interruptCalls.length, 1); - }), - "claudeCode", - ), -); - -it.live("reverts claudeCode turns and rolls back provider conversation state", () => - withHarness( - (harness) => - Effect.gen(function* () { - yield* seedProjectAndThread(harness); - - yield* harness.adapterHarness.queueTurnResponseForNextSession({ - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-revert-1", "2026-02-24T10:14:00.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "message.delta", - ...runtimeBase("evt-claude-revert-2", "2026-02-24T10:14:00.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - delta: "README -> v2\n", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-revert-3", "2026-02-24T10:14:00.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - mutateWorkspace: ({ cwd }) => - Effect.sync(() => { - fs.writeFileSync(path.join(cwd, "README.md"), "v2\n", "utf8"); - }), - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-revert-1", - messageId: "msg-user-claude-revert-1", - text: "First Claude edit", - provider: "claudeCode", - }); - - yield* harness.waitForThread( - THREAD_ID, - (entry) => entry.latestTurn?.turnId === "turn-1" && entry.session?.threadId === "thread-1", - ); - - yield* harness.adapterHarness.queueTurnResponse(THREAD_ID, { - events: [ - { - type: "turn.started", - ...runtimeBase("evt-claude-revert-4", "2026-02-24T10:14:01.000Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - }, - { - type: "message.delta", - ...runtimeBase("evt-claude-revert-5", "2026-02-24T10:14:01.050Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - delta: "README -> v3\n", - }, - { - type: "turn.completed", - ...runtimeBase("evt-claude-revert-6", "2026-02-24T10:14:01.100Z", "claudeCode"), - threadId: THREAD_ID, - turnId: FIXTURE_TURN_ID, - status: "completed", - }, - ], - mutateWorkspace: ({ cwd }) => - Effect.sync(() => { - fs.writeFileSync(path.join(cwd, "README.md"), "v3\n", "utf8"); - }), - }); - - yield* startTurn({ - harness, - commandId: "cmd-turn-start-claude-revert-2", - messageId: "msg-user-claude-revert-2", - text: "Second Claude edit", - }); - - yield* harness.waitForThread( - THREAD_ID, - (entry) => - entry.latestTurn?.turnId === "turn-2" && - entry.checkpoints.length === 2 && - entry.session?.providerName === "claudeCode", - ); - - yield* harness.engine.dispatch({ - type: "thread.checkpoint.revert", - commandId: CommandId.makeUnsafe("cmd-checkpoint-revert-claude"), - threadId: THREAD_ID, - turnCount: 1, - createdAt: nowIso(), - }); - - const revertedThread = yield* harness.waitForThread( - THREAD_ID, - (entry) => - entry.checkpoints.length === 1 && entry.checkpoints[0]?.checkpointTurnCount === 1, - ); - assert.equal(revertedThread.checkpoints[0]?.checkpointTurnCount, 1); - assert.equal( - gitRefExists(harness.workspaceDir, checkpointRefForThreadTurn(THREAD_ID, 1)), - true, - ); - assert.equal( - gitRefExists(harness.workspaceDir, checkpointRefForThreadTurn(THREAD_ID, 2)), - false, - ); - assert.deepEqual(harness.adapterHarness.getRollbackCalls(THREAD_ID), [1]); - }), - "claudeCode", - ), -); diff --git a/apps/server/src/orchestration/Layers/CheckpointReactor.test.ts b/apps/server/src/orchestration/Layers/CheckpointReactor.test.ts index 7910dbdcd2d678e9a5e2f0edd15f571854ea1a2f..3716a063099f8141c469b30478912f35c8a7b3a1 100644 --- a/apps/server/src/orchestration/Layers/CheckpointReactor.test.ts +++ b/apps/server/src/orchestration/Layers/CheckpointReactor.test.ts @@ -43,7 +43,7 @@ const asTurnId = (value: string): TurnId => TurnId.makeUnsafe(value); type LegacyProviderRuntimeEvent = { readonly type: string; readonly eventId: EventId; - readonly provider: "codex" | "claudeCode" | "cursor"; + readonly provider: "codex" | "cursor"; readonly createdAt: string; readonly threadId: ThreadId; readonly turnId?: string | undefined; diff --git a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts index 0b5967480ab010789974a2822125935c45856185..5bfabc2751270af551db57308b6fbc1ea8adf0d0 100644 --- a/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts +++ b/apps/server/src/orchestration/Layers/ProviderCommandReactor.ts @@ -212,7 +212,6 @@ const make = Effect.gen(function* () { const desiredRuntimeMode = thread.runtimeMode; const currentProvider: ProviderKind | undefined = thread.session?.providerName === "codex" || - thread.session?.providerName === "claudeCode" || thread.session?.providerName === "cursor" ? thread.session.providerName : undefined; diff --git a/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.test.ts b/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.test.ts index 1bafe2889107124c0663fc4d573e4bab5a5c78d5..77a6578995262cf41f49fb284c28c6b8379f30cc 100644 --- a/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.test.ts +++ b/apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.test.ts @@ -41,7 +41,7 @@ const asTurnId = (value: string): TurnId => TurnId.makeUnsafe(value); type LegacyProviderRuntimeEvent = { readonly type: string; readonly eventId: EventId; - readonly provider: "codex" | "claudeCode" | "cursor"; + readonly provider: "codex" | "cursor"; readonly createdAt: string; readonly threadId: ThreadId; readonly turnId?: string | undefined; diff --git a/apps/server/src/provider/Layers/CodexAdapter.test.ts b/apps/server/src/provider/Layers/CodexAdapter.test.ts index eaba8097c718540d3c0c0d3a4ea6ffeda803a6b2..c26ccc74c68ee8219e18cecd27e888fe339bfb68 100644 --- a/apps/server/src/provider/Layers/CodexAdapter.test.ts +++ b/apps/server/src/provider/Layers/CodexAdapter.test.ts @@ -162,7 +162,7 @@ validationLayer("CodexAdapterLive validation", (it) => { const adapter = yield* CodexAdapter; const result = yield* adapter .startSession({ - provider: "claudeCode", + provider: "cursor", threadId: asThreadId("thread-1"), runtimeMode: "full-access", }) @@ -174,7 +174,7 @@ validationLayer("CodexAdapterLive validation", (it) => { new ProviderAdapterValidationError({ provider: "codex", operation: "startSession", - issue: "Expected provider 'codex' but received 'claudeCode'.", + issue: "Expected provider 'codex' but received 'cursor'.", }), ); assert.equal(validationManager.startSessionImpl.mock.calls.length, 0); diff --git a/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts b/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts index b3911b14ba2bcca02c4ba3a385eb8f0c29f038bc..4f2c7f2c7e0421c95eb389a62edfc6e8aed3208e 100644 --- a/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts +++ b/apps/server/src/provider/Layers/ProviderAdapterRegistry.ts @@ -1,7 +1,7 @@ /** * ProviderAdapterRegistryLive - In-memory provider adapter lookup layer. * - * Binds provider kinds (codex/claudeCode/...) to concrete adapter services. + * Binds provider kinds (codex/cursor/...) to concrete adapter services. * This layer only performs adapter lookup; it does not route session-scoped * calls or own provider lifecycle workflows. * diff --git a/apps/server/src/provider/Layers/ProviderService.test.ts b/apps/server/src/provider/Layers/ProviderService.test.ts index 08673c3cbf2d64f8413776d41d0c5363b7f68987..9c2d8278e3b27485ee007d2c26033516537246bb 100644 --- a/apps/server/src/provider/Layers/ProviderService.test.ts +++ b/apps/server/src/provider/Layers/ProviderService.test.ts @@ -51,7 +51,7 @@ const asTurnId = (value: string): TurnId => TurnId.makeUnsafe(value); type LegacyProviderRuntimeEvent = { readonly type: string; readonly eventId: EventId; - readonly provider: "codex" | "claudeCode" | "cursor"; + readonly provider: "codex" | "cursor"; readonly createdAt: string; readonly threadId: ThreadId; readonly turnId?: string | undefined; diff --git a/apps/server/src/provider/Layers/ProviderSessionDirectory.ts b/apps/server/src/provider/Layers/ProviderSessionDirectory.ts index a45cd87decf19a439aa394d0462e4dfddcdc03b9..e35103ea7d695164ee0ea175e7c470f4d3c99403 100644 --- a/apps/server/src/provider/Layers/ProviderSessionDirectory.ts +++ b/apps/server/src/provider/Layers/ProviderSessionDirectory.ts @@ -25,7 +25,7 @@ function decodeProviderKind( providerName: string, operation: string, ): Effect.Effect { - if (providerName === "codex" || providerName === "claudeCode" || providerName === "cursor") { + if (providerName === "codex" || providerName === "cursor") { return Effect.succeed(providerName); } return Effect.fail( diff --git a/apps/web/src/appSettings.test.ts b/apps/web/src/appSettings.test.ts index 5d5509ce102c0e9570e16574c39e040154a491a7..def5bf73239b9344167d6c4ee3f060e67663a7f2 100644 --- a/apps/web/src/appSettings.test.ts +++ b/apps/web/src/appSettings.test.ts @@ -16,11 +16,7 @@ describe("normalizeCustomModelSlugs", () => { ).toEqual(["custom/internal-model"]); }); - it("normalizes provider-specific aliases for claude and cursor", () => { - expect(normalizeCustomModelSlugs(["sonnet"], "claudeCode")).toEqual([]); - expect(normalizeCustomModelSlugs(["claude/custom-sonnet"], "claudeCode")).toEqual([ - "claude/custom-sonnet", - ]); + it("normalizes provider-specific aliases for cursor", () => { expect(normalizeCustomModelSlugs(["composer"], "cursor")).toEqual([]); expect(normalizeCustomModelSlugs(["cursor/custom-model"], "cursor")).toEqual([ "cursor/custom-model", @@ -53,9 +49,9 @@ describe("getAppModelOptions", () => { }); it("keeps a saved custom provider model available as an exact slug option", () => { - const options = getAppModelOptions("claudeCode", ["claude/custom-opus"], "claude/custom-opus"); + const options = getAppModelOptions("cursor", ["cursor/custom-model"], "cursor/custom-model"); - expect(options.some((option) => option.slug === "claude/custom-opus" && option.isCustom)).toBe( + expect(options.some((option) => option.slug === "cursor/custom-model" && option.isCustom)).toBe( true, ); }); @@ -85,10 +81,8 @@ describe("getSlashModelOptions", () => { }); it("includes provider-specific custom slugs in non-codex model lists", () => { - const claudeOptions = getAppModelOptions("claudeCode", ["claude/custom-opus"]); const cursorOptions = getAppModelOptions("cursor", ["cursor/custom-model"]); - expect(claudeOptions.some((option) => option.slug === "claude/custom-opus")).toBe(true); expect(cursorOptions.some((option) => option.slug === "cursor/custom-model")).toBe(true); }); }); diff --git a/apps/web/src/appSettings.ts b/apps/web/src/appSettings.ts index fa09a909f8d4034591e0e965039c343c7a9e737a..1e37f1b39dc40350e69502139552481e71de4778 100644 --- a/apps/web/src/appSettings.ts +++ b/apps/web/src/appSettings.ts @@ -8,7 +8,6 @@ const MAX_CUSTOM_MODEL_COUNT = 32; export const MAX_CUSTOM_MODEL_LENGTH = 256; const BUILT_IN_MODEL_SLUGS_BY_PROVIDER: Record> = { codex: new Set(getModelOptions("codex").map((option) => option.slug)), - claudeCode: new Set(getModelOptions("claudeCode").map((option) => option.slug)), cursor: new Set(getModelOptions("cursor").map((option) => option.slug)), }; @@ -26,9 +25,6 @@ const AppSettingsSchema = Schema.Struct({ customCodexModels: Schema.Array(Schema.String).pipe( Schema.withConstructorDefault(() => Option.some([])), ), - customClaudeModels: Schema.Array(Schema.String).pipe( - Schema.withConstructorDefault(() => Option.some([])), - ), customCursorModels: Schema.Array(Schema.String).pipe( Schema.withConstructorDefault(() => Option.some([])), ), @@ -79,7 +75,6 @@ function normalizeAppSettings(settings: AppSettings): AppSettings { return { ...settings, customCodexModels: normalizeCustomModelSlugs(settings.customCodexModels, "codex"), - customClaudeModels: normalizeCustomModelSlugs(settings.customClaudeModels, "claudeCode"), customCursorModels: normalizeCustomModelSlugs(settings.customCursorModels, "cursor"), }; } diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 0b892472c7612760531dfd6db80c2fdbe85fb7e7..695da69aadc0bb287ecb1f6c4335bd34881bde3f 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -77,6 +77,7 @@ import { findLatestProposedPlan, type PendingApproval, type PendingUserInput, + type ProviderPickerKind, PROVIDER_OPTIONS, deriveWorkLogEntries, hasToolActivityForTurn, @@ -847,9 +848,8 @@ export default function ChatView({ threadId }: ChatViewProps) { }, [modelOptionsByProvider, selectedModelForPicker, selectedProvider]); const searchableModelOptions = useMemo( () => - PROVIDER_OPTIONS.filter( - (option) => - option.available && (lockedProvider === null || option.value === lockedProvider), + AVAILABLE_PROVIDER_OPTIONS.filter( + (option) => lockedProvider === null || option.value === lockedProvider, ).flatMap((option) => modelOptionsByProvider[option.value].map(({ slug, name }) => ({ provider: option.value, @@ -5278,7 +5278,17 @@ const MessagesTimeline = memo(function MessagesTimeline({ ); }); -const AVAILABLE_PROVIDER_OPTIONS = PROVIDER_OPTIONS.filter((option) => option.available); +function isAvailableProviderOption( + option: (typeof PROVIDER_OPTIONS)[number], +): option is { + value: ProviderKind; + label: string; + available: true; +} { + return option.available && option.value !== "claudeCode"; +} + +const AVAILABLE_PROVIDER_OPTIONS = PROVIDER_OPTIONS.filter(isAvailableProviderOption); const UNAVAILABLE_PROVIDER_OPTIONS = PROVIDER_OPTIONS.filter((option) => !option.available); const COMING_SOON_PROVIDER_OPTIONS = [ { id: "opencode", label: "OpenCode", icon: OpenCodeIcon }, @@ -5287,13 +5297,11 @@ const COMING_SOON_PROVIDER_OPTIONS = [ function getCustomModelOptionsByProvider(settings: { customCodexModels: readonly string[]; - customClaudeModels: readonly string[]; customCursorModels: readonly string[]; }): Record> { const cursorFamilyOptions = getCursorModelFamilyOptions(); return { codex: getAppModelOptions("codex", settings.customCodexModels), - claudeCode: getAppModelOptions("claudeCode", settings.customClaudeModels), cursor: [ ...cursorFamilyOptions, ...getAppModelOptions("cursor", settings.customCursorModels).filter( @@ -5304,7 +5312,7 @@ function getCustomModelOptionsByProvider(settings: { }; } -const PROVIDER_ICON_BY_PROVIDER: Record = { +const PROVIDER_ICON_BY_PROVIDER: Record = { codex: OpenAI, claudeCode: ClaudeAI, cursor: CursorIcon, @@ -5385,10 +5393,7 @@ const ProviderModelPicker = memo(function ProviderModelPicker(props: {