diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index 9dce2ac0..a9a88bf7 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -2,11 +2,12 @@ import * as React from 'react' import { useCallback, useEffect, useState, useRef } from 'react' import { workspace } from '@x/shared'; import { RunEvent } from '@x/shared/src/runs.js'; -import type { ChatStatus, LanguageModelUsage, ToolUIPart } from 'ai'; +import type { LanguageModelUsage, ToolUIPart } from 'ai'; import './App.css' import z from 'zod'; import { Button } from './components/ui/button'; -import { CheckIcon, LoaderIcon } from 'lucide-react'; +import { CheckIcon, LoaderIcon, ArrowUp } from 'lucide-react'; +import { cn } from '@/lib/utils'; import { MarkdownEditor } from './components/markdown-editor'; import { ChatInputBar } from './components/chat-button'; import { ChatSidebar } from './components/chat-sidebar'; @@ -27,31 +28,15 @@ import { MessageResponse, } from '@/components/ai-elements/message'; import { - PromptInput, - PromptInputBody, - PromptInputFooter, type PromptInputMessage, PromptInputProvider, - PromptInputSubmit, PromptInputTextarea, - PromptInputTools, usePromptInputController, type FileMention, } from '@/components/ai-elements/prompt-input'; import { Reasoning, ReasoningContent, ReasoningTrigger } from '@/components/ai-elements/reasoning'; import { Shimmer } from '@/components/ai-elements/shimmer'; import { Tool, ToolContent, ToolHeader, ToolInput, ToolOutput } from '@/components/ai-elements/tool'; -import { - Context, - ContextCacheUsage, - ContextContent, - ContextContentBody, - ContextContentHeader, - ContextInputUsage, - ContextOutputUsage, - ContextReasoningUsage, - ContextTrigger, -} from '@/components/ai-elements/context'; import { SidebarInset, SidebarProvider, @@ -259,61 +244,52 @@ const collectFilePaths = (nodes: TreeNode[]): string[] => interface ChatInputInnerProps { onSubmit: (message: PromptInputMessage, mentions?: FileMention[]) => void isProcessing: boolean - contextUsage: LanguageModelUsage - maxTokens: number - usedTokens: number } function ChatInputInner({ onSubmit, isProcessing, - contextUsage, - maxTokens, - usedTokens, }: ChatInputInnerProps) { const controller = usePromptInputController() const message = controller.textInput.value const canSubmit = Boolean(message.trim()) && !isProcessing - const submitStatus: ChatStatus = isProcessing ? 'streaming' : 'ready' - const handleSubmit = useCallback((msg: PromptInputMessage) => { - onSubmit(msg, controller.mentions.mentions) + const handleSubmit = useCallback(() => { + if (!canSubmit) return + onSubmit({ text: message.trim(), files: [] }, controller.mentions.mentions) + controller.textInput.clear() controller.mentions.clearMentions() - }, [onSubmit, controller.mentions]) + }, [canSubmit, message, onSubmit, controller]) + + const handleKeyDown = useCallback((e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault() + handleSubmit() + } + }, [handleSubmit]) return ( - - - - - - - - - - - - - - - - - - - - - - +
+ + +
) } @@ -324,9 +300,6 @@ interface ChatInputWithMentionsProps { visibleFiles: string[] onSubmit: (message: PromptInputMessage, mentions?: FileMention[]) => void isProcessing: boolean - contextUsage: LanguageModelUsage - maxTokens: number - usedTokens: number } function ChatInputWithMentions({ @@ -335,18 +308,12 @@ function ChatInputWithMentions({ visibleFiles, onSubmit, isProcessing, - contextUsage, - maxTokens, - usedTokens, }: ChatInputWithMentionsProps) { return ( ) @@ -1259,7 +1226,7 @@ function App() { -
+
diff --git a/apps/x/apps/renderer/src/components/ai-elements/prompt-input.tsx b/apps/x/apps/renderer/src/components/ai-elements/prompt-input.tsx index 5ba67292..b329fcbb 100644 --- a/apps/x/apps/renderer/src/components/ai-elements/prompt-input.tsx +++ b/apps/x/apps/renderer/src/components/ai-elements/prompt-input.tsx @@ -1123,7 +1123,7 @@ export const PromptInputTextarea = ({ }; return ( -
+
{mentionHighlights.hasHighlights && (
setIsComposing(false)} onCompositionStart={() => setIsComposing(true)} diff --git a/apps/x/apps/renderer/src/components/chat-sidebar.tsx b/apps/x/apps/renderer/src/components/chat-sidebar.tsx index 1f059503..b5801209 100644 --- a/apps/x/apps/renderer/src/components/chat-sidebar.tsx +++ b/apps/x/apps/renderer/src/components/chat-sidebar.tsx @@ -478,7 +478,7 @@ export function ChatSidebar({ {/* Input area - responsive to sidebar width, matches floating bar position exactly */}
-
+
{mentionHighlights.hasHighlights && (