authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-03-01 23:55:38-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-05 23:00:41-08:00
logad28eaa86f851c6cd28573bd76635b550b43a530
tree80d8b5ba38b20003bed83ea688e292bb343bf1fc
parentd36bbc177d29877a335cda8bbe6601727587cffe

Scope composer draft reasoning effort to Codex options

- Switch draft store types to `CodexReasoningEffort` - Validate and default effort using Codex-specific option/default constants

1 files changed, 14 insertions(+), 10 deletions(-)

apps/web/src/composerDraftStore.ts+14-10
......@@ -1,10 +1,10 @@
11import {
2 DEFAULT_REASONING,
2 DEFAULT_REASONING_EFFORT_BY_PROVIDER,
33 ProjectId,
4 REASONING_OPTIONS,
4 REASONING_EFFORT_OPTIONS_BY_PROVIDER,
55 ThreadId,
66 normalizeModelSlug,
7 type ReasoningEffort,
7 type CodexReasoningEffort,
88} from "@t3tools/contracts";
99import type { ChatImageAttachment } from "./types";
1010import { create } from "zustand";
......@@ -30,7 +30,7 @@ interface PersistedComposerThreadDraftState {
3030 prompt: string;
3131 attachments: PersistedComposerImageAttachment[];
3232 model?: string | null;
33 effort?: ReasoningEffort | null;
33 effort?: CodexReasoningEffort | null;
3434}
3535
3636interface PersistedDraftThreadState {
......@@ -53,7 +53,7 @@ interface ComposerThreadDraftState {
5353 nonPersistedImageIds: string[];
5454 persistedAttachments: PersistedComposerImageAttachment[];
5555 model: string | null;
56 effort: ReasoningEffort | null;
56 effort: CodexReasoningEffort | null;
5757}
5858
5959export interface DraftThreadState {
......@@ -99,7 +99,7 @@ interface ComposerDraftStoreState {
9999 clearDraftThread: (threadId: ThreadId) => void;
100100 setPrompt: (threadId: ThreadId, prompt: string) => void;
101101 setModel: (threadId: ThreadId, model: string | null | undefined) => void;
102 setEffort: (threadId: ThreadId, effort: ReasoningEffort | null | undefined) => void;
102 setEffort: (threadId: ThreadId, effort: CodexReasoningEffort | null | undefined) => void;
103103 addImage: (threadId: ThreadId, image: ComposerImageAttachment) => void;
104104 addImages: (threadId: ThreadId, images: ComposerImageAttachment[]) => void;
105105 removeImage: (threadId: ThreadId, imageId: string) => void;
......@@ -133,7 +133,9 @@ const EMPTY_THREAD_DRAFT = Object.freeze({
133133 effort: null,
134134}) as ComposerThreadDraftState;
135135
136const REASONING_EFFORT_VALUES = new Set<ReasoningEffort>(REASONING_OPTIONS);
136const REASONING_EFFORT_VALUES = new Set<CodexReasoningEffort>(
137 REASONING_EFFORT_OPTIONS_BY_PROVIDER.codex,
138);
137139
138140function createEmptyThreadDraft(): ComposerThreadDraftState {
139141 return {
......@@ -310,8 +312,8 @@ function normalizePersistedComposerDraftState(value: unknown): PersistedComposer
310312 const effortCandidate =
311313 typeof draftCandidate.effort === "string" ? draftCandidate.effort : null;
312314 const effort =
313 effortCandidate && REASONING_EFFORT_VALUES.has(effortCandidate as ReasoningEffort)
314 ? (effortCandidate as ReasoningEffort)
315 effortCandidate && REASONING_EFFORT_VALUES.has(effortCandidate as CodexReasoningEffort)
316 ? (effortCandidate as CodexReasoningEffort)
315317 : null;
316318 if (prompt.length === 0 && attachments.length === 0 && !model && !effort) {
317319 continue;
......@@ -706,7 +708,9 @@ export const useComposerDraftStore = create<ComposerDraftStoreState>()(
706708 return;
707709 }
708710 const nextEffort =
709 effort && REASONING_EFFORT_VALUES.has(effort) && effort !== DEFAULT_REASONING
711 effort &&
712 REASONING_EFFORT_VALUES.has(effort) &&
713 effort !== DEFAULT_REASONING_EFFORT_BY_PROVIDER.codex
710714 ? effort
711715 : null;
712716 set((state) => {