From c7da6cb8a8948fc59badcb0c41eb33de08dff111 Mon Sep 17 00:00:00 2001 From: Evandro Fonseca Junior Date: Fri, 28 Nov 2025 15:15:38 -0300 Subject: [PATCH] feat: enhance OllaHub with new features and UI improvements - Introduced a comprehensive README.md detailing the application, its architecture, and key features. - Implemented a local-first architecture with deep research capabilities, including query decomposition and parallel web scraping. - Added a reactive UI built with React and Next.js, featuring Tailwind CSS for styling and Zustand for state management. - Integrated a task scheduler for recurring tasks and system monitoring for real-time resource management. - Enhanced settings page with debug mode options and improved hardware dashboard loading states. - Updated chat interface to include debug data visualization and improved user experience during message streaming. - Removed unused favicon and updated application icons for better branding. - Improved navigation handling with non-blocking transitions and state management for setup completion. --- LICENSE | 20 + README.md | 362 ++++++++++++++++- app/chat/page.tsx | 166 ++------ app/favicon.ico | Bin 25931 -> 0 bytes app/icon512x512-wBackground.png | Bin 0 -> 139498 bytes app/layout.tsx | 6 + app/page.tsx | 83 ++-- app/settings/page.tsx | 64 ++- app/setup/page.tsx | 9 +- components/chat/chat-message.tsx | 179 ++++---- components/chat/debug-console.tsx | 475 ++++++++++++++++++++++ components/keyboard-shortcuts.tsx | 101 +++++ components/settings/HardwareDashboard.tsx | 32 +- components/setup/model-selector.tsx | 34 +- components/titlebar.tsx | 6 + hooks/use-hardware.ts | 7 +- hooks/use-setup-check.ts | 111 +++++ icons/app-icon.png | Bin 0 -> 139498 bytes icons/icon.psd | Bin 0 -> 993189 bytes icons/icon512x512-wBackground.png | Bin 0 -> 139498 bytes icons/icon512x512.png | Bin 0 -> 117237 bytes public/icon.png | Bin 0 -> 117237 bytes src-tauri/icons/128x128.ico | Bin 0 -> 67646 bytes src-tauri/icons/128x128.png | Bin 11059 -> 0 bytes src-tauri/icons/128x128@2x.png | Bin 23137 -> 0 bytes src-tauri/icons/256x256.ico | Bin 0 -> 42890 bytes src-tauri/icons/32x32.ico | Bin 0 -> 4286 bytes src-tauri/icons/32x32.png | Bin 2225 -> 0 bytes src-tauri/icons/512x512.ico | Bin 0 -> 123409 bytes src-tauri/icons/icon.ico | Bin 37710 -> 42890 bytes src-tauri/icons/icon.png | Bin 49979 -> 0 bytes src-tauri/icons/icon512x512.png | Bin 0 -> 139498 bytes src-tauri/src/lib.rs | 20 +- src-tauri/src/system_monitor.rs | 38 +- src-tauri/tauri.conf.json | 14 +- store/settings-store.ts | 24 +- 36 files changed, 1458 insertions(+), 293 deletions(-) create mode 100644 LICENSE delete mode 100644 app/favicon.ico create mode 100644 app/icon512x512-wBackground.png create mode 100644 components/chat/debug-console.tsx create mode 100644 components/keyboard-shortcuts.tsx create mode 100644 hooks/use-setup-check.ts create mode 100644 icons/app-icon.png create mode 100644 icons/icon.psd create mode 100644 icons/icon512x512-wBackground.png create mode 100644 icons/icon512x512.png create mode 100644 public/icon.png create mode 100644 src-tauri/icons/128x128.ico delete mode 100644 src-tauri/icons/128x128.png delete mode 100644 src-tauri/icons/128x128@2x.png create mode 100644 src-tauri/icons/256x256.ico create mode 100644 src-tauri/icons/32x32.ico delete mode 100644 src-tauri/icons/32x32.png create mode 100644 src-tauri/icons/512x512.ico delete mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/icons/icon512x512.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a86aaf8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +OllaHub Community License (v1.0) +Copyright (c) 2024 Evandro Fonseca Junior (evandrodevbr) Website: https://evandro.dev.br + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. GRANT OF LICENSE Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to use, copy, modify, merge, publish, distribute, and sublicense copies of the Software, subject strictly to the conditions and limitations set forth below. + +2. ATTRIBUTION REQUIREMENT (CREDITWARE) This license explicitly requires correct attribution as a condition of use. a) Source Code & Distribution: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. b) Public Display: Any redistribution, fork, derivative work, video content, article, social media post, or public demonstration involving this Software MUST include visible and clear credits to the original author (Evandro Fonseca Junior) and a direct link to https://evandro.dev.br. c) UI Integrity: Removal, obscuring, or modification of copyright notices, author links, metadata, or "About" screens within the Software's user interface is strictly prohibited. + +3. NON-COMMERCIAL & ANTI-MONETIZATION RESTRICTIONS This license distinguishes between "Internal Use" and "Commercial Distribution." a) Prohibition of Sale: You may NOT sell, rent, lease, or sub-license the Software for a fee. You may not bundle this Software within a paid product or service without express written permission from the Copyright Holder. b) No Monetization Barriers: You may NOT use the Software as a mechanism for monetization, including but not limited to "freemium" models, paywalls, or "pay-for-speed" download gates. c) Permitted Internal Use: The use of this Software internally within a commercial organization for productivity, research, or development purposes (e.g., employees using the tool to perform their daily tasks) is EXPLICITLY PERMITTED and encouraged, provided the Software itself is not the product being sold. + +4. DONATION POLICY The Software is developed and maintained through voluntary contributions. a) Official Channels Only: No third-party entity is authorized to solicit or collect donations on behalf of OllaHub or its author. b) Direct Support: All financial contributions must be directed exclusively to the official channels listed at https://evandro.dev.br. Soliciting donations for a fork or redistribution of this Software without significant and distinct added value is prohibited. + +5. DISCLAIMER OF WARRANTY & LIABILITY THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +6. SPECIFIC DISCLAIMER: AI & WEB SCRAPING The Software interacts with Large Language Models (LLMs) and performs web scraping operations. By using this Software, you acknowledge and agree that: a) The authors are not responsible for the accuracy, hallucinations, or bias of content generated by LLMs. b) You are solely responsible for ensuring that your use of the web scraping features complies with the Terms of Service (ToS) of third-party websites and applicable local laws. c) You are responsible for maintaining data privacy and security when processing sensitive information. + +7. COMMERCIAL LICENSING For usage scenarios that fall outside these terms (e.g., white-labeling, redistribution in paid suites, or custom enterprise agreements), please contact the author for a commercial license: + +Website: https://evandro.dev.br \ No newline at end of file diff --git a/README.md b/README.md index e215bc4..e42e586 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,358 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# OllaHub + +Local-first LLM workspace with deep research capabilities and native OS integration. + +[![Rust](https://img.shields.io/badge/Rust-1.77.2-orange.svg)](https://www.rust-lang.org/) +[![Tauri](https://img.shields.io/badge/Tauri-2.9.2-24C8DB.svg)](https://tauri.app/) +[![Next.js](https://img.shields.io/badge/Next.js-16.0.3-black.svg)](https://nextjs.org/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.0-blue.svg)](https://www.typescriptlang.org/) +[![License](https://img.shields.io/badge/License-Custom-blue.svg)](LICENSE) +[![Version](https://img.shields.io/badge/Version-0.1.0-blue.svg)](https://github.com/evandrodevbr/OllaHub) + +## Overview + +OllaHub is a desktop application that orchestrates local Large Language Models (LLMs) through Ollama, providing a private, offline-capable workspace for research, analysis, and conversation. The application executes complex research workflows by decomposing queries, performing parallel web scraping, and synthesizing context from multiple sources before generating responses. + +The architecture prioritizes data privacy by keeping all processing local, using SQLite with full-text search for efficient storage, and integrating ONNX Runtime for semantic relevance ranking without external API dependencies. + +## Key Features + +### Deep Research Pipeline + +The application implements a multi-stage research workflow: + +1. **Query Decomposition**: Uses LLM to break complex queries into 3-5 atomic, search-optimized sub-queries +2. **Parallel Web Scraping**: Executes multiple searches concurrently using headless Chrome and DuckDuckGo metadata API +3. **Knowledge Base Aggregation**: Collects and deduplicates content from multiple sources +4. **Context Condensation**: Applies relevance scoring and summarization to fit context within token limits +5. **Validation**: Verifies knowledge base sufficiency before response generation + +The pipeline includes safety checks to ensure decomposed queries remain relevant to the original intent, with automatic fallback to the original query if decomposition fails. + +### Local-First Architecture + +- **Ollama Integration**: Direct subprocess management of Ollama for model execution +- **ONNX Embeddings**: Local semantic similarity using all-MiniLM-L6-v2 (384-dimensional embeddings) +- **SQLite with FTS5**: Full-text search with virtual tables for session titles and message content +- **Hybrid Storage**: Dual persistence (SQLite + JSON) with automatic migration and fallback + +### Hybrid Storage System + +The application uses SQLite as the primary storage backend with JSON as a fallback: + +- **SQLite (Primary)**: WAL mode for concurrent reads/writes, optimized cache settings, FTS5 virtual tables for search +- **JSON (Legacy)**: Maintained for backward compatibility and export functionality +- **Automatic Migration**: Seamless transition from JSON to SQLite with data preservation + +### Reactive UI + +Built with React 19 and Next.js 16, the interface uses: + +- **Tailwind CSS**: Utility-first styling with design tokens +- **Radix UI / Shadcn**: Accessible, headless component primitives +- **Zustand**: Lightweight state management for settings and UI state +- **Framer Motion**: Smooth animations for state transitions +- **Resizable Panels**: Customizable layout with persistent preferences + +### MCP (Model Context Protocol) Integration + +Supports external tool integration through MCP servers: + +- **JSON-RPC Communication**: Bidirectional communication with MCP servers via stdin/stdout +- **Tool Discovery**: Automatic enumeration of available tools from running servers +- **Process Management**: Lifecycle management (start, stop, restart) with health monitoring +- **Tool Execution**: Runtime invocation of MCP tools with result injection into LLM context + +### System Monitoring + +Real-time hardware monitoring and resource management: + +- **GPU Detection**: NVIDIA and AMD GPU identification with utilization tracking +- **CPU/Memory Stats**: System-wide resource usage via `sysinfo` crate +- **Model Recommendations**: Hardware-aware model suggestions based on available VRAM/RAM + +### Task Scheduler + +Cron-based task execution system: + +- **Recurring Tasks**: Schedule periodic operations (e.g., knowledge base updates) +- **Task Queue**: Priority-based execution with retry logic +- **State Persistence**: Task state survives application restarts + +## Architecture + +```mermaid +graph TB + subgraph Frontend["Frontend (Next.js)"] + UI[React Components] + Hooks[Custom Hooks] + Store[Zustand Store] + end + + subgraph Bridge["Tauri Bridge"] + Commands[Tauri Commands] + Events[Event System] + end + + subgraph Backend["Rust Core"] + Orchestrator[Orchestrator] + Scraper[Web Scraper] + DB[(SQLite + FTS5)] + Embeddings[ONNX Embeddings] + Scheduler[Task Scheduler] + MCP[MCP Manager] + end + + subgraph External["External Services"] + Ollama[Ollama Subprocess] + Chrome[Headless Chrome] + MCP_Servers[MCP Servers] + end + + UI --> Hooks + Hooks --> Store + Store --> Commands + Commands --> Orchestrator + Orchestrator --> Scraper + Orchestrator --> DB + Orchestrator --> Embeddings + Orchestrator --> Scheduler + Orchestrator --> MCP + Scraper --> Chrome + Orchestrator --> Ollama + MCP --> MCP_Servers + Events --> UI + + style Frontend fill:#2563eb,color:#fff + style Bridge fill:#7c3aed,color:#fff + style Backend fill:#dc2626,color:#fff + style External fill:#059669,color:#fff +``` + +### Data Flow + +1. **User Query** → Frontend captures input and triggers preprocessing +2. **Query Preprocessing** → Intent classification, entity extraction, query enrichment +3. **Deep Research** → Query decomposition → Parallel search → Scraping → Knowledge base aggregation +4. **Context Condensation** → Relevance scoring (ONNX embeddings) → Summarization → Token optimization +5. **LLM Generation** → Ollama subprocess with streaming response +6. **Storage** → SQLite persistence with FTS5 indexing for future retrieval + +## Tech Stack + +### Core + +| Layer | Technology | Version | Purpose | +|-------|-----------|---------|---------| +| **Desktop Framework** | Tauri | 2.9.2 | Native desktop app with Rust backend | +| **Backend Language** | Rust | 1.77.2 | System-level operations, performance-critical paths | +| **Frontend Framework** | Next.js | 16.0.3 | React-based UI with SSR capabilities | +| **UI Library** | React | 19.2.0 | Component-based interface | +| **Language** | TypeScript | 5.0 | Type-safe frontend development | + +### Frontend + +| Category | Technology | Purpose | +|----------|-----------|---------| +| **State Management** | Zustand | 5.0.8 | Settings and UI state | +| **Styling** | Tailwind CSS | 4.0 | Utility-first CSS framework | +| **Components** | Radix UI | Latest | Accessible primitives (dialogs, dropdowns, tooltips) | +| **Components** | Shadcn/ui | Custom | Pre-built component library | +| **Animations** | Framer Motion | 12.23.24 | Smooth transitions | +| **Markdown** | react-markdown | 10.1.0 | Message rendering with GFM support | +| **Syntax Highlighting** | react-syntax-highlighter | 16.1.0 | Code block rendering | + +### Backend + +| Category | Technology | Purpose | +|----------|-----------|---------| +| **Database** | SQLite (rusqlite) | 0.31 | Local data persistence with FTS5 | +| **Web Scraping** | headless_chrome | 1.0 | Browser automation for content extraction | +| **HTML Parsing** | scraper | 0.18 | DOM parsing and content extraction | +| **Text Processing** | readability | 0.3 | Main content extraction from HTML | +| **HTTP Client** | reqwest | 0.12 | API requests with streaming support | +| **Async Runtime** | tokio | 1.0 | Async I/O and concurrency | +| **Task Scheduling** | tokio-cron-scheduler | 0.9 | Cron-based task execution | +| **System Info** | sysinfo | 0.36.1 | Hardware monitoring | +| **Embeddings** | ONNX Runtime (ort) | 2.0.0-rc.10 | Local semantic similarity | +| **Tokenization** | tokenizers | 0.21 | Text tokenization for embeddings | +| **Array Operations** | ndarray | 0.16 | Numerical computations | + +### AI/ML + +| Component | Technology | Purpose | +|-----------|-----------|---------| +| **LLM Runtime** | Ollama | Local model execution | +| **Embeddings Model** | all-MiniLM-L6-v2 | 384-dim semantic embeddings | +| **Embeddings Runtime** | ONNX Runtime | Model inference | ## Getting Started -First, run the development server: +### Prerequisites +- **Node.js**: 20.x or later +- **Rust**: 1.77.2 or later +- **pnpm**: Latest version (`npm install -g pnpm`) +- **Ollama**: [Install Ollama](https://ollama.ai) and ensure it's running on `http://localhost:11434` + +### Installation + +1. Clone the repository: ```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev +git clone https://github.com/evandrodevbr/OllaHub.git +cd OllaHub ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +2. Install dependencies: +```bash +pnpm install +``` -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +3. Run in development mode: +```bash +pnpm tauri dev +``` -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. +This command will: +- Start the Next.js development server on `http://localhost:3000` +- Build the Rust backend +- Launch the Tauri application window -## Learn More +### Building for Production -To learn more about Next.js, take a look at the following resources: +```bash +pnpm tauri build +``` -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +The built application will be in `src-tauri/target/release/bundle/`: +- **Windows**: `.msi` installer +- **macOS**: `.dmg` or `.app` +- **Linux**: `.deb`, `.AppImage`, or `.rpm` -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! +### Environment Configuration -## Deploy on Vercel +The application uses Tauri's built-in configuration. No environment variables are required for basic operation. MCP server configurations are stored in the application data directory and managed through the UI. -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +## Project Structure -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +``` +OllaHub/ +├── app/ # Next.js app directory (pages) +│ ├── chat/ # Chat interface +│ ├── settings/ # Application settings +│ ├── setup/ # Initial setup wizard +│ └── tasks/ # Task management +├── components/ # React components +│ ├── chat/ # Chat-specific components +│ ├── settings/ # Settings UI components +│ ├── setup/ # Setup wizard components +│ └── ui/ # Reusable UI primitives (Shadcn) +├── hooks/ # React custom hooks +│ ├── use-chat.ts # Chat state management +│ ├── use-deep-research.ts # Research pipeline orchestration +│ ├── use-mcp-servers.ts # MCP server management +│ └── ... +├── lib/ # Utility functions +│ ├── knowledge-base-processor.ts # Context condensation +│ ├── contextual-analyzer.ts # Query analysis +│ ├── query-enricher.ts # Query expansion +│ └── ... +├── services/ # Service layer +│ └── webSearch.ts # Web search abstraction +├── store/ # Zustand stores +│ └── settings-store.ts # Application settings +├── src-tauri/ # Rust backend +│ ├── src/ +│ │ ├── lib.rs # Main Tauri commands +│ │ ├── db.rs # SQLite database layer +│ │ ├── embeddings.rs # ONNX embeddings module +│ │ ├── web_scraper.rs # Web scraping logic +│ │ ├── scheduler.rs # Task scheduling +│ │ └── ... +│ └── Cargo.toml # Rust dependencies +└── data/ # Static data + ├── models/ # Model metadata JSON files + └── prompts/ # LLM prompt templates +``` + +## Design Patterns + +### Backend (Rust) + +- **Command Pattern**: Tauri commands encapsulate backend operations +- **State Management**: Arc> for shared state (browser instances, MCP processes) +- **Error Handling**: Result with custom error types and fallback strategies +- **Async/Await**: Tokio runtime for concurrent operations (scraping, MCP communication) + +### Frontend (TypeScript) + +- **Custom Hooks**: Encapsulate complex logic (deep research, chat management) +- **State Machines**: Step-based workflows (idle → planning → searching → aggregating) +- **Optimistic Updates**: UI updates before backend confirmation +- **Streaming**: Real-time token rendering via Tauri events + +### Data Layer + +- **Repository Pattern**: Database abstraction in `db.rs` +- **Migration Strategy**: Dual storage (SQLite + JSON) with automatic fallback +- **Full-Text Search**: FTS5 virtual tables with trigger-based synchronization + +## Roadmap + +### Planned Features + +- **Vector Store Integration**: Replace SQLite BLOB embeddings with dedicated vector database (LanceDB or Qdrant) +- **Cloud Sync**: Optional encrypted synchronization of chat sessions across devices +- **Plugin System**: Extensible architecture for custom research workflows +- **Advanced RAG**: Multi-modal retrieval with image and document support +- **Model Fine-tuning UI**: Interface for training custom models on user data +- **Collaborative Features**: Shared workspaces and team collaboration + +### Technical Improvements + +- **Performance**: Optimize SQLite queries with prepared statements caching +- **Memory Management**: Implement LRU cache for embeddings model +- **Error Recovery**: Enhanced retry logic with exponential backoff +- **Testing**: Comprehensive unit and integration test coverage +- **Documentation**: API documentation with code examples + +## Contributing + +Contributions are welcome. Please follow these guidelines: + +1. **Code Style**: Follow existing patterns (Rust: `rustfmt`, TypeScript: ESLint) +2. **Commits**: Use conventional commits (feat:, fix:, docs:, etc.) +3. **Pull Requests**: Include description of changes and test results +4. **Issues**: Use GitHub Issues for bug reports and feature requests + +## License + +OllaHub is released under a custom license that combines freeware, creditware, and non-commercial restrictions. See the [LICENSE](LICENSE) file for full terms. + +### Quick Summary + +**You may:** +- Use OllaHub freely for personal, educational, and internal professional use +- Modify and distribute the Software (with proper attribution) +- Fork the project and create derivative works (with attribution) + +**You must:** +- Give credit to **Evandro Fonseca Junior** and link to [evandro.dev.br](https://evandro.dev.br) +- Keep copyright notices and attribution intact +- Not sell the Software or charge for access without written permission + +**You may not:** +- Sell the Software or bundle it in paid products (without permission) +- Use it as a monetization mechanism +- Remove attribution or copyright notices +- Collect donations on behalf of OllaHub + +For commercial licensing inquiries, visit [evandro.dev.br](https://evandro.dev.br). + +## Acknowledgments + +- [Ollama](https://ollama.ai) for local LLM execution +- [Tauri](https://tauri.app) for desktop framework +- [Radix UI](https://www.radix-ui.com) for accessible components +- [Shadcn](https://ui.shadcn.com) for component library +- [ONNX Runtime](https://onnxruntime.ai) for embeddings inference diff --git a/app/chat/page.tsx b/app/chat/page.tsx index d9b6d33..39b39dd 100644 --- a/app/chat/page.tsx +++ b/app/chat/page.tsx @@ -3,7 +3,7 @@ import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "@/components/ui/resizable"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { MessageSquare, Settings, Server, Moon, Sun, PanelLeftClose, PanelLeftOpen, Loader2, ChevronDown, Plus, ScrollText, Copy, Check, Globe, RefreshCw, Cpu } from "lucide-react"; +import { MessageSquare, Settings, Server, Moon, Sun, PanelLeftClose, PanelLeftOpen, Loader2, ChevronDown, Plus, RefreshCw, Cpu } from "lucide-react"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { ChatInput } from "@/components/chat/chat-input"; import { ChatMessage } from "@/components/chat/chat-message"; @@ -33,6 +33,7 @@ import { chatLog } from "@/lib/terminal-logger"; import { useQueryPreprocessor, type PreprocessedQuery } from "@/hooks/use-query-preprocessor"; import type { Message, ThinkingMessageMetadata, ThinkingStepType, ThinkingStepStatus } from "@/hooks/use-chat"; import { executeProgressiveSearch } from "@/lib/web-search-fallback"; +import type { DebugData } from "@/components/chat/debug-console"; // @ts-expect-error - MD file import import defaultFormatPrompt from "@/data/prompts/default-format.md"; @@ -125,14 +126,9 @@ export default function ChatPage() { const lastSavedMessagesRef = useRef(0); const messagesEndRef = useRef(null); const scrollContainerRef = useRef(null); - const [showContextDebug, setShowContextDebug] = useState(false); - const [showProcessDebug, setShowProcessDebug] = useState(false); - const [lastWebContext, setLastWebContext] = useState(''); - const [lastContextSources, setLastContextSources] = useState([]); const [showDownloadDialog, setShowDownloadDialog] = useState(false); - const [logsCopied, setLogsCopied] = useState(false); - const [lastUserQuery, setLastUserQuery] = useState(''); const [searchMatchIndex, setSearchMatchIndex] = useState(0); + const [debugDataMap, setDebugDataMap] = useState>(new Map()); // Resetar índice quando busca é limpa ou sessão muda useEffect(() => { @@ -369,13 +365,6 @@ export default function ChatPage() { chatLog.info(`Should Search: ${preprocessed.shouldSearch}`); chatLog.info(`Timestamp: ${new Date().toISOString()}`); - setShowContextDebug(false); - setShowProcessDebug(false); - setLastWebContext(''); - setLastContextSources([]); - setLastUserQuery(content); // Store for copy logs - setLogsCopied(false); - // Generate ID if new session (but don't create card yet - wait for title) if (!currentSessionId) { const newId = crypto.randomUUID(); @@ -598,8 +587,6 @@ export default function ChatPage() { chatLog.warn('⚠️ Knowledge Base Context is empty!'); } - setLastWebContext(knowledgeBaseContext); - setLastContextSources(scrapedSources); // Atualizar mensagem: Processamento concluído updateThinkingMessage('processing', { @@ -627,8 +614,6 @@ export default function ChatPage() { deepResearch.addToKnowledgeBase(simpleQuery, results); knowledgeBaseContext = deepResearch.getCuratedContext(); scrapedSources = results; - setLastWebContext(knowledgeBaseContext); - setLastContextSources(scrapedSources); } } else { chatLog.info('Simple query returned NO_SEARCH, skipping web search'); @@ -837,6 +822,46 @@ Ao responder sobre fatos atuais ou notícias, inicie mencionando explicitamente chatLog.info('✅ Response generation complete'); chatLog.info('========== QUERY COMPLETE ==========\n'); + // Construir dados de debug para a última mensagem do assistente + setMessages(prev => { + const newMessages = [...prev]; + const lastMsgIndex = newMessages.length - 1; + if (lastMsgIndex >= 0 && newMessages[lastMsgIndex].role === 'assistant') { + const lastMsg = newMessages[lastMsgIndex]; + const debugData: DebugData = { + model: selectedModel, + timestamp: Date.now(), + latency: Date.now() - responseStart, + systemPrompt: enhancedSystemPrompt, + userQuery: content, + contextUsed: messages.filter(m => m.role !== 'system'), + webResearch: { + queries: deepResearch.state.plan || [], + enrichedQueries: deepResearch.state.enrichedQueries || undefined, + sources: scrapedSources, + logs: deepResearch.state.logs, + plan: deepResearch.state.plan, + knowledgeBase: deepResearch.state.knowledgeBase.map(entry => ({ + sourceUrl: entry.sourceUrl, + title: entry.title, + content: entry.content, + })), + }, + deepResearchState: deepResearch.state, + finalResponse: lastMsg.content, + rawResponse: lastMsg.content, + }; + + // Armazenar debug data usando o índice da mensagem + setDebugDataMap(prevMap => { + const newMap = new Map(prevMap); + newMap.set(lastMsgIndex, debugData); + return newMap; + }); + } + return newMessages; + }); + // Persistir fontes na mensagem do assistente (metadata) if (scrapedSources.length > 0) { // Aguardar um pouco para garantir que o sendMessage iniciou e criou a mensagem do assistente @@ -998,45 +1023,6 @@ Ao responder sobre fatos atuais ou notícias, inicie mencionando explicitamente } }; - // Copy Logs to Clipboard - const handleCopyLogs = async () => { - const logs = deepResearch.state.logs; - const lastAssistantMessage = messages.filter(m => m.role === 'assistant').pop(); - - let logText = `# Deep Research Debug Log\n\n`; - logText += `## User Query\n${lastUserQuery}\n\n`; - logText += `## Model\n${selectedModel}\n\n`; - logText += `## Process Logs\n\n`; - - logs.forEach((log, idx) => { - logText += `### ${idx + 1}. Stage: ${log.stage.toUpperCase()}\n`; - logText += `- **Time**: ${new Date(log.timestamp).toLocaleTimeString()}\n`; - logText += `- **Input**: ${log.input.substring(0, 500)}${log.input.length > 500 ? '...' : ''}\n`; - if (log.rawOutput) { - logText += `- **Raw Output**: ${log.rawOutput.substring(0, 500)}${log.rawOutput.length > 500 ? '...' : ''}\n`; - } - if (log.parsedOutput) { - logText += `- **Parsed Output**: \`\`\`json\n${JSON.stringify(log.parsedOutput, null, 2)}\n\`\`\`\n`; - } - if (log.error) { - logText += `- **Error**: ${log.error}\n`; - } - logText += '\n'; - }); - - logText += `## AI Response\n`; - logText += lastAssistantMessage?.content || '[No response yet]'; - logText += '\n\n---\n'; - logText += `Generated at: ${new Date().toISOString()}`; - - try { - await navigator.clipboard.writeText(logText); - setLogsCopied(true); - setTimeout(() => setLogsCopied(false), 2000); - } catch (err) { - console.error('Failed to copy logs:', err); - } - }; return (
@@ -1380,6 +1366,7 @@ Ao responder sobre fatos atuais ou notícias, inicie mencionando explicitamente highlightTerm={searchQuery && searchQuery.trim().length >= 2 ? searchQuery.trim() : undefined} highlightIndex={messageMatchIndex} messageIndex={group.index} + debugData={group.index !== undefined ? debugDataMap.get(group.index) : undefined} />
); @@ -1390,71 +1377,6 @@ Ao responder sobre fatos atuais ou notícias, inicie mencionando explicitamente )} - {/* Debug Info (Moved inside scroll) */} - {(deepResearch.state.logs.length > 0 || lastWebContext) && ( -
-
- {/* Process Log Toggle */} - {deepResearch.state.logs.length > 0 && ( -
- - {showProcessDebug && ( -
-
- -
- {deepResearch.state.logs.map((log, idx) => ( -
- {log.stage} - {log.input ? (log.input.length > 50 ? log.input.substring(0, 50) + '...' : log.input) : '-'} -
- ))} -
- )} -
- )} - - {/* Context Debug Toggle */} - {lastWebContext && ( -
- - {showContextDebug && ( -
-
- {lastContextSources.map((s, i) => ( - {s.title || s.url} - ))} -
-
-

Preview Contexto:

-
{lastWebContext.substring(0, 500)}...
-
-
- )} -
- )} -
-
- )} - {/* Spacer for Bottom Input */}
diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/icon512x512-wBackground.png b/app/icon512x512-wBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..fea9187ac853488e3135320d68173c3b5b8ee8b8 GIT binary patch literal 139498 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 z zER`oOHo82#ZLZGyOi-R17s+07Gh5LXu;8wnN59^HgmN%4+2Oyq=LJxy@c2U2FtZ2M8);IyU$m^+x z`xta91l*}qL6Ztafqd=}5h~7*=Hi%H)d(;v9#(DI+A5Ic0|8Xsczc8!Zp(4{1Y4q7 z9c}IcTuX;xzgyz>fBhBw_h0)mP93k%i1(loPXl>P74ldGb4l=`V2B+mtl%YJD zN-#lC=QlfKt#uDef)oM1ahPidfG!{>s5(^?Ka-Fwtil-|Iszo zXdqnWp4aY|Sv<+OiOI3GujI9H4CHtrT&`=y-(?io=f)Lly&l&4ef1Qu>VMQCc#H%1 z=4+e)T;!DuQg{Wq$@Hw|rp%-YU1BTQi$0fpDP%LO4F*_V@4}0tvx5G( z`al0QP5>_QnwXeF7}b&YHxO144=hgsVzR+y(>u#obLlda%Z7Q1xo0Ul3{{aLuI1RV zYhEo^4M969{&TGyhQv@j`?VAJPygmoJofN$%uen_v%N!tW}fj3$YeIDhZn0>o$phw zl+`GcDJE6~uaWvk`Xs?|4oR$vxjGVvBg&KVaH)hTprw$tM4cid$2a!cl(nH_8L5Do zNmk?;1Q`I2tK$mfVY3LhW zQ9drfL1*lucmjRh4%}!`!crJ|D5Znqu8WGX@HH^dJK-Yz2Ig!iB1hFQIMb?F5+Z)< zf;fpBVWe`&!lsblJ4Ls*jD^!D&`TDvb9Wo}y=NBhe*bNF&qpSZ7kvzR{MoVmPNT^F z(OLgyYwK%ezh8`1i)&&F%+8m?v^dWNZINSStW!zF%(0W~GUardVuW@8W&( z=+pY_z255^uh(DW1mGgCqessm&uIHf{c<|NnZ~&si26B|c&2MhRZB`|wd%B6tOAn? zFGSk!!9$AnWQdu$3FP_m5MwZU7+&=UVhKF@rC0Fz2an-Xzw-*pBEpWX_rR~}S^yAK znP)0qBVb8tpO=zg>7k+^BB^!R3T4F+1qgGMuML@mnfsiy6)RE$eMHidVOw77e^&4+ zm}6D71M*pwZ^H9yhH=W8J~PNjGiRA{quwkJizhhMGpP&)bzInEVv1%*`V z4vZ*4*yw%E8r2=RDj!V@07pd%tW$osq3%--H(YY0$)$AVN2)sQz&ebA9-?v`1T@AE zYTH)9V>*%&5BaJ>k`W}SCchk^u+kSlcS64W3WH<~i)T)tyS|FqnF+l6Lv`%FbrQB6H{2o=+de9mvQhv|20kkF49^&UEzsG zU%_ww%GWUH*To4-xaR~|iISTWfDuO)YjGJZOb$K`Mht8+$CiWC9)_SqR`jI1Fh4hs zB0mGq+wkWeJrJ*k!*Q^tg=u#kSXx{~x0_&Tse@;qSi+}&>pArM6{e(~yp z_9wxNT78@7iX=ZuyJKvX@9H%7B`ML@sT^w_#&%$G#3YD&{dpx#)eZ0{_=!;_f@sE@ zAdH#F@P~;ekX=7k_cFVsZ8cwaN#!*rS;QOU7^Lgy_c~bZoJ2C{px*GXXU`n=-LVCC zzhgT-@EyA_zY|zpNzmyK#LB==_rHy9)@ZfA+0<$*@bdbrUW*V%G0H)AC?l?*Rr7LS z;58|0%|LBbAQ%wCvk(|)-2*P(cfq^ZxJUX-w7XILXY!Q;Tfd!9q7x zM?xkS1`sqEX~i;Hr_|wk?0brnU=$;Z3w&weG=h zRco98yop7s?c-lQh9ieh;ESJG#Y2B|9L?G!rl)4aXog5~IlQC`r{FSa2Rk7eQGe61 zz=i~-&6s6&t20{J`k{xZZ7C+_SJ2PdVR)?o(3N&T776g`!Bw0(c?PFXEn_gq(Om;x z-A^|>pu3u2QQq%ibuE|RHa~wec5R)Nb0R0&y=41d75Jp`@O@-?F+zc}_O+Pb7!E*9 z=jD)*a440LRn?CE#H}xCi=+<~ib^(%W@ Rn@d2*2B@pHtaZ%S-`5>gjLw~CuoYG zD(R?FZ(YE9yv-C+(LgRBKF-EP8dztWhT9*~uyk[+LSmlnSKZ$w;2DkXOqYim@f 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 + {children} diff --git a/app/page.tsx b/app/page.tsx index 1d66491..915840d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,53 +1,63 @@ 'use client'; -import { useOllamaCheck } from "@/hooks/use-ollama-check"; +import { useSetupCheck } from "@/hooks/use-setup-check"; import { Hero } from "@/components/landing/hero"; import { InstallModal } from "@/components/modals/install-modal"; import { StoppedCard } from "@/components/landing/stopped-card"; import { WelcomeNotification } from "@/components/notifications/welcome-notification"; import { Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; -import { useEffect } from "react"; +import { useEffect, startTransition } from "react"; export default function Home() { - const { status, check } = useOllamaCheck(); + const { status, ollamaStatus, checkingStep, recheck } = useSetupCheck(); const router = useRouter(); - // Tentar iniciar Ollama automaticamente quando o componente montar + // Redirecionar automaticamente se tudo estiver pronto useEffect(() => { - const tryAutoStart = async () => { - try { - const { invoke } = await import("@tauri-apps/api/core"); - await invoke('auto_start_ollama'); - // Aguardar um pouco e verificar novamente - setTimeout(() => { - check(); - }, 2000); - } catch (error) { - console.error('Erro ao tentar iniciar Ollama automaticamente:', error); + if (status === 'ready') { + const setupComplete = localStorage.getItem("ollahub_setup_complete"); + + // Se setup não foi marcado como completo, marcar agora + if (!setupComplete) { + localStorage.setItem("ollahub_setup_complete", "true"); } - }; - - // Só tentar se estiver instalado mas não rodando - if (status === 'installed_stopped') { - tryAutoStart(); + + // Redirecionar para chat após um breve delay para mostrar feedback + const timer = setTimeout(() => { + startTransition(() => { + router.push("/chat"); + }); + }, 500); + + return () => clearTimeout(timer); } - }, [status, check]); + }, [status, router]); const handleStart = () => { const setupComplete = localStorage.getItem("ollahub_setup_complete"); if (setupComplete) { - router.push("/chat"); + startTransition(() => { + router.push("/chat"); + }); } else { - router.push("/setup"); + startTransition(() => { + router.push("/setup"); + }); } }; + // Mostrar loading durante verificação if (status === 'checking') { return (
- - Verificando sistema... +
+ +
+ {checkingStep} + Aguarde um momento... +
+
); } @@ -57,24 +67,37 @@ export default function Home() { {/* Notificação de boas-vindas */} - {/* Layout for Running State */} - {status === 'running' && ( + {/* Layout for Ready State - Redirecionamento automático */} + {status === 'ready' && ( +
+
+ +
+ Tudo pronto! + Redirecionando para o chat... +
+
+
+ )} + + {/* Layout for Needs Setup State */} + {status === 'needs_setup' && ollamaStatus === 'running' && ( )} {/* Layout for Stopped State */} - {status === 'installed_stopped' && ( + {status === 'needs_setup' && ollamaStatus === 'installed_stopped' && (

OllaHub

Detectamos o Ollama, mas ele não está rodando.

- +
)} {/* Layout for Not Installed State (Background + Modal) */} - {status === 'not_installed' && ( + {status === 'needs_ollama' && ( <>
{}} /> @@ -82,7 +105,7 @@ export default function Home() { {/* Hero is shown in background, modal is open */} )} diff --git a/app/settings/page.tsx b/app/settings/page.tsx index 418d46e..a93a9db 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useState, useEffect } from 'react'; +import { useState, useEffect, lazy, Suspense } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; @@ -22,7 +22,7 @@ import { } from '@/components/ui/dialog'; import { useSettingsStore } from '@/store/settings-store'; import { DomainTagsInput } from '@/components/settings/domain-tags-input'; -import { HardwareDashboard } from '@/components/settings/HardwareDashboard'; +const HardwareDashboard = lazy(() => import('@/components/settings/HardwareDashboard').then(m => ({ default: m.HardwareDashboard }))); import { invoke } from '@tauri-apps/api/core'; import { CheckCircle2, XCircle, Loader2, Download, Trash2, Copy, ExternalLink, Plus, X, BookOpen, GraduationCap, Newspaper, Code, DollarSign, Edit, RotateCcw, Terminal, Power, ArrowLeft, Sparkles, RefreshCw } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; @@ -55,6 +55,7 @@ export default function SettingsPage() { const [recentLogs, setRecentLogs] = useState([]); const [isLoadingLogs, setIsLoadingLogs] = useState(false); const [appVersion, setAppVersion] = useState(''); + const [activeTab, setActiveTab] = useState('overview'); const updater = useAppUpdater(); @@ -252,7 +253,7 @@ export default function SettingsPage() {
- + Visão Geral @@ -284,7 +285,30 @@ export default function SettingsPage() { - + {activeTab === 'overview' && ( + +
+ {[1, 2, 3, 4].map((i) => ( + + +
+
+
+
+ + +
+
+ + + ))} +
+
+ }> + + + )}
@@ -1106,6 +1130,38 @@ export default function SettingsPage() { + + + Debug & Desenvolvimento + + Ferramentas de debug e introspecção técnica + + + +
+
+ +

+ Exibe console completo de introspecção técnica para cada resposta da IA +

+
+ +
+ {settings.debugMode && ( +
+

+ O console de debug mostrará: System Prompt, Histórico da Sessão, Deep Research Pipeline, + Dados Processados e Resposta Raw para cada mensagem do assistente. +

+
+ )} +
+
+ Atualizações diff --git a/app/setup/page.tsx b/app/setup/page.tsx index 718ff92..a50b7fa 100644 --- a/app/setup/page.tsx +++ b/app/setup/page.tsx @@ -6,15 +6,22 @@ import { GpuSelector } from "@/components/setup/gpu-selector"; import { ModelSelector } from "@/components/setup/model-selector"; import { getRecommendation } from "@/lib/recommendation"; import { useRouter } from "next/navigation"; +import { startTransition, useState } from "react"; export default function SetupPage() { const { specs, loading, gpus } = useHardware(); const router = useRouter(); + const [isNavigating, setIsNavigating] = useState(false); const handleComplete = () => { + setIsNavigating(true); // Save setup state if needed localStorage.setItem("ollahub_setup_complete", "true"); - router.push("/chat"); + + // Usar startTransition para navegação não-bloqueante + startTransition(() => { + router.push("/chat"); + }); }; return ( diff --git a/components/chat/chat-message.tsx b/components/chat/chat-message.tsx index d122c93..2f9794c 100644 --- a/components/chat/chat-message.tsx +++ b/components/chat/chat-message.tsx @@ -8,7 +8,9 @@ import { markdownRenderers } from "./markdown-renderers"; import { MessageActions } from "./message-actions"; import { MessageBackground } from "./message-background"; import { MessageStepThinking } from "./message-step-thinking"; +import { DebugConsole, type DebugData } from "./debug-console"; import type { ThinkingMessageMetadata } from "@/hooks/use-chat"; +import { useSettingsStore } from "@/store/settings-store"; interface ChatMessageProps { message: Message; @@ -16,16 +18,17 @@ interface ChatMessageProps { highlightTerm?: string; highlightIndex?: number; messageIndex?: number; + debugData?: DebugData; } /** * Componente de mensagem do chat otimizado com React.memo * - * Durante streaming, usa renderização simplificada (texto puro) para evitar - * recálculo custoso da árvore DOM e syntax highlight a cada token. - * Markdown completo é aplicado apenas quando a mensagem está finalizada. + * Renderiza markdown em tempo real durante streaming para melhor UX. + * Usa useMemo para otimizar re-renders e manter performance. */ -function ChatMessageComponent({ message, isStreaming = false, highlightTerm, highlightIndex = 0, messageIndex }: ChatMessageProps) { +function ChatMessageComponent({ message, isStreaming = false, highlightTerm, highlightIndex = 0, messageIndex, debugData }: ChatMessageProps) { + const debugMode = useSettingsStore(state => state.debugMode); // Verificar se é mensagem de processo de pensamento const isThinkingMessage = message.metadata && typeof message.metadata === 'object' && @@ -61,6 +64,9 @@ function ChatMessageComponent({ message, isStreaming = false, highlightTerm, hig return content || message.content; }, [message.content]); + + // Memoizar conteúdo markdown para otimizar re-renders durante streaming + const markdownContent = useMemo(() => processedContent, [processedContent]); // Processar highlight separadamente (após limpeza de conteúdo) // Desabilitar durante streaming para performance @@ -114,91 +120,101 @@ function ChatMessageComponent({ message, isStreaming = false, highlightTerm, hig }, [processedContent, highlightTerm, highlightIndex, message.role, isStreaming]); return ( - setSelected((v) => !v)} - tabIndex={0} - > -
-
- {isUser ? : } + <> + setSelected((v) => !v)} + tabIndex={0} + > +
+
+ {isUser ? : } +
-
- -
- {isUser ? ( - // Estilo específico para mensagem do usuário (mais destaque, fonte maior) -
- {!highlightedContent && processedContent} -
- ) : ( - // Estilo Assistant - isEmpty && isStreaming ? ( -
-
- Gerando resposta... -
- ) : isStreaming ? ( - // Renderização LEVE durante streaming: texto simples com formatação básica - // Evita recálculo de ReactMarkdown e syntax highlight a cada token -
-
- {processedContent} + +
+ {isUser ? ( + // Estilo específico para mensagem do usuário (mais destaque, fonte maior) +
+ {!highlightedContent && processedContent} +
+ ) : ( + // Estilo Assistant + isEmpty && isStreaming ? ( +
+
+ Gerando resposta...
- -
- ) : ( - // Renderização COMPLETA quando mensagem finalizada: ReactMarkdown com syntax highlight -
- {highlightedContent ? ( -
- ) : ( + ) : isStreaming ? ( + // Renderização de markdown em tempo real durante streaming +
- {processedContent} + {markdownContent} - )} -
- ) - )} -
- - {!isUser && !isStreaming && ( -
- + +
+ ) : ( + // Renderização COMPLETA quando mensagem finalizada: ReactMarkdown com syntax highlight +
+ {highlightedContent ? ( +
+ ) : ( + + {processedContent} + + )} +
+ ) + )}
+ + {!isUser && !isStreaming && ( +
+ +
+ )} + + {!isUser && !isStreaming && debugMode && debugData && ( + )} - + ); } @@ -227,7 +243,8 @@ export const ChatMessage = React.memo(ChatMessageComponent, (prevProps, nextProp prevProps.message.role === nextProps.message.role && prevProps.highlightTerm === nextProps.highlightTerm && prevProps.highlightIndex === nextProps.highlightIndex && - prevProps.messageIndex === nextProps.messageIndex + prevProps.messageIndex === nextProps.messageIndex && + prevProps.debugData === nextProps.debugData ); }); diff --git a/components/chat/debug-console.tsx b/components/chat/debug-console.tsx new file mode 100644 index 0000000..de9dbca --- /dev/null +++ b/components/chat/debug-console.tsx @@ -0,0 +1,475 @@ +'use client'; + +import { useState, useMemo } from 'react'; +import { cn } from '@/lib/utils'; +import { + ChevronDown, + ChevronUp, + Copy, + Check, + Brain, + Search, + Settings, + FileText, + Globe, + Clock, + Database, + Code2 +} from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { Message } from '@/hooks/use-chat'; +import type { DeepResearchState } from '@/hooks/use-deep-research'; +import type { ScrapedContent } from '@/services/webSearch'; + +export interface DebugData { + model: string; + timestamp: number; + latency?: number; + systemPrompt: string; + userQuery: string; + contextUsed: Message[]; + webResearch?: { + queries: string[]; + enrichedQueries?: { + literal: string[]; + semantic: string[]; + related: string[]; + expanded: string[]; + contextual: string[]; + }; + sources: ScrapedContent[]; + logs: Array<{ + stage: string; + timestamp: number; + input: string; + rawOutput?: string; + parsedOutput?: any; + error?: string; + }>; + plan?: string[]; + knowledgeBase?: Array<{ + sourceUrl: string; + title: string; + content: string; + }>; + }; + deepResearchState?: DeepResearchState; + finalResponse: string; + rawResponse?: string; + tokenUsage?: { + input: number; + output: number; + }; +} + +interface DebugConsoleProps { + data: DebugData; +} + +export function DebugConsole({ data }: DebugConsoleProps) { + const [expandedSections, setExpandedSections] = useState>(new Set()); + const [copied, setCopied] = useState(false); + + const toggleSection = (section: string) => { + setExpandedSections(prev => { + const next = new Set(prev); + if (next.has(section)) { + next.delete(section); + } else { + next.add(section); + } + return next; + }); + }; + + const copyFullDump = async () => { + try { + await navigator.clipboard.writeText(JSON.stringify(data, null, 2)); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (error) { + console.error('Failed to copy:', error); + } + }; + + const formatTimestamp = (ts: number) => { + return new Date(ts).toLocaleString('pt-BR', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + }; + + const formatDuration = (ms?: number) => { + if (!ms) return 'N/A'; + if (ms < 1000) return `${ms}ms`; + return `${(ms / 1000).toFixed(2)}s`; + }; + + const isExpanded = (section: string) => expandedSections.has(section); + + return ( +
+
+ {/* Header Bar */} +
+
+
+ + Debug Console +
+ + {data.model || 'N/A'} + + {data.latency !== undefined && ( + + + {formatDuration(data.latency)} + + )} + {data.tokenUsage && ( + + Tokens: {data.tokenUsage.input}/{data.tokenUsage.output} + + )} +
+ +
+ + {/* Sections */} +
+ {/* Section A: Contexto & Memória */} +
} + isExpanded={isExpanded('context')} + onToggle={() => toggleSection('context')} + > +
+
+

+ System Prompt +

+
+                  {data.systemPrompt}
+                
+

+ Injetado em: {formatTimestamp(data.timestamp)} +

+
+
+

+ Histórico da Sessão ({data.contextUsed.length} mensagens) +

+
+ + Expandir JSON + +
+                    {JSON.stringify(data.contextUsed, null, 2)}
+                  
+
+
+
+
+ + {/* Section B: Deep Research */} + {data.webResearch && ( +
} + isExpanded={isExpanded('research')} + onToggle={() => toggleSection('research')} + > +
+ {/* Pipeline Status */} +
+

+ Status do Pipeline +

+
+ {/* Decomposition */} + {data.webResearch.plan && data.webResearch.plan.length > 0 && ( +
+
+
+ Decomposition +
+
+ {data.webResearch.plan.map((query, idx) => ( +
+ {idx + 1}. + {query} +
+ ))} +
+
+ )} + + {/* Query Expansion */} + {data.webResearch.enrichedQueries && ( +
+
+
+ Query Expansion +
+
+ {data.webResearch.queries.map((original, idx) => { + const eq = data.webResearch?.enrichedQueries; + const allEnriched = eq ? [ + ...(eq.literal || []), + ...(eq.semantic || []), + ...(eq.related || []), + ...(eq.expanded || []), + ...(eq.contextual || []), + ] : []; + return ( +
+
+ Original: {original} +
+ {allEnriched.length > 0 && ( +
+ Enriquecidas ({allEnriched.length}): +
+ {allEnriched.slice(0, 5).map((q, qIdx) => ( +
• {q}
+ ))} + {allEnriched.length > 5 && ( +
+ ... e mais {allEnriched.length - 5} +
+ )} +
+
+ )} +
+ ); + })} +
+
+ )} + + {/* Web Crawling */} + {data.webResearch.sources && data.webResearch.sources.length > 0 && ( +
+
+
+ + Web Crawling ({data.webResearch.sources.length} fontes) + +
+
+ {data.webResearch.sources.map((source, idx) => ( +
+
+ {source.content && source.content.length > 0 ? ( + ✓ + ) : ( + ✗ + )} +
+
+
+ {source.title || source.url} + {source.cached && ( + + Cached + + )} +
+ + {source.url} + + {source.content && ( +

+ {source.content.substring(0, 150)}... +

+ )} +
+
+ ))} +
+
+ )} + + {/* Knowledge Base */} + {data.webResearch.knowledgeBase && data.webResearch.knowledgeBase.length > 0 && ( +
+
+
+ Knowledge Base +
+
+ + {data.webResearch.knowledgeBase.length} chunks extraídos + +
+
+ )} +
+
+ + {/* Research Logs */} + {data.webResearch.logs && data.webResearch.logs.length > 0 && ( +
+

+ Logs Internos ({data.webResearch.logs.length} entradas) +

+
+ {data.webResearch.logs.map((log, idx) => ( +
+
+ + {log.stage} + + + {formatTimestamp(log.timestamp)} + +
+
+
+ Input: {log.input} +
+ {log.rawOutput && ( +
+ Output:{' '} + {log.rawOutput.substring(0, 200)}... +
+ )} + {log.error && ( +
+ Erro: {log.error} +
+ )} +
+
+ ))} +
+
+ )} +
+
+ )} + + {/* Section C: Dados Processados */} + {data.deepResearchState && ( +
} + isExpanded={isExpanded('processed')} + onToggle={() => toggleSection('processed')} + > +
+
+

+ Estado do Deep Research +

+
+
+ Step: + {data.deepResearchState.step} +
+ {data.deepResearchState.validationReport && ( +
+ Validation Report: +
+                          {data.deepResearchState.validationReport}
+                        
+
+ )} + {data.deepResearchState.error && ( +
+ Erro: {data.deepResearchState.error} +
+ )} +
+
+
+
+ )} + + {/* Section D: Resposta Raw */} +
} + isExpanded={isExpanded('response')} + onToggle={() => toggleSection('response')} + > +
+
+                {data.rawResponse || data.finalResponse}
+              
+
+
+
+
+
+ ); +} + +interface SectionProps { + id: string; + title: string; + icon: React.ReactNode; + isExpanded: boolean; + onToggle: () => void; + children: React.ReactNode; +} + +function Section({ id, title, icon, isExpanded, onToggle, children }: SectionProps) { + return ( +
+ + {isExpanded && ( +
+ {children} +
+ )} +
+ ); +} + diff --git a/components/keyboard-shortcuts.tsx b/components/keyboard-shortcuts.tsx new file mode 100644 index 0000000..7e055d1 --- /dev/null +++ b/components/keyboard-shortcuts.tsx @@ -0,0 +1,101 @@ +'use client'; + +import { useEffect } from 'react'; +import { invoke } from '@tauri-apps/api/core'; + +export function KeyboardShortcuts() { + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + // CTRL+SHIFT+D para abrir devtools + if (e.ctrlKey && e.shiftKey && (e.key === 'd' || e.key === 'D')) { + e.preventDefault(); + e.stopPropagation(); + invoke('toggle_devtools').catch(console.error); + return; + } + + // Bloquear F5 (refresh) + if (e.key === 'F5') { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+R (refresh) + if (e.ctrlKey && (e.key === 'r' || e.key === 'R') && !e.shiftKey && !e.altKey) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+SHIFT+R (hard refresh) + if (e.ctrlKey && e.shiftKey && (e.key === 'r' || e.key === 'R')) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+SHIFT+I (devtools) + if (e.ctrlKey && e.shiftKey && (e.key === 'i' || e.key === 'I')) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+SHIFT+J (console) + if (e.ctrlKey && e.shiftKey && (e.key === 'j' || e.key === 'J')) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+U (view source) + if (e.ctrlKey && (e.key === 'u' || e.key === 'U') && !e.shiftKey && !e.altKey) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+SHIFT+DEL (clear storage) + if (e.ctrlKey && e.shiftKey && e.key === 'Delete') { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+W (fechar aba - mas permitir fechar janela com o comportamento customizado do Tauri) + // Não bloqueamos CTRL+W porque o Tauri já trata isso no on_window_event + + // Bloquear CTRL+N (nova janela) + if (e.ctrlKey && (e.key === 'n' || e.key === 'N') && !e.shiftKey && !e.altKey) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+SHIFT+N (nova janela anônima) + if (e.ctrlKey && e.shiftKey && (e.key === 'n' || e.key === 'N')) { + e.preventDefault(); + e.stopPropagation(); + return; + } + + // Bloquear CTRL+T (nova aba) + if (e.ctrlKey && (e.key === 't' || e.key === 'T') && !e.shiftKey && !e.altKey) { + e.preventDefault(); + e.stopPropagation(); + return; + } + }; + + // Adicionar listener com capture para interceptar antes de outros handlers + window.addEventListener('keydown', handleKeyDown, true); + + return () => { + window.removeEventListener('keydown', handleKeyDown, true); + }; + }, []); + + return null; +} + diff --git a/components/settings/HardwareDashboard.tsx b/components/settings/HardwareDashboard.tsx index 2fa5a82..9addb1b 100644 --- a/components/settings/HardwareDashboard.tsx +++ b/components/settings/HardwareDashboard.tsx @@ -43,11 +43,33 @@ export function HardwareDashboard() { if (isLoading || !stats) { return ( - - - Carregando estatísticas do sistema... - - +
+
+ {/* Skeleton Cards */} + {[1, 2, 3, 4].map((i) => ( + + +
+
+
+
+ + +
+
+ + + ))} +
+ + +
+
+ Carregando estatísticas do sistema... +
+ + +
); } diff --git a/components/setup/model-selector.tsx b/components/setup/model-selector.tsx index 60c7b86..791988e 100644 --- a/components/setup/model-selector.tsx +++ b/components/setup/model-selector.tsx @@ -8,6 +8,7 @@ import { RECOMMENDED_MODELS, ModelRecommendation } from "@/lib/recommendation"; import { useState, useEffect } from "react"; import { invoke } from "@tauri-apps/api/core"; import { listen } from "@tauri-apps/api/event"; +import { startTransition } from "react"; interface ModelSelectorProps { recommendation: ModelRecommendation; @@ -30,6 +31,7 @@ export function ModelSelector({ recommendation, onComplete }: ModelSelectorProps const [downloadProgress, setDownloadProgress] = useState(0); const [downloadStatus, setDownloadStatus] = useState(""); const [downloadInfo, setDownloadInfo] = useState(null); + const [isNavigating, setIsNavigating] = useState(false); const selectedModel = RECOMMENDED_MODELS.find(m => m.id === selectedModelId) || RECOMMENDED_MODELS[0]; @@ -80,10 +82,11 @@ export function ModelSelector({ recommendation, onComplete }: ModelSelectorProps // Se chegou a 100% ou success, marcar como instalado após um pequeno delay if (info.percent === 100 || info.status === "success") { - setTimeout(() => { + setTimeout(async () => { setIsInstalled(true); setIsDownloading(false); - checkInstallation(selectedModelId); + // Verificar instalação de forma assíncrona sem bloquear + checkInstallation(selectedModelId).catch(console.error); }, 500); } } @@ -103,6 +106,14 @@ export function ModelSelector({ recommendation, onComplete }: ModelSelectorProps } }; + const handleNavigate = () => { + setIsNavigating(true); + // Usar startTransition para navegação não-bloqueante + startTransition(() => { + onComplete(); + }); + }; + const handleDownload = async () => { setIsDownloading(true); setDownloadProgress(0); @@ -192,9 +203,22 @@ export function ModelSelector({ recommendation, onComplete }: ModelSelectorProps
{isInstalled ? ( - ) : (