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 @@
-[](src/mastra/agents)
-[](src/mastra/tools)
+[](src/mastra/agents)
+[](src/mastra/tools)
[](src/mastra/workflows)
-[](src/mastra/networks)
+[](src/mastra/networks)
[](ui/)
@@ -37,7 +37,7 @@
[](https://gitmcp.io/ssdeanx/AgentStack)
[](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 (
-