diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index e4711a0075..501d9c20db 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -2456,7 +2456,7 @@ export default function ChatView({ threadId }: ChatViewProps) { ? parseStandaloneComposerSlashCommand(trimmed) : null; if (standaloneSlashCommand) { - await handleInteractionModeChange(standaloneSlashCommand); + handleInteractionModeChange(standaloneSlashCommand); promptRef.current = ""; clearComposerDraftContent(activeThread.id); setComposerHighlightedItemId(null); @@ -2512,7 +2512,7 @@ export default function ChatView({ threadId }: ChatViewProps) { const outgoingMessageText = formatOutgoingPrompt({ provider: selectedProvider, effort: selectedPromptEffort, - text: trimmed || IMAGE_ONLY_BOOTSTRAP_PROMPT, + text: messageTextForSend || IMAGE_ONLY_BOOTSTRAP_PROMPT, }); const turnAttachmentsPromise = Promise.all( composerImagesSnapshot.map(async (image) => ({ @@ -3670,8 +3670,6 @@ export default function ChatView({ threadId }: ChatViewProps) { /> ) : null} - - {/* Textarea area */}
void onImplementPlanInNewThread()} > - Implement in new thread + Implement in a new thread @@ -4079,9 +4077,7 @@ export default function ChatView({ threadId }: ChatViewProps) { type="submit" className="flex h-9 w-9 items-center justify-center rounded-full bg-primary/90 text-primary-foreground transition-all duration-150 hover:bg-primary hover:scale-105 disabled:opacity-30 disabled:hover:scale-100 sm:h-8 sm:w-8" disabled={ - isSendBusy || - isConnecting || - (!prompt.trim() && composerImages.length === 0) + isSendBusy || isConnecting || !composerSendState.hasSendableContent } aria-label={ isConnecting diff --git a/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx b/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx index 3c11fa5a05..fd80e10473 100644 --- a/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx +++ b/apps/web/src/components/chat/ClaudeTraitsPicker.browser.tsx @@ -16,27 +16,29 @@ async function mountPicker(props?: { fastModeEnabled?: boolean; }) { const threadId = ThreadId.makeUnsafe("thread-claude-traits"); - useComposerDraftStore.setState({ - draftsByThreadId: { - [threadId]: { - prompt: props?.prompt ?? "", - images: [], - nonPersistedImageIds: [], - persistedAttachments: [], - terminalContexts: [], - provider: "claudeAgent", - model: props?.model ?? "claude-opus-4-6", - modelOptions: { - claudeAgent: { - ...(props?.effort ? { effort: props.effort } : {}), - ...(props?.thinkingEnabled === false ? { thinking: false } : {}), - ...(props?.fastModeEnabled ? { fastMode: true } : {}), - }, - }, - runtimeMode: null, - interactionMode: null, + const draftsByThreadId = {} as ReturnType< + typeof useComposerDraftStore.getState + >["draftsByThreadId"]; + draftsByThreadId[threadId] = { + prompt: props?.prompt ?? "", + images: [], + nonPersistedImageIds: [], + persistedAttachments: [], + terminalContexts: [], + provider: "claudeAgent", + model: props?.model ?? "claude-opus-4-6", + modelOptions: { + claudeAgent: { + ...(props?.effort ? { effort: props.effort } : {}), + ...(props?.thinkingEnabled === false ? { thinking: false } : {}), + ...(props?.fastModeEnabled ? { fastMode: true } : {}), }, }, + runtimeMode: null, + interactionMode: null, + }; + useComposerDraftStore.setState({ + draftsByThreadId, draftThreadsByThreadId: {}, projectDraftThreadIdByProjectId: {}, }); diff --git a/apps/web/src/components/chat/CodexTraitsPicker.browser.tsx b/apps/web/src/components/chat/CodexTraitsPicker.browser.tsx index 494913dc76..d717f91923 100644 --- a/apps/web/src/components/chat/CodexTraitsPicker.browser.tsx +++ b/apps/web/src/components/chat/CodexTraitsPicker.browser.tsx @@ -13,26 +13,28 @@ async function mountPicker(props: { fastModeEnabled: boolean; }) { const threadId = ThreadId.makeUnsafe("thread-codex-traits"); - useComposerDraftStore.setState({ - draftsByThreadId: { - [threadId]: { - prompt: "", - images: [], - nonPersistedImageIds: [], - persistedAttachments: [], - terminalContexts: [], - provider: "codex", - model: null, - modelOptions: { - codex: { - ...(props.reasoningEffort ? { reasoningEffort: props.reasoningEffort } : {}), - ...(props.fastModeEnabled ? { fastMode: true } : {}), - }, - }, - runtimeMode: null, - interactionMode: null, + const draftsByThreadId = {} as ReturnType< + typeof useComposerDraftStore.getState + >["draftsByThreadId"]; + draftsByThreadId[threadId] = { + prompt: "", + images: [], + nonPersistedImageIds: [], + persistedAttachments: [], + terminalContexts: [], + provider: "codex", + model: null, + modelOptions: { + codex: { + ...(props.reasoningEffort ? { reasoningEffort: props.reasoningEffort } : {}), + ...(props.fastModeEnabled ? { fastMode: true } : {}), }, }, + runtimeMode: null, + interactionMode: null, + }; + useComposerDraftStore.setState({ + draftsByThreadId, draftThreadsByThreadId: {}, projectDraftThreadIdByProjectId: { [ProjectId.makeUnsafe("project-codex-traits")]: threadId, diff --git a/apps/web/src/components/chat/CodexTraitsPicker.tsx b/apps/web/src/components/chat/CodexTraitsPicker.tsx index 914eca5540..641d39277e 100644 --- a/apps/web/src/components/chat/CodexTraitsPicker.tsx +++ b/apps/web/src/components/chat/CodexTraitsPicker.tsx @@ -1,8 +1,8 @@ -import { - type CodexModelOptions, - type CodexReasoningEffort, - type ProviderModelOptions, - type ThreadId, +import type { + CodexModelOptions, + CodexReasoningEffort, + ProviderModelOptions, + ThreadId, } from "@t3tools/contracts"; import { getDefaultReasoningEffort, @@ -132,12 +132,14 @@ export const CodexTraitsPicker = memo(function CodexTraitsPicker(props: { thread