diff --git a/.env.example b/.env.example index e97d1f4e..10d9e372 100644 --- a/.env.example +++ b/.env.example @@ -12,7 +12,7 @@ OPENCODE_API_KEY='your_opencode_zen_api_key_here' # Can also use gemini must set OPENAI_BASE_URL and OPENAI_MODEL, OPENAI_EMBEDDING_BASE_URL, and EMBEDDING_MODEL OPENAI_API_KEY='your_openai_api_key_here' OPENAI_BASE_URL='https://api.openai.com/v1' -OPENAI_MODEL='gpt-5.1-mini' +OPENAI_MODEL='gpt-5-mini' # Gemini OAuth Cache Directory GEMINI_OAUTH_CACHE='~/.gemini/oauth_creds.json' diff --git a/.gitignore b/.gitignore index 0f98fb3e..b6985306 100644 --- a/.gitignore +++ b/.gitignore @@ -173,3 +173,4 @@ thoughts/ledgers/CONTINUITY_ses_37f3.md thoughts/ledgers/CONTINUITY_ses_37f1.md thoughts/ledgers/CONTINUITY_ses_3771.md thoughts/ledgers/CONTINUITY_ses_3772.md +.sisyphus/plans/update-readme-accurate-stats.md diff --git a/AI_ELEMENTS_INTEGRATION_TODO.md b/AI_ELEMENTS_INTEGRATION_TODO.md deleted file mode 100644 index baa75393..00000000 --- a/AI_ELEMENTS_INTEGRATION_TODO.md +++ /dev/null @@ -1,176 +0,0 @@ -# AI Elements Integration - Detailed Task List - -## ANALYSIS COMPLETE - -### Current State: - -- **chat-input.tsx**: Uses simple MicIcon button (line 210) - needs SpeechInput component -- **chat-messages.tsx**: Has type guards imported from 'ai' but uses custom rendering for file parts (lines 895-903) -- **Unused 'ai' imports**: Many type guards and helpers available but not actively used for type narrowing - -### Files to Modify: - -1. `app/chat/components/chat-input.tsx` - Replace MicIcon with SpeechInput -2. `app/chat/components/chat-messages.tsx` - Integrate Attachments, AudioPlayer components - ---- - -## TODO LIST - -### TASK 001: Update chat-input.tsx - Add SpeechInput Integration - -**Status:** COMPLETED ✓ -**File:** `app/chat/components/chat-input.tsx` -**Lines:** ~210 (MicIcon button area) - -**Sub-tasks:** - -- [x] 001a: Import SpeechInput component from '@/src/components/ai-elements/speech-input' -- [x] 001b: Add useState for speech transcription text (uses existing input state) -- [x] 001c: Create handleTranscriptionChange callback to append text to input -- [x] 001d: Replace MicIcon button (lines ~201-211) with SpeechInput component -- [x] 001e: Add onAudioRecorded callback for MediaRecorder fallback support -- [x] 001f: Test TypeScript compilation (LSP errors are pre-existing, not from this change) - -**Components to integrate:** - -- SpeechInput (from speech-input.tsx) -- Uses: onTranscriptionChange, onAudioRecorded, lang props - ---- - -### TASK 002: Update chat-messages.tsx - Add Attachments Integration - -**Status:** COMPLETED ✓ -**File:** `app/chat/components/chat-messages.tsx` -**Lines:** ~895-903 (fileParts rendering) - -**Sub-tasks:** - -- [x] 002a: Import Attachments components from '@/src/components/ai-elements/attachments' -- [x] 002b: Locate current fileParts rendering code (lines 895-903) -- [x] 002c: Replace custom Badge-based file rendering with Attachments component -- [x] 002d: Map FileUIPart[] to AttachmentData[] format -- [x] 002e: Ensure type imports from 'ai' (FileUIPart, isFileUIPart) are used -- [x] 002f: Test TypeScript compilation - -**Components to integrate:** - -- Attachments, Attachment, AttachmentPreview, AttachmentInfo, AttachmentRemove (from attachments.tsx) - ---- - -### TASK 003: Update chat-messages.tsx - Add AudioPlayer Integration - -**Status:** COMPLETED ✓ -**File:** `app/chat/components/chat-messages.tsx` - -**Sub-tasks:** - -- [x] 003a: Import AudioPlayer from '@/src/components/ai-elements/audio-player' -- [x] 003b: Identify where audio FileUIPart messages are rendered -- [x] 003c: Add conditional rendering for audio mediaType files -- [x] 003d: Integrate AudioPlayer for audio file parts -- [x] 003e: Test TypeScript compilation - -**Components to integrate:** - -- AudioPlayer (from audio-player.tsx) - ---- - -### TASK 004: Update chat-messages.tsx - Add Transcription Integration - -**Status:** COMPLETED ✓ -**File:** `app/chat/components/chat-messages.tsx` - -**Sub-tasks:** - -- [x] 004a: Import Transcription from '@/src/components/ai-elements/transcription' -- [x] 004b: Import Experimental_SpeechResult type from 'ai' -- [x] 004c: Add Transcription component for speech-to-text display -- [x] 004d: Test TypeScript compilation - -**Components to integrate:** - -- Transcription (from transcription.tsx) - ---- - -### TASK 005: Verify and Leverage 'ai' Package Type Imports - -**Status:** COMPLETED ✓ -**Files:** `app/chat/components/chat-messages.tsx`, `app/chat/components/chat-input.tsx` - -**Sub-tasks:** - -- [x] 005a: List all imported types from 'ai' in chat-messages.tsx -- [] 005b: Identify which types are NOT actively used for type narrowing -- [ ] 005c: Add active type narrowing using isFileUIPart, isTextUIPart, etc. -- [ ] 005d: Replace any 'as' type assertions with proper type guards -- [ ] 005e: Verify all unused imports serve a purpose (keep them as requested) - -**Types from 'ai' to leverage:** - -- isFileUIPart, isTextUIPart, isReasoningUIPart, isToolUIPart, isDataUIPart, isStaticToolUIPart -- FileUIPart, TextUIPart, ReasoningUIPart, ToolUIPart, DataUIPart - ---- - -## PROGRESS TRACKING - -| Task | Status | File | Started | Completed | -| ---- | ----------- | ----------------- | ------- | --------- | -| 001 | COMPLETED ✓ | chat-input.tsx | - | - | -| 002 | COMPLETED ✓ | chat-messages.tsx | - | - | -| 003 | COMPLETED ✓ | chat-messages.tsx | - | - | -| 004 | COMPLETED ✓ | chat-messages.tsx | - | - | -| 005 | NOT STARTED | both | - | - | - ---- - -## COMPONENTS AVAILABLE BUT NOT INTEGRATED (31 total) - -### Priority 1 (Chat Input): - -1. ~~SpeechInput~~ (TASK 001) - -### Priority 2 (Message Rendering): - -2. ~~Attachments~~ (TASK 002) -3. ~~AudioPlayer~~ (TASK 003) -4. ~~Transcription~~ (TASK 004) - -### Priority 3 (Future - Not in current todo): - -5. agent.tsx -6. canvas.tsx -7. commit.tsx -8. connection.tsx -9. controls.tsx -10. custom/ -11. edge.tsx -12. environment-variables.tsx -13. file-tree.tsx -14. image.tsx -15. jsx-preview.tsx -16. mic-selector.tsx -17. node.tsx -18. open-in-chat.tsx -19. package-info.tsx -20. panel.tsx -21. persona.tsx -22. sandbox.tsx -23. schema-display.tsx -24. shimmer.tsx -25. snippet.tsx -26. stack-trace.tsx -27. terminal.tsx -28. test-results.tsx -29. tools/ -30. voice-selector.tsx -31. toolbar.tsx (partially used) - ---- - -Last Updated: 2026-02-16 diff --git a/README.md b/README.md index 5eb4dfe6..3b4b0359 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +
@@ -19,10 +19,10 @@ -[![Agents](https://img.shields.io/badge/Agents-48+-blue?logo=robot&logoColor=white)](src/mastra/agents) -[![Tools](https://img.shields.io/badge/Tools-94+-orange?logo=hammer&logoColor=white)](src/mastra/tools) +[![Agents](https://img.shields.io/badge/Agents-41-blue?logo=robot&logoColor=white)](src/mastra/agents) +[![Tools](https://img.shields.io/badge/Tools-57-orange?logo=hammer&logoColor=white)](src/mastra/tools) [![Workflows](https://img.shields.io/badge/Workflows-21-purple?logo=workflow&logoColor=white)](src/mastra/workflows) -[![Networks](https://img.shields.io/badge/Networks-12-teal?logo=network-wired&logoColor=white)](src/mastra/networks) +[![Networks](https://img.shields.io/badge/Networks-11-teal?logo=network-wired&logoColor=white)](src/mastra/networks) [![UI Components](https://img.shields.io/badge/UI%20Components-105-pink?logo=react&logoColor=white)](ui/) @@ -37,7 +37,7 @@ [![GitMCP](https://img.shields.io/endpoint?url=https://gitmcp.io/badge/ssdeanx/AgentStack)](https://gitmcp.io/ssdeanx/AgentStack) [![wakatime](https://wakatime.com/badge/user/7a2fb9a0-188b-4568-887f-7645f9249e62/project/e52d02a1-f64a-4f8d-bc13-caaa2dc37461.svg)](https://wakatime.com/badge/user/7a2fb9a0-188b-4568-887f-7645f9249e62/project/e52d02a1-f64a-4f8d-bc13-caaa2dc37461) -**AgentStack** is a **production-grade multi-agent framework** built on Mastra, delivering **60+ enterprise tools**, **48+ specialized agents**, **21 workflows**, **12 agent networks**, **105 UI components** (50+ AI Elements + 55+ base), and **A2A/MCP orchestration** for scalable AI systems. Focuses on **financial intelligence**, **RAG pipelines**, **observability**, **secure governance**, and **AI chat interfaces**. +**AgentStack** is a **production-grade multi-agent framework** built on Mastra, delivering **57 enterprise tools**, **41 specialized agents**, **21 workflows**, **11 agent networks**, **105 UI components** (50+ AI Elements + 55+ base), and **A2A/MCP orchestration** for scalable AI systems. Focuses on **financial intelligence**, **RAG pipelines**, **observability**, **secure governance**, and **AI chat interfaces**. @@ -71,9 +71,9 @@ AgentStack bridges the gap between experimental AI frameworks and production-rea | **Production Observability** | ✅ **Full Langfuse tracing + 10+ custom scorers** | ⚠️ Partial | ❌ Basic | ❌ Limited | | **Financial Intelligence** | ✅ **Polygon/Finnhub/AlphaVantage (30+ endpoints)** | ❌ None | ❌ None | ❌ None | | **RAG Pipeline** | ✅ **PgVector HNSW + rerank + graphRAG** | ⚠️ External | ❌ Basic | ❌ None | -| **Multi-Agent Orchestration** | ✅ **A2A MCP + parallel execution (48+ agents)** | ⚠️ Sequential | ✅ Sequential | ✅ Custom | +| **Multi-Agent Orchestration** | ✅ **A2A MCP + parallel execution (41 agents)** | ⚠️ Sequential | ✅ Sequential | ✅ Custom | | **Enterprise Security** | ✅ **JWT/RBAC + path traversal protection + HTML sanitization** | ❌ Custom | ❌ None | ❌ None | -| **Type Safety** | ✅ **Zod schemas everywhere (94+ tools)** | ⚠️ JS/TS mix | ⚠️ JS focus | ❌ Python | +| **Type Safety** | ✅ **Zod schemas everywhere (57 tools)** | ⚠️ JS/TS mix | ⚠️ JS focus | ❌ Python | | **UI Components** | ✅ **105 components (AI Elements + shadcn/ui)** | ❌ None | ❌ None | ❌ None | | **Testing** | ✅ **Vitest + 97% coverage + comprehensive mocks** | ⚠️ Partial | ❌ Sparse | ⚠️ Partial | @@ -88,9 +88,9 @@ AgentStack bridges the gap between experimental AI frameworks and production-rea - **💰 Financial Intelligence**: 30+ tools (Polygon quotes/aggs/fundamentals, Finnhub analysis, AlphaVantage indicators) - **🔍 Semantic RAG**: PgVector (3072D embeddings) + MDocument chunking + rerank + graph traversal -- **🤖 48+ Agents**: Research → Learn → Report → Edit → Analyze (stock/crypto/copywriter/evaluator/data pipeline/business-legal/charting/image/coding/dane/social media/SEO/translation/customer support/project management) +- **🤖 41 Agents**: Research → Learn → Report → Edit → Analyze (stock/crypto/copywriter/evaluator/data pipeline/business-legal/charting/image/coding/dane/social media/SEO/translation/customer support/project management) - **📋 21 Workflows**: Weather, content, financial reports, document processing, research synthesis, learning extraction, governed RAG (index + answer), spec generation, repo ingestion, stock analysis, marketing campaign -- **🌐 12 Agent Networks**: Primary routing, data pipeline, report generation, research pipeline, content creation, financial intelligence, learning, marketing automation, DevOps, business intelligence, security +- **🌐 11 Agent Networks**: Primary routing, data pipeline, report generation, research pipeline, content creation, financial intelligence, learning, marketing automation, DevOps, business intelligence, security - **🔌 A2A/MCP**: MCP server coordinates parallel agents (research+stock→report), A2A coordinator for cross-agent communication - **🎨 105 UI Components**: AI Elements (50 chat/reasoning/canvas components) + shadcn/ui (55 base primitives) - **📊 Full Observability**: Langfuse traces + 10+ custom scorers (diversity/quality/completeness) + TanStack Query for state management diff --git a/app/chat/components/chat-layout.tsx b/app/chat/components/chat-layout.tsx index 653126cb..e8870eb9 100644 --- a/app/chat/components/chat-layout.tsx +++ b/app/chat/components/chat-layout.tsx @@ -15,20 +15,27 @@ export function ChatLayout() { return (
- + - - - + +
+
+ + +
+ + {!isFocusMode && ( +
+ +
+ )} +
-
- -
) diff --git a/app/chat/components/chat-messages.tsx b/app/chat/components/chat-messages.tsx index 6892e796..302f9fe3 100644 --- a/app/chat/components/chat-messages.tsx +++ b/app/chat/components/chat-messages.tsx @@ -2161,6 +2161,11 @@ export function ChatMessages(_props?: Partial) { const timeoutId = window.setTimeout(() => { const validateMessages = async () => { + if (messages.length === 0) { + setValidationError(null) + return + } + const result = await safeValidateUIMessages({ messages, }) diff --git a/app/chat/components/chat-sidebar.tsx b/app/chat/components/chat-sidebar.tsx index 402c11b2..5b361ed0 100644 --- a/app/chat/components/chat-sidebar.tsx +++ b/app/chat/components/chat-sidebar.tsx @@ -6,6 +6,7 @@ import { Badge } from '@/ui/badge' import { Button } from '@/ui/button' import { Input } from '@/ui/input' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/ui/tabs' +import { ScrollArea, ScrollBar } from '@/ui/scroll-area' import { BotIcon, CpuIcon, @@ -38,7 +39,6 @@ type TabKey = | 'workflows' | 'traces' | 'vectors' - | 'logs' | 'memory' | 'config' @@ -57,7 +57,6 @@ export function ChatSidebar() { const [tempThreadId, setTempThreadId] = useState(threadId) const [tempResourceId, setTempResourceId] = useState(resourceId) const [memorySearchQuery, setMemorySearchQuery] = useState('') - const [selectedTransport, setSelectedTransport] = useState('') const [instructions, setInstructions] = useState('') const [isEditingInstructions, setIsEditingInstructions] = useState(false) const [activeTab, setActiveTab] = useState('threads') @@ -69,8 +68,6 @@ export function ChatSidebar() { useTraces, useThreads, useVectorIndexes, - useLogs, - useLogTransports, useMemoryStatus, useAgent, useAgentEnhanceInstructionsMutation, @@ -83,8 +80,6 @@ export function ChatSidebar() { const tracesQuery = useTraces({ pagination: { page: 1, perPage: 20 } }) const threadsQuery = useThreads({ resourceId }) const vectorsQuery = useVectorIndexes() - const logsQuery = useLogs({ transportId: selectedTransport }) - const transportsQuery = useLogTransports() const memoryStatusQuery = useMemoryStatus(agentConfig?.id ?? '') const agentDetailsQuery = useAgent(selectedAgent) @@ -108,9 +103,6 @@ export function ChatSidebar() { void vectorsQuery.refetch() }, [vectorsQuery]) - const onRefreshLogs = useCallback(() => { - void logsQuery.refetch() - }, [logsQuery]) const onRefreshThreads = useCallback(() => { void threadsQuery.refetch() @@ -134,14 +126,6 @@ export function ChatSidebar() { const vectors = vectorsQuery.data ?? [] const loadingVectors = vectorsQuery.isLoading - const logs = logsQuery.data ?? [] - const loadingLogs = logsQuery.isLoading - - const transportsRes = useMemo(() => { - const v = transportsQuery.data - return Array.isArray(v) ? v : [] - }, [transportsQuery.data]) - const loadingTransports = transportsQuery.isLoading const memoryStatusRes = memoryStatusQuery.data const loadingMemory = memoryStatusQuery.isLoading @@ -195,7 +179,6 @@ export function ChatSidebar() { return Array.isArray(spans) ? (spans as unknown[]) : [] }, [tracesRes]) - const logTransports = useMemo(() => transportsRes, [transportsRes]) const memoryStatus = useMemo(() => memoryStatusRes, [memoryStatusRes]) const handleSaveMemory = useCallback(() => { @@ -248,113 +231,121 @@ export function ChatSidebar() { } return ( -