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 (
-