- {/* Header */}
-
-
-
-
- {locale === 'my' ? 'AI Router v8' : 'AI Router v8'}
-
- 0 ? 'rgba(34,197,94,0.15)' : 'rgba(239,68,68,0.15)',
- color: activeCount > 0 ? '#4ade80' : '#f87171',
- border: `1px solid ${activeCount > 0 ? 'rgba(34,197,94,0.3)' : 'rgba(239,68,68,0.3)'}`,
- }}>
- {activeCount} active
-
-
-
-
-
-
-
- {/* Summary */}
-
-
-
-
Total calls:
-
{totalCalls}
-
-
-
- Providers:
-
- {activeCount}/{sortedProviders.length}
-
-
- {lastRefresh && (
-
- {lastRefresh.toLocaleTimeString()}
-
- )}
-
-
- {/* Provider List */}
-
- {loading && sortedProviders.length === 0 ? (
-
-
- {[0, 1, 2].map(i => (
-
- ))}
-
-
- ) : sortedProviders.length === 0 ? (
-
- No providers configured
-
- ) : (
-
- {sortedProviders.map(([name, stat]) => {
- const pool = pools[name]
- const icon = PROVIDER_ICONS[name] || '🔌'
- const color = PROVIDER_COLORS[name] || '#6366f1'
- const isExpanded = expandedProvider === name
- const successRate = stat.calls > 0
- ? Math.round(((stat.calls - stat.errors) / stat.calls) * 100)
- : 100
-
- return (
-
setExpandedProvider(isExpanded ? null : name)}>
-
- {/* Provider Header */}
-
-
{icon}
-
-
-
- {name}
-
- {stat.priority <= 2 && (
-
- PRIMARY
-
- )}
-
-
-
- {stat.calls} calls · {stat.avg_latency_ms}ms avg
-
- {pool && (
-
- · {pool.available_keys}/{pool.total_keys} keys
-
- )}
-
-
-
- {/* Success Rate Bar */}
- {stat.calls > 0 && (
-
-
80 ? '#4ade80' : successRate > 50 ? '#fbbf24' : '#f87171',
- }} />
-
- )}
- {stat.available ? (
-
- ) : (
-
- )}
-
-
-
- {/* Expanded Key Pool */}
- {isExpanded && pool && pool.keys.length > 0 && (
-
-
- KEY POOL ({pool.available_keys}/{pool.total_keys} available)
-
-
- {pool.keys.map((k, i) => (
-
-
-
- {k.key_preview}
-
-
- {k.calls} calls
-
- {k.failures > 0 && (
-
- {k.failures} fails
-
- )}
- {!k.available && k.cooldown_remaining_s > 0 && (
-
- {Math.round(k.cooldown_remaining_s)}s
-
- )}
-
- ))}
-
-
- )}
-
- )
- })}
-
- )}
-
-
- {/* Footer Info */}
-
-
-
- Priority: SambaNova → Gemini → OpenAI → Groq → Cerebras → Anthropic
-
-
-
- )
-}
diff --git a/frontend/components/layout/BrowserPanel.tsx b/frontend/components/layout/BrowserPanel.tsx
deleted file mode 100644
index 6b1db6dc1523aaaedac76bfb20f13a79c9715566..0000000000000000000000000000000000000000
--- a/frontend/components/layout/BrowserPanel.tsx
+++ /dev/null
@@ -1,149 +0,0 @@
-'use client'
-
-import { useState } from 'react'
-import { Globe, Search, ArrowRight, Loader2, ExternalLink, BookOpen } from 'lucide-react'
-import ReactMarkdown from 'react-markdown'
-import remarkGfm from 'remark-gfm'
-
-const QUICK_SEARCHES = [
- { label: 'Latest AI News', query: 'latest AI agent developments 2025' },
- { label: 'FastAPI Docs', query: 'https://fastapi.tiangolo.com' },
- { label: 'Next.js 14', query: 'Next.js 14 app router best practices' },
- { label: 'HuggingFace', query: 'https://huggingface.co' },
-]
-
-export default function BrowserPanel() {
- const [query, setQuery] = useState('')
- const [result, setResult] = useState('')
- const [loading, setLoading] = useState(false)
- const [history, setHistory] = useState
([])
-
- const apiUrl = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'
-
- const search = async (q?: string) => {
- const searchQuery = q || query.trim()
- if (!searchQuery || loading) return
- setLoading(true)
- setResult('')
- setHistory(prev => [searchQuery, ...prev.slice(0, 4)])
- try {
- const resp = await fetch(`${apiUrl}/api/v1/browser/research`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ query: searchQuery, session_id: 'browser' }),
- })
- if (resp.ok) {
- const data = await resp.json()
- setResult(data.result || '')
- } else {
- setResult('❌ Research failed. Check if the backend is running.')
- }
- } catch (e) {
- setResult('❌ Cannot reach backend. Make sure the API server is running.')
- } finally {
- setLoading(false)
- }
- }
-
- return (
-
- {/* Header */}
-
-
-
-
- Browser Agent
-
-
- Web Research
-
-
-
- {/* Search bar */}
-
-
-
- setQuery(e.target.value)}
- onKeyDown={e => e.key === 'Enter' && search()}
- placeholder="URL or search query..."
- className="w-full text-xs pl-7 pr-3 py-2 rounded-xl outline-none"
- style={{
- background: 'var(--bg-3)',
- border: '1px solid var(--border)',
- color: 'var(--text-primary)',
- }}
- />
-
-
search()}
- disabled={loading || !query.trim()}
- className="p-2 rounded-xl transition-all disabled:opacity-40"
- style={{ background: 'var(--brand)' }}>
- {loading ? : }
-
-
-
-
- {/* Quick searches */}
-
- {QUICK_SEARCHES.map(({ label, query: q }) => (
- { setQuery(q); search(q) }}
- className="text-[10px] px-2 py-1 rounded-lg transition-all hover:opacity-80"
- style={{ background: 'var(--bg-3)', border: '1px solid var(--border)', color: 'var(--text-secondary)' }}>
- {label}
-
- ))}
-
-
- {/* Result */}
-
- {loading ? (
-
-
-
-
-
- Researching the web...
-
-
- ) : result ? (
-
- {result}
-
- ) : (
-
-
-
- Enter a URL or search query to start web research
-
-
- )}
-
-
- {/* History */}
- {history.length > 0 && (
-
-
Recent:
-
- {history.map((h, i) => (
- { setQuery(h); search(h) }}
- className="text-[10px] text-left truncate hover:opacity-80 transition-all"
- style={{ color: 'var(--text-secondary)' }}>
- → {h}
-
- ))}
-
-
- )}
-
- )
-}
diff --git a/frontend/components/layout/ComputerUsePanel.tsx b/frontend/components/layout/ComputerUsePanel.tsx
deleted file mode 100644
index 2aca39d5480e94d418e03e4c37b65321c633c687..0000000000000000000000000000000000000000
--- a/frontend/components/layout/ComputerUsePanel.tsx
+++ /dev/null
@@ -1,164 +0,0 @@
-'use client'
-
-import { useEffect, useRef } from 'react'
-import { X, MonitorPlay, Brain, Globe, Code2, Terminal, GitBranch, Rocket, CheckCircle, XCircle, Loader, FileText, Search, PenTool, HardDrive } from 'lucide-react'
-import { useAppStore, type ComputerUseStep } from '@/store/useAppStore'
-
-const STEP_ICONS: Record = {
- thinking: { icon: Brain, color: '#a78bfa', bg: 'rgba(124,58,237,0.12)' },
- browsing: { icon: Globe, color: '#22d3ee', bg: 'rgba(34,211,238,0.12)' },
- coding: { icon: Code2, color: '#34d399', bg: 'rgba(52,211,153,0.12)' },
- terminal: { icon: Terminal, color: '#f59e0b', bg: 'rgba(245,158,11,0.12)' },
- executing: { icon: Terminal, color: '#f59e0b', bg: 'rgba(245,158,11,0.12)' },
- file: { icon: FileText, color: '#94a3b8', bg: 'rgba(148,163,184,0.1)' },
- git: { icon: GitBranch, color: '#60a5fa', bg: 'rgba(96,165,250,0.12)' },
- deploy: { icon: Rocket, color: '#f472b6', bg: 'rgba(244,114,182,0.12)' },
- complete: { icon: CheckCircle, color: '#22c55e', bg: 'rgba(34,197,94,0.12)' },
- error: { icon: XCircle, color: '#ef4444', bg: 'rgba(239,68,68,0.12)' },
- reading: { icon: FileText, color: '#94a3b8', bg: 'rgba(148,163,184,0.1)' },
- writing: { icon: PenTool, color: '#818cf8', bg: 'rgba(129,140,248,0.12)'},
- searching: { icon: Search, color: '#fbbf24', bg: 'rgba(251,191,36,0.12)' },
- sandbox: { icon: HardDrive, color: '#fb923c', bg: 'rgba(251,146,60,0.12)' },
-}
-
-function StepCard({ step }: { step: ComputerUseStep }) {
- const def = STEP_ICONS[step.type] || STEP_ICONS.thinking
- const Icon = def.icon
-
- return (
-
-
- {step.status === 'running' && step.type !== 'complete' && step.type !== 'error' && step.type !== 'done' ? (
-
- ) : (
-
- )}
-
-
-
-
- {step.type}
-
-
- {new Date(step.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}
-
-
-
- {step.title}
-
- {step.detail && (
-
- {step.detail}
-
- )}
- {step.data && step.type === 'coding' && (() => {
- const code = step.data['code'] as string | undefined
- return code ? (
-
- {code.slice(0, 200)}{code.length > 200 ? '...' : ''}
-
- ) : null
- })()}
-
-
- )
-}
-
-export default function ComputerUsePanel() {
- const { computerUseSteps, clearComputerUseSteps, setComputerUseOpen, locale } = useAppStore()
- const bottomRef = useRef(null)
-
- useEffect(() => {
- bottomRef.current?.scrollIntoView({ behavior: 'smooth' })
- }, [computerUseSteps.length])
-
- const runningSteps = computerUseSteps.filter(s => s.status === 'running').length
-
- return (
-
- {/* Header */}
-
-
-
-
-
-
-
- {locale === 'my' ? 'Computer ကြည့်ရန်' : 'Computer Use'}
-
-
- {locale === 'my' ? 'Agent လုပ်ဆောင်မှုများ' : 'Live agent activity'}
-
-
-
-
- {runningSteps > 0 && (
-
-
- {runningSteps} {locale === 'my' ? 'လုပ်နေသည်' : 'running'}
-
- )}
-
- {locale === 'my' ? 'ရှင်းလင်း' : 'Clear'}
-
-
setComputerUseOpen(false)}
- className="p-1 rounded-md hover:bg-white/5 transition-colors"
- style={{ color: 'var(--text-muted)' }}
- >
-
-
-
-
-
- {/* Steps */}
-
- {computerUseSteps.length === 0 ? (
-
-
-
-
-
-
- {locale === 'my' ? 'လုပ်ဆောင်မှုမရှိသေးပါ' : 'No activity yet'}
-
-
- {locale === 'my'
- ? 'Chat မှာ task တစ်ခုပေးပြီး agent ၏ computer အသုံးပြုမှုကြည့်ပါ'
- : 'Send a task in chat to see Manus-style agent activity here'}
-
-
-
- ) : (
- <>
- {computerUseSteps.map(step => (
-
- ))}
-
- >
- )}
-
-
- {/* Footer Stats */}
-
-
- {computerUseSteps.length} {locale === 'my' ? 'အဆင့်' : 'steps'}
-
-
- {computerUseSteps.filter(s => s.type === 'complete').length} {locale === 'my' ? 'ပြီးဆုံး' : 'completed'}
-
-
-
- )
-}
diff --git a/frontend/components/layout/ConnectorsPanel.tsx b/frontend/components/layout/ConnectorsPanel.tsx
deleted file mode 100644
index e49850daa520cd5901c3fde15fb3bd06859be73b..0000000000000000000000000000000000000000
--- a/frontend/components/layout/ConnectorsPanel.tsx
+++ /dev/null
@@ -1,234 +0,0 @@
-'use client'
-
-import { useEffect, useState } from 'react'
-import { useAgentStore } from '@/hooks/useAgentStore'
-import { getConnectors } from '@/lib/api'
-const setConnectorToken = (id: string, token: string) => fetch('/api/v1/connectors/' + id + '/token', { method: 'POST', body: JSON.stringify({ token }), headers: { 'Content-Type': 'application/json' } })
-import { Plug, CheckCircle2, XCircle, Eye, EyeOff, ChevronRight, RefreshCw, Zap } from 'lucide-react'
-
-const CATEGORY_LABELS: Record = {
- ai: '🤖 AI Providers',
- code: '💻 Code & Dev',
- deploy: '🚀 Deployment',
- workflow: '⚙️ Workflow',
- messaging: '💬 Messaging',
- infra: '🏗️ Infrastructure',
-}
-
-const CATEGORY_ORDER = ['ai', 'code', 'deploy', 'workflow', 'messaging', 'infra']
-
-interface Connector {
- id: string
- name: string
- connected: boolean
- color: string
- description: string
- category: string
- token_preview?: string
-}
-
-export default function ConnectorsPanel() {
- const { locale } = useAgentStore()
- const [connectors, setConnectors] = useState([])
- const [loading, setLoading] = useState(true)
- const [tokenInputs, setTokenInputs] = useState>({})
- const [showToken, setShowToken] = useState>({})
- const [saving, setSaving] = useState>({})
- const [activeCategory, setActiveCategory] = useState(null)
-
- const load = async () => {
- setLoading(true)
- try {
- const data = await getConnectors()
- setConnectors(data.connectors || [])
- } catch {}
- setLoading(false)
- }
-
- useEffect(() => { load() }, [])
-
- const saveToken = async (id: string) => {
- const token = tokenInputs[id]?.trim()
- if (!token) return
- setSaving(s => ({ ...s, [id]: true }))
- try {
- await setConnectorToken(id, token)
- setConnectors(prev => prev.map(c => c.id === id ? { ...c, connected: true, token_preview: token.slice(0, 8) + '...' } : c))
- setTokenInputs(s => ({ ...s, [id]: '' }))
- } catch {}
- setSaving(s => ({ ...s, [id]: false }))
- }
-
- const byCategory = CATEGORY_ORDER.reduce((acc, cat) => {
- const items = connectors.filter(c => c.category === cat)
- if (items.length) acc[cat] = items
- return acc
- }, {} as Record)
-
- const connected = connectors.filter(c => c.connected)
- const total = connectors.length
-
- return (
-
- {/* Header */}
-
-
-
-
- {locale === 'my' ? 'ချိတ်ဆက်မှုများ' : 'Connectors'}
-
-
0 ? 'rgba(34,197,94,0.15)' : 'rgba(99,102,241,0.15)', color: connected.length > 0 ? '#4ade80' : '#818cf8', border: `1px solid ${connected.length > 0 ? 'rgba(34,197,94,0.3)' : 'rgba(99,102,241,0.3)'}` }}>
- {connected.length}/{total}
-
-
-
-
-
-
-
- {/* Summary bar */}
- {connected.length > 0 && (
-
- {connected.slice(0, 6).map(c => (
-
-
- {c.name}
-
- ))}
- {connected.length > 6 && (
-
- +{connected.length - 6} more
-
- )}
-
- )}
-
- {/* Connectors list */}
-
- {loading ? (
-
- {[...Array(4)].map((_, i) => (
-
- ))}
-
- ) : (
- Object.entries(byCategory).map(([cat, items]) => (
-
-
- {CATEGORY_LABELS[cat] || cat}
-
-
- {items.map(c => (
- setTokenInputs(s => ({ ...s, [c.id]: v }))}
- onToggleShow={() => setShowToken(s => ({ ...s, [c.id]: !s[c.id] }))}
- onSave={() => saveToken(c.id)}
- />
- ))}
-
-
- ))
- )}
-
-
- {/* Footer hint */}
-
-
- {locale === 'my'
- ? 'Token များ env var တွင် ထည့်သွင်းနိုင်သည် — Runtime တွင်လည်း ထည့်နိုင်သည်'
- : 'Add tokens via env vars or set them at runtime above'}
-
-
-
- )
-}
-
-function ConnectorCard({ connector: c, tokenInput, showToken, saving, onTokenChange, onToggleShow, onSave }: {
- connector: Connector
- tokenInput: string
- showToken: boolean
- saving: boolean
- onTokenChange: (v: string) => void
- onToggleShow: () => void
- onSave: () => void
-}) {
- const [expanded, setExpanded] = useState(false)
-
- return (
-
-
!c.connected && setExpanded(!expanded)}>
- {/* Color dot */}
-
-
-
-
- {c.name}
- {c.connected && }
-
-
{c.description}
-
-
-
- {c.connected ? (
-
- Connected
-
- ) : (
-
- )}
-
-
-
- {/* Token input (expanded) */}
- {expanded && !c.connected && (
-
-
- Add API token to connect:
-
-
-
- onTokenChange(e.target.value)}
- placeholder="Token..."
- className="flex-1 bg-transparent text-[11px] outline-none"
- style={{ color: 'var(--text-primary)' }}
- onKeyDown={e => e.key === 'Enter' && onSave()}
- />
-
- {showToken ? : }
-
-
-
- {saving ? '...' : }
-
-
-
- )}
-
- )
-}
diff --git a/frontend/components/layout/FileExplorer.tsx b/frontend/components/layout/FileExplorer.tsx
deleted file mode 100644
index 081da831594965a3ae6cfac657f3bd8dd9b5f012..0000000000000000000000000000000000000000
--- a/frontend/components/layout/FileExplorer.tsx
+++ /dev/null
@@ -1,186 +0,0 @@
-'use client'
-
-import { useState, useEffect } from 'react'
-import { Folder, File, FolderOpen, RefreshCw, Code2, FileText, Image, Package } from 'lucide-react'
-
-interface FileItem {
- path: string
- size: number
-}
-
-interface WorkspaceData {
- workspace: string
- files: FileItem[]
- total: number
-}
-
-const getFileIcon = (filename: string) => {
- const ext = filename.split('.').pop()?.toLowerCase()
- if (['ts', 'tsx', 'js', 'jsx', 'py', 'go', 'rs'].includes(ext || '')) return Code2
- if (['json', 'yaml', 'yml', 'toml'].includes(ext || '')) return Package
- if (['md', 'txt', 'rst'].includes(ext || '')) return FileText
- if (['png', 'jpg', 'svg', 'webp'].includes(ext || '')) return Image
- return File
-}
-
-const getFileColor = (filename: string) => {
- const ext = filename.split('.').pop()?.toLowerCase()
- if (['ts', 'tsx'].includes(ext || '')) return '#3b82f6'
- if (['py'].includes(ext || '')) return '#f59e0b'
- if (['js', 'jsx'].includes(ext || '')) return '#eab308'
- if (['go'].includes(ext || '')) return '#06b6d4'
- if (['rs'].includes(ext || '')) return '#f97316'
- if (['json', 'yaml', 'yml'].includes(ext || '')) return '#a78bfa'
- if (['md'].includes(ext || '')) return '#6b7280'
- return '#9ca3af'
-}
-
-export default function FileExplorer() {
- const [workspace, setWorkspace] = useState(null)
- const [loading, setLoading] = useState(false)
- const [selectedFile, setSelectedFile] = useState(null)
- const [expandedDirs, setExpandedDirs] = useState>(new Set())
-
- const apiUrl = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'
-
- const fetchWorkspace = async () => {
- setLoading(true)
- try {
- const resp = await fetch(`${apiUrl}/api/v1/files/workspace`)
- if (resp.ok) {
- const data = await resp.json()
- setWorkspace(data)
- }
- } catch (e) {
- console.error('Failed to fetch workspace', e)
- } finally {
- setLoading(false)
- }
- }
-
- useEffect(() => {
- fetchWorkspace()
- }, [])
-
- // Build tree structure from flat file list
- const buildTree = (files: FileItem[]) => {
- const tree: Record = {}
- files.forEach(({ path, size }) => {
- const parts = path.split('/')
- let current = tree
- parts.forEach((part, i) => {
- if (i === parts.length - 1) {
- current[part] = { _file: true, path, size }
- } else {
- if (!current[part]) current[part] = {}
- current = current[part]
- }
- })
- })
- return tree
- }
-
- const toggleDir = (path: string) => {
- setExpandedDirs(prev => {
- const next = new Set(prev)
- if (next.has(path)) next.delete(path)
- else next.add(path)
- return next
- })
- }
-
- const renderTree = (node: Record, prefix: string = '', depth: number = 0) => {
- return Object.entries(node).map(([name, value]) => {
- const fullPath = prefix ? `${prefix}/${name}` : name
- const isFile = value?._file === true
- const Icon = isFile ? getFileIcon(name) : (expandedDirs.has(fullPath) ? FolderOpen : Folder)
- const color = isFile ? getFileColor(name) : '#f59e0b'
-
- return (
-
-
{
- if (isFile) setSelectedFile(fullPath)
- else toggleDir(fullPath)
- }}
- onMouseEnter={e => { if (selectedFile !== fullPath) (e.currentTarget as HTMLElement).style.background = 'rgba(255,255,255,0.04)' }}
- onMouseLeave={e => { if (selectedFile !== fullPath) (e.currentTarget as HTMLElement).style.background = 'transparent' }}
- >
-
- {name}
- {isFile && value.size && (
-
- {value.size > 1024 ? `${(value.size / 1024).toFixed(1)}k` : `${value.size}b`}
-
- )}
-
- {!isFile && expandedDirs.has(fullPath) && renderTree(value, fullPath, depth + 1)}
-
- )
- })
- }
-
- const tree = workspace ? buildTree(workspace.files) : {}
-
- return (
-
- {/* Header */}
-
-
-
-
- File Explorer
-
- {workspace && (
-
- {workspace.total} files
-
- )}
-
-
-
-
-
-
- {/* File Tree */}
-
- {loading ? (
-
-
-
- ) : workspace && workspace.files.length > 0 ? (
-
{renderTree(tree)}
- ) : (
-
-
-
Workspace empty
-
- Ask God Agent to create a project
-
-
- )}
-
-
- {/* Selected file info */}
- {selectedFile && (
-
- )}
-
- )
-}
diff --git a/frontend/components/layout/MemoryPanel.tsx b/frontend/components/layout/MemoryPanel.tsx
deleted file mode 100644
index 1f508b456a9b3aa23ecbd0c89168a3a3231d4ab2..0000000000000000000000000000000000000000
--- a/frontend/components/layout/MemoryPanel.tsx
+++ /dev/null
@@ -1,145 +0,0 @@
-'use client'
-
-import { useEffect, useState } from 'react'
-import { useAgentStore } from '@/hooks/useAgentStore'
-import { getMemory } from '@/lib/api'
-const searchMemory = (q: string) => fetch('/api/v1/memory/search?q=' + encodeURIComponent(q)).then(r => r.json())
-import { Brain, Search, RefreshCw, MessageSquare, Settings, Code2, User } from 'lucide-react'
-import { formatDistanceToNow } from 'date-fns'
-
-const TYPE_META: Record = {
- conversation: { icon: MessageSquare, color: '#22d3ee', label: 'Conversation' },
- user_preference: { icon: User, color: '#fbbf24', label: 'Preference' },
- user_directive: { icon: User, color: '#fbbf24', label: 'Directive' },
- project_context: { icon: Code2, color: '#34d399', label: 'Project' },
- general: { icon: Brain, color: '#818cf8', label: 'General' },
-}
-
-export default function MemoryPanel() {
- const { sessionId, locale } = useAgentStore()
- const [memories, setMemories] = useState([])
- const [loading, setLoading] = useState(true)
- const [query, setQuery] = useState('')
- const [searching, setSearching] = useState(false)
-
- const load = async () => {
- setLoading(true)
- try {
- const data = await getMemory()
- setMemories(Array.isArray(data) ? data : data.memories || [])
- } catch {}
- setLoading(false)
- }
-
- const search = async () => {
- if (!query.trim()) { load(); return }
- setSearching(true)
- try {
- const data = await searchMemory(query)
- setMemories(Array.isArray(data) ? data : data.results || [])
- } catch {}
- setSearching(false)
- }
-
- useEffect(() => { load() }, [sessionId])
-
- return (
-
-
-
-
-
- {locale === 'my' ? 'မှတ်ဉာဏ်' : 'Memory'}
-
- {memories.length > 0 && (
-
- {memories.length}
-
- )}
-
-
-
-
-
-
- {/* Search */}
-
-
-
-
- setQuery(e.target.value)}
- onKeyDown={e => e.key === 'Enter' && search()}
- placeholder={locale === 'my' ? 'မှတ်ဉာဏ်ရှာဖွေရန်...' : 'Search memory...'}
- className="flex-1 bg-transparent text-[11px] outline-none"
- style={{ color: 'var(--text-primary)' }}
- />
-
-
-
-
-
-
-
-
- {loading ? (
-
- {[...Array(4)].map((_, i) => (
-
- ))}
-
- ) : memories.length === 0 ? (
-
-
-
-
-
- {locale === 'my' ? 'မှတ်ဉာဏ်မရှိသေးပါ' : 'No memories yet'}
-
-
- {locale === 'my'
- ? 'Conversation များ မှတ်ဉာဏ်တွင် သိမ်းဆည်းမည်'
- : 'Conversations and context will be saved here automatically'}
-
-
- ) : (
- memories.map((mem: any, i: number) => {
- const tm = TYPE_META[mem.memory_type] || TYPE_META.general
- const Icon = tm.icon
- return (
-
-
-
-
- {tm.label}
-
- {mem.key && (
-
- {mem.key}
-
- )}
-
- {mem.created_at ? formatDistanceToNow(new Date(mem.created_at * 1000), { addSuffix: true }) : ''}
-
-
-
- {mem.content}
-
-
- )
- })
- )}
-
-
- )
-}
diff --git a/frontend/components/layout/SandboxPanel.tsx b/frontend/components/layout/SandboxPanel.tsx
deleted file mode 100644
index 81f4cd06de1be15df94798d2fda30b46f1668999..0000000000000000000000000000000000000000
--- a/frontend/components/layout/SandboxPanel.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-'use client'
-
-import { useState, useRef, useEffect } from 'react'
-import { useAgentStore } from '@/hooks/useAgentStore'
-import { fetchAPI } from '@/lib/api'
-const sandboxExecute = (cmd: string, sid: string) => fetchAPI('/api/v1/spaces/sandbox-worker-space/execute', { method: 'POST', body: JSON.stringify({ task: cmd, role: 'execution', session_id: sid }) })
-const sandboxWriteFile = (path: string, content: string) => fetchAPI('/api/v1/files/write', { method: 'POST', body: JSON.stringify({ path, content }) })
-const getWorkspaceInfo = () => fetchAPI('/api/v1/files/workspace')
-import { Terminal, Play, FolderOpen, File, RefreshCw, ChevronRight, Zap, ExternalLink, Code2 } from 'lucide-react'
-
-const VSCODE_HF_URL = 'https://pyae1994-god-agent-vscode.hf.space'
-
-interface TerminalLine {
- type: 'input' | 'output' | 'error'
- text: string
- time: string
-}
-
-export default function SandboxPanel() {
- const { locale } = useAgentStore()
- const [cmd, setCmd] = useState('')
- const [lines, setLines] = useState([
- { type: 'output', text: '🚀 God Mode+ Sandbox — Persistent VS Code Workspace', time: '' },
- { type: 'output', text: 'Type commands to execute in the sandbox...', time: '' },
- ])
- const [loading, setLoading] = useState(false)
- const [workspace, setWorkspace] = useState(null)
- const [tab, setTab] = useState<'terminal' | 'files' | 'vscode'>('terminal')
- const endRef = useRef(null)
- const inputRef = useRef(null)
- const [history, setHistory] = useState([])
- const [histIdx, setHistIdx] = useState(-1)
-
- useEffect(() => { endRef.current?.scrollIntoView({ behavior: 'smooth' }) }, [lines])
- const loadWorkspace = async () => { try { const data = await getWorkspaceInfo(); setWorkspace(data) } catch {} }
- useEffect(() => { loadWorkspace() }, [])
-
- const run = async () => {
- const c = cmd.trim()
- if (!c || loading) return
- const now = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })
- setLines(lines => [...lines, { type: 'input', text: `$ ${c}`, time: now }])
- setHistory(history => [c, ...history.slice(0, 49)])
- setHistIdx(-1)
- setCmd('')
- setLoading(true)
- try {
- const res = await sandboxExecute(c, 'sandbox_panel')
- const output = res.result || ''
- output.split('\n').forEach((line: string) => setLines(lines => [...lines, { type: 'output', text: line, time: '' }]))
- } catch (e: any) {
- setLines(lines => [...lines, { type: 'error', text: `❌ ${e.message}`, time: '' }])
- }
- setLoading(false)
- if (tab === 'files') loadWorkspace()
- }
-
- const handleKeyDown = (e: React.KeyboardEvent) => {
- if (e.key === 'Enter') { run(); return }
- if (e.key === 'ArrowUp') {
- const idx = Math.min(histIdx + 1, history.length - 1)
- setHistIdx(idx)
- setCmd(history[idx] || '')
- }
- if (e.key === 'ArrowDown') {
- const idx = Math.max(histIdx - 1, -1)
- setHistIdx(idx)
- setCmd(idx === -1 ? '' : history[idx])
- }
- }
-
- const QUICK_CMDS = ['ls -la', 'pwd', 'python3 --version', 'node --version', 'git status', 'pip list | head -10']
-
- return (
-
-
-
{locale === 'my' ? 'Sandbox' : 'Sandbox'}
-
- {(['terminal', 'files', 'vscode'] as const).map(t => (
- { setTab(t); if (t === 'files') loadWorkspace() }} className="px-2.5 py-0.5 rounded-md text-[10px] font-medium transition-all capitalize" style={{ background: tab === t ? 'var(--brand)' : 'transparent', color: tab === t ? '#fff' : 'var(--text-muted)' }}>{t === 'vscode' ? '⚡ VS Code' : t}
- ))}
-
-
- {tab === 'terminal' ? (
- <>
-
- {QUICK_CMDS.map(q => { setCmd(q); inputRef.current?.focus() }} className="flex-shrink-0 px-2 py-0.5 rounded-full text-[9px] font-mono transition-all hover:opacity-80" style={{ background: 'var(--bg-3)', color: 'var(--text-muted)', border: '1px solid var(--border)' }}>{q} )}
-
-
- {lines.map((line, i) =>
{line.text}
)}
- {loading &&
Running...
}
-
-
-
-
-
-
setCmd(e.target.value)} onKeyDown={handleKeyDown} placeholder="Enter command..." className="flex-1 bg-transparent outline-none text-sm text-slate-100" />
-
-
-
- >
- ) : tab === 'files' ? (
-
Workspace: {workspace?.workspace || '/tmp/god_workspace'}
- ) : (
-
- )}
-
- )
-}
diff --git a/frontend/components/layout/Sidebar.tsx b/frontend/components/layout/Sidebar.tsx
deleted file mode 100644
index e5620a8fd039b9c998446b9800abee75ddc92d7a..0000000000000000000000000000000000000000
--- a/frontend/components/layout/Sidebar.tsx
+++ /dev/null
@@ -1,138 +0,0 @@
-'use client'
-
-import { useAgentStore } from '@/hooks/useAgentStore'
-import {
- MessageSquare, ListTodo, Brain, Clock, Plug, Terminal,
- Plus, Zap, Code2, Bug, Cpu,
- GitBranch, Workflow, Rocket, Palette, Bot, Globe, Folder,
- FlaskConical, Eye, Cpu as CpuIcon
-} from 'lucide-react'
-import type { ActivePanel, AgentName } from '@/hooks/useAgentStore'
-
-const PANELS: { id: ActivePanel; icon: React.ElementType; labelEn: string; labelMy: string; badge?: string }[] = [
- { id: 'timeline', icon: Clock, labelEn: 'Timeline', labelMy: 'အချိန်ဇယား' },
- { id: 'tasks', icon: ListTodo, labelEn: 'Tasks', labelMy: 'လုပ်ငန်းများ' },
- { id: 'sandbox', icon: Terminal, labelEn: 'Terminal', labelMy: 'Terminal' },
- { id: 'files', icon: Folder, labelEn: 'Files', labelMy: 'ဖိုင်များ', badge: 'v7' },
- { id: 'browser', icon: Globe, labelEn: 'Browser', labelMy: 'ဘရောင်ဇာ', badge: 'v7' },
- { id: 'memory', icon: Brain, labelEn: 'Memory', labelMy: 'မှတ်ဉာဏ်' },
- { id: 'connectors', icon: Plug, labelEn: 'Connectors', labelMy: 'ချိတ်ဆက်မှု' },
- { id: 'ai_router', icon: Cpu, labelEn: 'AI Router', labelMy: 'AI Router', badge: 'v8' },
-]
-
-const AGENT_META: Record = {
- chat: { icon: MessageSquare, color: '#22d3ee', label: 'Chat' },
- planner: { icon: Zap, color: '#a78bfa', label: 'Planner' },
- coding: { icon: Code2, color: '#34d399', label: 'Coding' },
- debug: { icon: Bug, color: '#f87171', label: 'Debug' },
- memory: { icon: Brain, color: '#fbbf24', label: 'Memory' },
- connector: { icon: Plug, color: '#60a5fa', label: 'Connector' },
- deploy: { icon: Rocket, color: '#f472b6', label: 'Deploy' },
- workflow: { icon: Workflow, color: '#fb923c', label: 'Workflow' },
- sandbox: { icon: Terminal, color: '#4ade80', label: 'Sandbox' },
- ui: { icon: Palette, color: '#e879f9', label: 'UI' },
- browser: { icon: Globe, color: '#38bdf8', label: 'Browser', isNew: true },
- file: { icon: Folder, color: '#fcd34d', label: 'File', isNew: true },
- git: { icon: GitBranch, color: '#f97316', label: 'Git', isNew: true },
- test: { icon: FlaskConical, color: '#a3e635', label: 'Test', isNew: true },
- vision: { icon: Eye, color: '#c084fc', label: 'Vision', isNew: true },
-}
-
-export default function Sidebar() {
- const { sidebarOpen, activePanel, setActivePanel, locale, messages, clearMessages, agents } = useAgentStore()
-
- if (!sidebarOpen) return null
-
- return (
-
-
- {/* New Chat */}
-
-
-
- {locale === 'my' ? 'စကားပြောသစ်' : 'New Chat'}
-
-
-
- {/* Navigation */}
-
- Views
- {PANELS.map(({ id, icon: Icon, labelEn, labelMy, badge }) => (
- setActivePanel(id)}
- className={`w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-xs font-medium transition-all mb-0.5`}
- style={{
- background: activePanel === id ? 'var(--brand)' : 'transparent',
- color: activePanel === id ? '#fff' : 'var(--text-secondary)',
- }}>
-
- {locale === 'my' ? labelMy : labelEn}
- {badge && (
-
- {badge}
-
- )}
-
- ))}
-
-
- {/* Agent Status */}
-
-
- Agents ({Object.keys(AGENT_META).length})
-
- {Object.entries(AGENT_META).map(([name, meta]) => {
- const agent = (agents as any)[name]
- const Icon = meta.icon
- const isActive = agent?.status === 'executing' || agent?.status === 'thinking'
- const isComplete = agent?.status === 'complete'
- const isError = agent?.status === 'error'
-
- return (
-
-
-
- {meta.label}
-
- {meta.isNew && !isActive && (
-
- new
-
- )}
-
-
- )
- })}
-
-
- {/* Footer */}
-
-
-
-
God Agent OS v8.0
-
-
-
-
- )
-}
diff --git a/frontend/components/layout/TasksPanel.tsx b/frontend/components/layout/TasksPanel.tsx
deleted file mode 100644
index b9cc71219680570db5e6c0fe3c325ec37fa11c85..0000000000000000000000000000000000000000
--- a/frontend/components/layout/TasksPanel.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-'use client'
-
-import { useEffect, useState } from 'react'
-import { useAgentStore } from '@/hooks/useAgentStore'
-import { getTasks, fetchAPI } from '@/lib/api'
-const cancelTask = (id: string) => fetchAPI('/api/v1/tasks/' + id + '/cancel', { method: 'POST' })
-const retryTask = (id: string) => fetchAPI('/api/v1/tasks/' + id + '/retry', { method: 'POST' })
-import { ListTodo, Play, Square, RefreshCw, Clock, CheckCircle2, XCircle, Loader2, Zap } from 'lucide-react'
-import { formatDistanceToNow } from 'date-fns'
-
-const STATUS_META: Record = {
- queued: { icon: Clock, color: '#94a3b8', label: 'Queued' },
- executing: { icon: Loader2, color: '#6366f1', label: 'Running' },
- completed: { icon: CheckCircle2, color: '#22c55e', label: 'Done' },
- failed: { icon: XCircle, color: '#ef4444', label: 'Failed' },
- cancelled: { icon: Square, color: '#64748b', label: 'Cancelled' },
-}
-
-export default function TasksPanel() {
- const { sessionId, locale, setActiveTaskId, activeTaskId } = useAgentStore()
- const [tasks, setTasks] = useState([])
- const [loading, setLoading] = useState(true)
-
- const load = async () => {
- setLoading(true)
- try {
- const data = await getTasks()
- setTasks(Array.isArray(data) ? data : data.tasks || [])
- } catch {}
- setLoading(false)
- }
-
- useEffect(() => { load() }, [sessionId])
- useEffect(() => {
- const id = setInterval(load, 5000)
- return () => clearInterval(id)
- }, [sessionId])
-
- const handleCancel = async (taskId: string, e: React.MouseEvent) => {
- e.stopPropagation()
- await cancelTask(taskId)
- load()
- }
-
- const handleRetry = async (taskId: string, e: React.MouseEvent) => {
- e.stopPropagation()
- await retryTask(taskId)
- load()
- }
-
- return (
-
-
-
-
-
- {locale === 'my' ? 'လုပ်ငန်းများ' : 'Tasks'}
-
- {tasks.length > 0 && (
-
- {tasks.length}
-
- )}
-
-
-
-
-
-
-
- {loading && tasks.length === 0 ? (
-
- {[...Array(3)].map((_, i) => (
-
- ))}
-
- ) : tasks.length === 0 ? (
-
-
-
-
-
- {locale === 'my' ? 'လုပ်ငန်းမရှိသေးပါ' : 'No tasks yet'}
-
-
- ) : (
- tasks.map(task => {
- const sm = STATUS_META[task.status] || STATUS_META.queued
- const Icon = sm.icon
- const isActive = task.id === activeTaskId
- const isRunning = task.status === 'executing' || task.status === 'queued'
-
- return (
-
setActiveTaskId(isActive ? null : task.id)}
- className="w-full rounded-xl p-3 text-left transition-all hover:scale-[1.01] active:scale-[0.99]"
- style={{
- background: isActive ? 'rgba(99,102,241,0.1)' : 'var(--bg-3)',
- border: `1px solid ${isActive ? 'rgba(99,102,241,0.4)' : 'var(--border)'}`,
- }}>
-
-
-
-
-
-
- {task.goal}
-
-
-
- {sm.label}
-
-
- {formatDistanceToNow(new Date(task.created_at * 1000), { addSuffix: true })}
-
-
-
- {task.id}
-
-
-
- {/* Actions */}
-
- {isRunning && (
- handleCancel(task.id, e)}
- className="p-1 rounded-lg hover:bg-red-500/10 transition-colors" title="Cancel">
-
-
- )}
- {task.status === 'failed' && (
- handleRetry(task.id, e)}
- className="p-1 rounded-lg hover:bg-indigo-500/10 transition-colors" title="Retry">
-
-
- )}
-
-
-
- {/* Progress bar for running tasks */}
- {isRunning && (
-
- )}
-
- )
- })
- )}
-
-
- )
-}
diff --git a/frontend/components/layout/TopBar.tsx b/frontend/components/layout/TopBar.tsx
deleted file mode 100644
index b34ab521413e1e22ade8e2f924b6ce143dab1dd3..0000000000000000000000000000000000000000
--- a/frontend/components/layout/TopBar.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-'use client'
-
-import { useAgentStore } from '@/hooks/useAgentStore'
-import { t } from '@/lib/i18n'
-import { Menu, Zap, Globe, Moon, Sun, MonitorSmartphone, Sparkles, Cpu } from 'lucide-react'
-import type { Theme, Locale } from '@/hooks/useAgentStore'
-
-const THEMES: { id: Theme; label: string; icon: string }[] = [
- { id: 'dark', label: 'Dark', icon: '🌙' },
- { id: 'light', label: 'Light', icon: '☀️' },
- { id: 'amoled', label: 'AMOLED', icon: '⬛' },
- { id: 'neon', label: 'Neon', icon: '🌊' },
- { id: 'glass', label: 'Glass', icon: '🔮' },
-]
-
-export default function TopBar() {
- const { theme, locale, setTheme, setLocale, sidebarOpen, setSidebarOpen, agents } = useAgentStore()
-
- const activeAgents = Object.values(agents).filter(a => a.status === 'executing' || a.status === 'thinking').length
- const allIdle = Object.values(agents).every(a => a.status === 'idle')
-
- return (
-
-
- {/* Left */}
-
-
setSidebarOpen(!sidebarOpen)}
- className="p-1.5 rounded-lg hover:bg-white/5 transition-colors">
-
-
-
-
-
-
-
-
- God Mode+
-
- v3.0
-
-
-
-
-
- {/* Center — Agent Status */}
-
-
0
- ? 'bg-indigo-500/15 border border-indigo-500/30 text-indigo-300'
- : 'bg-white/5 border border-white/10 text-slate-400'
- }`}>
-
0 ? 'bg-indigo-400 animate-pulse' : 'bg-slate-500'}`} />
- {activeAgents > 0 ? `${activeAgents} Agent${activeAgents > 1 ? 's' : ''} Active` : '10 Agents Ready'}
-
-
-
- {(['chat','coding','debug','workflow','sandbox'] as const).map(name => {
- const a = agents[name]
- const colors: Record
= {
- chat: '#22d3ee', coding: '#34d399', debug: '#f87171',
- workflow: '#fb923c', sandbox: '#4ade80',
- }
- const isActive = a.status === 'executing' || a.status === 'thinking'
- return (
-
- )
- })}
-
-
-
- {/* Right */}
-
- {/* Theme Picker */}
-
- {THEMES.map(th => (
- setTheme(th.id)} title={th.label}
- className={`px-1.5 py-0.5 rounded-md text-[10px] transition-all ${
- theme === th.id ? 'text-white shadow' : 'text-slate-500 hover:text-slate-300'
- }`}
- style={{ background: theme === th.id ? 'var(--brand)' : 'transparent' }}>
- {th.icon}
-
- ))}
-
-
- {/* Locale */}
-
setLocale(locale === 'en' ? 'my' : 'en')}
- className="flex items-center gap-1 px-2 py-1 rounded-lg text-xs transition-all hover:bg-white/5"
- style={{ color: 'var(--text-secondary)', border: '1px solid var(--border)' }}
- title="Toggle Language / ဘာသာစကားပြောင်း">
-
- {locale === 'en' ? 'EN' : 'မြ'}
-
-
- {/* God Mode badge */}
-
-
- GOD
-
-
-
- )
-}
diff --git a/frontend/components/pages/AgentsPage.tsx b/frontend/components/pages/AgentsPage.tsx
deleted file mode 100644
index 0deb4f88a8b84c2cab8bc93cec908b11de15f500..0000000000000000000000000000000000000000
--- a/frontend/components/pages/AgentsPage.tsx
+++ /dev/null
@@ -1,170 +0,0 @@
-'use client'
-
-import { useEffect, useState } from 'react'
-import { motion } from 'framer-motion'
-import { RefreshCw, Loader, Bot, Play, CheckCircle, XCircle } from 'lucide-react'
-import { getAgents, runAgent } from '@/lib/api'
-import { useAppStore } from '@/store/useAppStore'
-
-interface AgentInfo {
- name: string
- available: boolean
- class: string | null
-}
-
-const AGENT_META: Record
= {
- chat: { icon: '💬', desc: 'Conversation & clarification', descMy: 'စကားပြော', color: '#22d3ee' },
- planner: { icon: '📋', desc: 'Task decomposition & planning', descMy: 'အစီအစဥ်ချ', color: '#a78bfa' },
- coding: { icon: '⚡', desc: 'Production code generation', descMy: 'Code ရေးရန်', color: '#34d399' },
- debug: { icon: '🐛', desc: 'Self-healing error resolution', descMy: 'Error ဖြေရှင်း', color: '#ef4444' },
- browser: { icon: '🌐', desc: 'Web research & scraping', descMy: 'Web ဆိုင်ရာ', color: '#60a5fa' },
- file: { icon: '📁', desc: 'File system & project scaffold', descMy: 'ဖိုင် စီမံ', color: '#fbbf24' },
- git: { icon: '🔀', desc: 'Git ops & GitHub PR creation', descMy: 'Git လုပ်ဆောင်', color: '#fb923c' },
- test: { icon: '🧪', desc: 'Auto test generation', descMy: 'Test ဖန်တီး', color: '#84cc16' },
- vision: { icon: '👁️', desc: 'Design-to-code UI generation', descMy: 'UI ဒီဇိုင်း', color: '#f472b6' },
- sandbox: { icon: '🔧', desc: 'Isolated code execution', descMy: 'Code run', color: '#f59e0b' },
- deploy: { icon: '🚀', desc: 'Auto-deploy to cloud', descMy: 'Deploy လုပ်', color: '#a855f7' },
- connector: { icon: '🔌', desc: 'External integrations', descMy: 'ချိတ်ဆက်', color: '#06b6d4' },
- memory: { icon: '💾', desc: 'Long-term context storage', descMy: 'မှတ်ဉာဏ်', color: '#818cf8' },
- workflow: { icon: '⚙️', desc: 'n8n workflow automation', descMy: 'Workflow', color: '#c084fc' },
- reasoning: { icon: '🧠', desc: 'Deep reasoning & analysis', descMy: 'ခွဲခြမ်းစိတ်ဖြာ', color: '#6366f1' },
- ui: { icon: '🎨', desc: 'Real-time UI state management', descMy: 'UI စီမံ', color: '#f472b6' },
- orchestrator:{ icon: '🎭', desc: 'Central orchestrator (brain)', descMy: 'ဦးဆောင်', color: '#7c3aed' },
-}
-
-export default function AgentsPage() {
- const { locale, addComputerUseStep } = useAppStore()
- const [agents, setAgents] = useState([])
- const [loading, setLoading] = useState(true)
- const [running, setRunning] = useState(null)
- const [testResult, setTestResult] = useState>({})
-
- const load = async () => {
- setLoading(true)
- try {
- const data = await getAgents()
- setAgents(data.agents || [])
- } catch {
- // Show placeholder if backend offline
- setAgents(Object.keys(AGENT_META).filter(k => k !== 'orchestrator').map(name => ({
- name,
- available: false,
- class: null,
- })))
- } finally {
- setLoading(false)
- }
- }
-
- useEffect(() => { load() }, [])
-
- const testAgent = async (agentName: string) => {
- setRunning(agentName)
- addComputerUseStep({ type: 'executing', title: `Testing ${agentName} agent...`, status: 'running' })
- try {
- const result = await runAgent(agentName, 'Hello! Give me a one-sentence description of your capabilities.', 'test-session')
- setTestResult(prev => ({ ...prev, [agentName]: result.result?.slice(0, 150) || 'OK' }))
- addComputerUseStep({ type: 'complete', title: `${agentName} agent responded`, status: 'done' })
- } catch (e) {
- setTestResult(prev => ({ ...prev, [agentName]: `Error: ${(e as Error).message?.slice(0, 100)}` }))
- addComputerUseStep({ type: 'error', title: `${agentName} test failed`, status: 'error' })
- } finally {
- setRunning(null)
- }
- }
-
- const onlineCount = agents.filter(a => a.available).length
-
- return (
-
-
-
-
-
- {locale === 'my' ? 'Agent များ (16)' : 'Agent Fleet (16)'}
-
-
- {locale === 'my'
- ? `${onlineCount}/16 online · Manus+Devin+Genspark combined`
- : `${onlineCount}/16 online · Manus + Devin + Genspark combined`}
-
-
-
-
- {locale === 'my' ? 'ပြန်စစ်' : 'Refresh'}
-
-
-
- {loading ? (
-
-
-
- ) : (
-
- {agents.map((agent, i) => {
- const meta = AGENT_META[agent.name] || { icon: '🤖', desc: agent.class || agent.name, color: '#7c3aed', descMy: agent.name }
- const result = testResult[agent.name]
- return (
-
-
-
-
- {meta.icon}
-
-
-
{agent.name}
-
- {locale === 'my' ? meta.descMy : meta.desc}
-
-
-
-
- {agent.available ? (
-
- ) : (
-
- )}
-
-
-
- {result && (
-
- {result}
-
- )}
-
-
-
-
-
- {agent.available ? (locale === 'my' ? 'Online' : 'Online') : (locale === 'my' ? 'Offline' : 'Offline')}
-
-
-
testAgent(agent.name)}
- disabled={!agent.available || running === agent.name}
- className="btn btn-secondary text-[11px] py-1 px-2.5 disabled:opacity-40 disabled:cursor-not-allowed"
- >
- {running === agent.name ? (
- <> Testing...>
- ) : (
- <> {locale === 'my' ? 'စမ်းသပ်' : 'Test'}>
- )}
-
-
-
- )
- })}
-
- )}
-
- )
-}
diff --git a/frontend/components/pages/AnalyticsPage.tsx b/frontend/components/pages/AnalyticsPage.tsx
deleted file mode 100644
index f84f7a9cf6312fbf7a87ac72a42a8cc8d0b0dca9..0000000000000000000000000000000000000000
--- a/frontend/components/pages/AnalyticsPage.tsx
+++ /dev/null
@@ -1,121 +0,0 @@
-'use client'
-
-import { motion } from 'framer-motion'
-import { BarChart3, TrendingUp, Clock, CheckSquare, Zap } from 'lucide-react'
-import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, LineChart, Line, AreaChart, Area } from 'recharts'
-
-const WEEKLY_DATA = [
- { day: 'Mon', tasks: 28, efficiency: 91 },
- { day: 'Tue', tasks: 35, efficiency: 94 },
- { day: 'Wed', tasks: 42, efficiency: 96 },
- { day: 'Thu', tasks: 31, efficiency: 89 },
- { day: 'Fri', tasks: 55, efficiency: 98 },
- { day: 'Sat', tasks: 22, efficiency: 92 },
- { day: 'Sun', tasks: 34, efficiency: 97 },
-]
-
-const AGENT_PERF = [
- { name: 'Code', tasks: 62, success: 99 },
- { name: 'Data', tasks: 83, success: 98 },
- { name: 'Research', tasks: 47, success: 92 },
- { name: 'Content', tasks: 31, success: 95 },
- { name: 'Design', tasks: 24, success: 90 },
-]
-
-const customTooltipStyle = {
- background: 'rgba(14,17,33,0.95)',
- border: '1px solid rgba(255,255,255,0.08)',
- borderRadius: 10,
- padding: '8px 12px',
- fontSize: 12,
- color: '#e2e8f0',
-}
-
-export default function AnalyticsPage() {
- return (
-
-
-
- Analytics
-
-
Performance insights across all agents and tasks
-
-
- {/* KPI Row */}
-
- {[
- { label: 'Tasks This Week', value: '247', delta: '+37%', color: '#6366f1', icon: CheckSquare },
- { label: 'Avg Efficiency', value: '95.2%', delta: '+3.1%', color: '#22c55e', icon: TrendingUp },
- { label: 'Time Saved', value: '128h', delta: '+55%', color: '#22d3ee', icon: Clock },
- { label: 'Success Rate', value: '98.6%', delta: '+1.2%', color: '#a78bfa', icon: Zap },
- ].map(kpi => (
-
-
-
{kpi.value}
-
{kpi.delta} vs last week
-
- ))}
-
-
-
- {/* Tasks Chart */}
-
-
Weekly Task Completion
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Efficiency Chart */}
-
-
Agent Efficiency Scores
-
-
-
-
-
-
-
-
-
-
-
- {/* Agent Performance Table */}
-
-
Agent Performance Breakdown
-
- {AGENT_PERF.map(agent => (
-
-
{agent.name}
-
-
-
-
{agent.success}%
-
{agent.tasks} tasks
-
- ))}
-
-
-
- )
-}
diff --git a/frontend/components/pages/ChatMainPage.tsx b/frontend/components/pages/ChatMainPage.tsx
deleted file mode 100644
index 29aae5b941d44f639c8640c3858d23e4f1938c88..0000000000000000000000000000000000000000
--- a/frontend/components/pages/ChatMainPage.tsx
+++ /dev/null
@@ -1,632 +0,0 @@
-'use client'
-
-import { useState, useRef, useEffect, useCallback } from 'react'
-import { motion, AnimatePresence } from 'framer-motion'
-import {
- Plus, MessageSquare, Zap, Send, Square, Code2, Globe,
- Folder, GitBranch, FlaskConical, Eye, Rocket, Bot,
- Search, Trash2, Sparkles, Terminal,
- Brain, RefreshCw, Copy, Check, ChevronRight, AlertCircle, Wifi, WifiOff
-} from 'lucide-react'
-import { streamOrchestrate, getHealth, type ToolResult, type ComputerUseStepEvent } from '@/lib/api'
-import { useAppStore } from '@/store/useAppStore'
-import ReactMarkdown from 'react-markdown'
-
-// ─── Types ────────────────────────────────────────────────────────────────────
-
-interface Message {
- id: string
- role: 'user' | 'assistant' | 'system'
- content: string
- timestamp: number
- streaming?: boolean
- agent?: string
- provider?: string
- error?: boolean
- toolResults?: ToolResult[]
-}
-
-interface ChatSession {
- id: string
- title: string
- messages: Message[]
- createdAt: number
- updatedAt: number
-}
-
-// ─── Constants ───────────────────────────────────────────────────────────────
-
-const QUICK_ACTIONS = [
- { icon: Code2, label: 'Build REST API', labelMy: 'REST API တည်ဆောက်', prompt: 'Build a production-ready REST API with FastAPI, SQLite, JWT auth, and full CRUD endpoints' },
- { icon: Globe, label: 'Web Research', labelMy: 'Web သုတေသန', prompt: 'Research the latest AI agent frameworks. Compare Manus, Genspark, and Devin capabilities with pros/cons' },
- { icon: Folder, label: 'Scaffold Project', labelMy: 'Project ဖွဲ့ဆောက်', prompt: 'Create a full-stack project: Next.js 14 frontend + FastAPI backend + Docker + CI/CD pipeline' },
- { icon: GitBranch, label: 'Git Operations', labelMy: 'Git လုပ်ဆောင်', prompt: 'Create a GitHub repository with README, .gitignore, branch protection, and initial commit' },
- { icon: FlaskConical, label: 'Generate Tests', labelMy: 'Test ဖန်တီး', prompt: 'Generate comprehensive pytest tests with fixtures, mocks, and edge cases for a FastAPI app' },
- { icon: Eye, label: 'Generate UI', labelMy: 'UI ဖန်တီး', prompt: 'Create a stunning dark-themed admin dashboard with React, Tailwind CSS, and glassmorphism design' },
- { icon: Rocket, label: 'Deploy to Vercel', labelMy: 'Vercel တင်', prompt: 'Generate Vercel deployment config with environment variables, edge functions, and CI/CD pipeline' },
- { icon: Bot, label: 'Multi-Agent Task', labelMy: 'Multi-Agent', prompt: 'Build a full autonomous AI agent system: plan, code, test, and deploy a Telegram AI bot' },
-]
-
-const STORAGE_KEY = 'god_agent_v12_sessions'
-const ACTIVE_KEY = 'god_agent_v12_active'
-
-// ─── Helpers ─────────────────────────────────────────────────────────────────
-
-function genId() { return Math.random().toString(36).slice(2, 10) + Date.now().toString(36) }
-
-function loadSessions(): ChatSession[] {
- if (typeof window === 'undefined') return []
- try { return JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]') } catch { return [] }
-}
-
-function saveSessions(sessions: ChatSession[]) {
- if (typeof window === 'undefined') return
- try { localStorage.setItem(STORAGE_KEY, JSON.stringify(sessions)) } catch {}
-}
-
-function loadActiveId(): string | null {
- if (typeof window === 'undefined') return null
- try { return localStorage.getItem(ACTIVE_KEY) } catch { return null }
-}
-
-function saveActiveId(id: string) {
- if (typeof window === 'undefined') return
- try { localStorage.setItem(ACTIVE_KEY, id) } catch {}
-}
-
-// ─── Message Bubble ───────────────────────────────────────────────────────────
-
-function MessageBubble({ msg }: { msg: Message }) {
- const [copied, setCopied] = useState(false)
-
- const copyContent = () => {
- navigator.clipboard.writeText(msg.content).then(() => {
- setCopied(true)
- setTimeout(() => setCopied(false), 1500)
- })
- }
-
- const isUser = msg.role === 'user'
-
- if (isUser) {
- return (
-
-
-
- {msg.content}
-
-
- {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
-
-
-
- )
- }
-
- return (
-
- {/* Avatar */}
-
-
-
-
-
-
-
God Agent
- {msg.agent && (
-
- {msg.agent}
-
- )}
- {msg.error && (
-
- Error
-
- )}
-
- {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
-
-
-
-
- {msg.streaming && !msg.content ? (
-
-
- {[0,1,2].map(i => (
-
- ))}
-
-
Thinking...
-
- ) : (
-
-
{
- const isBlock = className?.includes('language-')
- return isBlock ? (
-
- {children}
-
- ) : (
- {children}
- )
- }) as React.ComponentType<{ className?: string; children?: React.ReactNode }>
- }}
- >
- {msg.content}
-
-
- )}
-
-
- {/* Copy button */}
- {!msg.streaming && msg.content && (
-
- {copied ? <> Copied> : <> Copy>}
-
- )}
-
-
- )
-}
-
-// ─── Main Component ───────────────────────────────────────────────────────────
-
-export default function ChatMainPage() {
- const { locale, addComputerUseStep, setComputerUseOpen } = useAppStore()
-
- const [sessions, setSessions] = useState([])
- const [activeId, setActiveId] = useState(null)
- const [input, setInput] = useState('')
- const [isStreaming, setIsStreaming] = useState(false)
- const [backendStatus, setBackendStatus] = useState<'checking' | 'online' | 'offline'>('checking')
- const [toolResultsRef, setToolResultsRef] = useState([])
-
- const abortRef = useRef(null)
- const messagesEndRef = useRef(null)
- const textareaRef = useRef(null)
-
- // Load sessions
- useEffect(() => {
- const saved = loadSessions()
- setSessions(saved)
- const savedId = loadActiveId()
- if (savedId && saved.find(s => s.id === savedId)) {
- setActiveId(savedId)
- } else if (saved.length > 0) {
- setActiveId(saved[0].id)
- }
- }, [])
-
- // Check backend
- useEffect(() => {
- getHealth()
- .then(() => setBackendStatus('online'))
- .catch(() => setBackendStatus('offline'))
- }, [])
-
- // Scroll to bottom
- useEffect(() => {
- messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })
- }, [sessions, activeId])
-
- const activeSession = sessions.find(s => s.id === activeId)
-
- const createSession = useCallback(() => {
- const id = genId()
- const session: ChatSession = {
- id,
- title: locale === 'my' ? 'စကားပြောသစ်' : 'New Chat',
- messages: [],
- createdAt: Date.now(),
- updatedAt: Date.now(),
- }
- setSessions(prev => {
- const next = [session, ...prev]
- saveSessions(next)
- return next
- })
- setActiveId(id)
- saveActiveId(id)
- }, [locale])
-
- const deleteSession = useCallback((id: string) => {
- setSessions(prev => {
- const next = prev.filter(s => s.id !== id)
- saveSessions(next)
- return next
- })
- if (activeId === id) {
- setActiveId(null)
- }
- }, [activeId])
-
- const updateSession = useCallback((id: string, updates: Partial) => {
- setSessions(prev => {
- const next = prev.map(s => s.id === id ? { ...s, ...updates, updatedAt: Date.now() } : s)
- saveSessions(next)
- return next
- })
- }, [])
-
- const sendMessage = useCallback(async (content: string) => {
- if (!content.trim() || isStreaming) return
-
- let sessionId = activeId
- if (!sessionId) {
- const id = genId()
- const session: ChatSession = {
- id,
- title: content.slice(0, 30),
- messages: [],
- createdAt: Date.now(),
- updatedAt: Date.now(),
- }
- setSessions(prev => {
- const next = [session, ...prev]
- saveSessions(next)
- return next
- })
- setActiveId(id)
- saveActiveId(id)
- sessionId = id
- }
-
- // User message
- const userMsg: Message = {
- id: genId(),
- role: 'user',
- content,
- timestamp: Date.now(),
- }
-
- // Assistant placeholder
- const assistantMsg: Message = {
- id: genId(),
- role: 'assistant',
- content: '',
- timestamp: Date.now(),
- streaming: true,
- }
-
- const assistantId = assistantMsg.id
-
- updateSession(sessionId, {
- messages: [...(sessions.find(s => s.id === sessionId)?.messages || []), userMsg, assistantMsg],
- title: sessions.find(s => s.id === sessionId)?.messages.length === 0
- ? content.slice(0, 35)
- : sessions.find(s => s.id === sessionId)?.title || content.slice(0, 35),
- })
-
- setInput('')
- setIsStreaming(true)
- setComputerUseOpen(true)
-
- // Add initial computer use step
- addComputerUseStep({
- type: 'thinking',
- title: locale === 'my' ? `မေးခွန်းကို ခွဲခြမ်းနေသည်...` : `Analyzing request...`,
- detail: content.slice(0, 80),
- status: 'running',
- })
-
- const sessionToolResults: ToolResult[] = []
-
- const ctrl = await streamOrchestrate(
- content,
- sessionId,
- // onChunk
- (chunk: string) => {
- setSessions(prev => prev.map(s => {
- if (s.id !== sessionId) return s
- return {
- ...s,
- messages: s.messages.map(m =>
- m.id === assistantId ? { ...m, content: m.content + chunk, streaming: true } : m
- ),
- }
- }))
- },
- // onDone
- (full: string) => {
- setSessions(prev => {
- const next = prev.map(s => {
- if (s.id !== sessionId) return s
- return {
- ...s,
- messages: s.messages.map(m =>
- m.id === assistantId ? { ...m, content: full || m.content, streaming: false } : m
- ),
- updatedAt: Date.now(),
- }
- })
- saveSessions(next)
- return next
- })
- setIsStreaming(false)
- addComputerUseStep({
- type: 'complete',
- title: locale === 'my' ? 'လုပ်ဆောင်မှုပြီးဆုံးပါပြီ' : 'Task completed',
- status: 'done',
- })
- },
- // onError
- (err: string) => {
- setSessions(prev => {
- const next = prev.map(s => {
- if (s.id !== sessionId) return s
- const errMsg = locale === 'my'
- ? `❌ Backend ချိတ်ဆက်မရပါ: ${err}\n\nBackend URL ကို Settings > API Keys တွင် စစ်ဆေးပါ။`
- : `❌ **Backend Error:** ${err}\n\nCheck backend URL in Settings → API Keys.\n\nMake sure HF Space is running: https://huggingface.co/spaces/PYAE1994/autonomous-coding-system`
- return {
- ...s,
- messages: s.messages.map(m =>
- m.id === assistantId ? { ...m, content: errMsg, streaming: false, error: true } : m
- ),
- }
- })
- saveSessions(next)
- return next
- })
- setIsStreaming(false)
- addComputerUseStep({
- type: 'error',
- title: 'Connection failed',
- detail: err.slice(0, 100),
- status: 'error',
- })
- },
- // onComputerUseStep
- (step: ComputerUseStepEvent) => {
- addComputerUseStep({
- type: (step.type as ComputerUseStep['type']) || 'executing',
- title: step.title,
- detail: step.detail,
- status: step.status === 'done' ? 'done' : 'running',
- })
- },
- // onToolResult
- (result: ToolResult) => {
- sessionToolResults.push(result)
- setToolResultsRef([...sessionToolResults])
- }
- )
-
- abortRef.current = ctrl
- }, [activeId, isStreaming, sessions, locale, addComputerUseStep, setComputerUseOpen, updateSession])
-
- const stopStreaming = () => {
- abortRef.current?.abort()
- setIsStreaming(false)
- setSessions(prev => prev.map(s => ({
- ...s,
- messages: s.messages.map(m => m.streaming ? { ...m, streaming: false } : m),
- })))
- }
-
- const handleKeyDown = (e: React.KeyboardEvent) => {
- if (e.key === 'Enter' && !e.shiftKey) {
- e.preventDefault()
- sendMessage(input)
- }
- }
-
- const handleQuickAction = (prompt: string) => {
- setInput(prompt)
- textareaRef.current?.focus()
- }
-
- return (
-
- {/* Sessions Sidebar */}
-
-
-
-
- {locale === 'my' ? 'စကားပြောသစ်' : 'New Chat'}
-
-
-
- {/* Backend Status */}
-
-
- {backendStatus === 'online' ? : backendStatus === 'offline' ? : }
- Backend: {backendStatus === 'online' ? (locale === 'my' ? 'ချိတ်ဆက်ပြီး' : 'Connected') : backendStatus === 'offline' ? (locale === 'my' ? 'ဆက်သွယ်မရ' : 'Offline') : (locale === 'my' ? 'စစ်ဆေးနေ' : 'Checking...')}
-
-
-
- {/* Session List */}
-
- {sessions.length === 0 && (
-
- {locale === 'my' ? 'စကားပြောမရှိသေးပါ' : 'No sessions yet'}
-
- )}
- {sessions.map(s => (
-
{ setActiveId(s.id); saveActiveId(s.id) }}
- className="flex items-center gap-2 px-2.5 py-2 rounded-lg cursor-pointer group"
- style={{
- background: s.id === activeId ? 'rgba(124,58,237,0.12)' : 'transparent',
- border: s.id === activeId ? '1px solid rgba(124,58,237,0.2)' : '1px solid transparent',
- }}
- >
-
-
- {s.title || (locale === 'my' ? 'စကားပြောသစ်' : 'New Chat')}
-
- { e.stopPropagation(); deleteSession(s.id) }}
- className="opacity-0 group-hover:opacity-100 p-0.5 rounded hover:bg-red-500/20 transition-all shrink-0"
- >
-
-
-
- ))}
-
-
-
- {/* Main Chat */}
-
- {/* Messages */}
-
- {!activeSession ? (
- // Welcome screen
-
-
-
-
-
-
- {locale === 'my' ? 'GOD AGENT OS v12' : 'GOD AGENT OS v12'}
-
-
- {locale === 'my'
- ? 'Code ရေး · Debug · Deploy · Browser · Git · Memory — 16 Agent + 22 Space'
- : 'Code · Debug · Deploy · Browse · Git · Memory — 16 Agents + 22 Spaces'}
-
-
-
- {/* Quick Actions */}
-
- {QUICK_ACTIONS.map((a, i) => (
-
{ if (!activeId) createSession(); handleQuickAction(a.prompt) }}
- className="flex items-center gap-2.5 px-3 py-2.5 rounded-xl text-left text-xs transition-all hover:-translate-y-0.5 card"
- style={{ ':hover': { borderColor: 'var(--border-hover)' } } as React.CSSProperties}
- >
-
-
- {locale === 'my' ? a.labelMy : a.label}
-
-
-
- ))}
-
-
- ) : activeSession.messages.length === 0 ? (
- // Empty session
-
-
-
-
- {locale === 'my' ? 'စကားပြောစတင်ပါ' : 'Start a conversation'}
-
-
- {locale === 'my' ? 'မည်သည့်ရည်မှန်းချက်မဆို ပေးနိုင်သည်' : 'Give me any goal and I\'ll plan, code & execute it'}
-
-
-
- {QUICK_ACTIONS.slice(0, 4).map((a, i) => (
-
handleQuickAction(a.prompt)}
- className="flex items-center gap-2 px-3 py-2 rounded-xl text-xs card transition-all hover:-translate-y-0.5"
- >
-
-
- {locale === 'my' ? a.labelMy : a.label}
-
-
- ))}
-
-
- ) : (
- // Messages
-
- {activeSession.messages.map(msg => (
-
- ))}
-
-
- )}
-
-
- {/* Input Bar */}
-
-
-
-
-
-
- {isStreaming ? (
-
-
-
- ) : (
-
sendMessage(input)}
- disabled={!input.trim() || isStreaming}
- className="btn btn-primary p-3 shrink-0 disabled:opacity-40 disabled:cursor-not-allowed"
- title={locale === 'my' ? 'ပို့ရန်' : 'Send'}
- >
-
-
- )}
-
-
-
- {isStreaming ? (
-
-
- {locale === 'my' ? 'Agent လုပ်ဆောင်နေသည်...' : 'Agent is working...'}
-
- ) : (
- locale === 'my' ? 'Enter = ပို့ · Shift+Enter = လိုင်းသစ်' : 'Enter to send · Shift+Enter for new line'
- )}
-
-
- {locale === 'my' ? 'God Mode v12 · Real Execution' : 'God Mode v12 · E2B Execution'}
-
-
-
-
-
-
- )
-}
-
-// End of ChatMainPage
diff --git a/frontend/components/pages/ConnectorsPage.tsx b/frontend/components/pages/ConnectorsPage.tsx
deleted file mode 100644
index 2989de89147cf7eaed2a35ea113de4cb813ba0b6..0000000000000000000000000000000000000000
--- a/frontend/components/pages/ConnectorsPage.tsx
+++ /dev/null
@@ -1,224 +0,0 @@
-'use client'
-
-import { useState, useEffect } from 'react'
-import { motion } from 'framer-motion'
-import { Plus, CheckCircle, XCircle, Loader, ExternalLink, Key } from 'lucide-react'
-
-interface Connector {
- id: string
- name: string
- icon: string
- description: string
- connected: boolean
- category: string
- apiKeyField?: string
-}
-
-const CONNECTORS: Connector[] = [
- { id: 'github', name: 'GitHub', icon: '🐙', description: 'Repository management, PRs, Issues', connected: false, category: 'DevTools', apiKeyField: 'GitHub Token' },
- { id: 'openai', name: 'OpenAI', icon: '🤖', description: 'GPT-4, DALL-E, Whisper APIs', connected: false, category: 'AI', apiKeyField: 'API Key' },
- { id: 'anthropic', name: 'Anthropic', icon: '🧠', description: 'Claude 3 Opus/Sonnet/Haiku', connected: false, category: 'AI', apiKeyField: 'API Key' },
- { id: 'gemini', name: 'Google Gemini', icon: '✨', description: 'Gemini Pro/Flash models', connected: true, category: 'AI', apiKeyField: 'API Key' },
- { id: 'sambanova', name: 'SambaNova', icon: '⚡', description: 'Ultra-fast LLM inference', connected: true, category: 'AI', apiKeyField: 'API Key' },
- { id: 'vercel', name: 'Vercel', icon: '▲', description: 'Deploy and manage web apps', connected: false, category: 'Deploy', apiKeyField: 'Access Token' },
- { id: 'huggingface', name: 'HuggingFace', icon: '🤗', description: 'Models, Spaces, Datasets', connected: false, category: 'AI', apiKeyField: 'HF Token' },
- { id: 'slack', name: 'Slack', icon: '💬', description: 'Team messaging and notifications', connected: false, category: 'Comm' },
- { id: 'notion', name: 'Notion', icon: '📝', description: 'Knowledge management', connected: false, category: 'Productivity' },
- { id: 'docker', name: 'Docker', icon: '🐳', description: 'Container management', connected: false, category: 'DevOps' },
- { id: 'aws', name: 'AWS', icon: '☁️', description: 'Cloud infrastructure', connected: false, category: 'Cloud', apiKeyField: 'Access Key' },
- { id: 'stripe', name: 'Stripe', icon: '💳', description: 'Payment processing', connected: false, category: 'Finance', apiKeyField: 'Secret Key' },
-]
-
-const CATEGORIES = ['All', 'AI', 'DevTools', 'Deploy', 'DevOps', 'Comm', 'Productivity', 'Cloud', 'Finance']
-
-export default function ConnectorsPage() {
- const [connectors, setConnectors] = useState(CONNECTORS)
- const [selectedCategory, setSelectedCategory] = useState('All')
- const [selectedConnector, setSelectedConnector] = useState(null)
- const [apiKey, setApiKey] = useState('')
- const [connecting, setConnecting] = useState(false)
-
- const filtered = selectedCategory === 'All'
- ? connectors
- : connectors.filter(c => c.category === selectedCategory)
-
- const connectedCount = connectors.filter(c => c.connected).length
-
- async function connectConnector(connector: Connector) {
- setConnecting(true)
- await new Promise(r => setTimeout(r, 1500))
- setConnectors(prev => prev.map(c =>
- c.id === connector.id ? { ...c, connected: true } : c
- ))
- setConnecting(false)
- setSelectedConnector(null)
- setApiKey('')
- }
-
- function disconnectConnector(id: string) {
- setConnectors(prev => prev.map(c =>
- c.id === id ? { ...c, connected: false } : c
- ))
- }
-
- return (
-
-
- {/* Header */}
-
-
-
Connectors
-
{connectedCount} of {connectors.length} services connected
-
-
-
- Add Custom
-
-
-
- {/* Stats */}
-
- {[
- { label: 'Connected', value: connectedCount, color: '#22c55e' },
- { label: 'Available', value: connectors.length - connectedCount, color: '#64748b' },
- { label: 'AI Models', value: connectors.filter(c => c.category === 'AI' && c.connected).length, color: '#7c3aed' },
- { label: 'Deploy', value: connectors.filter(c => c.category === 'Deploy' && c.connected).length, color: '#0891b2' },
- ].map(stat => (
-
-
{stat.value}
-
{stat.label}
-
- ))}
-
-
- {/* Category Filter */}
-
- {CATEGORIES.map(cat => (
- setSelectedCategory(cat)}
- className="flex-shrink-0 px-3 py-1 rounded-full text-xs font-medium transition-all"
- style={{
- background: selectedCategory === cat ? 'rgba(139,92,246,0.2)' : 'rgba(255,255,255,0.04)',
- color: selectedCategory === cat ? '#a78bfa' : '#64748b',
- border: `1px solid ${selectedCategory === cat ? 'rgba(139,92,246,0.4)' : 'transparent'}`,
- }}>
- {cat}
-
- ))}
-
-
- {/* Connectors Grid */}
-
- {filtered.map((connector, i) => (
-
-
-
-
-
{connector.icon}
-
-
{connector.name}
-
{connector.category}
-
-
-
- {connector.connected ? (
-
- ) : (
-
- )}
-
-
-
- {connector.description}
-
-
- {connector.connected ? (
- disconnectConnector(connector.id)}
- className="flex-1 py-1.5 rounded-lg text-xs text-red-400 transition-all hover:bg-red-500/10"
- style={{ border: '1px solid rgba(239,68,68,0.2)' }}>
- Disconnect
-
- ) : (
- setSelectedConnector(connector)}
- className="flex-1 py-1.5 rounded-lg text-xs font-medium text-white transition-all"
- style={{ background: 'rgba(139,92,246,0.2)', border: '1px solid rgba(139,92,246,0.3)' }}>
- Connect
-
- )}
-
-
- ))}
-
-
- {/* Connect Modal */}
- {selectedConnector && (
-
-
-
-
-
{selectedConnector.icon}
-
-
Connect {selectedConnector.name}
-
{selectedConnector.description}
-
-
-
- {selectedConnector.apiKeyField && (
-
-
{selectedConnector.apiKeyField}
-
-
- setApiKey(e.target.value)}
- placeholder={`Enter your ${selectedConnector.apiKeyField}...`}
- className="flex-1 bg-transparent text-sm text-slate-200 outline-none"
- />
-
-
- )}
-
-
- { setSelectedConnector(null); setApiKey('') }}
- className="flex-1 py-2 rounded-lg text-sm text-slate-400 transition-all hover:bg-white/5">
- Cancel
-
- connectConnector(selectedConnector)}
- disabled={connecting}
- className="flex-1 py-2 rounded-lg text-sm font-medium text-white transition-all disabled:opacity-50 flex items-center justify-center gap-2"
- style={{ background: 'linear-gradient(135deg, #7c3aed, #4f46e5)' }}>
- {connecting ? (
- <> Connecting...>
- ) : (
- 'Connect'
- )}
-
-
-
-
- )}
-
-
- )
-}
diff --git a/frontend/components/pages/DashboardPage.tsx b/frontend/components/pages/DashboardPage.tsx
deleted file mode 100644
index c3f26b52e50f317a690b0d523fd89d969437a295..0000000000000000000000000000000000000000
--- a/frontend/components/pages/DashboardPage.tsx
+++ /dev/null
@@ -1,231 +0,0 @@
-'use client'
-
-import { useEffect, useState } from 'react'
-import { motion } from 'framer-motion'
-import { Zap, Activity, Bot, Cpu, Server, RefreshCw, ExternalLink, TrendingUp, CheckCircle, AlertCircle } from 'lucide-react'
-import { getHealth, getSystemStatus, getAIStats } from '@/lib/api'
-import { useAppStore } from '@/store/useAppStore'
-
-interface SystemStatus {
- status: string
- agents: { total: number; online: number }
- spaces: { total: number }
- ai_router: { active: number; providers: Record }
- features: Record
-}
-
-export default function DashboardPage() {
- const { locale, setCurrentPage } = useAppStore()
- const [health, setHealth] = useState>({})
- const [sysStatus, setSysStatus] = useState(null)
- const [loading, setLoading] = useState(true)
- const [lastUpdated, setLastUpdated] = useState(null)
-
- const load = async () => {
- setLoading(true)
- try {
- const [h, s] = await Promise.allSettled([getHealth(), getSystemStatus()])
- if (h.status === 'fulfilled') setHealth(h.value as Record)
- if (s.status === 'fulfilled') setSysStatus(s.value as SystemStatus)
- setLastUpdated(new Date())
- } catch {}
- setLoading(false)
- }
-
- useEffect(() => { load() }, [])
-
- const isOnline = (health as { status?: string })?.status === 'healthy'
- const agentCount = sysStatus?.agents?.online || 16
- const providerCount = sysStatus?.ai_router?.active || 0
- const features = sysStatus?.features || {}
-
- const METRICS = [
- {
- label: locale === 'my' ? 'System Status' : 'System Status',
- value: isOnline ? (locale === 'my' ? 'Online' : 'Online') : (locale === 'my' ? 'Offline' : 'Offline'),
- icon: Activity,
- color: isOnline ? '#22c55e' : '#ef4444',
- bg: isOnline ? 'rgba(34,197,94,0.1)' : 'rgba(239,68,68,0.1)',
- sub: 'God Mode v11',
- },
- {
- label: locale === 'my' ? 'Agents Online' : 'Agents Online',
- value: `${agentCount}/16`,
- icon: Bot,
- color: '#a78bfa',
- bg: 'rgba(167,139,250,0.1)',
- sub: 'All agents active',
- },
- {
- label: locale === 'my' ? 'AI Providers' : 'AI Providers',
- value: `${providerCount || '?'}/5`,
- icon: Cpu,
- color: '#22d3ee',
- bg: 'rgba(34,211,238,0.1)',
- sub: 'Gemini · SambaNova · GitHub',
- },
- {
- label: locale === 'my' ? 'Spaces' : 'Worker Spaces',
- value: '22',
- icon: Server,
- color: '#34d399',
- bg: 'rgba(52,211,153,0.1)',
- sub: 'All in main backend',
- },
- ]
-
- const FEATURE_LIST = [
- { key: 'streaming_chat', label: 'Streaming Chat', labelMy: 'Streaming Chat' },
- { key: 'computer_use', label: 'Computer Use', labelMy: 'Computer Use' },
- { key: 'god_mode', label: 'God Mode', labelMy: 'God Mode' },
- { key: 'multi_agent', label: 'Multi-Agent', labelMy: 'Multi-Agent' },
- { key: 'self_healing', label: 'Self-Healing Debug', labelMy: 'Self-Healing Debug' },
- { key: 'auto_deploy', label: 'Auto Deploy', labelMy: 'Auto Deploy' },
- { key: 'burmese_language', label: 'Burmese Language', labelMy: 'မြန်မာဘာသာ' },
- { key: 'real_time_websocket', label: 'Real-time WebSocket', labelMy: 'WebSocket' },
- ]
-
- return (
-
-
-
-
-
- {locale === 'my' ? 'System Dashboard' : 'System Dashboard'}
-
-
- {locale === 'my' ? 'GOD AGENT OS v11 · System Overview' : 'GOD AGENT OS v11 · Real-time System Overview'}
- {lastUpdated && · Updated {lastUpdated.toLocaleTimeString()} }
-
-
-
-
-
- {/* Metric Cards */}
-
- {METRICS.map((m, i) => {
- const Icon = m.icon
- return (
-
-
- {m.value}
- {m.label}
- {m.sub}
-
- )
- })}
-
-
-
- {/* Features */}
-
-
-
- {locale === 'my' ? 'Features' : 'System Features'}
-
-
- {FEATURE_LIST.map(f => {
- const enabled = features[f.key] !== false
- return (
-
- {enabled ? (
-
- ) : (
-
- )}
-
- {locale === 'my' ? f.labelMy : f.label}
-
-
- )
- })}
-
-
-
- {/* AI Providers */}
-
-
-
- {locale === 'my' ? 'AI Provider Status' : 'AI Provider Status'}
-
-
- {[
- { name: 'Gemini', model: 'gemini-2.0-flash', color: '#22d3ee', keys: '6 keys' },
- { name: 'SambaNova', model: 'Llama-3.3-70B', color: '#a78bfa', keys: '9 keys' },
- { name: 'GitHub Models', model: 'gpt-4o', color: '#34d399', keys: '9 keys' },
- { name: 'Groq', model: 'Llama-3.3-70B', color: '#f59e0b', keys: 'fallback' },
- { name: 'OpenAI', model: 'gpt-4o', color: '#60a5fa', keys: 'fallback' },
- ].map(p => {
- const provStatus = sysStatus?.ai_router?.providers?.[p.name.toLowerCase().replace(' ', '_')]
- const available = !provStatus || provStatus.available !== false
- return (
-
-
-
-
- {p.name}
- {p.model}
-
-
-
-
- )
- })}
-
-
-
- {/* Quick Actions */}
-
-
- {locale === 'my' ? 'မြန်ဆန်သောလုပ်ဆောင်မှုများ' : 'Quick Actions'}
-
-
- {[
- { label: 'Start Chat', labelMy: 'Chat စတင်', page: 'chat' as const, color: '#a78bfa', icon: '💬' },
- { label: 'View Agents', labelMy: 'Agent ကြည့်', page: 'agents' as const, color: '#22d3ee', icon: '🤖' },
- { label: '22 Spaces', labelMy: '22 Spaces', page: 'spaces' as const, color: '#34d399', icon: '⚡' },
- { label: 'Settings', labelMy: 'ဆက်တင်', page: 'settings' as const, color: '#f59e0b', icon: '⚙️' },
- ].map(a => (
- setCurrentPage(a.page)}
- className="flex flex-col items-center gap-2 p-4 rounded-xl transition-all card hover:-translate-y-0.5"
- style={{ border: `1px solid ${a.color}20`, ':hover': { borderColor: `${a.color}40` } } as React.CSSProperties}
- >
- {a.icon}
-
- {locale === 'my' ? a.labelMy : a.label}
-
-
- ))}
-
-
-
-
- )
-}
diff --git a/frontend/components/pages/KnowledgePage.tsx b/frontend/components/pages/KnowledgePage.tsx
deleted file mode 100644
index 3a31ae4b508e1ff94d6da5499253551cf7e49c7e..0000000000000000000000000000000000000000
--- a/frontend/components/pages/KnowledgePage.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-'use client'
-
-import { motion } from 'framer-motion'
-import { BookOpen, FileText, Globe, Code2, BarChart3, Search, Plus } from 'lucide-react'
-
-const KNOWLEDGE_BASES = [
- { id: 1, name: 'Product Documentation', desc: 'Internal product specs and API docs', docs: 342, icon: FileText, color: '#6366f1', updated: '1h ago' },
- { id: 2, name: 'Market Intelligence', desc: 'Industry reports and competitor analysis', docs: 87, icon: Globe, color: '#22d3ee', updated: '2h ago' },
- { id: 3, name: 'Codebase Knowledge', desc: 'Source code patterns and architecture', docs: 1240, icon: Code2, color: '#34d399', updated: '30m ago' },
- { id: 4, name: 'Analytics Data', desc: 'Historical metrics and performance data', docs: 512, icon: BarChart3, color: '#a78bfa', updated: '15m ago' },
- { id: 5, name: 'Research Library', desc: 'Academic papers and research synthesis', docs: 234, icon: BookOpen, color: '#f59e0b', updated: '3h ago' },
-]
-
-export default function KnowledgePage() {
- return (
-
-
-
-
- Knowledge Base
-
-
2,415 documents indexed across 5 knowledge bases
-
-
-
-
-
-
-
- Add Source
-
-
-
-
-
- {KNOWLEDGE_BASES.map((kb, i) => (
-
-
-
-
-
-
-
-
-
{kb.name}
-
{kb.desc}
-
-
-
-
- Documents
- {kb.docs.toLocaleString()}
-
-
- Updated {kb.updated}
-
- ))}
-
- {/* Add Knowledge Base Card */}
-
-
- Add Knowledge Base
- Connect a new data source
-
-
-
- )
-}
diff --git a/frontend/components/pages/MemoryPage.tsx b/frontend/components/pages/MemoryPage.tsx
deleted file mode 100644
index 142539584dbb5f450c315d976e8ca9a4672e9085..0000000000000000000000000000000000000000
--- a/frontend/components/pages/MemoryPage.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-'use client'
-
-import { motion } from 'framer-motion'
-import { Brain, Database, Clock, Search, Tag } from 'lucide-react'
-
-const MEMORIES = [
- { id: 1, title: 'Market Research — SaaS Competitors Q4', tags: ['research', 'market'], date: '2h ago', size: '48 KB', type: 'document', color: '#6366f1' },
- { id: 2, title: 'API Authentication Module Design', tags: ['code', 'architecture'], date: '5h ago', size: '12 KB', type: 'code', color: '#34d399' },
- { id: 3, title: 'Product Positioning Statement v3', tags: ['content', 'strategy'], date: '1d ago', size: '8 KB', type: 'text', color: '#a78bfa' },
- { id: 4, title: 'Database Schema — Users & Sessions', tags: ['code', 'database'], date: '2d ago', size: '22 KB', type: 'code', color: '#22d3ee' },
- { id: 5, title: 'Brand Voice Guidelines 2025', tags: ['content', 'brand'], date: '3d ago', size: '35 KB', type: 'document', color: '#f472b6' },
- { id: 6, title: 'Competitor Analysis Matrix', tags: ['research', 'strategy'], date: '4d ago', size: '61 KB', type: 'document', color: '#f59e0b' },
-]
-
-export default function MemoryPage() {
- return (
-
-
-
-
- Memory
-
-
Persistent knowledge storage · 4,200 indexed documents
-
-
-
-
- {/* Stats */}
-
- {[
- { label: 'Total Memories', value: '4,200', icon: Database, color: '#6366f1' },
- { label: 'Storage Used', value: '2.4 GB', icon: Database, color: '#22d3ee' },
- { label: 'Last Indexed', value: '3m ago', icon: Clock, color: '#a78bfa' },
- ].map(stat => (
-
-
-
-
-
-
{stat.value}
-
{stat.label}
-
-
- ))}
-
-
- {/* Memory Grid */}
-
- {MEMORIES.map((m, i) => (
-
-
-
-
-
-
-
- {m.title}
-
-
- {m.date} · {m.size}
-
-
-
-
- {m.tags.map(tag => (
-
- {tag}
-
- ))}
-
-
- ))}
-
-
- )
-}
diff --git a/frontend/components/pages/SettingsPage.tsx b/frontend/components/pages/SettingsPage.tsx
deleted file mode 100644
index 4cb8ff31ae19387ba94384c815610cb032f60771..0000000000000000000000000000000000000000
--- a/frontend/components/pages/SettingsPage.tsx
+++ /dev/null
@@ -1,468 +0,0 @@
-'use client'
-
-import { useState, useEffect } from 'react'
-import { motion } from 'framer-motion'
-import {
- Settings, Key, Cpu, Bell, Shield, Globe, Palette, Zap,
- Check, Eye, EyeOff, Save, RefreshCw, ExternalLink, Copy, AlertCircle
-} from 'lucide-react'
-import { useAppStore, type Theme, type Locale } from '@/store/useAppStore'
-import { getHealth, getAIStats } from '@/lib/api'
-
-// ─── Types ────────────────────────────────────────────────────────────────────
-
-interface ApiKeyEntry {
- id: string
- label: string
- key: string
- color: string
- provider: string
-}
-
-const THEMES: { id: Theme; label: string; my: string; icon: string; desc: string }[] = [
- { id: 'dark', label: 'Dark', my: 'မှောင်', icon: '🌑', desc: 'Deep dark background' },
- { id: 'amoled', label: 'AMOLED', my: 'AMOLED', icon: '⬛', desc: 'Pure black for OLED screens' },
- { id: 'neon', label: 'Neon', my: 'Neon', icon: '💜', desc: 'Purple neon glow effect' },
- { id: 'glass', label: 'Glass', my: 'ဖန်ထည်', icon: '🔮', desc: 'Glassmorphism blur style' },
-]
-
-// ─── ApiKeyField ──────────────────────────────────────────────────────────────
-
-function ApiKeyField({ label, value, color, onSave }: {
- label: string
- value: string
- color: string
- onSave: (val: string) => void
-}) {
- const [show, setShow] = useState(false)
- const [editing, setEditing] = useState(false)
- const [val, setVal] = useState(value)
- const [saved, setSaved] = useState(false)
-
- const display = show ? val : (val ? val.slice(0, 8) + '••••••••••••' + val.slice(-4) : '(not set)')
-
- const handleSave = () => {
- onSave(val)
- setEditing(false)
- setSaved(true)
- setTimeout(() => setSaved(false), 2000)
- }
-
- return (
-
-
-
{label}
- {editing ? (
-
setVal(e.target.value)}
- onKeyDown={e => e.key === 'Enter' && handleSave()}
- className="input flex-1 text-xs py-1"
- placeholder="Enter API key..."
- autoFocus
- />
- ) : (
-
{display}
- )}
-
- {editing ? (
-
- {saved ? : }
- {saved ? 'Saved' : 'Save'}
-
- ) : (
- setEditing(true)}
- className="text-[10px] px-2 py-1 rounded-md hover:bg-white/5 transition-colors"
- style={{ color: 'var(--text-muted)' }}>
- Edit
-
- )}
- setShow(!show)}
- className="p-1 rounded hover:bg-white/5 transition-colors"
- style={{ color: 'var(--text-muted)' }}>
- {show ? : }
-
-
-
- )
-}
-
-// ─── Toggle ───────────────────────────────────────────────────────────────────
-
-function Toggle({ on, onChange, color = 'var(--accent)' }: { on: boolean; onChange: (v: boolean) => void; color?: string }) {
- return (
- onChange(!on)}
- className="toggle"
- style={{ background: on ? color : 'rgba(255,255,255,0.1)' }}
- >
-
-
- )
-}
-
-// ─── Settings ─────────────────────────────────────────────────────────────────
-
-const SECTIONS = [
- { id: 'appearance', label: 'Appearance', labelMy: 'အပြင်', icon: Palette },
- { id: 'providers', label: 'AI Providers', labelMy: 'AI Providers', icon: Cpu },
- { id: 'keys', label: 'API Keys', labelMy: 'API Keys', icon: Key },
- { id: 'backend', label: 'Backend', labelMy: 'Backend', icon: Zap },
- { id: 'language', label: 'Language', labelMy: 'ဘာသာစကား', icon: Globe },
- { id: 'security', label: 'Security', labelMy: 'လုံခြုံရေး', icon: Shield },
-]
-
-export default function SettingsPage() {
- const {
- theme, setTheme,
- locale, setLocale,
- backendUrl, setBackendUrl,
- } = useAppStore()
-
- const [activeSection, setActiveSection] = useState('appearance')
- const [godMode, setGodMode] = useState(true)
- const [autoRotate, setAutoRotate] = useState(true)
- const [streamMode, setStreamMode] = useState(true)
- const [computeUseBanner, setComputeUseBanner] = useState(true)
- const [backendStatus, setBackendStatus] = useState<'checking' | 'ok' | 'error'>('checking')
- const [aiStats, setAiStats] = useState>({})
- const [backendInput, setBackendInput] = useState(backendUrl)
- const [savedBackend, setSavedBackend] = useState(false)
-
- const [keys, setKeys] = useState([
- { id: 'gemini1', label: 'Gemini Key 1', key: '', color: '#22d3ee', provider: 'gemini' },
- { id: 'gemini2', label: 'Gemini Key 2', key: '', color: '#22d3ee', provider: 'gemini' },
- { id: 'samba1', label: 'SambaNova Key 1', key: '', color: '#a78bfa', provider: 'sambanova' },
- { id: 'samba2', label: 'SambaNova Key 2', key: '', color: '#a78bfa', provider: 'sambanova' },
- { id: 'github1', label: 'GitHub Token 1', key: '', color: '#34d399', provider: 'github' },
- { id: 'openai', label: 'OpenAI Key', key: '', color: '#60a5fa', provider: 'openai' },
- { id: 'groq', label: 'Groq Key', key: '', color: '#f59e0b', provider: 'groq' },
- ])
-
- // Check backend
- const checkBackend = async () => {
- setBackendStatus('checking')
- try {
- await getHealth()
- setBackendStatus('ok')
- const stats = await getAIStats().catch(() => ({}))
- setAiStats((stats as { stats?: Record })?.stats || {})
- } catch {
- setBackendStatus('error')
- }
- }
-
- useEffect(() => { checkBackend() }, [])
-
- const saveBackendUrl = () => {
- setBackendUrl(backendInput)
- setSavedBackend(true)
- setTimeout(() => { setSavedBackend(false); checkBackend() }, 500)
- }
-
- const updateKey = (id: string, val: string) => {
- setKeys(prev => prev.map(k => k.id === id ? { ...k, key: val } : k))
- }
-
- return (
-
-
-
-
- {locale === 'my' ? 'ဆက်တင်' : 'Settings'}
-
-
- {locale === 'my' ? 'God Agent OS v11 ကို ပြင်ဆင်ရန်' : 'Configure God Agent OS v11 — AI, theme, keys & backend'}
-
-
-
-
- {/* Nav */}
-
- {SECTIONS.map(sec => (
- setActiveSection(sec.id)}
- className={`nav-item w-full text-left ${activeSection === sec.id ? 'active' : ''}`}
- >
-
- {locale === 'my' ? sec.labelMy : sec.label}
-
- ))}
-
-
- {/* Content */}
-
-
- {/* ── APPEARANCE ──────────────────────────────────────────────────── */}
- {activeSection === 'appearance' && (
-
-
- {locale === 'my' ? 'Theme ရွေးချယ်ရန်' : 'Choose Theme'}
-
-
- {THEMES.map(t => (
-
setTheme(t.id)}
- className="p-4 rounded-xl text-left transition-all card"
- style={{
- border: theme === t.id ? '1.5px solid var(--accent)' : '1px solid var(--border)',
- background: theme === t.id ? 'rgba(124,58,237,0.08)' : 'var(--surface-2)',
- }}
- >
- {t.icon}
-
- {locale === 'my' ? t.my : t.label}
- {theme === t.id && }
-
- {t.desc}
-
- ))}
-
-
- {/* UI Toggles */}
-
- {locale === 'my' ? 'UI ဆက်တင်' : 'UI Settings'}
-
-
- {[
- { label: 'Computer Use Panel', labelMy: 'Computer Use Panel', desc: 'Show Manus-style computer use panel by default', state: computeUseBanner, toggle: setComputeUseBanner, color: '#a78bfa' },
- { label: 'Stream Mode', labelMy: 'Stream Mode', desc: 'Real-time token streaming from AI', state: streamMode, toggle: setStreamMode, color: '#22d3ee' },
- ].map(item => (
-
-
-
{locale === 'my' ? item.labelMy : item.label}
-
{item.desc}
-
-
-
- ))}
-
-
- )}
-
- {/* ── AI PROVIDERS ─────────────────────────────────────────────────── */}
- {activeSection === 'providers' && (
-
- AI Provider Status
-
-
- {[
- { name: 'Gemini', model: 'gemini-2.0-flash', color: '#22d3ee', keys: 6, type: 'Primary', icon: '✦' },
- { name: 'SambaNova', model: 'Meta-Llama-3.3-70B', color: '#a78bfa', keys: 9, type: 'Primary', icon: '◈' },
- { name: 'GitHub Models', model: 'gpt-4o', color: '#34d399', keys: 9, type: 'Primary', icon: '⬡' },
- { name: 'Groq', model: 'llama-3.3-70b', color: '#f59e0b', keys: 1, type: 'Fallback', icon: '⚡' },
- { name: 'OpenAI', model: 'gpt-4o', color: '#60a5fa', keys: 1, type: 'Fallback', icon: '○' },
- ].map(p => {
- const stat = (aiStats as Record
)[p.name.toLowerCase().replace(' ', '_')] || {}
- const available = stat.available !== false
- return (
-
-
- {p.icon}
-
-
-
- {p.name}
- {p.type}
-
-
{p.model} · {p.keys} keys
-
-
-
-
- {available ? 'Active' : 'Offline'}
-
-
-
- )
- })}
-
-
-
- {[
- { label: 'God Mode', labelMy: 'God Mode', desc: 'Full autonomous operation — no confirmation needed', state: godMode, toggle: setGodMode, color: '#a78bfa' },
- { label: 'Auto-Rotate Keys', labelMy: 'Key အလိုအလျောက်ပြောင်း', desc: 'Rotate API keys on rate limit or failure', state: autoRotate, toggle: setAutoRotate, color: '#22d3ee' },
- ].map(item => (
-
-
-
{locale === 'my' ? item.labelMy : item.label}
-
{item.desc}
-
-
-
- ))}
-
-
- )}
-
- {/* ── API KEYS ─────────────────────────────────────────────────────── */}
- {activeSection === 'keys' && (
-
- API Key Management
-
- {locale === 'my'
- ? 'Keys များကို HF Space secrets တွင်သိမ်းထားသည်။ အောက်မှာ local စစ်ဆေးရန်သာ ထည့်ပါ။'
- : 'Keys are stored in HF Space secrets. Enter here to test locally. Never commit to git.'}
-
-
- {keys.map(k => (
-
updateKey(k.id, val)}
- />
- ))}
-
-
-
-
- {locale === 'my'
- ? 'စစ်မှန်သော keys များကို HF Space → Settings → Variables တွင်ထည့်ပါ'
- : 'Add real keys in HF Space → Settings → Variables → GEMINI_KEY, SAMBANOVA_KEY, etc.'}
-
-
-
- )}
-
- {/* ── BACKEND ──────────────────────────────────────────────────────── */}
- {activeSection === 'backend' && (
-
- Backend Configuration
-
- {/* Status */}
-
-
-
-
Backend Status
-
- {backendStatus === 'ok' ? '✓ Connected and healthy' : backendStatus === 'error' ? '✗ Cannot reach backend' : 'Checking...'}
-
-
{backendUrl}
-
-
-
- {locale === 'my' ? 'စစ်ဆေး' : 'Test'}
-
-
-
- {/* URL Editor */}
-
-
- {locale === 'my' ? 'Backend URL' : 'Backend URL'}
-
-
- setBackendInput(e.target.value)}
- className="input flex-1 text-xs"
- placeholder="https://pyae1994-autonomous-coding-system.hf.space"
- />
-
- {savedBackend ? : }
- {savedBackend ? 'Saved' : 'Save'}
-
-
-
-
- {/* Quick Links */}
-
- {[
- { label: 'HF Space (Main Backend)', url: 'https://huggingface.co/spaces/PYAE1994/autonomous-coding-system' },
- { label: 'API Docs', url: `${backendUrl}/api/docs` },
- { label: 'Health Check', url: `${backendUrl}/health` },
- { label: 'GitHub Repo', url: 'https://github.com/pyaesonegtckglay-dotcom/god-agent-os' },
- ].map(link => (
-
-
- {link.label}
- {link.url}
-
- ))}
-
-
- )}
-
- {/* ── LANGUAGE ─────────────────────────────────────────────────────── */}
- {activeSection === 'language' && (
-
-
- {locale === 'my' ? 'ဘာသာစကား ရွေးချယ်ရန်' : 'Language Selection'}
-
-
- {[
- { id: 'en' as Locale, flag: '🇬🇧', label: 'English', desc: 'Interface in English' },
- { id: 'my' as Locale, flag: '🇲🇲', label: 'မြန်မာဘာသာ', desc: 'မြန်မာဘာသာဖြင့် UI ပြသ' },
- ].map(l => (
-
setLocale(l.id)}
- className="p-5 rounded-xl text-left card transition-all"
- style={{
- border: locale === l.id ? '1.5px solid var(--accent)' : '1px solid var(--border)',
- background: locale === l.id ? 'rgba(124,58,237,0.08)' : 'var(--surface-2)',
- }}
- >
- {l.flag}
-
- {l.label}
- {locale === l.id && }
-
- {l.desc}
-
- ))}
-
-
- )}
-
- {/* ── SECURITY ─────────────────────────────────────────────────────── */}
- {activeSection === 'security' && (
-
- Security Settings
-
-
-
Data Storage
-
- Chat sessions are stored locally in your browser (localStorage). No data sent to external servers except the configured backend.
-
-
-
-
API Key Security
-
- API keys should be stored as HF Space secrets (GEMINI_KEY, SAMBANOVA_KEY, GITHUB_KEY). Never hardcode in frontend.
-
-
-
{
- if (confirm('Clear all chat sessions? This cannot be undone.')) {
- localStorage.removeItem('god_agent_v11_sessions')
- localStorage.removeItem('god_agent_v11_active')
- window.location.reload()
- }
- }}
- className="btn w-full justify-center text-xs"
- style={{ background: 'rgba(239,68,68,0.1)', color: '#f87171', border: '1px solid rgba(239,68,68,0.2)' }}
- >
- Clear All Chat Data
-
-
-
- )}
-
-
-
- )
-}
diff --git a/frontend/components/pages/SpacesPage.tsx b/frontend/components/pages/SpacesPage.tsx
deleted file mode 100644
index 69ab1d6c8f3c7e3ff8f0b9e2e3a31a10379b546f..0000000000000000000000000000000000000000
--- a/frontend/components/pages/SpacesPage.tsx
+++ /dev/null
@@ -1,171 +0,0 @@
-'use client'
-
-import { useEffect, useState } from 'react'
-import { motion } from 'framer-motion'
-import { RefreshCw, ExternalLink, CheckCircle, XCircle, Loader, Zap } from 'lucide-react'
-import { getSpaces } from '@/lib/api'
-import { useAppStore } from '@/store/useAppStore'
-
-interface SpaceInfo {
- id: string
- name: string
- role: string
- agent: string | null
- icon: string
- status: 'active' | 'inactive'
- online: boolean
- backend: string
- tasks_completed: number
-}
-
-const ROLE_COLORS: Record = {
- orchestration: '#a78bfa',
- code_generation: '#34d399',
- execution: '#f59e0b',
- files: '#60a5fa',
- research: '#22d3ee',
- ui_gen: '#f472b6',
- ui: '#f472b6',
- debugging: '#ef4444',
- testing: '#84cc16',
- qa: '#4ade80',
- git: '#fb923c',
- deployment: '#a855f7',
- integration: '#06b6d4',
- memory: '#818cf8',
- knowledge: '#6366f1',
- automation: '#c084fc',
- events: '#94a3b8',
- ai_routing: '#22d3ee',
- monitoring: '#4ade80',
- sessions: '#fbbf24',
- auth: '#f87171',
-}
-
-export default function SpacesPage() {
- const { locale } = useAppStore()
- const [spaces, setSpaces] = useState([])
- const [loading, setLoading] = useState(true)
- const [backendUrl, setBackendUrl] = useState('')
-
- const load = async () => {
- setLoading(true)
- try {
- const data = await getSpaces()
- setSpaces(data.spaces || [])
- setBackendUrl(data.backend_url || '')
- } catch (e) {
- // Show placeholder spaces if backend is offline
- setSpaces([])
- } finally {
- setLoading(false)
- }
- }
-
- useEffect(() => { load() }, [])
-
- const active = spaces.filter(s => s.status === 'active').length
-
- return (
-
-
-
-
-
- {locale === 'my' ? '22 Worker Spaces' : '22 Worker Spaces'}
-
-
- {locale === 'my'
- ? `${active}/22 space လုပ်ဆောင်နေသည် · Backend: ${backendUrl || 'N/A'}`
- : `${active}/22 spaces active · All running inside main backend`}
-
-
-
-
- {locale === 'my' ? 'ပြန်စစ်' : 'Refresh'}
-
-
-
- {/* Architecture Note */}
-
-
-
ℹ️
-
-
- {locale === 'my' ? 'Architecture မှတ်ချက်' : 'Architecture Note'}
-
-
- {locale === 'my'
- ? 'Hugging Face ရှိ 22 static spaces များသည် placeholder HTML သာဖြစ်သည်။ စစ်မှန်သော 22 agent spaces အားလုံးသည် main backend (autonomous-coding-system space) အတွင်းတွင် run နေသည်။ Architecture plan မှာ ဆက်လက်ချဲ့ထွင်ရန်ဖြစ်သည်။'
- : '22 HuggingFace "spaces" were placeholder HTML pages. All 22 real agent spaces now run inside the main backend (autonomous-coding-system). The distributed HF architecture is the future roadmap.'}
-
-
-
-
-
- {loading ? (
-
-
-
- {locale === 'my' ? 'Space status စစ်ဆေးနေသည်...' : 'Checking space status...'}
-
-
- ) : spaces.length === 0 ? (
-
-
-
- {locale === 'my' ? 'Backend ချိတ်ဆက်မရသောကြောင့် space status ရယူ၍မရပါ' : 'Cannot reach backend to get space status'}
-
-
Retry
-
- ) : (
-
- {spaces.map((space, i) => {
- const color = ROLE_COLORS[space.role] || '#7c3aed'
- return (
-
-
-
- {space.icon}
-
-
- {space.online ? (
-
- ) : (
-
- )}
-
-
- {space.name}
-
- {space.role.replace(/_/g, ' ')}
-
- {space.agent && (
-
- Agent: {space.agent}
-
- )}
-
- {space.status === 'active' ? (
- ● Active in backend
- ) : (
- ◦ System space
- )}
-
-
- )
- })}
-
- )}
-
- )
-}
diff --git a/frontend/components/pages/TasksPage.tsx b/frontend/components/pages/TasksPage.tsx
deleted file mode 100644
index 5d1e7cc0bec28bd6193dd21bac9c37dc94afdc0c..0000000000000000000000000000000000000000
--- a/frontend/components/pages/TasksPage.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-'use client'
-
-import { useState } from 'react'
-import { motion } from 'framer-motion'
-import { CheckSquare, Clock, Loader2, AlertCircle, Plus, ChevronRight } from 'lucide-react'
-type Task = { id: string; title: string; status: 'running' | 'completed' | 'pending' | 'failed'; space?: string; agent?: string; goal: string; started?: number; completed_at?: number; createdAt?: string; completedAt?: string; progress?: number; [key: string]: any }
-const TASKS: Task[] = []
-import { cn } from '@/lib/utils'
-
-const STATUS_CONFIG = {
- running: { color: '#6366f1', label: 'Running', icon: Loader2, bg: 'rgba(99,102,241,0.12)' },
- completed: { color: '#22c55e', label: 'Completed', icon: CheckSquare, bg: 'rgba(34,197,94,0.12)' },
- pending: { color: '#94a3b8', label: 'Pending', icon: Clock, bg: 'rgba(148,163,184,0.1)' },
- failed: { color: '#ef4444', label: 'Failed', icon: AlertCircle, bg: 'rgba(239,68,68,0.12)' },
-}
-
-function TaskRow({ task, delay }: { task: Task; delay: number }) {
- const cfg = STATUS_CONFIG[task.status]
- const Icon = cfg.icon
- const isRunning = task.status === 'running'
- const agentColor = '#6366f1'
-
- return (
-
-
-
-
-
-
-
-
- {task.title}
- {cfg.label}
-
-
- {task.agent}
- · {task.createdAt}
- {task.completedAt && Completed {task.completedAt} }
-
- {task.status === 'running' && (
-
-
-
-
-
{task.progress}%
-
- )}
-
-
-
-
-
- )
-}
-
-export default function TasksPage() {
- const [filter, setFilter] = useState<'all' | Task['status']>('all')
- const filtered = filter === 'all' ? TASKS : TASKS.filter(t => t.status === filter)
-
- const counts = {
- all: TASKS.length,
- running: TASKS.filter(t => t.status === 'running').length,
- completed: TASKS.filter(t => t.status === 'completed').length,
- pending: TASKS.filter(t => t.status === 'pending').length,
- failed: TASKS.filter(t => t.status === 'failed').length,
- }
-
- return (
-
-
-
-
- Tasks
-
-
{counts.running} running · {counts.pending} pending · {counts.completed} completed
-
-
- New Task
-
-
-
- {/* Status Tabs */}
-
- {(['all', 'running', 'completed', 'pending', 'failed'] as const).map(s => (
- setFilter(s)}
- className={cn('px-4 py-2 rounded-xl text-xs font-semibold capitalize transition-all',
- filter === s
- ? 'bg-purple-600/20 text-purple-300 border border-purple-500/30'
- : 'text-slate-500 border border-transparent hover:border-white/10 hover:text-slate-300'
- )}>
- {s} ({counts[s]})
-
- ))}
-
-
- {/* Summary Stats */}
-
- {Object.entries(STATUS_CONFIG).map(([status, cfg]) => (
-
-
{counts[status as keyof typeof counts] || 0}
-
{cfg.label}
-
- ))}
-
-
- {/* Tasks List */}
-
- {filtered.map((task, i) =>
)}
- {filtered.length === 0 && (
-
No tasks with this filter
- )}
-
-
- )
-}
diff --git a/frontend/components/pages/WorkflowsPage.tsx b/frontend/components/pages/WorkflowsPage.tsx
deleted file mode 100644
index 5d10e6df62e1ad8e32d56148a64abc8f12ab3726..0000000000000000000000000000000000000000
--- a/frontend/components/pages/WorkflowsPage.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-'use client'
-
-import { motion } from 'framer-motion'
-import { GitBranch, Play, Pause, Plus, Clock, CheckCircle2, Zap } from 'lucide-react'
-
-const WORKFLOWS = [
- { id: 1, name: 'Daily Research Pipeline', desc: 'Research → Analyze → Summarize → Report', status: 'active', runs: 47, lastRun: '2h ago', color: '#6366f1', schedule: 'Daily 9:00 AM' },
- { id: 2, name: 'Code Review Automation', desc: 'PR Detect → AI Review → Comment → Approve', status: 'active', runs: 23, lastRun: '1h ago', color: '#34d399', schedule: 'On PR event' },
- { id: 3, name: 'Content Generation Loop', desc: 'Research → Write → Review → Publish', status: 'paused', runs: 12, lastRun: '1d ago', color: '#a78bfa', schedule: 'Weekly' },
- { id: 4, name: 'Deploy Pipeline', desc: 'Build → Test → Stage → Deploy → Monitor', status: 'active', runs: 89, lastRun: '30m ago', color: '#22d3ee', schedule: 'On push to main' },
- { id: 5, name: 'Market Intelligence', desc: 'Scrape → Parse → Analyze → Alert', status: 'idle', runs: 7, lastRun: '3d ago', color: '#f59e0b', schedule: 'Weekly' },
-]
-
-const STATUS_CONFIG = {
- active: { color: '#22c55e', label: 'Active' },
- paused: { color: '#f59e0b', label: 'Paused' },
- idle: { color: '#94a3b8', label: 'Idle' },
-}
-
-export default function WorkflowsPage() {
- return (
-
-
-
-
- Workflows
-
-
Autonomous multi-agent pipelines · {WORKFLOWS.filter(w => w.status === 'active').length} running
-
-
- New Workflow
-
-
-
-
- {WORKFLOWS.map((wf, i) => {
- const sc = STATUS_CONFIG[wf.status as keyof typeof STATUS_CONFIG]
- return (
-
-
-
-
-
-
-
-
-
{wf.name}
-
- {sc.label}
-
-
-
{wf.desc}
-
- {wf.runs} runs
- {wf.lastRun}
- {wf.schedule}
-
-
-
-
-
- {wf.status === 'active' ? : }
-
-
-
-
- )
- })}
-
-
- )
-}
diff --git a/frontend/components/shared/Sidebar.tsx b/frontend/components/shared/Sidebar.tsx
deleted file mode 100644
index 00da3c4d79f4471b39f5a410f11b610578df6f8a..0000000000000000000000000000000000000000
--- a/frontend/components/shared/Sidebar.tsx
+++ /dev/null
@@ -1,108 +0,0 @@
-'use client'
-
-import { MessageSquare, LayoutDashboard, Box, Bot, ListTodo, Brain, BookOpen, GitBranch, BarChart2, Settings, Zap, Plug, MonitorPlay } from 'lucide-react'
-import { useAppStore } from '@/store/useAppStore'
-import type { Page } from '@/store/useAppStore'
-
-interface NavItem {
- id: Page
- label: string
- labelMy: string
- icon: React.ElementType
-}
-
-const NAV_ITEMS: NavItem[] = [
- { id: 'chat', label: 'Chat', labelMy: 'စကားပြော', icon: MessageSquare },
- { id: 'dashboard', label: 'Dashboard', labelMy: 'Dashboard', icon: LayoutDashboard },
- { id: 'spaces', label: 'Spaces', labelMy: 'Spaces (22)', icon: Box },
- { id: 'agents', label: 'Agents', labelMy: 'Agent (16)', icon: Bot },
- { id: 'connectors', label: 'Connectors', labelMy: 'ချိတ်ဆက်မှု', icon: Plug },
- { id: 'tasks', label: 'Tasks', labelMy: 'လုပ်ငန်းများ', icon: ListTodo },
- { id: 'memory', label: 'Memory', labelMy: 'မှတ်ဉာဏ်', icon: Brain },
- { id: 'knowledge', label: 'Knowledge', labelMy: 'ဗဟုသုတ', icon: BookOpen },
- { id: 'workflows', label: 'Workflows', labelMy: 'Workflow', icon: GitBranch },
- { id: 'analytics', label: 'Analytics', labelMy: 'Analytics', icon: BarChart2 },
- { id: 'settings', label: 'Settings', labelMy: 'ဆက်တင်', icon: Settings },
-]
-
-export default function Sidebar() {
- const { currentPage, setCurrentPage, sidebarOpen, locale, isComputerUseOpen, setComputerUseOpen } = useAppStore()
-
- if (!sidebarOpen) return null
-
- return (
-
- {/* Logo */}
-
-
-
-
-
-
-
GOD AGENT OS
-
- v11 · God Mode
-
-
-
-
-
- {/* Navigation */}
-
-
- {NAV_ITEMS.map(item => {
- const Icon = item.icon
- const active = currentPage === item.id
- return (
- setCurrentPage(item.id)}
- className={`nav-item w-full text-left ${active ? 'active' : ''}`}
- >
-
- {locale === 'my' ? item.labelMy : item.label}
- {item.id === 'chat' && active && (
-
- )}
-
- )
- })}
-
-
- {/* Computer Use Shortcut */}
-
- setComputerUseOpen(!isComputerUseOpen)}
- className={`nav-item w-full text-left ${isComputerUseOpen ? 'active' : ''}`}
- >
-
- {locale === 'my' ? 'Computer ကြည့်' : 'Computer Use'}
- {isComputerUseOpen && (
-
- Live
-
- )}
-
-
-
-
- {/* Footer */}
-
-
-
-
- {locale === 'my' ? '16 Agent Online' : '16 Agents Online'}
-
-
-
- {locale === 'my' ? 'Gemini · SambaNova · GitHub' : 'Gemini · SambaNova · GitHub'}
-
-
-
- )
-}
diff --git a/frontend/components/shared/ThemeProvider.tsx b/frontend/components/shared/ThemeProvider.tsx
deleted file mode 100644
index 212aec63c6d7078e1af1374a2046731efb2debe2..0000000000000000000000000000000000000000
--- a/frontend/components/shared/ThemeProvider.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-'use client'
-
-import { useEffect } from 'react'
-import { useAppStore } from '@/store/useAppStore'
-
-export function ThemeProvider({ children }: { children: React.ReactNode }) {
- const { theme } = useAppStore()
-
- useEffect(() => {
- document.documentElement.setAttribute('data-theme', theme)
- }, [theme])
-
- return <>{children}>
-}
diff --git a/frontend/components/shared/TopBar.tsx b/frontend/components/shared/TopBar.tsx
deleted file mode 100644
index 67279f491a5cb40c19d98a041b45219172e3df37..0000000000000000000000000000000000000000
--- a/frontend/components/shared/TopBar.tsx
+++ /dev/null
@@ -1,210 +0,0 @@
-'use client'
-
-import { useState, useRef, useEffect } from 'react'
-import { Menu, Zap, Settings, Bell, Activity, Sun, Moon, Globe, ChevronDown, Cpu, MonitorPlay } from 'lucide-react'
-import { useAppStore, type Theme, type Locale } from '@/store/useAppStore'
-
-const THEMES: { id: Theme; label: string; en: string; my: string; icon: string }[] = [
- { id: 'dark', label: 'Dark', en: 'Dark', my: 'မှောင်', icon: '🌑' },
- { id: 'amoled', label: 'AMOLED', en: 'AMOLED', my: 'AMOLED', icon: '⬛' },
- { id: 'neon', label: 'Neon', en: 'Neon', my: 'Neon', icon: '💜' },
- { id: 'glass', label: 'Glass', en: 'Glass', my: 'ဖန်ထည်', icon: '🔮' },
-]
-
-const LOCALES: { id: Locale; flag: string; label: string }[] = [
- { id: 'en', flag: '🇬🇧', label: 'English' },
- { id: 'my', flag: '🇲🇲', label: 'မြန်မာ' },
-]
-
-export default function TopBar() {
- const {
- sidebarOpen, setSidebarOpen,
- theme, setTheme,
- locale, setLocale,
- setCurrentPage, currentPage,
- isComputerUseOpen, setComputerUseOpen,
- } = useAppStore()
-
- const [themeOpen, setThemeOpen] = useState(false)
- const [langOpen, setLangOpen] = useState(false)
- const themeRef = useRef(null)
- const langRef = useRef(null)
-
- // Close dropdowns on outside click
- useEffect(() => {
- function handler(e: MouseEvent) {
- if (themeRef.current && !themeRef.current.contains(e.target as Node)) setThemeOpen(false)
- if (langRef.current && !langRef.current.contains(e.target as Node)) setLangOpen(false)
- }
- document.addEventListener('mousedown', handler)
- return () => document.removeEventListener('mousedown', handler)
- }, [])
-
- const currentTheme = THEMES.find(t => t.id === theme) || THEMES[0]
- const currentLocale = LOCALES.find(l => l.id === locale) || LOCALES[0]
-
- return (
-
- {/* Left */}
-
-
setSidebarOpen(!sidebarOpen)}
- className="p-1.5 rounded-lg hover:bg-white/5 transition-colors"
- title="Toggle Sidebar"
- >
-
-
-
-
-
-
-
-
-
- {locale === 'my' ? 'GOD AGENT OS' : 'GOD AGENT OS'}
-
-
- v11 · God Mode
-
-
-
-
-
- {/* Center - Status */}
-
-
-
-
-
{locale === 'my' ? 'Backend Online' : 'Backend Online'}
-
-
-
-
- 16 Agents · 22 Spaces
-
-
-
- {/* Right - Controls */}
-
-
- {/* Computer Use Toggle (Manus-style) */}
-
setComputerUseOpen(!isComputerUseOpen)}
- className="flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-xs font-medium transition-all"
- style={{
- background: isComputerUseOpen ? 'rgba(124,58,237,0.15)' : 'transparent',
- color: isComputerUseOpen ? '#a78bfa' : 'var(--text-muted)',
- border: isComputerUseOpen ? '1px solid rgba(124,58,237,0.25)' : '1px solid transparent',
- }}
- title={locale === 'my' ? 'Computer ကြည့်ရန်' : 'Computer Use View'}
- >
-
-
- {locale === 'my' ? 'Computer' : 'Computer Use'}
-
-
-
- {/* Language Toggle */}
-
-
{ setLangOpen(!langOpen); setThemeOpen(false) }}
- className="flex items-center gap-1 px-2 py-1.5 rounded-lg hover:bg-white/5 transition-colors text-xs"
- style={{ color: 'var(--text-secondary)' }}
- title="Language"
- >
-
- {currentLocale.flag}
-
-
- {langOpen && (
-
- {LOCALES.map(l => (
- { setLocale(l.id); setLangOpen(false) }}
- className="w-full flex items-center gap-2.5 px-3 py-2 text-xs hover:bg-white/5 transition-colors"
- style={{ color: locale === l.id ? 'var(--accent-bright)' : 'var(--text-secondary)' }}
- >
- {l.flag}
- {l.label}
- {locale === l.id && ✓ }
-
- ))}
-
- )}
-
-
- {/* Theme Toggle */}
-
-
{ setThemeOpen(!themeOpen); setLangOpen(false) }}
- className="flex items-center gap-1 px-2 py-1.5 rounded-lg hover:bg-white/5 transition-colors text-xs"
- style={{ color: 'var(--text-secondary)' }}
- title="Theme"
- >
- {currentTheme.icon}
-
-
- {themeOpen && (
-
-
- {locale === 'my' ? 'အပြင်အဆင်' : 'Theme'}
-
- {THEMES.map(t => (
-
{ setTheme(t.id); setThemeOpen(false) }}
- className="w-full flex items-center gap-2.5 px-3 py-2 text-xs hover:bg-white/5 transition-colors"
- style={{ color: theme === t.id ? 'var(--accent-bright)' : 'var(--text-secondary)' }}
- >
- {t.icon}
- {locale === 'my' ? t.my : t.en}
- {theme === t.id && ✓ }
-
- ))}
-
- )}
-
-
- {/* Notifications */}
-
-
-
-
- {/* Settings */}
-
setCurrentPage('settings')}
- className="p-1.5 rounded-lg hover:bg-white/5 transition-colors"
- style={{
- color: currentPage === 'settings' ? 'var(--accent-bright)' : 'var(--text-muted)',
- background: currentPage === 'settings' ? 'rgba(124,58,237,0.1)' : 'transparent',
- }}
- title="Settings"
- >
-
-
-
-
- )
-}
diff --git a/frontend/components/timeline/ExecutionTimeline.tsx b/frontend/components/timeline/ExecutionTimeline.tsx
deleted file mode 100644
index 7f630ff3e1f201ef2c4bd535e7491b65dde8ea37..0000000000000000000000000000000000000000
--- a/frontend/components/timeline/ExecutionTimeline.tsx
+++ /dev/null
@@ -1,252 +0,0 @@
-'use client'
-
-import { useAgentStore } from '@/hooks/useAgentStore'
-import { formatDistanceToNow } from 'date-fns'
-import {
- Zap, Code2, Bug, Brain, Plug, Rocket, Workflow, Terminal,
- MessageSquare, CheckCircle2, XCircle, Clock, RefreshCw,
- ChevronDown, Trash2, Activity, Bot, Palette
-} from 'lucide-react'
-import { useState } from 'react'
-import type { AgentName } from '@/hooks/useAgentStore'
-
-const AGENT_META: Record = {
- chat: { icon: MessageSquare, color: '#22d3ee' },
- planner: { icon: Zap, color: '#a78bfa' },
- coding: { icon: Code2, color: '#34d399' },
- debug: { icon: Bug, color: '#f87171' },
- memory: { icon: Brain, color: '#fbbf24' },
- connector: { icon: Plug, color: '#60a5fa' },
- deploy: { icon: Rocket, color: '#f472b6' },
- workflow: { icon: Workflow, color: '#fb923c' },
- sandbox: { icon: Terminal, color: '#4ade80' },
- ui: { icon: Palette, color: '#e879f9' },
-}
-
-const EVENT_DISPLAY: Record = {
- task_created: { label: 'Task Created', icon: Zap, color: '#6366f1' },
- task_submitted: { label: 'Task Submitted', icon: Zap, color: '#6366f1' },
- task_queued: { label: 'Task Queued', icon: Clock, color: '#94a3b8' },
- task_started: { label: 'Task Started', icon: Activity, color: '#22d3ee' },
- task_completed: { label: 'Task Complete', icon: CheckCircle2, color: '#22c55e' },
- task_failed: { label: 'Task Failed', icon: XCircle, color: '#ef4444' },
- orchestrator_start: { label: 'Orchestrator Start', icon: Bot, color: '#6366f1' },
- orchestrator_complete:{ label: 'Orchestrator Done', icon: CheckCircle2, color: '#22c55e' },
- intent_classified: { label: 'Intent Classified', icon: Brain, color: '#a78bfa' },
- agent_start: { label: 'Agent Started', icon: Zap, color: '#818cf8' },
- agent_called: { label: 'Agent Called', icon: Bot, color: '#818cf8' },
- plan_ready: { label: 'Plan Ready', icon: Zap, color: '#a78bfa' },
- tool_called: { label: 'Tool Called', icon: Code2, color: '#34d399' },
- tool_result: { label: 'Tool Result', icon: CheckCircle2, color: '#34d399' },
- code_generated: { label: 'Code Generated', icon: Code2, color: '#34d399' },
- file_written: { label: 'File Written', icon: Terminal, color: '#4ade80' },
- sandbox_exec: { label: 'Sandbox Exec', icon: Terminal, color: '#4ade80' },
- sandbox_result: { label: 'Sandbox Result', icon: CheckCircle2, color: '#4ade80' },
- workflow_generated: { label: 'Workflow Generated', icon: Workflow, color: '#fb923c' },
- deploy_plan_ready: { label: 'Deploy Plan Ready', icon: Rocket, color: '#f472b6' },
- connector_result: { label: 'Connector Result', icon: Plug, color: '#60a5fa' },
- self_heal_attempt: { label: 'Self-Healing', icon: RefreshCw, color: '#f87171' },
- self_heal_success: { label: 'Healed ✓', icon: CheckCircle2, color: '#22c55e' },
- self_heal_failed: { label: 'Heal Failed', icon: XCircle, color: '#ef4444' },
- retry_attempt: { label: 'Retry', icon: RefreshCw, color: '#f59e0b' },
- llm_chunk: { label: 'Streaming', icon: Activity, color: '#6366f1' },
- stream_start: { label: 'Stream Start', icon: Activity, color: '#22d3ee' },
- stream_end: { label: 'Stream End', icon: CheckCircle2, color: '#22c55e' },
- debug_complete: { label: 'Debug Complete', icon: Bug, color: '#f87171' },
- ui_generated: { label: 'UI Generated', icon: Palette, color: '#e879f9' },
- installing_packages: { label: 'Installing Packages', icon: Terminal, color: '#4ade80' },
- github_op: { label: 'GitHub Op', icon: Plug, color: '#60a5fa' },
-}
-
-function EventCard({ event, index }: { event: any; index: number }) {
- const [expanded, setExpanded] = useState(false)
- const meta = EVENT_DISPLAY[event.type] || { label: event.type, icon: Activity, color: '#6366f1' }
- const Icon = meta.icon
- const agentMeta = event.agent ? AGENT_META[event.agent] : null
- const AgentIcon = agentMeta?.icon
-
- // Skip raw llm_chunk events (too noisy)
- if (event.type === 'llm_chunk') return null
-
- const hasData = event.data && Object.keys(event.data).length > 0
- const dataStr = hasData ? JSON.stringify(event.data, null, 2) : null
-
- return (
-
- {/* Line */}
-
-
- {/* Dot */}
-
-
- {/* Card */}
-
-
hasData && setExpanded(!expanded)}
- >
-
-
- {meta.label}
-
-
- {/* Agent badge */}
- {agentMeta && AgentIcon && (
-
- )}
-
- {/* Time */}
-
- {new Date(event.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}
-
-
- {hasData && (
-
- )}
-
-
- {/* Data preview (collapsed) */}
- {!expanded && hasData && (
-
-
- {Object.entries(event.data).filter(([k]) => k !== 'chunk').slice(0, 3).map(([k, v]) =>
- `${k}: ${typeof v === 'string' ? v.slice(0, 30) : JSON.stringify(v)}`
- ).join(' · ')}
-
-
- )}
-
- {/* Expanded data */}
- {expanded && dataStr && (
-
- )}
-
-
- )
-}
-
-export default function ExecutionTimeline() {
- const { events, clearEvents, agents, locale } = useAgentStore()
- const visibleEvents = events.filter(e => e.type !== 'llm_chunk')
-
- const activeAgents = Object.values(agents).filter(a => a.status === 'executing' || a.status === 'thinking')
-
- return (
-
- {/* Header */}
-
-
-
-
- {locale === 'my' ? 'အချိန်ဇယား' : 'Execution Timeline'}
-
- {visibleEvents.length > 0 && (
-
- {visibleEvents.length}
-
- )}
-
- {visibleEvents.length > 0 && (
-
-
-
- )}
-
-
- {/* Active Agents Banner */}
- {activeAgents.length > 0 && (
-
-
-
- {locale === 'my' ? 'အသုံးပြုနေသော Agent များ:' : 'Active:'}
-
- {activeAgents.map(a => {
- const meta = AGENT_META[a.name]
- const Icon = meta?.icon
- return Icon ? (
-
-
- {a.name}
-
- ) : null
- })}
-
- )}
-
- {/* Events */}
-
- {visibleEvents.length === 0 ? (
-
-
-
-
- {locale === 'my' ? 'အချိန်ဇယားအလွတ်' : 'No events yet'}
-
-
- {locale === 'my'
- ? 'Task တစ်ခုဖန်တီးပါ — Real-time events တွေ့ရမည်'
- : 'Create a task to see real-time execution events'}
-
-
-
- ) : (
-
- {[...visibleEvents].reverse().map((ev, i) => (
-
- ))}
-
- )}
-
-
- {/* Agent Grid */}
-
-
- {locale === 'my' ? 'Agent အားလုံး' : 'All Agents'}
-
-
- {Object.entries(AGENT_META).map(([name, meta]) => {
- const Icon = meta.icon
- const agent = useAgentStore.getState().agents[name as AgentName]
- const isActive = agent?.status === 'executing' || agent?.status === 'thinking'
- return (
-
-
-
- {name}
-
- {isActive &&
}
-
- )
- })}
-
-
-
- )
-}
diff --git a/frontend/ecosystem.config.cjs b/frontend/ecosystem.config.cjs
deleted file mode 100644
index 351256be525a0ed21f211adaf44455ac828741ee..0000000000000000000000000000000000000000
--- a/frontend/ecosystem.config.cjs
+++ /dev/null
@@ -1,19 +0,0 @@
-module.exports = {
- apps: [
- {
- name: 'devin-frontend',
- script: 'npm',
- args: 'start',
- cwd: '/home/user/devin-agent/frontend',
- watch: false,
- instances: 1,
- exec_mode: 'fork',
- env: {
- PORT: 3000,
- NODE_ENV: 'production',
- NEXT_PUBLIC_API_URL: 'http://localhost:7860',
- NEXT_PUBLIC_WS_URL: 'ws://localhost:7860',
- },
- },
- ],
-}
diff --git a/frontend/hooks/nanoid.ts b/frontend/hooks/nanoid.ts
deleted file mode 100644
index b0ccc40baa7f981fee7b2a11a7dbc53c195426d1..0000000000000000000000000000000000000000
--- a/frontend/hooks/nanoid.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export function nanoid(size = 10): string {
- const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
- let result = ''
- for (let i = 0; i < size; i++) {
- result += chars.charAt(Math.floor(Math.random() * chars.length))
- }
- return result
-}
diff --git a/frontend/hooks/useAgentStore.ts b/frontend/hooks/useAgentStore.ts
deleted file mode 100644
index 17c04e798dc9244e732b8f691f5840ff413df10a..0000000000000000000000000000000000000000
--- a/frontend/hooks/useAgentStore.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * God Agent OS v7 — Global State Store
- * Manus + Genspark + Devin (OneHand)
- */
-
-import { create } from 'zustand'
-import { nanoid } from './nanoid'
-
-export type Theme = 'dark' | 'light' | 'amoled' | 'neon' | 'glass'
-export type Locale = 'en' | 'my'
-export type AgentName = 'chat' | 'planner' | 'coding' | 'debug' | 'memory' | 'connector' | 'deploy' | 'workflow' | 'sandbox' | 'ui' | 'browser' | 'file' | 'git' | 'test' | 'vision' | 'reasoning'
-export type ActivePanel = 'timeline' | 'tasks' | 'memory' | 'connectors' | 'sandbox' | 'files' | 'browser' | 'ai_router'
-
-export interface Message {
- id: string
- role: 'user' | 'assistant' | 'system'
- content: string
- streaming?: boolean
- timestamp: number
- agent?: AgentName
- metadata?: Record
-}
-
-export interface AgentStatus {
- name: AgentName
- status: 'idle' | 'thinking' | 'executing' | 'complete' | 'error'
- currentTask?: string
- lastActive?: number
-}
-
-export interface TaskEvent {
- id: string
- type: string
- data: Record
- timestamp: number
- agent?: AgentName
-}
-
-export interface ConnectorInfo {
- id: string
- name: string
- connected: boolean
- icon: string
- color: string
- category: string
- description: string
-}
-
-interface GodStore {
- sessionId: string
- messages: Message[]
- isStreaming: boolean
- streamingMessageId: string | null
- mode: 'agent' | 'chat'
- setMode: (m: 'agent' | 'chat') => void
- theme: Theme
- locale: Locale
- setTheme: (t: Theme) => void
- setLocale: (l: Locale) => void
- activePanel: ActivePanel
- setActivePanel: (p: ActivePanel) => void
- sidebarOpen: boolean
- setSidebarOpen: (v: boolean) => void
- activeTaskId: string | null
- setActiveTaskId: (id: string | null) => void
- events: TaskEvent[]
- addEvent: (e: Omit) => void
- clearEvents: () => void
- agents: Record
- updateAgentStatus: (name: AgentName, s: Partial) => void
- connectors: ConnectorInfo[]
- setConnectors: (c: ConnectorInfo[]) => void
- addMessage: (m: Omit) => string
- appendChunk: (id: string, chunk: string) => void
- updateMessage: (id: string, updates: Partial) => void
- setStreaming: (v: boolean, id: string | null) => void
- clearMessages: () => void
-}
-
-const ALL_AGENTS: AgentName[] = [
- 'chat','planner','coding','debug','memory','connector',
- 'deploy','workflow','sandbox','ui','browser','file',
- 'git','test','vision','reasoning'
-]
-
-const defaultAgents = Object.fromEntries(
- ALL_AGENTS.map(n => [n, { name: n, status: 'idle' as const }])
-) as Record
-
-export const useAgentStore = create((set, get) => ({
- sessionId: `sess_${nanoid(16)}`,
- messages: [],
- isStreaming: false,
- streamingMessageId: null,
- mode: 'agent',
- setMode: (mode) => set({ mode }),
- theme: 'dark',
- locale: 'en',
- setTheme: (theme) => {
- set({ theme })
- if (typeof document !== 'undefined') {
- document.documentElement.setAttribute('data-theme', theme)
- }
- },
- setLocale: (locale) => set({ locale }),
- activePanel: 'timeline',
- setActivePanel: (activePanel) => set({ activePanel }),
- sidebarOpen: true,
- setSidebarOpen: (v) => set({ sidebarOpen: v }),
- activeTaskId: null,
- setActiveTaskId: (id) => set({ activeTaskId: id }),
- events: [],
- addEvent: (e) => set(s => ({
- events: [...s.events.slice(-200), { ...e, id: nanoid(8), timestamp: Date.now() }]
- })),
- clearEvents: () => set({ events: [] }),
- agents: defaultAgents,
- updateAgentStatus: (name, updates) => set(s => ({
- agents: { ...s.agents, [name]: { ...(s.agents[name] || { name, status: 'idle' }), ...updates } }
- })),
- connectors: [],
- setConnectors: (connectors) => set({ connectors }),
- addMessage: (m) => {
- const id = nanoid(12)
- set(s => ({ messages: [...s.messages, { ...m, id, timestamp: Date.now() }] }))
- return id
- },
- appendChunk: (id, chunk) => set(s => ({
- messages: s.messages.map(m => m.id === id ? { ...m, content: m.content + chunk } : m)
- })),
- updateMessage: (id, updates) => set(s => ({
- messages: s.messages.map(m => m.id === id ? { ...m, ...updates } : m)
- })),
- setStreaming: (isStreaming, streamingMessageId) => set({ isStreaming, streamingMessageId }),
- clearMessages: () => set({ messages: [], events: [] }),
-}))
diff --git a/frontend/hooks/useWebSocket.ts b/frontend/hooks/useWebSocket.ts
deleted file mode 100644
index f0c718942a7982935a0c513dc5951878631c1eab..0000000000000000000000000000000000000000
--- a/frontend/hooks/useWebSocket.ts
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * God Mode+ WebSocket Hook
- * Real-time event streaming from all agents
- */
-
-'use client'
-
-import { useEffect, useRef, useCallback } from 'react'
-import { useAgentStore } from './useAgentStore'
-import type { AgentName } from './useAgentStore'
-
-const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'
-const WS_URL = API_URL.replace(/^http/, 'ws')
-
-const AGENT_EVENT_MAP: Record = {
- agent_chat: 'chat', agent_planner: 'planner', agent_coding: 'coding',
- agent_debug: 'debug', agent_memory: 'memory', agent_connector: 'connector',
- agent_deploy: 'deploy', agent_workflow: 'workflow', agent_sandbox: 'sandbox',
- agent_ui: 'ui',
-}
-
-export function useAgentWebSocket(taskId?: string) {
- const socketRef = useRef(null)
- const reconnectRef = useRef()
- const { addEvent, updateAgentStatus, updateMessage, setStreaming, streamingMessageId } = useAgentStore()
-
- const connect = useCallback(() => {
- const url = taskId
- ? `${WS_URL}/ws/tasks/${taskId}`
- : `${WS_URL}/ws/logs`
-
- try {
- const ws = new WebSocket(url)
- socketRef.current = ws
-
- ws.onopen = () => {
- // Start heartbeat
- const hb = setInterval(() => {
- if (ws.readyState === WebSocket.OPEN) {
- ws.send(JSON.stringify({ type: 'ping' }))
- } else {
- clearInterval(hb)
- }
- }, 25000)
- }
-
- ws.onmessage = (ev) => {
- try {
- const msg = JSON.parse(ev.data)
- handleEvent(msg)
- } catch {}
- }
-
- ws.onclose = () => {
- reconnectRef.current = setTimeout(connect, 3000)
- }
-
- ws.onerror = () => {
- ws.close()
- }
- } catch {}
- }, [taskId])
-
- const handleEvent = useCallback((msg: any) => {
- const { type, data = {}, event } = msg
- const eventType = type || event
-
- // Add to timeline
- addEvent({ type: eventType, data: data || msg, agent: detectAgent(eventType, data) })
-
- // Handle streaming chunks
- if (eventType === 'llm_chunk') {
- const chunk = data.chunk || ''
- if (streamingMessageId) {
- useAgentStore.getState().appendChunk(streamingMessageId, chunk)
- }
- return
- }
-
- // Update agent statuses
- switch (eventType) {
- case 'agent_start':
- case 'agent_called': {
- const agentName = (data.agent || '').toLowerCase().replace('agent', '') as AgentName
- if (agentName) {
- updateAgentStatus(agentName, {
- status: 'executing',
- currentTask: data.task || data.intent || data.goal || '',
- lastActive: Date.now(),
- })
- }
- break
- }
- case 'task_completed':
- case 'orchestrator_complete':
- case 'stream_end':
- setStreaming(false, null)
- break
-
- case 'task_failed':
- setStreaming(false, null)
- break
-
- case 'self_heal_attempt':
- updateAgentStatus('debug', { status: 'executing', currentTask: `Self-healing attempt ${data.attempt}/${data.max}` })
- break
-
- case 'self_heal_success':
- updateAgentStatus('debug', { status: 'complete', lastActive: Date.now() })
- break
-
- case 'workflow_generated':
- updateAgentStatus('workflow', { status: 'complete', lastActive: Date.now() })
- break
-
- case 'plan_ready':
- updateAgentStatus('planner', { status: 'complete', lastActive: Date.now() })
- break
-
- case 'code_generated':
- updateAgentStatus('coding', { status: 'complete', lastActive: Date.now() })
- break
- }
- }, [addEvent, updateAgentStatus, setStreaming, streamingMessageId])
-
- useEffect(() => {
- connect()
- return () => {
- clearTimeout(reconnectRef.current)
- socketRef.current?.close()
- }
- }, [connect])
-
- return socketRef
-}
-
-export function useChatWebSocket(sessionId: string) {
- const socketRef = useRef(null)
- const reconnectRef = useRef()
- const store = useAgentStore()
-
- const connect = useCallback(() => {
- const url = `${WS_URL}/ws/chat/${sessionId}`
- try {
- const ws = new WebSocket(url)
- socketRef.current = ws
-
- ws.onopen = () => {
- const hb = setInterval(() => {
- if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'ping' }))
- else clearInterval(hb)
- }, 25000)
- }
-
- ws.onmessage = (ev) => {
- try {
- const msg = JSON.parse(ev.data)
- handleChatEvent(msg)
- } catch {}
- }
-
- ws.onclose = () => {
- reconnectRef.current = setTimeout(connect, 3000)
- }
-
- ws.onerror = () => ws.close()
- } catch {}
- }, [sessionId])
-
- const handleChatEvent = useCallback((msg: any) => {
- const { type, data = {} } = msg
-
- store.addEvent({ type, data, agent: detectAgent(type, data) })
-
- switch (type) {
- case 'stream_start':
- break
- case 'llm_chunk':
- if (store.streamingMessageId) {
- store.appendChunk(store.streamingMessageId, data.chunk || '')
- }
- break
- case 'stream_end':
- if (store.streamingMessageId) {
- store.updateMessage(store.streamingMessageId, {
- content: data.full_response || store.messages.find(m => m.id === store.streamingMessageId)?.content || '',
- streaming: false,
- })
- }
- store.setStreaming(false, null)
- break
- case 'orchestrator_complete':
- store.setStreaming(false, null)
- break
- }
- }, [store])
-
- const sendMessage = useCallback((content: string, context?: Record) => {
- if (socketRef.current?.readyState === WebSocket.OPEN) {
- socketRef.current.send(JSON.stringify({
- type: 'chat_message',
- content,
- context: context || {},
- timestamp: Date.now(),
- }))
- }
- }, [])
-
- const sendTask = useCallback((content: string) => {
- if (socketRef.current?.readyState === WebSocket.OPEN) {
- socketRef.current.send(JSON.stringify({
- type: 'task_message',
- content,
- timestamp: Date.now(),
- }))
- }
- }, [])
-
- useEffect(() => {
- connect()
- return () => {
- clearTimeout(reconnectRef.current)
- socketRef.current?.close()
- }
- }, [connect])
-
- return { socketRef, sendMessage, sendTask }
-}
-
-function detectAgent(eventType: string, data: any): AgentName | undefined {
- const agentStr = (data?.agent || '').toLowerCase()
- if (agentStr.includes('chat')) return 'chat'
- if (agentStr.includes('planner') || agentStr.includes('plan')) return 'planner'
- if (agentStr.includes('coding') || agentStr.includes('code')) return 'coding'
- if (agentStr.includes('debug')) return 'debug'
- if (agentStr.includes('memory')) return 'memory'
- if (agentStr.includes('connector')) return 'connector'
- if (agentStr.includes('deploy')) return 'deploy'
- if (agentStr.includes('workflow')) return 'workflow'
- if (agentStr.includes('sandbox')) return 'sandbox'
- if (agentStr.includes('ui')) return 'ui'
- if (eventType.includes('code')) return 'coding'
- if (eventType.includes('plan')) return 'planner'
- if (eventType.includes('debug') || eventType.includes('heal')) return 'debug'
- if (eventType.includes('workflow')) return 'workflow'
- if (eventType.includes('sandbox') || eventType.includes('exec')) return 'sandbox'
- if (eventType.includes('connector')) return 'connector'
- if (eventType.includes('deploy')) return 'deploy'
- return undefined
-}
diff --git a/frontend/lib/api.ts b/frontend/lib/api.ts
deleted file mode 100644
index 742c2e655a356014f5f8051722851781135c6f70..0000000000000000000000000000000000000000
--- a/frontend/lib/api.ts
+++ /dev/null
@@ -1,524 +0,0 @@
-/**
- * God Agent OS v12 — API Client
- * Real autonomous agent — E2B execution + live streaming
- */
-
-export const DEFAULT_BACKEND = process.env.NEXT_PUBLIC_API_URL || 'https://pyae1994-autonomous-coding-system.hf.space'
-
-function getBackendUrl(): string {
- if (typeof window === 'undefined') return DEFAULT_BACKEND
- try {
- const stored = localStorage.getItem('god-agent-store')
- if (stored) {
- const parsed = JSON.parse(stored)
- return parsed?.state?.backendUrl || DEFAULT_BACKEND
- }
- } catch {}
- return DEFAULT_BACKEND
-}
-
-export function getApiBase(): string {
- return getBackendUrl()
-}
-
-export function getWsBase(): string {
- return getApiBase().replace(/^https?:\/\//, (m) => m === 'https://' ? 'wss://' : 'ws://')
-}
-
-export async function fetchAPI(path: string, options?: RequestInit) {
- const base = getApiBase()
- const res = await fetch(`${base}${path}`, {
- headers: {
- 'Content-Type': 'application/json',
- ...(options?.headers || {}),
- },
- ...options,
- })
- if (!res.ok) {
- const text = await res.text().catch(() => '')
- throw new Error(`API ${res.status}: ${text.slice(0, 200) || res.statusText}`)
- }
- return res.json()
-}
-
-// ─── Health ────────────────────────────────────────────────────────────────
-
-export async function getHealth() {
- return fetchAPI('/health')
-}
-
-export async function getSystemStatus() {
- return fetchAPI('/api/v1/system/status')
-}
-
-// ─── Chat / Orchestration ─────────────────────────────────────────────────
-
-export interface ChatMessage {
- role: 'user' | 'assistant' | 'system'
- content: string
-}
-
-export interface ToolResult {
- tool: string
- success: boolean
- sandboxId?: string
- stdout?: string
- stderr?: string
- exitCode?: number
- output?: string
- durationMs?: number
-}
-
-export interface ComputerUseStepEvent {
- type: 'thinking' | 'coding' | 'terminal' | 'file' | 'browsing' | 'git' | 'deploy' | 'executing' | 'complete' | 'error'
- title: string
- detail?: string
- status?: 'running' | 'done' | 'error'
- tool?: string
- sandboxId?: string
- stdout?: string
- exitCode?: number
-}
-
-/**
- * Stream from autonomous agent — handles v12 event protocol
- * Events: llm_chunk, tool_executing, tool_result, agent_complete, stream_end, error
- */
-export async function streamOrchestrate(
- message: string,
- sessionId: string,
- onChunk: (chunk: string) => void,
- onDone: (full: string) => void,
- onError: (err: string) => void,
- onComputerUseStep?: (step: ComputerUseStepEvent) => void,
- onToolResult?: (result: ToolResult) => void,
-): Promise {
- const base = getApiBase()
- const controller = new AbortController()
-
- try {
- // Use /api/v1/agent — intent router (chat OR real E2B execute)
- const res = await fetch(`${base}/api/v1/agent`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- signal: controller.signal,
- body: JSON.stringify({
- message,
- stream: true,
- session_id: sessionId,
- }),
- })
-
- if (!res.ok) {
- const text = await res.text()
- onError(`Backend error ${res.status}: ${text.slice(0, 200)}`)
- return controller
- }
-
- const reader = res.body?.getReader()
- const decoder = new TextDecoder()
- let full = ''
- let buffer = ''
-
- if (!reader) {
- onError('No response body')
- return controller
- }
-
- // Emit initial thinking step
- onComputerUseStep?.({
- type: 'thinking',
- title: `Analyzing: ${message.slice(0, 60)}...`,
- status: 'running',
- })
-
- while (true) {
- const { done, value } = await reader.read()
- if (done) break
-
- buffer += decoder.decode(value, { stream: true })
- const lines = buffer.split('\n')
- buffer = lines.pop() || '' // Keep incomplete line in buffer
-
- for (const line of lines) {
- const trimmed = line.trim()
- if (!trimmed.startsWith('data:')) continue
-
- const jsonStr = trimmed.slice(5).trim()
- if (!jsonStr || jsonStr === '[DONE]') {
- onDone(full)
- return controller
- }
-
- try {
- const event = JSON.parse(jsonStr)
- const eventType = event.type || ''
- const data = event.data || {}
-
- switch (eventType) {
- case 'llm_chunk': {
- const chunk = data.chunk || ''
- if (chunk) {
- full += chunk
- onChunk(chunk)
- }
- break
- }
-
- case 'thinking_start': {
- onComputerUseStep?.({
- type: 'thinking',
- title: `Reasoning (iteration ${data.iteration || 1})...`,
- status: 'running',
- })
- break
- }
-
- case 'agent_thinking': {
- onComputerUseStep?.({
- type: 'thinking',
- title: data.message ? `Processing: ${String(data.message).slice(0, 60)}` : 'Thinking...',
- status: 'running',
- })
- break
- }
-
- case 'agent_iteration': {
- onComputerUseStep?.({
- type: 'thinking',
- title: `Planning step ${data.iteration || 1}...`,
- status: 'running',
- })
- break
- }
-
- case 'tool_executing': {
- const toolName = data.tool || ''
- const stepType = getStepType(toolName)
- onComputerUseStep?.({
- type: stepType,
- title: `${getToolLabel(toolName)}: ${formatArgs(data.args)}`,
- status: 'running',
- tool: toolName,
- })
- break
- }
-
- case 'tool_result': {
- const toolName = data.tool || ''
- const stepType = getStepType(toolName)
- const raw = data.raw || {}
- const success = data.success !== false
- const sandboxId = data.sandbox_id || raw.sandbox_id || 'local'
- const stdout = raw.stdout || raw.output || ''
- const stderr = raw.stderr || ''
- const exitCode = raw.exit_code ?? 0
-
- onComputerUseStep?.({
- type: success ? stepType : 'error',
- title: success
- ? `✅ ${getToolLabel(toolName)} completed (sandbox: ${sandboxId})`
- : `❌ ${getToolLabel(toolName)} failed`,
- detail: stdout ? stdout.slice(0, 300) : (stderr ? stderr.slice(0, 200) : undefined),
- status: 'done',
- tool: toolName,
- sandboxId,
- stdout: stdout.slice(0, 500),
- exitCode,
- })
-
- onToolResult?.({
- tool: toolName,
- success,
- sandboxId,
- stdout: stdout.slice(0, 2000),
- stderr: stderr.slice(0, 500),
- exitCode,
- output: data.result?.slice(0, 2000),
- durationMs: raw._duration_ms,
- })
-
- // Inject tool output into chat as a system block
- if (data.result) {
- const resultBlock = `\n\n**Tool: ${getToolLabel(toolName)}** (${sandboxId})\n${data.result.slice(0, 1500)}`
- full += resultBlock
- onChunk(resultBlock)
- }
- break
- }
-
- case 'agent_complete': {
- onComputerUseStep?.({
- type: 'complete',
- title: `✅ Task complete — ${data.tools_called || 0} tools executed, ${data.iterations || 1} iterations`,
- status: 'done',
- })
- break
- }
-
- case 'stream_end': {
- const finalResponse = data.full_response || full
- onDone(finalResponse)
- return controller
- }
-
- case 'error': {
- onError(data.error || 'Unknown error')
- return controller
- }
-
- // Legacy events from older API
- case 'agent_start': {
- onComputerUseStep?.({
- type: 'thinking',
- title: `Agent started: ${String(data.message || '').slice(0, 60)}`,
- status: 'running',
- })
- break
- }
-
- case 'tool_called': {
- const toolName = data.tool || ''
- onComputerUseStep?.({
- type: getStepType(toolName),
- title: `Calling: ${getToolLabel(toolName)}`,
- status: 'running',
- tool: toolName,
- })
- break
- }
-
- case 'computer_use_step': {
- onComputerUseStep?.({
- type: (data.type as ComputerUseStepEvent['type']) || 'executing',
- title: data.title || '',
- detail: data.detail,
- status: data.status === 'done' ? 'done' : 'running',
- })
- break
- }
- }
- } catch (_e) {
- // Skip malformed JSON lines
- }
- }
- }
-
- onDone(full)
- } catch (e: unknown) {
- const msg = (e as Error).message || String(e)
- if (!msg.includes('abort')) onError(msg)
- }
-
- return controller
-}
-
-// ─── Helpers ─────────────────────────────────────────────────────────────────
-
-function getStepType(toolName: string): ComputerUseStepEvent['type'] {
- const map: Record = {
- execute_python: 'coding',
- execute_shell: 'terminal',
- write_file: 'file',
- read_file: 'file',
- delete_file: 'file',
- list_files: 'file',
- web_search: 'browsing',
- install_package: 'terminal',
- git_clone: 'git',
- git_commit: 'git',
- git_push: 'git',
- deploy: 'deploy',
- }
- return map[toolName] || 'executing'
-}
-
-function getToolLabel(toolName: string): string {
- const map: Record = {
- execute_python: '🐍 Python Execution',
- execute_shell: '💻 Shell Command',
- write_file: '📝 Write File',
- read_file: '📖 Read File',
- delete_file: '🗑️ Delete File',
- list_files: '📁 List Files',
- web_search: '🔍 Web Search',
- install_package: '📦 Install Package',
- }
- return map[toolName] || toolName
-}
-
-function formatArgs(args: Record | undefined): string {
- if (!args) return ''
- const key = Object.keys(args)[0]
- if (!key) return ''
- const val = String(args[key] || '').slice(0, 60)
- return val
-}
-
-// ─── Direct Tool Execution ────────────────────────────────────────────────────
-
-export async function executeTool(
- tool: string,
- args: Record,
- sessionId: string,
-) {
- return fetchAPI('/api/v1/execute', {
- method: 'POST',
- body: JSON.stringify({ tool, args, session_id: sessionId }),
- })
-}
-
-// ─── Sandbox Info ─────────────────────────────────────────────────────────────
-
-export async function getSandboxInfo(sessionId: string) {
- return fetchAPI(`/api/v1/sandbox/${sessionId}`)
-}
-
-// ─── Computer Use ─────────────────────────────────────────────────────────────
-
-export async function getComputerUseSteps(sessionId: string) {
- return fetchAPI(`/api/v1/computer-use/${sessionId}`)
-}
-
-// ─── Spaces ──────────────────────────────────────────────────────────────────
-
-export async function getSpaces() {
- return fetchAPI('/api/v1/spaces')
-}
-
-// ─── Agents ──────────────────────────────────────────────────────────────────
-
-export async function getAgents() {
- return fetchAPI('/api/v1/agents')
-}
-
-export async function runAgent(agentName: string, task: string, sessionId: string) {
- return fetchAPI(`/api/v1/agents/${agentName}/run`, {
- method: 'POST',
- body: JSON.stringify({ task, session_id: sessionId }),
- })
-}
-
-// ─── Tasks ───────────────────────────────────────────────────────────────────
-
-export async function getTasks() {
- return fetchAPI('/api/v1/tasks/')
-}
-
-export async function createTask(goal: string, sessionId: string) {
- return fetchAPI('/api/v1/chat/goal', {
- method: 'POST',
- body: JSON.stringify({ goal, session_id: sessionId }),
- })
-}
-
-// ─── Memory ──────────────────────────────────────────────────────────────────
-
-export async function getMemory() {
- return fetchAPI('/api/v1/memory/')
-}
-
-// ─── Connectors ──────────────────────────────────────────────────────────────
-
-export async function getConnectors() {
- return fetchAPI('/api/v1/connectors')
-}
-
-// ─── AI Stats ────────────────────────────────────────────────────────────────
-
-export async function getAIStats() {
- return fetchAPI('/api/v1/ai/stats')
-}
-
-export async function getPoolStatus() {
- return fetchAPI('/api/v1/ai/pool-status')
-}
-
-// ─── Direct execute (E2B sandbox, no LLM) ────────────────────────────────────
-
-export interface ExecuteEvent {
- type: 'agent_start' | 'tool_executing' | 'sandbox_ready' | 'stdout' | 'stderr' | 'result' | 'tool_result' | 'agent_complete' | 'stream_end' | 'error'
- data?: any
- text?: string
- sandbox_id?: string
- backend?: string
- exit_code?: number
- success?: boolean
- duration_ms?: number
- session_id?: string
- error?: string
-}
-
-/**
- * Execute code directly in E2B sandbox with SSE streaming.
- * Returns AbortController so caller can cancel.
- */
-export async function executeCode(
- opts: { language?: string; code: string; sessionId: string; timeout?: number },
- onEvent: (ev: ExecuteEvent) => void,
-): Promise {
- const base = getApiBase()
- const controller = new AbortController()
- try {
- const res = await fetch(`${base}/api/v1/execute`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- signal: controller.signal,
- body: JSON.stringify({
- language: opts.language || 'python',
- code: opts.code,
- session_id: opts.sessionId,
- timeout: opts.timeout || 60,
- stream: true,
- }),
- })
- if (!res.ok || !res.body) {
- onEvent({ type: 'error', error: `HTTP ${res.status}` })
- return controller
- }
- const reader = res.body.getReader()
- const decoder = new TextDecoder()
- let buffer = ''
- while (true) {
- const { done, value } = await reader.read()
- if (done) break
- buffer += decoder.decode(value, { stream: true })
- const lines = buffer.split('\n')
- buffer = lines.pop() || ''
- for (const line of lines) {
- const t = line.trim()
- if (!t.startsWith('data:')) continue
- try {
- const ev = JSON.parse(t.slice(5).trim())
- onEvent(ev)
- } catch {}
- }
- }
- } catch (e: unknown) {
- const msg = (e as Error).message || String(e)
- if (!msg.includes('abort')) onEvent({ type: 'error', error: msg })
- }
- return controller
-}
-
-export async function killSandbox(sessionId: string) {
- return fetchAPI(`/api/v1/sandbox/${sessionId}`, { method: 'DELETE' })
-}
-
-export async function getSandboxInfo(sessionId: string) {
- return fetchAPI(`/api/v1/sandbox/${sessionId}`)
-}
-
-// ─── WebSocket ────────────────────────────────────────────────────────────────
-
-export function createWebSocket(sessionId: string): WebSocket {
- return new WebSocket(`${getWsBase()}/ws/${sessionId}`)
-}
-
-export function createComputerUseWS(sessionId: string): WebSocket {
- return new WebSocket(`${getWsBase()}/ws/computer-use/${sessionId}`)
-}
-
-// ─── Export URLs ─────────────────────────────────────────────────────────────
-export const API_URL = DEFAULT_BACKEND
-export const WS_URL = DEFAULT_BACKEND.replace(/^https?:\/\//, (m) => m === 'https://' ? 'wss://' : 'ws://')
diff --git a/frontend/lib/i18n.ts b/frontend/lib/i18n.ts
deleted file mode 100644
index 5be4118412cb16f6c8877cc7f2176fadaa1e72f4..0000000000000000000000000000000000000000
--- a/frontend/lib/i18n.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
- * i18n — Burmese + English support
- */
-
-export type Locale = 'en' | 'my'
-
-export const translations = {
- en: {
- app_name: 'God Mode+',
- subtitle: 'Autonomous AI Operating System',
- chat: 'Chat',
- tasks: 'Tasks',
- memory: 'Memory',
- timeline: 'Timeline',
- connectors: 'Connectors',
- sandbox: 'Sandbox',
- settings: 'Settings',
- send: 'Send',
- stop: 'Stop',
- agent_mode: 'Agent Mode',
- chat_mode: 'Chat Mode',
- new_chat: 'New Chat',
- no_messages: 'Start a conversation...',
- placeholder_agent: "Give me a goal... I'll plan, code & execute it autonomously",
- placeholder_chat: 'Ask anything... (Shift+Enter for new line)',
- quick_actions: 'Quick Actions',
- build_api: 'Build a REST API',
- create_repo: 'Create GitHub Repo',
- analyze_code: 'Analyze Codebase',
- deploy_app: 'Deploy to Vercel',
- generating: 'Generating...',
- thinking: 'Thinking...',
- planning: 'Planning...',
- executing: 'Executing...',
- complete: 'Complete',
- failed: 'Failed',
- connected: 'Connected',
- disconnected: 'Disconnected',
- agents_online: 'Agents Online',
- ai_router: 'AI Router',
- dark: 'Dark',
- light: 'Light',
- amoled: 'AMOLED',
- neon: 'Neon',
- glass: 'Glass',
- theme: 'Theme',
- language: 'Language',
- all_agents: 'All Agents',
- workspace: 'Workspace',
- terminal: 'Terminal',
- files: 'Files',
- git: 'Git',
- god_mode_active: 'GOD MODE+ Active',
- task_created: 'Task Created',
- self_healing: 'Self-Healing...',
- workflow_generated: 'Workflow Generated',
- code_generated: 'Code Generated',
- deployed: 'Deployed',
- connector_connected: 'Connector Connected',
- phases_complete: 'All Phases Complete',
- },
- my: {
- app_name: 'God Mode+',
- subtitle: 'ကိုယ်ပိုင် AI Operating System',
- chat: 'စကားပြော',
- tasks: 'လုပ်ငန်းများ',
- memory: 'မှတ်ဉာဏ်',
- timeline: 'အချိန်ဇယား',
- connectors: 'ချိတ်ဆက်မှုများ',
- sandbox: 'Sandbox',
- settings: 'ဆက်တင်',
- send: 'ပို့ရန်',
- stop: 'ရပ်ရန်',
- agent_mode: 'Agent Mode',
- chat_mode: 'Chat Mode',
- new_chat: 'စကားပြောသစ်',
- no_messages: 'စကားပြောစတင်ရန်...',
- placeholder_agent: 'ရည်မှန်းချက်တစ်ခုပေးပါ... ကျွန်ုပ်ပြင်ဆင်၊ code ရေး၍ အလိုအလျောက်လုပ်ဆောင်မည်',
- placeholder_chat: 'မည်သည့်အရာမဆို မေးပါ...',
- quick_actions: 'မြန်ဆန်သောလုပ်ဆောင်မှုများ',
- build_api: 'REST API တည်ဆောက်ရန်',
- create_repo: 'GitHub Repo ဖန်တီးရန်',
- analyze_code: 'Code စစ်ဆေးရန်',
- deploy_app: 'Vercel တင်ရန်',
- generating: 'ထုတ်လုပ်နေသည်...',
- thinking: 'တွေးနေသည်...',
- planning: 'စီစဉ်နေသည်...',
- executing: 'လုပ်ဆောင်နေသည်...',
- complete: 'ပြီးဆုံး',
- failed: 'မအောင်မြင်',
- connected: 'ချိတ်ဆက်ပြီး',
- disconnected: 'ချိတ်ဆက်မရ',
- agents_online: 'Agent များ Online',
- ai_router: 'AI Router',
- dark: 'မှောင်',
- light: 'တောက်',
- amoled: 'AMOLED',
- neon: 'Neon',
- glass: 'ဖန်ထည်',
- theme: 'အပြင်အဆင်',
- language: 'ဘာသာစကား',
- all_agents: 'Agent အားလုံး',
- workspace: 'လုပ်ငန်းခွင်',
- terminal: 'Terminal',
- files: 'ဖိုင်များ',
- git: 'Git',
- god_mode_active: 'GOD MODE+ အသုံးပြုနေသည်',
- task_created: 'လုပ်ငန်းဖန်တီးပြီး',
- self_healing: 'ကိုယ်ကျောက်ပြင်ဆင်နေသည်...',
- workflow_generated: 'Workflow ဖန်တီးပြီး',
- code_generated: 'Code ဖန်တီးပြီး',
- deployed: 'တင်ပြီးပြီ',
- connector_connected: 'ချိတ်ဆက်ပြီး',
- phases_complete: 'အဆင့်အားလုံးပြီးဆုံး',
- },
-} as const
-
-export type TranslationKey = keyof typeof translations.en
-
-export function t(key: TranslationKey, locale: Locale = 'en'): string {
- return translations[locale][key] ?? translations.en[key] ?? key
-}
diff --git a/frontend/lib/spaceCatalog.ts b/frontend/lib/spaceCatalog.ts
deleted file mode 100644
index fb665c46865948301c7f91c5d8af3122306b64bf..0000000000000000000000000000000000000000
--- a/frontend/lib/spaceCatalog.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-export type WorkerRole = 'cognition' | 'automation' | 'execution' | 'repair' | 'visual_intelligence'
-
-export interface WorkerSpaceSpec {
- id: string
- name: string
- shortName: string
- icon: string
- color: string
- layer: string
- description: string
- responsibilities: string[]
- roles: WorkerRole[]
-}
-
-export const SPACE_CATALOG: WorkerSpaceSpec[] = [
- { id: 'god-core-space', name: 'God Core Space', shortName: 'Core', icon: '🧠', color: '#7c3aed', layer: 'Core Cognitive Layer', description: 'System brain for orchestration, planning, reasoning, workflow control, mission state, websocket events, and model routing.', responsibilities: ['orchestrator', 'planner', 'reasoning', 'task graph', 'workflow engine', 'mission state', 'memory routing', 'websocket events', 'LLM routing'], roles: ['cognition', 'automation'] },
- { id: 'coding-worker-space', name: 'Coding Worker Space', shortName: 'Coding', icon: '🔧', color: '#f59e0b', layer: 'Execution Layer', description: 'Code generation, file editing, refactoring, dependency handling, and code transformations.', responsibilities: ['code generation', 'file editing', 'refactoring', 'dependency handling', 'code transformations'], roles: ['execution', 'cognition', 'automation'] },
- { id: 'sandbox-worker-space', name: 'Sandbox Worker Space', shortName: 'Sandbox', icon: '🧪', color: '#10b981', layer: 'Execution Layer', description: 'Isolated execution, runtime sandboxing, subprocesses, environment resets, and lifecycle management.', responsibilities: ['isolated execution', 'docker runtime', 'subprocesses', 'environment resets', 'runtime lifecycle'], roles: ['execution', 'repair'] },
- { id: 'terminal-worker-space', name: 'Terminal Worker Space', shortName: 'Terminal', icon: '⌨️', color: '#14b8a6', layer: 'Execution Layer', description: 'Shell commands, package installs, build tools, and process monitoring.', responsibilities: ['shell commands', 'package installs', 'build tools', 'process monitoring'], roles: ['execution', 'automation'] },
- { id: 'filesystem-worker-space', name: 'Filesystem Worker Space', shortName: 'FS', icon: '🗂️', color: '#22c55e', layer: 'Execution Layer', description: 'File writes, project trees, artifact management, and storage operations.', responsibilities: ['file writes', 'project trees', 'artifact management', 'storage operations'], roles: ['execution', 'automation'] },
- { id: 'browser-worker-space', name: 'Browser Worker Space', shortName: 'Browser', icon: '🌐', color: '#3b82f6', layer: 'Browser + UI Intelligence', description: 'Playwright automation, navigation, screenshots, and interaction testing.', responsibilities: ['playwright', 'browser automation', 'navigation', 'screenshots', 'interaction testing'], roles: ['automation', 'cognition'] },
- { id: 'vision-worker-space', name: 'Vision Worker Space', shortName: 'Vision', icon: '👁️', color: '#ec4899', layer: 'Browser + UI Intelligence', description: 'Screenshot analysis, OCR, layout detection, visual regression, and UI understanding.', responsibilities: ['screenshot analysis', 'OCR', 'layout detection', 'visual regression', 'UI understanding'], roles: ['visual_intelligence', 'cognition'] },
- { id: 'ui-worker-space', name: 'UI Worker Space', shortName: 'UI', icon: '🎨', color: '#8b5cf6', layer: 'Browser + UI Intelligence', description: 'Frontend generation, design systems, responsive layouts, component consistency, and visual polish.', responsibilities: ['frontend generation', 'design systems', 'responsive layouts', 'component consistency', 'visual polish'], roles: ['visual_intelligence', 'execution'] },
- { id: 'debug-worker-space', name: 'Debug Worker Space', shortName: 'Debug', icon: '🐛', color: '#ef4444', layer: 'Verification + Repair Layer', description: 'Error analysis, traceback parsing, repair strategies, and retry planning.', responsibilities: ['error analysis', 'traceback parsing', 'repair strategies', 'retry planning'], roles: ['repair', 'cognition'] },
- { id: 'test-worker-space', name: 'Test Worker Space', shortName: 'Test', icon: '🧪', color: '#06b6d4', layer: 'Verification + Repair Layer', description: 'Run tests, assertions, integration checks, and regression testing.', responsibilities: ['run tests', 'assertions', 'integration checks', 'regression testing'], roles: ['execution', 'repair'] },
- { id: 'verification-worker-space', name: 'Verification Worker Space', shortName: 'Verify', icon: '✅', color: '#84cc16', layer: 'Verification + Repair Layer', description: 'Validate outputs, compare expectations, quality scoring, and mission verification.', responsibilities: ['validate outputs', 'compare expectations', 'quality scoring', 'mission verification'], roles: ['repair', 'cognition'] },
- { id: 'git-worker-space', name: 'Git Worker Space', shortName: 'Git', icon: '🌳', color: '#f97316', layer: 'Deployment Layer', description: 'Commits, branching, diffs, merges, and repository workflow operations.', responsibilities: ['commits', 'branching', 'diffs', 'merges'], roles: ['automation', 'execution'] },
- { id: 'deploy-worker-space', name: 'Deploy Worker Space', shortName: 'Deploy', icon: '🚀', color: '#0ea5e9', layer: 'Deployment Layer', description: 'Vercel, Railway, Docker deploys, preview URLs, and CI/CD triggers.', responsibilities: ['Vercel deploy', 'Railway deploy', 'Docker deploy', 'preview URLs', 'CI/CD triggers'], roles: ['automation', 'execution'] },
- { id: 'connector-worker-space', name: 'Connector Worker Space', shortName: 'Connector', icon: '🔌', color: '#6366f1', layer: 'Deployment Layer', description: 'GitHub, Supabase, APIs, and external integrations.', responsibilities: ['GitHub', 'Supabase', 'APIs', 'external integrations'], roles: ['automation', 'cognition'] },
- { id: 'memory-worker-space', name: 'Memory Worker Space', shortName: 'Memory', icon: '🧠', color: '#a855f7', layer: 'Memory + Knowledge Layer', description: 'Vector DB, execution history, learned fixes, project memory, and long-term state.', responsibilities: ['vector DB', 'execution history', 'learned fixes', 'project memory', 'long-term state'], roles: ['cognition', 'automation'] },
- { id: 'knowledge-worker-space', name: 'Knowledge Worker Space', shortName: 'Knowledge', icon: '📚', color: '#4f46e5', layer: 'Memory + Knowledge Layer', description: 'Docs retrieval, semantic search, RAG pipelines, and indexed repositories.', responsibilities: ['docs retrieval', 'semantic search', 'RAG pipelines', 'indexed repositories'], roles: ['cognition', 'automation'] },
- { id: 'workflow-worker-space', name: 'Workflow Worker Space', shortName: 'Workflow', icon: '🧭', color: '#0f766e', layer: 'Coordination Layer', description: 'DAG execution, task queues, retries, scheduling, and background jobs.', responsibilities: ['DAG execution', 'task queues', 'retries', 'scheduling', 'background jobs'], roles: ['automation', 'execution'] },
- { id: 'eventbus-space', name: 'Eventbus Space', shortName: 'Eventbus', icon: '📡', color: '#06b6d4', layer: 'Coordination Layer', description: 'Redis PubSub, NATS, RabbitMQ, and event streams.', responsibilities: ['Redis PubSub', 'NATS', 'RabbitMQ', 'event streams'], roles: ['automation', 'execution'] },
- { id: 'observability-space', name: 'Observability Space', shortName: 'Obs', icon: '📈', color: '#22c55e', layer: 'Monitoring Layer', description: 'Logs, metrics, tracing, agent monitoring, and runtime analytics.', responsibilities: ['logs', 'metrics', 'tracing', 'agent monitoring', 'runtime analytics'], roles: ['cognition', 'automation'] },
- { id: 'session-runtime-space', name: 'Session Runtime Space', shortName: 'Session', icon: '🧷', color: '#64748b', layer: 'Session Layer', description: 'User sessions, mission isolation, runtime persistence, and checkpointing.', responsibilities: ['user sessions', 'mission isolation', 'runtime persistence', 'checkpointing'], roles: ['automation', 'cognition'] },
- { id: 'model-router-space', name: 'Model Router Space', shortName: 'Router', icon: '🛣️', color: '#eab308', layer: 'Infrastructure Layer', description: 'GPT routing, Claude routing, fallback models, cost optimization, and model selection.', responsibilities: ['GPT routing', 'Claude routing', 'fallback models', 'cost optimization', 'model selection'], roles: ['cognition', 'automation'] },
- { id: 'auth-gateway-space', name: 'Auth Gateway Space', shortName: 'Auth', icon: '🔐', color: '#9333ea', layer: 'Infrastructure Layer', description: 'Auth, API keys, rate limits, and permissions.', responsibilities: ['auth', 'API keys', 'rate limits', 'permissions'], roles: ['automation', 'repair'] },
-]
-
-export const SPACE_COLORS = Object.fromEntries(SPACE_CATALOG.map(space => [space.id, space.color])) as Record
diff --git a/frontend/lib/utils.ts b/frontend/lib/utils.ts
deleted file mode 100644
index cfc50677c698f9d59c7b4db70cc71df25008c4d5..0000000000000000000000000000000000000000
--- a/frontend/lib/utils.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { type ClassValue, clsx } from 'clsx'
-import { twMerge } from 'tailwind-merge'
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
-}
-
-export function formatNumber(n: number): string {
- if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`
- if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`
- return n.toString()
-}
-
-export function getStatusColor(status: string): string {
- switch (status) {
- case 'active': return '#22c55e'
- case 'processing': return '#f59e0b'
- case 'idle': return '#94a3b8'
- case 'error': return '#ef4444'
- case 'running': return '#6366f1'
- case 'completed': return '#22c55e'
- case 'pending': return '#94a3b8'
- case 'failed': return '#ef4444'
- default: return '#94a3b8'
- }
-}
-
-export function getStatusLabel(status: string): string {
- return status.charAt(0).toUpperCase() + status.slice(1)
-}
-
-export function randomBetween(min: number, max: number): number {
- return Math.floor(Math.random() * (max - min + 1)) + min
-}
diff --git a/frontend/lib/websocket.ts b/frontend/lib/websocket.ts
deleted file mode 100644
index 6e5bb6dfa5665452414f58cef38281a6738a75b0..0000000000000000000000000000000000000000
--- a/frontend/lib/websocket.ts
+++ /dev/null
@@ -1,212 +0,0 @@
-// ─── WebSocket Client with Auto-Reconnect + Event Buffering ──────────────────
-
-import { StreamEvent } from '@/types'
-
-const WS_URL = process.env.NEXT_PUBLIC_WS_URL || 'ws://localhost:7860'
-
-type EventHandler = (event: StreamEvent) => void
-
-interface WSOptions {
- onEvent?: EventHandler
- onConnect?: () => void
- onDisconnect?: () => void
- onError?: (err: Event) => void
- maxRetries?: number
- heartbeatInterval?: number
-}
-
-export class AgentWebSocket {
- private ws: WebSocket | null = null
- private url: string
- private opts: WSOptions
- private retryCount = 0
- private maxRetries: number
- private retryTimer: ReturnType | null = null
- private heartbeatTimer: ReturnType | null = null
- private seenIds = new Set()
- private connected = false
- private intentionalClose = false
-
- constructor(path: string, opts: WSOptions = {}) {
- this.url = `${WS_URL}${path}`
- this.opts = opts
- this.maxRetries = opts.maxRetries ?? 10
- }
-
- connect() {
- if (this.ws?.readyState === WebSocket.OPEN) return
- this.intentionalClose = false
- this._connect()
- }
-
- private _connect() {
- try {
- this.ws = new WebSocket(this.url)
-
- this.ws.onopen = () => {
- this.connected = true
- this.retryCount = 0
- this.opts.onConnect?.()
- this._startHeartbeat()
- }
-
- this.ws.onmessage = (e) => {
- try {
- const event: StreamEvent = JSON.parse(e.data)
- // Deduplicate
- if (event.id && this.seenIds.has(event.id)) return
- if (event.id) this.seenIds.add(event.id)
- if (this.seenIds.size > 500) {
- const arr = Array.from(this.seenIds)
- this.seenIds = new Set(arr.slice(arr.length - 300))
- }
- this.opts.onEvent?.(event)
- } catch {}
- }
-
- this.ws.onclose = () => {
- this.connected = false
- this._stopHeartbeat()
- this.opts.onDisconnect?.()
- if (!this.intentionalClose) this._scheduleReconnect()
- }
-
- this.ws.onerror = (e) => {
- this.opts.onError?.(e)
- }
- } catch (err) {
- if (!this.intentionalClose) this._scheduleReconnect()
- }
- }
-
- private _scheduleReconnect() {
- if (this.retryCount >= this.maxRetries) return
- const delay = Math.min(1000 * Math.pow(2, this.retryCount), 30000)
- this.retryCount++
- this.retryTimer = setTimeout(() => this._connect(), delay)
- }
-
- private _startHeartbeat() {
- this.heartbeatTimer = setInterval(() => {
- if (this.ws?.readyState === WebSocket.OPEN) {
- this.ws.send(JSON.stringify({ type: 'ping', timestamp: Date.now() / 1000 }))
- }
- }, this.opts.heartbeatInterval ?? 15000)
- }
-
- private _stopHeartbeat() {
- if (this.heartbeatTimer) {
- clearInterval(this.heartbeatTimer)
- this.heartbeatTimer = null
- }
- }
-
- send(data: object) {
- if (this.ws?.readyState === WebSocket.OPEN) {
- this.ws.send(JSON.stringify(data))
- }
- }
-
- disconnect() {
- this.intentionalClose = true
- if (this.retryTimer) clearTimeout(this.retryTimer)
- this._stopHeartbeat()
- this.ws?.close()
- this.ws = null
- this.connected = false
- }
-
- isConnected() { return this.connected }
- getRetryCount() { return this.retryCount }
-}
-
-// ─── SSE Client for task streaming ────────────────────────────────────────────
-
-export class TaskSSEClient {
- private url: string
- private eventSource: EventSource | null = null
- private onEvent: EventHandler
-
- constructor(taskId: string, onEvent: EventHandler) {
- this.url = `${process.env.NEXT_PUBLIC_API_URL || 'http://localhost:7860'}/api/v1/tasks/${taskId}/stream`
- this.onEvent = onEvent
- }
-
- connect() {
- this.eventSource = new EventSource(this.url)
- this.eventSource.onmessage = (e) => {
- try {
- const event: StreamEvent = JSON.parse(e.data)
- this.onEvent(event)
- if (event.type === 'stream_end' || event.type === 'task_completed' || event.type === 'task_failed') {
- this.disconnect()
- }
- } catch {}
- }
- this.eventSource.onerror = () => {
- this.disconnect()
- }
- }
-
- disconnect() {
- this.eventSource?.close()
- this.eventSource = null
- }
-}
-
-// ─── Chat streaming via fetch (SSE) ───────────────────────────────────────────
-
-export async function streamChatSSE(
- messages: any[],
- sessionId: string,
- onChunk: (chunk: string) => void,
- onDone: (full: string) => void,
- onError?: (err: string) => void
-) {
- const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:7860'
- try {
- const res = await fetch(`${API_URL}/api/v1/chat/stream`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ messages, session_id: sessionId, stream: true }),
- })
-
- if (!res.ok) {
- onError?.(`HTTP ${res.status}: ${res.statusText}`)
- return
- }
-
- const reader = res.body?.getReader()
- if (!reader) return
- const decoder = new TextDecoder()
- let full = ''
- let buffer = ''
-
- while (true) {
- const { done, value } = await reader.read()
- if (done) break
- buffer += decoder.decode(value, { stream: true })
- const lines = buffer.split('\n')
- buffer = lines.pop() ?? ''
- for (const line of lines) {
- if (!line.startsWith('data:')) continue
- const raw = line.slice(5).trim()
- if (!raw || raw === '[DONE]') continue
- try {
- const event = JSON.parse(raw)
- if (event.type === 'llm_chunk') {
- const chunk = event.data?.chunk || ''
- full += chunk
- onChunk(chunk)
- } else if (event.type === 'stream_end') {
- onDone(event.data?.full_response || full)
- return
- }
- } catch {}
- }
- }
- onDone(full)
- } catch (err: any) {
- onError?.(err.message || 'Stream error')
- }
-}
diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts
deleted file mode 100644
index 4f11a03dc6cc37f2b5105c08f2e7b24c603ab2f4..0000000000000000000000000000000000000000
--- a/frontend/next-env.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-///
-///
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/frontend/next.config.js b/frontend/next.config.js
deleted file mode 100644
index 8c298e25d8b98064aa96a6cc0786bbaa10fdbcb1..0000000000000000000000000000000000000000
--- a/frontend/next.config.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/** @type {import('next').NextConfig} */
-const nextConfig = {
- reactStrictMode: false,
- poweredByHeader: false,
- typescript: {
- ignoreBuildErrors: true,
- },
- eslint: {
- ignoreDuringBuilds: true,
- },
-
- async headers() {
- return [
- {
- source: '/(.*)',
- headers: [
- { key: 'X-Powered-By', value: 'God Agent OS v11 - Pyae Sone' },
- { key: 'Access-Control-Allow-Origin', value: '*' },
- ],
- },
- ]
- },
-}
-
-module.exports = nextConfig
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
deleted file mode 100644
index 67dc49da6ffcf0337cb1699fc549fdc6d07e7f49..0000000000000000000000000000000000000000
--- a/frontend/package-lock.json
+++ /dev/null
@@ -1,5135 +0,0 @@
-{
- "name": "god-agent-os-ui",
- "version": "11.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "god-agent-os-ui",
- "version": "11.0.0",
- "dependencies": {
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-progress": "^1.1.8",
- "@radix-ui/react-separator": "^1.1.8",
- "@radix-ui/react-slot": "^1.2.4",
- "@radix-ui/react-tooltip": "^1.2.8",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "date-fns": "^3.6.0",
- "framer-motion": "^11.1.9",
- "i18next": "^23.11.5",
- "lucide-react": "^0.378.0",
- "next": "14.2.3",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "react-i18next": "^14.1.2",
- "react-is": "^19.2.6",
- "react-markdown": "^9.0.1",
- "react-syntax-highlighter": "^15.5.0",
- "recharts": "^3.8.1",
- "rehype-highlight": "^7.0.0",
- "remark-gfm": "^4.0.0",
- "tailwind-merge": "^2.3.0",
- "zustand": "^4.5.2"
- },
- "devDependencies": {
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "@types/react-syntax-highlighter": "^15.5.13",
- "autoprefixer": "^10.0.1",
- "postcss": "^8",
- "tailwindcss": "^3.4.1",
- "typescript": "^5"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.29.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
- "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz",
- "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.11"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.7.6",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz",
- "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.7.5",
- "@floating-ui/utils": "^0.2.11"
- }
- },
- "node_modules/@floating-ui/react-dom": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz",
- "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/dom": "^1.7.6"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.11",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz",
- "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==",
- "license": "MIT"
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@next/env": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz",
- "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==",
- "license": "MIT"
- },
- "node_modules/@next/swc-darwin-arm64": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz",
- "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-darwin-x64": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz",
- "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz",
- "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz",
- "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz",
- "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz",
- "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz",
- "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-ia32-msvc": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz",
- "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==",
- "cpu": [
- "ia32"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz",
- "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@radix-ui/primitive": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
- "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
- "license": "MIT"
- },
- "node_modules/@radix-ui/react-arrow": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz",
- "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.1.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-collection": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz",
- "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-slot": "1.2.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
- "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-compose-refs": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz",
- "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-context": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz",
- "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
- "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-dismissable-layer": "1.1.11",
- "@radix-ui/react-focus-guards": "1.1.3",
- "@radix-ui/react-focus-scope": "1.1.7",
- "@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-portal": "1.1.9",
- "@radix-ui/react-presence": "1.1.5",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-slot": "1.2.3",
- "@radix-ui/react-use-controllable-state": "1.2.2",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
- "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-direction": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz",
- "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dismissable-layer": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
- "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-use-callback-ref": "1.1.1",
- "@radix-ui/react-use-escape-keydown": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dropdown-menu": {
- "version": "2.1.16",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz",
- "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-menu": "2.1.16",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-use-controllable-state": "1.2.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-focus-guards": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
- "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-focus-scope": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz",
- "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-use-callback-ref": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-id": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz",
- "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-menu": {
- "version": "2.1.16",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
- "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-collection": "1.1.7",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-direction": "1.1.1",
- "@radix-ui/react-dismissable-layer": "1.1.11",
- "@radix-ui/react-focus-guards": "1.1.3",
- "@radix-ui/react-focus-scope": "1.1.7",
- "@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-popper": "1.2.8",
- "@radix-ui/react-portal": "1.1.9",
- "@radix-ui/react-presence": "1.1.5",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-roving-focus": "1.1.11",
- "@radix-ui/react-slot": "1.2.3",
- "@radix-ui/react-use-callback-ref": "1.1.1",
- "aria-hidden": "^1.2.4",
- "react-remove-scroll": "^2.6.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
- "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-popper": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
- "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/react-dom": "^2.0.0",
- "@radix-ui/react-arrow": "1.1.7",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-use-callback-ref": "1.1.1",
- "@radix-ui/react-use-layout-effect": "1.1.1",
- "@radix-ui/react-use-rect": "1.1.1",
- "@radix-ui/react-use-size": "1.1.1",
- "@radix-ui/rect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-portal": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz",
- "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-presence": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
- "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-primitive": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz",
- "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-slot": "1.2.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
- "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-progress": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz",
- "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-context": "1.1.3",
- "@radix-ui/react-primitive": "2.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz",
- "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
- "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-slot": "1.2.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-roving-focus": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
- "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-collection": "1.1.7",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-direction": "1.1.1",
- "@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-use-callback-ref": "1.1.1",
- "@radix-ui/react-use-controllable-state": "1.2.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-separator": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz",
- "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.1.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz",
- "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-slot": "1.2.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-slot": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
- "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-tooltip": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz",
- "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-compose-refs": "1.1.2",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-dismissable-layer": "1.1.11",
- "@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-popper": "1.2.8",
- "@radix-ui/react-portal": "1.1.9",
- "@radix-ui/react-presence": "1.1.5",
- "@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-slot": "1.2.3",
- "@radix-ui/react-use-controllable-state": "1.2.2",
- "@radix-ui/react-visually-hidden": "1.2.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz",
- "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-compose-refs": "1.1.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-callback-ref": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz",
- "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-controllable-state": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz",
- "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-effect-event": "0.0.2",
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-effect-event": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz",
- "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-escape-keydown": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz",
- "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-callback-ref": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-layout-effect": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz",
- "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-rect": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz",
- "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/rect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-size": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz",
- "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-use-layout-effect": "1.1.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-visually-hidden": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz",
- "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==",
- "license": "MIT",
- "dependencies": {
- "@radix-ui/react-primitive": "2.1.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
- "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/rect": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz",
- "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==",
- "license": "MIT"
- },
- "node_modules/@reduxjs/toolkit": {
- "version": "2.11.2",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
- "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.0.0",
- "@standard-schema/utils": "^0.3.0",
- "immer": "^11.0.0",
- "redux": "^5.0.1",
- "redux-thunk": "^3.1.0",
- "reselect": "^5.1.0"
- },
- "peerDependencies": {
- "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
- "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-redux": {
- "optional": true
- }
- }
- },
- "node_modules/@reduxjs/toolkit/node_modules/immer": {
- "version": "11.1.8",
- "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz",
- "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
- },
- "node_modules/@standard-schema/spec": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
- "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
- "license": "MIT"
- },
- "node_modules/@standard-schema/utils": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
- "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
- "license": "MIT"
- },
- "node_modules/@swc/counter": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
- "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "license": "Apache-2.0"
- },
- "node_modules/@swc/helpers": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
- "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/counter": "^0.1.3",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@types/d3-array": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
- "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
- "license": "MIT"
- },
- "node_modules/@types/d3-color": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
- "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
- "license": "MIT"
- },
- "node_modules/@types/d3-ease": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
- "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
- "license": "MIT"
- },
- "node_modules/@types/d3-interpolate": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
- "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
- "license": "MIT",
- "dependencies": {
- "@types/d3-color": "*"
- }
- },
- "node_modules/@types/d3-path": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
- "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
- "license": "MIT"
- },
- "node_modules/@types/d3-scale": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
- "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
- "license": "MIT",
- "dependencies": {
- "@types/d3-time": "*"
- }
- },
- "node_modules/@types/d3-shape": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
- "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
- "license": "MIT",
- "dependencies": {
- "@types/d3-path": "*"
- }
- },
- "node_modules/@types/d3-time": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
- "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
- "license": "MIT"
- },
- "node_modules/@types/d3-timer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
- "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
- "license": "MIT"
- },
- "node_modules/@types/debug": {
- "version": "4.1.13",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
- "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
- "license": "MIT",
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
- "license": "MIT"
- },
- "node_modules/@types/estree-jsx": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
- "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/@types/hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
- "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/mdast": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
- "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/ms": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
- "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "20.19.41",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz",
- "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~6.21.0"
- }
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.15",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
- "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/react": {
- "version": "18.3.28",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz",
- "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.2.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.3.7",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz",
- "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^18.0.0"
- }
- },
- "node_modules/@types/react-syntax-highlighter": {
- "version": "15.5.13",
- "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz",
- "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/unist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
- "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
- "license": "MIT"
- },
- "node_modules/@types/use-sync-external-store": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
- "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
- "license": "MIT"
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz",
- "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==",
- "license": "ISC"
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/anymatch/node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/aria-hidden": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz",
- "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz",
- "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.28.2",
- "caniuse-lite": "^1.0.30001787",
- "fraction.js": "^5.3.4",
- "picocolors": "^1.1.1",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/baseline-browser-mapping": {
- "version": "2.10.29",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz",
- "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "baseline-browser-mapping": "dist/cli.cjs"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.28.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
- "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "baseline-browser-mapping": "^2.10.12",
- "caniuse-lite": "^1.0.30001782",
- "electron-to-chromium": "^1.5.328",
- "node-releases": "^2.0.36",
- "update-browserslist-db": "^1.2.3"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001792",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
- "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-html4": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
- "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-legacy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
- "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-reference-invalid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
- "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/class-variance-authority": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
- "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
- "license": "Apache-2.0",
- "dependencies": {
- "clsx": "^2.1.1"
- },
- "funding": {
- "url": "https://polar.sh/cva"
- }
- },
- "node_modules/client-only": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
- "license": "MIT"
- },
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
- "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/csstype": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/d3-array": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
- "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
- "license": "ISC",
- "dependencies": {
- "internmap": "1 - 2"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-color": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
- "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-ease": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
- "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-format": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
- "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-interpolate": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
- "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
- "license": "ISC",
- "dependencies": {
- "d3-color": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-path": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
- "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-scale": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
- "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2.10.0 - 3",
- "d3-format": "1 - 3",
- "d3-interpolate": "1.2.0 - 3",
- "d3-time": "2.1.1 - 3",
- "d3-time-format": "2 - 4"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-shape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
- "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
- "license": "ISC",
- "dependencies": {
- "d3-path": "^3.1.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-time": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
- "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
- "license": "ISC",
- "dependencies": {
- "d3-array": "2 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-time-format": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
- "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
- "license": "ISC",
- "dependencies": {
- "d3-time": "1 - 3"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/d3-timer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
- "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/date-fns": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
- "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/kossnocorp"
- }
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decimal.js-light": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
- "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
- "license": "MIT"
- },
- "node_modules/decode-named-character-reference": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
- "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
- "license": "MIT",
- "dependencies": {
- "character-entities": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/detect-node-es": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
- "license": "MIT"
- },
- "node_modules/devlop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
- "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
- "license": "MIT",
- "dependencies": {
- "dequal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.354",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.354.tgz",
- "integrity": "sha512-JaBHwWcfIdmSAfWM5l3uwjGd431j8YEMikZ+K/2nXVuBqJKyZ0f+2h4n4JY5AyNiZmnY9qQr2RU3v9DxDmHMNg==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-toolkit": {
- "version": "1.46.1",
- "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz",
- "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==",
- "license": "MIT",
- "workspaces": [
- "docs",
- "benchmarks"
- ]
- },
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/estree-util-is-identifier-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
- "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/eventemitter3": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
- "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
- "license": "MIT"
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fastq": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
- "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fault": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
- "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
- "license": "MIT",
- "dependencies": {
- "format": "^0.2.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/format": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
- "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
- "engines": {
- "node": ">=0.4.x"
- }
- },
- "node_modules/fraction.js": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
- "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/framer-motion": {
- "version": "11.18.2",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz",
- "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==",
- "license": "MIT",
- "dependencies": {
- "motion-dom": "^11.18.1",
- "motion-utils": "^11.18.1",
- "tslib": "^2.4.0"
- },
- "peerDependencies": {
- "@emotion/is-prop-valid": "*",
- "react": "^18.0.0 || ^19.0.0",
- "react-dom": "^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/is-prop-valid": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "license": "ISC"
- },
- "node_modules/hasown": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
- "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hast-util-is-element": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
- "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-parse-selector": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
- "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-jsx-runtime": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
- "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "comma-separated-tokens": "^2.0.0",
- "devlop": "^1.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "hast-util-whitespace": "^3.0.0",
- "mdast-util-mdx-expression": "^2.0.0",
- "mdast-util-mdx-jsx": "^3.0.0",
- "mdast-util-mdxjs-esm": "^2.0.0",
- "property-information": "^7.0.0",
- "space-separated-tokens": "^2.0.0",
- "style-to-js": "^1.0.0",
- "unist-util-position": "^5.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-text": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
- "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "hast-util-is-element": "^3.0.0",
- "unist-util-find-after": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-whitespace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
- "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hastscript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
- "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^2.0.0",
- "comma-separated-tokens": "^1.0.0",
- "hast-util-parse-selector": "^2.0.0",
- "property-information": "^5.0.0",
- "space-separated-tokens": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hastscript/node_modules/@types/hast": {
- "version": "2.3.10",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
- "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^2"
- }
- },
- "node_modules/hastscript/node_modules/@types/unist": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
- "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
- "license": "MIT"
- },
- "node_modules/hastscript/node_modules/comma-separated-tokens": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
- "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/hastscript/node_modules/property-information": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
- "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
- "license": "MIT",
- "dependencies": {
- "xtend": "^4.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/hastscript/node_modules/space-separated-tokens": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
- "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/highlight.js": {
- "version": "10.7.3",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
- "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/highlightjs-vue": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
- "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
- "license": "CC0-1.0"
- },
- "node_modules/html-parse-stringify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
- "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
- "license": "MIT",
- "dependencies": {
- "void-elements": "3.1.0"
- }
- },
- "node_modules/html-url-attributes": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
- "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/i18next": {
- "version": "23.16.8",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
- "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
- "funding": [
- {
- "type": "individual",
- "url": "https://locize.com"
- },
- {
- "type": "individual",
- "url": "https://locize.com/i18next.html"
- },
- {
- "type": "individual",
- "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.2"
- }
- },
- "node_modules/immer": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
- "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
- },
- "node_modules/inline-style-parser": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
- "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
- "license": "MIT"
- },
- "node_modules/internmap": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
- "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/is-alphabetical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
- "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-alphanumerical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
- "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
- "license": "MIT",
- "dependencies": {
- "is-alphabetical": "^2.0.0",
- "is-decimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.16.2",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
- "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-decimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
- "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-hexadecimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
- "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
- "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/jiti": {
- "version": "1.21.7",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
- "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "license": "MIT"
- },
- "node_modules/lilconfig": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
- "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/longest-streak": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
- "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lowlight": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
- "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
- "license": "MIT",
- "dependencies": {
- "fault": "^1.0.0",
- "highlight.js": "~10.7.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/lucide-react": {
- "version": "0.378.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.378.0.tgz",
- "integrity": "sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==",
- "license": "ISC",
- "peerDependencies": {
- "react": "^16.5.1 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/markdown-table": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
- "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mdast-util-find-and-replace": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz",
- "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "escape-string-regexp": "^5.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-from-markdown": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
- "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "mdast-util-to-string": "^4.0.0",
- "micromark": "^4.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-decode-string": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
- "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
- "license": "MIT",
- "dependencies": {
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-gfm-autolink-literal": "^2.0.0",
- "mdast-util-gfm-footnote": "^2.0.0",
- "mdast-util-gfm-strikethrough": "^2.0.0",
- "mdast-util-gfm-table": "^2.0.0",
- "mdast-util-gfm-task-list-item": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
- "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "ccount": "^2.0.0",
- "devlop": "^1.0.0",
- "mdast-util-find-and-replace": "^3.0.0",
- "micromark-util-character": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-footnote": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
- "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.1.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-strikethrough": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
- "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
- "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "markdown-table": "^3.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-task-list-item": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
- "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-expression": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
- "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-jsx": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
- "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "ccount": "^2.0.0",
- "devlop": "^1.1.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "parse-entities": "^4.0.0",
- "stringify-entities": "^4.0.0",
- "unist-util-stringify-position": "^4.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdxjs-esm": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
- "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
- "license": "MIT",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-phrasing": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
- "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-hast": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
- "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "trim-lines": "^3.0.0",
- "unist-util-position": "^5.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-markdown": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
- "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "longest-streak": "^3.0.0",
- "mdast-util-phrasing": "^4.0.0",
- "mdast-util-to-string": "^4.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-decode-string": "^2.0.0",
- "unist-util-visit": "^5.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
- "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromark": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
- "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@types/debug": "^4.0.0",
- "debug": "^4.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-core-commonmark": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
- "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-factory-destination": "^2.0.0",
- "micromark-factory-label": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-factory-title": "^2.0.0",
- "micromark-factory-whitespace": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-html-tag-name": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
- "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
- "license": "MIT",
- "dependencies": {
- "micromark-extension-gfm-autolink-literal": "^2.0.0",
- "micromark-extension-gfm-footnote": "^2.0.0",
- "micromark-extension-gfm-strikethrough": "^2.0.0",
- "micromark-extension-gfm-table": "^2.0.0",
- "micromark-extension-gfm-tagfilter": "^2.0.0",
- "micromark-extension-gfm-task-list-item": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
- "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-footnote": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
- "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-strikethrough": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
- "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-table": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
- "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-tagfilter": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
- "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
- "license": "MIT",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
- "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-factory-destination": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
- "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-label": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
- "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-space": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
- "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-title": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
- "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-whitespace": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
- "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-character": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
- "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-chunked": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
- "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-classify-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
- "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-combine-extensions": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
- "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-numeric-character-reference": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
- "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-string": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
- "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-encode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
- "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-html-tag-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
- "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-normalize-identifier": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
- "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-resolve-all": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
- "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-sanitize-uri": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
- "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-subtokenize": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
- "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-symbol": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
- "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromark-util-types": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
- "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "license": "MIT"
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/motion-dom": {
- "version": "11.18.1",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz",
- "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==",
- "license": "MIT",
- "dependencies": {
- "motion-utils": "^11.18.1"
- }
- },
- "node_modules/motion-utils": {
- "version": "11.18.1",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz",
- "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==",
- "license": "MIT"
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.12",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz",
- "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/next": {
- "version": "14.2.3",
- "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz",
- "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==",
- "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.",
- "license": "MIT",
- "dependencies": {
- "@next/env": "14.2.3",
- "@swc/helpers": "0.5.5",
- "busboy": "1.6.0",
- "caniuse-lite": "^1.0.30001579",
- "graceful-fs": "^4.2.11",
- "postcss": "8.4.31",
- "styled-jsx": "5.1.1"
- },
- "bin": {
- "next": "dist/bin/next"
- },
- "engines": {
- "node": ">=18.17.0"
- },
- "optionalDependencies": {
- "@next/swc-darwin-arm64": "14.2.3",
- "@next/swc-darwin-x64": "14.2.3",
- "@next/swc-linux-arm64-gnu": "14.2.3",
- "@next/swc-linux-arm64-musl": "14.2.3",
- "@next/swc-linux-x64-gnu": "14.2.3",
- "@next/swc-linux-x64-musl": "14.2.3",
- "@next/swc-win32-arm64-msvc": "14.2.3",
- "@next/swc-win32-ia32-msvc": "14.2.3",
- "@next/swc-win32-x64-msvc": "14.2.3"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.1.0",
- "@playwright/test": "^1.41.2",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "sass": "^1.3.0"
- },
- "peerDependenciesMeta": {
- "@opentelemetry/api": {
- "optional": true
- },
- "@playwright/test": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/next/node_modules/postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.44",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz",
- "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/parse-entities": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
- "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "character-entities-legacy": "^3.0.0",
- "character-reference-invalid": "^2.0.0",
- "decode-named-character-reference": "^1.0.0",
- "is-alphanumerical": "^2.0.0",
- "is-decimal": "^2.0.0",
- "is-hexadecimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/parse-entities/node_modules/@types/unist": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
- "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
- "license": "MIT"
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
- "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.11",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-import": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
- "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-js": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
- "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "camelcase-css": "^2.0.1"
- },
- "engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "peerDependencies": {
- "postcss": "^8.4.21"
- }
- },
- "node_modules/postcss-load-config": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
- "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "jiti": ">=1.21.0",
- "postcss": ">=8.0.9",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-nested": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
- "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "postcss-selector-parser": "^6.1.1"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
- "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/prismjs": {
- "version": "1.30.0",
- "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
- "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/property-information": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
- "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/react": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
- "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dom": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
- "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.2"
- },
- "peerDependencies": {
- "react": "^18.3.1"
- }
- },
- "node_modules/react-i18next": {
- "version": "14.1.3",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.3.tgz",
- "integrity": "sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "html-parse-stringify": "^3.0.1"
- },
- "peerDependencies": {
- "i18next": ">= 23.2.3",
- "react": ">= 16.8.0"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/react-is": {
- "version": "19.2.6",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz",
- "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==",
- "license": "MIT"
- },
- "node_modules/react-markdown": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz",
- "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "hast-util-to-jsx-runtime": "^2.0.0",
- "html-url-attributes": "^3.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.0.0",
- "unified": "^11.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- },
- "peerDependencies": {
- "@types/react": ">=18",
- "react": ">=18"
- }
- },
- "node_modules/react-redux": {
- "version": "9.2.0",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
- "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
- "license": "MIT",
- "dependencies": {
- "@types/use-sync-external-store": "^0.0.6",
- "use-sync-external-store": "^1.4.0"
- },
- "peerDependencies": {
- "@types/react": "^18.2.25 || ^19",
- "react": "^18.0 || ^19",
- "redux": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "redux": {
- "optional": true
- }
- }
- },
- "node_modules/react-remove-scroll": {
- "version": "2.7.2",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
- "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
- "license": "MIT",
- "dependencies": {
- "react-remove-scroll-bar": "^2.3.7",
- "react-style-singleton": "^2.2.3",
- "tslib": "^2.1.0",
- "use-callback-ref": "^1.3.3",
- "use-sidecar": "^1.1.3"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-remove-scroll-bar": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
- "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
- "license": "MIT",
- "dependencies": {
- "react-style-singleton": "^2.2.2",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-style-singleton": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
- "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
- "license": "MIT",
- "dependencies": {
- "get-nonce": "^1.0.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-syntax-highlighter": {
- "version": "15.6.6",
- "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz",
- "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.3.1",
- "highlight.js": "^10.4.1",
- "highlightjs-vue": "^1.0.0",
- "lowlight": "^1.17.0",
- "prismjs": "^1.30.0",
- "refractor": "^3.6.0"
- },
- "peerDependencies": {
- "react": ">= 0.14.0"
- }
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/readdirp/node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/recharts": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz",
- "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==",
- "license": "MIT",
- "workspaces": [
- "www"
- ],
- "dependencies": {
- "@reduxjs/toolkit": "^1.9.0 || 2.x.x",
- "clsx": "^2.1.1",
- "decimal.js-light": "^2.5.1",
- "es-toolkit": "^1.39.3",
- "eventemitter3": "^5.0.1",
- "immer": "^10.1.1",
- "react-redux": "8.x.x || 9.x.x",
- "reselect": "5.1.1",
- "tiny-invariant": "^1.3.3",
- "use-sync-external-store": "^1.2.2",
- "victory-vendor": "^37.0.2"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/redux": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
- "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
- "license": "MIT"
- },
- "node_modules/redux-thunk": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
- "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
- "license": "MIT",
- "peerDependencies": {
- "redux": "^5.0.0"
- }
- },
- "node_modules/refractor": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
- "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
- "license": "MIT",
- "dependencies": {
- "hastscript": "^6.0.0",
- "parse-entities": "^2.0.0",
- "prismjs": "~1.27.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "license": "MIT",
- "dependencies": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/parse-entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
- "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
- "license": "MIT",
- "dependencies": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/refractor/node_modules/prismjs": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
- "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/rehype-highlight": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz",
- "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "hast-util-to-text": "^4.0.0",
- "lowlight": "^3.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-highlight/node_modules/highlight.js": {
- "version": "11.11.1",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
- "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/rehype-highlight/node_modules/lowlight": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz",
- "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "devlop": "^1.0.0",
- "highlight.js": "~11.11.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/remark-gfm": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
- "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-gfm": "^3.0.0",
- "micromark-extension-gfm": "^3.0.0",
- "remark-parse": "^11.0.0",
- "remark-stringify": "^11.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-parse": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
- "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-rehype": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
- "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
- "license": "MIT",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "unified": "^11.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-stringify": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
- "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
- "license": "MIT",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/reselect": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
- "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
- "license": "MIT"
- },
- "node_modules/resolve": {
- "version": "1.22.12",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
- "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "is-core-module": "^2.16.1",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/scheduler": {
- "version": "0.23.2",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
- "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/stringify-entities": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
- "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
- "license": "MIT",
- "dependencies": {
- "character-entities-html4": "^2.0.0",
- "character-entities-legacy": "^3.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/style-to-js": {
- "version": "1.1.21",
- "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
- "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
- "license": "MIT",
- "dependencies": {
- "style-to-object": "1.0.14"
- }
- },
- "node_modules/style-to-object": {
- "version": "1.0.14",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
- "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
- "license": "MIT",
- "dependencies": {
- "inline-style-parser": "0.2.7"
- }
- },
- "node_modules/styled-jsx": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
- "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
- "license": "MIT",
- "dependencies": {
- "client-only": "0.0.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "peerDependencies": {
- "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
- },
- "peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
- "babel-plugin-macros": {
- "optional": true
- }
- }
- },
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwind-merge": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz",
- "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/dcastil"
- }
- },
- "node_modules/tailwindcss": {
- "version": "3.4.19",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
- "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "arg": "^5.0.2",
- "chokidar": "^3.6.0",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.3.2",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "jiti": "^1.21.7",
- "lilconfig": "^3.1.3",
- "micromatch": "^4.0.8",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.1.1",
- "postcss": "^8.4.47",
- "postcss-import": "^15.1.0",
- "postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0",
- "postcss-nested": "^6.2.0",
- "postcss-selector-parser": "^6.1.2",
- "resolve": "^1.22.8",
- "sucrase": "^3.35.0"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/tiny-invariant": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
- "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
- "license": "MIT"
- },
- "node_modules/tinyglobby": {
- "version": "0.2.16",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/trim-lines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
- "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/trough": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
- "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/unified": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
- "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "bail": "^2.0.0",
- "devlop": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^4.0.0",
- "trough": "^2.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-find-after": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
- "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-is": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
- "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
- "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-stringify-position": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
- "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
- "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit-parents": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
- "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.2.0",
- "picocolors": "^1.1.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/use-callback-ref": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
- "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sidecar": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
- "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
- "license": "MIT",
- "dependencies": {
- "detect-node-es": "^1.1.0",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/use-sync-external-store": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
- "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
- "license": "MIT",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/vfile": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
- "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-message": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
- "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
- "license": "MIT",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/victory-vendor": {
- "version": "37.3.6",
- "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
- "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
- "license": "MIT AND ISC",
- "dependencies": {
- "@types/d3-array": "^3.0.3",
- "@types/d3-ease": "^3.0.0",
- "@types/d3-interpolate": "^3.0.1",
- "@types/d3-scale": "^4.0.2",
- "@types/d3-shape": "^3.1.0",
- "@types/d3-time": "^3.0.0",
- "@types/d3-timer": "^3.0.0",
- "d3-array": "^3.1.6",
- "d3-ease": "^3.0.1",
- "d3-interpolate": "^3.0.1",
- "d3-scale": "^4.0.2",
- "d3-shape": "^3.1.0",
- "d3-time": "^3.0.0",
- "d3-timer": "^3.0.1"
- }
- },
- "node_modules/void-elements": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
- "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/zustand": {
- "version": "4.5.7",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz",
- "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==",
- "license": "MIT",
- "dependencies": {
- "use-sync-external-store": "^1.2.2"
- },
- "engines": {
- "node": ">=12.7.0"
- },
- "peerDependencies": {
- "@types/react": ">=16.8",
- "immer": ">=9.0.6",
- "react": ">=16.8"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "immer": {
- "optional": true
- },
- "react": {
- "optional": true
- }
- }
- },
- "node_modules/zwitch": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
- "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- }
- }
-}
diff --git a/frontend/package.json b/frontend/package.json
deleted file mode 100644
index e840a1185ed2b69f92468947f311ce1dd5984946..0000000000000000000000000000000000000000
--- a/frontend/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "name": "god-agent-os-ui",
- "version": "11.0.0",
- "private": true,
- "scripts": {
- "dev": "next dev -p 3000",
- "build": "next build",
- "start": "next start -p 3000",
- "lint": "next lint"
- },
- "dependencies": {
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-progress": "^1.1.8",
- "@radix-ui/react-separator": "^1.1.8",
- "@radix-ui/react-slot": "^1.2.4",
- "@radix-ui/react-tooltip": "^1.2.8",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "date-fns": "^3.6.0",
- "framer-motion": "^11.1.9",
- "i18next": "^23.11.5",
- "lucide-react": "^0.378.0",
- "next": "14.2.3",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "react-i18next": "^14.1.2",
- "react-is": "^19.2.6",
- "react-markdown": "^9.0.1",
- "react-syntax-highlighter": "^15.5.0",
- "recharts": "^3.8.1",
- "rehype-highlight": "^7.0.0",
- "remark-gfm": "^4.0.0",
- "tailwind-merge": "^2.3.0",
- "zustand": "^4.5.2"
- },
- "devDependencies": {
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "@types/react-syntax-highlighter": "^15.5.13",
- "autoprefixer": "^10.0.1",
- "postcss": "^8",
- "tailwindcss": "^3.4.1",
- "typescript": "^5"
- }
-}
diff --git a/frontend/package_v3.json b/frontend/package_v3.json
deleted file mode 100644
index 83b548f283d0591d04a32ce00b23a88fe02a2beb..0000000000000000000000000000000000000000
--- a/frontend/package_v3.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "name": "god-mode-plus-ui-v3",
- "version": "3.0.0",
- "private": true,
- "scripts": {
- "dev": "next dev -p 3000",
- "build": "next build",
- "start": "next start -p 3000",
- "lint": "next lint",
- "type-check": "tsc --noEmit",
- "test": "jest",
- "test:watch": "jest --watch"
- },
- "dependencies": {
- "next": "15.0.0",
- "react": "^19.0.0",
- "react-dom": "^19.0.0",
- "react-markdown": "^9.0.1",
- "react-syntax-highlighter": "^15.5.0",
- "remark-gfm": "^4.0.0",
- "rehype-highlight": "^7.0.0",
- "lucide-react": "^0.400.0",
- "clsx": "^2.1.1",
- "tailwind-merge": "^2.3.0",
- "date-fns": "^3.6.0",
- "zustand": "^4.5.2",
- "framer-motion": "^12.0.0",
- "i18next": "^23.11.5",
- "react-i18next": "^14.1.2",
- "recharts": "^2.12.0",
- "react-hot-toast": "^2.4.1",
- "axios": "^1.7.0",
- "ws": "^8.16.0",
- "swr": "^2.2.4",
- "react-query": "^3.39.3",
- "valtio": "^1.11.2",
- "immer": "^10.0.3"
- },
- "devDependencies": {
- "@types/node": "^20",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "@types/react-syntax-highlighter": "^15.5.13",
- "@types/jest": "^29.5.0",
- "autoprefixer": "^10.0.1",
- "postcss": "^8",
- "tailwindcss": "^4.0.0",
- "typescript": "^5.3.0",
- "jest": "^29.5.0",
- "jest-environment-jsdom": "^29.5.0",
- "@testing-library/react": "^14.0.0",
- "@testing-library/jest-dom": "^6.1.0",
- "eslint": "^8.50.0",
- "eslint-config-next": "15.0.0"
- }
-}
diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js
deleted file mode 100644
index 33ad091d26d8a9dc95ebdf616e217d985ec215b8..0000000000000000000000000000000000000000
--- a/frontend/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-}
diff --git a/frontend/store/useAppStore.ts b/frontend/store/useAppStore.ts
deleted file mode 100644
index fcfd99ae74237f03558370ae0c42f09661201ac6..0000000000000000000000000000000000000000
--- a/frontend/store/useAppStore.ts
+++ /dev/null
@@ -1,153 +0,0 @@
-import { create } from 'zustand'
-import { persist } from 'zustand/middleware'
-import { SPACE_CATALOG, type WorkerRole } from '@/lib/spaceCatalog'
-
-export type Page =
- | 'chat'
- | 'dashboard'
- | 'spaces'
- | 'agents'
- | 'tasks'
- | 'memory'
- | 'knowledge'
- | 'workflows'
- | 'analytics'
- | 'settings'
- | 'connectors'
- | 'computer-use'
-
-export type Space = string
-export type Role = WorkerRole
-export type Theme = 'dark' | 'amoled' | 'neon' | 'glass'
-export type Locale = 'en' | 'my'
-
-export interface SpaceStatus {
- name: Space
- active: boolean
- taskCount: number
- lastActive: number | null
- color: string
- icon: string
-}
-
-// ─── Computer-Use Step (Manus-style) ─────────────────────────────────────────
-export interface ComputerUseStep {
- id: string
- type: 'thinking' | 'browsing' | 'coding' | 'executing' | 'terminal' | 'file' | 'git' | 'deploy' | 'complete' | 'error' | 'reading' | 'writing' | 'searching' | 'sandbox' | 'done'
- title: string
- detail?: string
- status: 'running' | 'done' | 'error'
- timestamp: number
- data?: Record
-}
-
-interface AppState {
- currentPage: Page
- activeSpace: Space | null
- currentRole: Role
- sidebarOpen: boolean
- theme: Theme
- locale: Locale
- spaces: Record
- computerUseSteps: ComputerUseStep[]
- isComputerUseOpen: boolean
- backendUrl: string
- // Actions
- setCurrentPage: (page: Page) => void
- setActiveSpace: (space: Space | null) => void
- setCurrentRole: (role: Role) => void
- setSidebarOpen: (open: boolean) => void
- setTheme: (theme: Theme) => void
- setLocale: (locale: Locale) => void
- activateSpace: (space: Space, role?: Role) => void
- deactivateSpace: (space: Space) => void
- addComputerUseStep: (step: Omit) => void
- clearComputerUseSteps: () => void
- setComputerUseOpen: (open: boolean) => void
- setBackendUrl: (url: string) => void
-}
-
-const initialSpaces: Record = Object.fromEntries(
- SPACE_CATALOG.map(space => [
- space.id,
- {
- name: space.id,
- active: false,
- taskCount: 0,
- lastActive: null,
- color: space.color,
- icon: space.icon,
- },
- ])
-)
-
-export const useAppStore = create()(
- persist(
- (set) => ({
- currentPage: 'chat',
- activeSpace: null,
- currentRole: 'cognition' as Role,
- sidebarOpen: true,
- theme: 'dark',
- locale: 'en',
- spaces: initialSpaces,
- computerUseSteps: [],
- isComputerUseOpen: false,
- backendUrl: process.env.NEXT_PUBLIC_API_URL || 'https://pyae1994-autonomous-coding-system.hf.space',
-
- setCurrentPage: (page) => set({ currentPage: page }),
- setActiveSpace: (space) => set({ activeSpace: space }),
- setCurrentRole: (role) => set({ currentRole: role }),
- setSidebarOpen: (open) => set({ sidebarOpen: open }),
- setTheme: (theme) => set({ theme }),
- setLocale: (locale) => set({ locale }),
- setBackendUrl: (url) => set({ backendUrl: url }),
-
- activateSpace: (space, role) =>
- set(state => ({
- activeSpace: space,
- currentRole: role || state.currentRole,
- spaces: {
- ...state.spaces,
- [space]: {
- ...state.spaces[space],
- active: true,
- lastActive: Date.now(),
- },
- },
- })),
-
- deactivateSpace: (space) =>
- set(state => ({
- spaces: {
- ...state.spaces,
- [space]: { ...state.spaces[space], active: false },
- },
- })),
-
- addComputerUseStep: (step) =>
- set(state => ({
- computerUseSteps: [
- ...state.computerUseSteps.slice(-99),
- {
- ...step,
- id: Math.random().toString(36).slice(2, 10),
- timestamp: Date.now(),
- },
- ],
- })),
-
- clearComputerUseSteps: () => set({ computerUseSteps: [] }),
- setComputerUseOpen: (open) => set({ isComputerUseOpen: open }),
- }),
- {
- name: 'god-agent-store',
- partialize: (state) => ({
- theme: state.theme,
- locale: state.locale,
- sidebarOpen: state.sidebarOpen,
- backendUrl: state.backendUrl,
- }),
- }
- )
-)
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js
deleted file mode 100644
index e6ce26cd6cbd9b1cdfa1a753fcc9848238a12a85..0000000000000000000000000000000000000000
--- a/frontend/tailwind.config.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/** @type {import('tailwindcss').Config} */
-module.exports = {
- darkMode: 'class',
- content: [
- './pages/**/*.{js,ts,jsx,tsx,mdx}',
- './components/**/*.{js,ts,jsx,tsx,mdx}',
- './app/**/*.{js,ts,jsx,tsx,mdx}',
- './store/**/*.{js,ts,jsx,tsx}',
- ],
- theme: {
- extend: {
- colors: {
- void: '#05060d',
- surface: {
- 1: '#0a0c16',
- 2: '#0e1121',
- 3: '#131729',
- 4: '#191e32',
- 5: '#1f263b',
- },
- purple: {
- DEFAULT: '#7c3aed',
- bright: '#8b5cf6',
- light: '#a78bfa',
- dim: 'rgba(124,58,237,0.15)',
- },
- blue: { DEFAULT: '#3b82f6', bright: '#60a5fa' },
- cyan: { DEFAULT: '#22d3ee', bright: '#67e8f9' },
- green: { DEFAULT: '#22c55e', bright: '#4ade80' },
- amber: { DEFAULT: '#f59e0b', bright: '#fbbf24' },
- pink: { DEFAULT: '#ec4899', bright: '#f472b6' },
- neon: { purple: '#bf00ff', blue: '#00d4ff', green: '#00ff88' },
- },
- fontFamily: {
- sans: ['Inter', 'system-ui', 'sans-serif'],
- mono: ['JetBrains Mono', 'Fira Code', 'monospace'],
- },
- borderRadius: {
- '2xl': '16px',
- '3xl': '20px',
- '4xl': '24px',
- },
- backdropBlur: { xs: '2px', sm: '8px', md: '16px', lg: '24px', xl: '40px' },
- boxShadow: {
- 'glow-purple': '0 0 20px rgba(124,58,237,0.3), 0 0 60px rgba(124,58,237,0.1)',
- 'glow-blue': '0 0 20px rgba(59,130,246,0.3)',
- 'glow-cyan': '0 0 20px rgba(34,211,238,0.3)',
- 'glow-green': '0 0 12px rgba(34,197,94,0.4)',
- 'card': '0 4px 24px rgba(0,0,0,0.3)',
- 'card-hover': '0 8px 40px rgba(0,0,0,0.4)',
- },
- animation: {
- 'fade-in-up': 'fadeInUp 0.4s ease-out forwards',
- 'fade-in': 'fadeIn 0.3s ease-out forwards',
- 'slide-left': 'slideInLeft 0.3s ease-out forwards',
- 'pulse-glow': 'pulseGlow 2s ease-in-out infinite',
- 'spin-slow': 'spin 8s linear infinite',
- 'orb-float': 'orbFloat 6s ease-in-out infinite',
- 'shimmer': 'shimmer 3s linear infinite',
- 'typing-dot': 'typingDot 1.4s ease-in-out infinite',
- },
- keyframes: {
- fadeInUp: { from: { opacity: '0', transform: 'translateY(12px)' }, to: { opacity: '1', transform: 'translateY(0)' } },
- fadeIn: { from: { opacity: '0' }, to: { opacity: '1' } },
- slideInLeft: { from: { opacity: '0', transform: 'translateX(-16px)' }, to: { opacity: '1', transform: 'translateX(0)' } },
- pulseGlow: { '0%,100%': { opacity: '0.6' }, '50%': { opacity: '1' } },
- orbFloat: { '0%,100%': { transform: 'translateY(0px) rotate(0deg)' }, '33%': { transform: 'translateY(-8px) rotate(5deg)' }, '66%': { transform: 'translateY(4px) rotate(-3deg)' } },
- shimmer: { '0%': { backgroundPosition: '-200% center' }, '100%': { backgroundPosition: '200% center' } },
- typingDot: { '0%,80%,100%': { transform: 'scale(0)', opacity: '0.3' }, '40%': { transform: 'scale(1)', opacity: '1' } },
- },
- },
- },
- plugins: [],
-}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
deleted file mode 100644
index 109b22f5043aa526d91dcb3930912d59a67933b1..0000000000000000000000000000000000000000
--- a/frontend/tsconfig.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "compilerOptions": {
- "target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "preserve",
- "incremental": true,
- "plugins": [{ "name": "next" }],
- "paths": { "@/*": ["./*"] }
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
-}
diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/frontend/types/index.ts b/frontend/types/index.ts
deleted file mode 100644
index 0ed7de6171db495b8e8151b93b731263517d3050..0000000000000000000000000000000000000000
--- a/frontend/types/index.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-// ─── Core Types ────────────────────────────────────────────────────────────────
-
-export type TaskStatus =
- | 'queued' | 'initializing' | 'planning' | 'executing'
- | 'streaming' | 'waiting_input' | 'retrying' | 'finalizing'
- | 'completed' | 'failed' | 'cancelled'
-
-export type EventType =
- | 'task_created' | 'task_queued' | 'task_started' | 'plan_generated'
- | 'step_started' | 'step_progress' | 'tool_called' | 'tool_result'
- | 'llm_chunk' | 'memory_updated' | 'retry_attempt' | 'step_completed'
- | 'warning' | 'error' | 'task_completed' | 'task_failed'
- | 'heartbeat' | 'connected' | 'stream_start' | 'stream_end'
- | 'agent_event'
-
-export interface StreamEvent {
- id?: string
- type: EventType | string
- task_id?: string
- session_id?: string
- timestamp: number
- data: Record
-}
-
-export interface TaskStep {
- id: string
- name: string
- description: string
- tool?: string
- status: 'pending' | 'running' | 'completed' | 'failed'
- output?: string
- error?: string
- started_at?: number
- completed_at?: number
- duration_ms?: number
-}
-
-export interface TaskPlan {
- goal: string
- steps: TaskStep[]
- estimated_duration: number
- tools_needed: string[]
- created_at: number
-}
-
-export interface Task {
- id: string
- goal: string
- status: TaskStatus
- session_id: string
- project_id: string
- plan?: TaskPlan
- result?: string
- error?: string
- metadata?: Record
- created_at: number
- started_at?: number
- completed_at?: number
- retry_count: number
- ws_url?: string
- stream_url?: string
-}
-
-export interface Message {
- id: string
- role: 'user' | 'assistant' | 'system' | 'tool'
- content: string
- timestamp: number
- streaming?: boolean
- task_id?: string
- metadata?: Record
-}
-
-export interface TimelineEvent {
- id: string
- type: string
- label: string
- description?: string
- timestamp: number
- status: 'pending' | 'running' | 'completed' | 'failed' | 'warning'
- tool?: string
- data?: Record
- duration_ms?: number
-}
-
-export interface AgentSession {
- id: string
- project_id: string
- tasks: Task[]
- messages: Message[]
- timeline: TimelineEvent[]
- active_task_id?: string
- created_at: number
- last_active: number
-}
-
-export type ToolIcon = {
- [key: string]: string
-}
diff --git a/frontend/vercel.json b/frontend/vercel.json
deleted file mode 100644
index 8ba82f7fa83aa1f49badfb27ad27d409d9bfcf90..0000000000000000000000000000000000000000
--- a/frontend/vercel.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "buildCommand": "npm run build",
- "outputDirectory": ".next",
- "framework": "nextjs",
- "rewrites": [
- {
- "source": "/api/v1/:path*",
- "destination": "https://pyae1994-autonomous-coding-system.hf.space/api/v1/:path*"
- },
- {
- "source": "/ws/:path*",
- "destination": "https://pyae1994-autonomous-coding-system.hf.space/ws/:path*"
- }
- ],
- "headers": [
- {
- "source": "/(.*)",
- "headers": [
- { "key": "X-Powered-By", "value": "Pyae Sone" },
- { "key": "X-Frame-Options", "value": "SAMEORIGIN" }
- ]
- }
- ]
-}
diff --git a/github/__init__.py b/github/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/kernel/__init__.py b/kernel/__init__.py
deleted file mode 100644
index c6ead012d1c75d4a8ac22ba8341d909005c68fa8..0000000000000000000000000000000000000000
--- a/kernel/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from .agent_kernel import AgentKernel, ContextManager, ToolRegistry
diff --git a/kernel/agent_kernel.py b/kernel/agent_kernel.py
deleted file mode 100644
index 64676da0fa6b396e2cea8c6ecf7c809ef727b821..0000000000000000000000000000000000000000
--- a/kernel/agent_kernel.py
+++ /dev/null
@@ -1,308 +0,0 @@
-"""
-🧠 God Agent OS v9 — Agent Kernel
-The Central Nervous System of the Space-Role Architecture.
-Replaces GodAgentOrchestratorV7 with a generalized, modular kernel.
-"""
-import asyncio
-import json
-import time
-import uuid
-from typing import Any, Dict, List, Optional
-import structlog
-from spaces.catalog import SPACE_CATALOG
-
-log = structlog.get_logger()
-SPACE_IDS = [space["id"] for space in SPACE_CATALOG]
-
-KERNEL_SYSTEM_PROMPT = f"""You are GOD AGENT OS v10 — a distributed autonomous agent operating system.
-
-Architecture: Distributed Worker Space Paradigm
-- SPACES: {', '.join(SPACE_IDS)}
-- ROLES: Cognition (Thinker), Automation (Operator), Execution (Doer), Repair (Fixer), Visual Intelligence (Observer)
-
-You are infinitely extensible. For any digital task, select the best worker space and role combination.
-Prioritize god-core-space for orchestration, model-router-space for model strategy, deploy-worker-space for deployment, verification-worker-space for quality gates, and auth-gateway-space for permission concerns.
-Respond in Burmese or English based on user language.
-Be decisive, thorough, and production-focused.
-"""
-
-INTENT_CLASSIFICATION_PROMPT = """Classify this request for the Space-Role autonomous agent system.
-
-User message: "{message}"
-
-Available Spaces: god-core-space, coding-worker-space, sandbox-worker-space, terminal-worker-space, filesystem-worker-space, browser-worker-space, vision-worker-space, ui-worker-space, debug-worker-space, test-worker-space, verification-worker-space, git-worker-space, deploy-worker-space, connector-worker-space, memory-worker-space, knowledge-worker-space, workflow-worker-space, eventbus-space, observability-space, session-runtime-space, model-router-space, auth-gateway-space
-Available Roles: cognition, automation, execution, repair, visual_intelligence
-
-Respond ONLY with valid JSON:
-{{
- "primary_space": "space_name",
- "secondary_spaces": ["space1", "space2"],
- "role": "role_name",
- "intent": "brief description",
- "complexity": "low|medium|high",
- "requires_planning": true/false,
- "parallel_tasks": []
-}}"""
-
-
-class ContextManager:
- """Maintains task state, active Space, and current Role."""
-
- def __init__(self):
- self._contexts: Dict[str, Dict] = {}
-
- def get(self, session_id: str) -> Dict:
- if session_id not in self._contexts:
- self._contexts[session_id] = {
- "session_id": session_id,
- "active_space": "god-core-space",
- "current_role": "cognition",
- "task_history": [],
- "short_term_memory": [],
- "created_at": time.time(),
- "last_active": time.time(),
- }
- self._contexts[session_id]["last_active"] = time.time()
- return self._contexts[session_id]
-
- def update(self, session_id: str, updates: Dict):
- ctx = self.get(session_id)
- ctx.update(updates)
-
- def add_to_memory(self, session_id: str, entry: Dict):
- ctx = self.get(session_id)
- ctx["short_term_memory"].append({**entry, "timestamp": time.time()})
- # Keep only last 20 entries
- if len(ctx["short_term_memory"]) > 20:
- ctx["short_term_memory"] = ctx["short_term_memory"][-20:]
-
- def get_all_sessions(self) -> List[str]:
- return list(self._contexts.keys())
-
-
-class ToolRegistry:
- """Centralized registry of all tools, categorized by Space."""
-
- def __init__(self):
- self._tools: Dict[str, Dict[str, Any]] = {}
- self._space_tools: Dict[str, List[str]] = {
- **{space_id: [] for space_id in SPACE_IDS},
- }
-
- def register(self, name: str, func, space: str, description: str):
- self._tools[name] = {"func": func, "space": space, "description": description}
- if space in self._space_tools:
- self._space_tools[space].append(name)
-
- def get_tools_for_space(self, space: str) -> List[str]:
- return self._space_tools.get(space, [])
-
- def execute(self, tool_name: str, **kwargs) -> Any:
- if tool_name not in self._tools:
- raise ValueError(f"Tool '{tool_name}' not found in registry")
- return self._tools[tool_name]["func"](**kwargs)
-
- def get_all_tools_summary(self) -> Dict:
- return {space: tools for space, tools in self._space_tools.items()}
-
-
-class AgentKernel:
- """
- The OS Core — replaces GodAgentOrchestratorV7.
- Manages Space routing, Role switching, and tool orchestration.
- """
-
- def __init__(self, ws_manager=None, ai_router=None):
- self.ws = ws_manager
- self.ai_router = ai_router
- self.context_manager = ContextManager()
- self.tool_registry = ToolRegistry()
- self._spaces: Dict[str, Any] = {}
- self._active_tasks: Dict[str, Dict] = {}
- self._task_history: List[Dict] = []
- self.version = "10.0.0"
- log.info("🧠 Agent Kernel v10 initialized — Distributed Worker Space Architecture")
-
- def register_space(self, name: str, space_instance):
- """Register a Space module."""
- self._spaces[name] = space_instance
- log.info(f"📦 Space registered: {name}")
-
- def get_space(self, name: str):
- return self._spaces.get(name)
-
- def get_status(self) -> Dict:
- return {
- "version": self.version,
- "architecture": "Distributed Worker Space",
- "spaces": list(self._spaces.keys()),
- "total_spaces": len(self._spaces),
- "active_tasks": len(self._active_tasks),
- "sessions": len(self.context_manager.get_all_sessions()),
- "tools": self.tool_registry.get_all_tools_summary(),
- }
-
- async def classify_intent(self, user_message: str) -> Dict:
- """Classify intent to determine Space and Role."""
- try:
- prompt = INTENT_CLASSIFICATION_PROMPT.format(message=user_message)
- response = await self.ai_router.complete(
- prompt=prompt,
- system=KERNEL_SYSTEM_PROMPT,
- max_tokens=400,
- )
- text = response.get("content", "")
- # Extract JSON
- start = text.find("{")
- end = text.rfind("}") + 1
- if start >= 0 and end > start:
- return json.loads(text[start:end])
- except Exception as e:
- log.warning(f"Intent classification failed: {e}")
-
- # Fallback
- return {
- "primary_space": "god-core-space",
- "secondary_spaces": [],
- "role": "cognition",
- "intent": user_message,
- "complexity": "medium",
- "requires_planning": True,
- "parallel_tasks": [],
- }
-
- async def route_to_space(self, space_name: str, role: str, task: str,
- session_id: str, context: Dict = None) -> str:
- """Route a task to the appropriate Space with the given Role."""
- space = self._spaces.get(space_name)
- if not space:
- space = self._spaces.get("god-core-space")
-
- if not space:
- return f"Space '{space_name}' not available."
-
- return await space.execute(
- task=task,
- role=role,
- session_id=session_id,
- context=context or {},
- )
-
- async def orchestrate(self, user_message: str, session_id: str, context: Dict = None) -> str:
- """Main orchestration entry point."""
- task_id = str(uuid.uuid4())[:8]
- ctx = self.context_manager.get(session_id)
-
- # Broadcast thinking state
- if self.ws:
- await self.ws.broadcast_to_room(f"chat:{session_id}", {
- "type": "kernel_status",
- "task_id": task_id,
- "status": "analyzing",
- "message": "🧠 Agent Kernel analyzing request...",
- "timestamp": time.time(),
- })
-
- # 1. Classify intent → determine Space + Role
- intent = await self.classify_intent(user_message)
- primary_space = intent.get("primary_space", "core")
- role = intent.get("role", "cognition")
-
- # Update context
- self.context_manager.update(session_id, {
- "active_space": primary_space,
- "current_role": role,
- })
- self.context_manager.add_to_memory(session_id, {
- "type": "user_message",
- "content": user_message,
- "space": primary_space,
- "role": role,
- })
-
- # Broadcast space activation
- if self.ws:
- await self.ws.broadcast_to_room(f"chat:{session_id}", {
- "type": "space_activated",
- "task_id": task_id,
- "space": primary_space,
- "role": role,
- "intent": intent.get("intent", ""),
- "timestamp": time.time(),
- })
-
- # 2. Route to primary Space
- try:
- # Build memory context
- mem_context = {
- "short_term_memory": ctx["short_term_memory"][-5:],
- "intent": intent,
- **(context or {}),
- }
-
- result = await self.route_to_space(
- space_name=primary_space,
- role=role,
- task=user_message,
- session_id=session_id,
- context=mem_context,
- )
-
- # 3. Handle secondary spaces if needed
- secondary_spaces = intent.get("secondary_spaces", [])
- secondary_results = {}
- for sec_space in secondary_spaces[:2]: # Max 2 secondary spaces
- try:
- sec_result = await self.route_to_space(
- space_name=sec_space,
- role="automation",
- task=user_message,
- session_id=session_id,
- context={"primary_result": result, **mem_context},
- )
- secondary_results[sec_space] = sec_result
- except Exception as e:
- log.warning(f"Secondary space {sec_space} failed: {e}")
-
- # Combine results
- final_result = result
- if secondary_results:
- secondary_text = "\n\n".join([f"[{k.upper()} SPACE]\n{v}" for k, v in secondary_results.items()])
- final_result = f"{result}\n\n{secondary_text}"
-
- # Store in memory
- self.context_manager.add_to_memory(session_id, {
- "type": "assistant_response",
- "content": final_result,
- "space": primary_space,
- "role": role,
- })
-
- # Track task
- self._task_history.append({
- "task_id": task_id,
- "session_id": session_id,
- "message": user_message,
- "space": primary_space,
- "role": role,
- "result_length": len(final_result),
- "timestamp": time.time(),
- })
-
- return final_result
-
- except Exception as e:
- log.error(f"Orchestration error: {e}")
- # Switch to Repair role
- if self.ws:
- await self.ws.broadcast_to_room(f"chat:{session_id}", {
- "type": "space_activated",
- "space": "debug",
- "role": "repair",
- "message": "🔧 Switching to Repair role...",
- })
- return f"⚠️ Error in {primary_space} Space: {str(e)}\n\nDebug Space activated. Please try again."
-
- def get_agent(self, name: str):
- """Backward compatibility - get space by name."""
- return self._spaces.get(name)
diff --git a/main_v12.py b/main_v12.py
deleted file mode 100644
index ef40980e9c529db8c762bb518909af5156896fce..0000000000000000000000000000000000000000
--- a/main_v12.py
+++ /dev/null
@@ -1,1314 +0,0 @@
-"""
-GOD AGENT OS v12 — TRUE AUTONOMOUS AGENT RUNTIME
-━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-Real execution: E2B sandbox + tool router + live streaming
-NOT a chatbot — an actual autonomous agent OS like Manus/Devin
-"""
-
-import asyncio
-import hashlib
-import json
-import os
-import time
-import uuid
-from contextlib import asynccontextmanager
-from typing import AsyncGenerator, Dict, List, Optional, Any
-
-import httpx
-import structlog
-from fastapi import FastAPI, WebSocket, WebSocketDisconnect, HTTPException, Request
-from fastapi.middleware.cors import CORSMiddleware
-from fastapi.middleware.gzip import GZipMiddleware
-from fastapi.responses import StreamingResponse, JSONResponse
-from slowapi import Limiter, _rate_limit_exceeded_handler
-from slowapi.util import get_remote_address
-from slowapi.errors import RateLimitExceeded
-
-structlog.configure(
- processors=[
- structlog.processors.TimeStamper(fmt="iso"),
- structlog.stdlib.add_log_level,
- structlog.processors.StackInfoRenderer(),
- structlog.dev.ConsoleRenderer(),
- ]
-)
-log = structlog.get_logger()
-
-# ─── Environment ──────────────────────────────────────────────────────────────
-E2B_API_KEY = os.environ.get("E2B_API_KEY", "")
-GEMINI_KEY = os.environ.get("GEMINI_KEY", "")
-SAMBANOVA_KEY = os.environ.get("SAMBANOVA_KEY", "")
-GITHUB_KEY = os.environ.get("GITHUB_KEY", "")
-GROQ_KEY = os.environ.get("GROQ_API_KEY", "")
-OPENAI_KEY = os.environ.get("OPENAI_API_KEY", "")
-
-# ─── Rate Limiter ──────────────────────────────────────────────────────────────
-limiter = Limiter(key_func=get_remote_address)
-
-
-# ─── WebSocket Manager ─────────────────────────────────────────────────────────
-class WebSocketManager:
- def __init__(self):
- self._rooms: Dict[str, set] = {}
- self._conn_count = 0
-
- async def connect(self, ws: WebSocket, room: str):
- await ws.accept()
- if room not in self._rooms:
- self._rooms[room] = set()
- self._rooms[room].add(ws)
- self._conn_count += 1
- log.info("WS connected", room=room, total=self._conn_count)
-
- def disconnect(self, ws: WebSocket, room: str):
- if room in self._rooms:
- self._rooms[room].discard(ws)
- self._conn_count = max(0, self._conn_count - 1)
-
- async def broadcast(self, room: str, data: dict):
- if "ts" not in data:
- data["ts"] = time.time()
- dead = set()
- for ws in list(self._rooms.get(room, [])):
- try:
- await ws.send_json(data)
- except Exception:
- dead.add(ws)
- for ws in dead:
- self._rooms.get(room, set()).discard(ws)
-
- async def emit_chat(self, session_id: str, event_type: str, data: dict):
- event = {
- "type": event_type,
- "session_id": session_id,
- "ts": time.time(),
- "data": data,
- }
- await self.broadcast(f"chat:{session_id}", event)
-
- async def heartbeat_loop(self):
- while True:
- await asyncio.sleep(20)
- for room in list(self._rooms.keys()):
- await self.broadcast(room, {"type": "heartbeat", "ts": time.time()})
-
- def stats(self):
- return {"connections": self._conn_count, "rooms": len(self._rooms)}
-
-
-# ─── AI Router — Multi-provider with streaming ────────────────────────────────
-class AIRouter:
- """Multi-provider AI router: Gemini → Sambanova → GitHub → Groq"""
-
- PROVIDERS = {
- "gemini": {
- "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:streamGenerateContent",
- "key": lambda: os.environ.get("GEMINI_KEY", GEMINI_KEY),
- "type": "gemini",
- },
- "sambanova": {
- "url": "https://api.sambanova.ai/v1/chat/completions",
- "key": lambda: os.environ.get("SAMBANOVA_KEY", SAMBANOVA_KEY),
- "model": "Meta-Llama-3.3-70B-Instruct",
- "type": "openai",
- },
- "github": {
- "url": "https://models.inference.ai.azure.com/chat/completions",
- "key": lambda: os.environ.get("GITHUB_KEY", GITHUB_KEY),
- "model": "gpt-4o",
- "type": "openai",
- },
- "groq": {
- "url": "https://api.groq.com/openai/v1/chat/completions",
- "key": lambda: os.environ.get("GROQ_API_KEY", GROQ_KEY),
- "model": "llama-3.3-70b-versatile",
- "type": "openai",
- },
- "openai": {
- "url": "https://api.openai.com/v1/chat/completions",
- "key": lambda: os.environ.get("OPENAI_API_KEY", OPENAI_KEY),
- "model": "gpt-4o",
- "type": "openai",
- },
- }
-
- ORDER = ["gemini", "sambanova", "github", "groq", "openai"]
-
- def get_active_provider(self) -> Optional[str]:
- for p in self.ORDER:
- k = self.PROVIDERS[p]["key"]()
- if k and len(k) > 10:
- return p
- return None
-
- def get_stats(self) -> Dict:
- stats = {}
- for p in self.ORDER:
- k = self.PROVIDERS[p]["key"]()
- stats[p] = {"available": bool(k and len(k) > 10), "key_set": bool(k)}
- return stats
-
- async def stream_chat(
- self,
- messages: List[Dict],
- session_id: str,
- ws_manager: Optional[WebSocketManager] = None,
- tools: Optional[List] = None,
- temperature: float = 0.7,
- max_tokens: int = 8192,
- ) -> AsyncGenerator[str, None]:
- """Stream tokens from AI provider."""
- provider = self.get_active_provider()
-
- if not provider:
- # Demo mode — no API key
- async for chunk in self._demo_stream(messages):
- yield chunk
- return
-
- cfg = self.PROVIDERS[provider]
- key = cfg["key"]()
-
- if cfg["type"] == "gemini":
- async for chunk in self._gemini_stream(cfg["url"], key, messages, max_tokens, tools):
- yield chunk
- else:
- async for chunk in self._openai_stream(
- cfg["url"], key, cfg.get("model", "gpt-4o"),
- messages, max_tokens, tools, temperature
- ):
- yield chunk
-
- async def _gemini_stream(
- self, url: str, key: str, messages: List[Dict],
- max_tokens: int, tools: Optional[List] = None
- ) -> AsyncGenerator[str, None]:
- """Stream from Gemini API."""
- # Convert messages to Gemini format
- contents = []
- system_text = ""
- for m in messages:
- role = m.get("role", "user")
- content = m.get("content", "")
- if role == "system":
- system_text = content
- continue
- g_role = "user" if role == "user" else "model"
- contents.append({"role": g_role, "parts": [{"text": content}]})
-
- if not contents:
- contents = [{"role": "user", "parts": [{"text": "Hello"}]}]
-
- body = {
- "contents": contents,
- "generationConfig": {
- "maxOutputTokens": max_tokens,
- "temperature": 0.7,
- },
- }
- if system_text:
- body["systemInstruction"] = {"parts": [{"text": system_text}]}
-
- # Add tools if provided
- if tools:
- gemini_tools = []
- for tool in tools:
- gemini_tools.append({
- "functionDeclarations": [{
- "name": tool["name"],
- "description": tool.get("description", ""),
- "parameters": tool.get("parameters", {}),
- }]
- })
- body["tools"] = gemini_tools
-
- stream_url = url if "?alt=sse" in url else url + "?alt=sse"
- stream_url = stream_url.replace("streamGenerateContent?", "streamGenerateContent?") + f"&key={key}"
- if "?alt=sse" not in stream_url:
- stream_url = stream_url.replace(f"&key={key}", "") + f"?alt=sse&key={key}"
-
- # Use non-streaming endpoint for tool calls
- final_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={key}"
-
- try:
- async with httpx.AsyncClient(timeout=120.0) as client:
- # Try SSE streaming first
- sse_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:streamGenerateContent?alt=sse&key={key}"
- async with client.stream("POST", sse_url, json=body) as resp:
- if resp.status_code != 200:
- # Fallback to non-streaming
- resp2 = await client.post(final_url, json=body)
- if resp2.status_code == 200:
- data = resp2.json()
- candidates = data.get("candidates", [])
- if candidates:
- parts = candidates[0].get("content", {}).get("parts", [])
- for part in parts:
- if "text" in part:
- yield part["text"]
- elif "functionCall" in part:
- yield json.dumps({"function_call": part["functionCall"]})
- return
-
- async for line in resp.aiter_lines():
- if not line.startswith("data:"):
- continue
- data_str = line[5:].strip()
- if not data_str or data_str == "[DONE]":
- continue
- try:
- data = json.loads(data_str)
- candidates = data.get("candidates", [])
- if candidates:
- parts = candidates[0].get("content", {}).get("parts", [])
- for part in parts:
- if "text" in part:
- yield part["text"]
- elif "functionCall" in part:
- yield json.dumps({"function_call": part["functionCall"]})
- except json.JSONDecodeError:
- pass
- except Exception as e:
- log.error("Gemini stream error", error=str(e))
- yield f"[Gemini error: {str(e)[:100]}]"
-
- async def _openai_stream(
- self, url: str, key: str, model: str,
- messages: List[Dict], max_tokens: int,
- tools: Optional[List] = None, temperature: float = 0.7
- ) -> AsyncGenerator[str, None]:
- """Stream from OpenAI-compatible API."""
- payload: Dict[str, Any] = {
- "model": model,
- "messages": messages,
- "stream": True,
- "temperature": temperature,
- "max_tokens": max_tokens,
- }
- if tools:
- payload["tools"] = [{"type": "function", "function": t} for t in tools]
- payload["tool_choice"] = "auto"
-
- headers = {
- "Authorization": f"Bearer {key}",
- "Content-Type": "application/json",
- }
-
- try:
- async with httpx.AsyncClient(timeout=120.0) as client:
- async with client.stream("POST", url, json=payload, headers=headers) as resp:
- if resp.status_code != 200:
- error_text = await resp.aread()
- log.error("OpenAI stream error", status=resp.status_code, body=error_text[:200])
- # Try next provider
- return
-
- tool_calls_buffer = {}
-
- async for line in resp.aiter_lines():
- if not line.startswith("data:"):
- continue
- data_str = line[6:].strip()
- if data_str == "[DONE]":
- # Flush any buffered tool calls
- if tool_calls_buffer:
- yield json.dumps({"tool_calls": list(tool_calls_buffer.values())})
- return
- try:
- data = json.loads(data_str)
- delta = data["choices"][0].get("delta", {})
-
- # Text content
- if "content" in delta and delta["content"]:
- yield delta["content"]
-
- # Tool calls
- if "tool_calls" in delta:
- for tc in delta["tool_calls"]:
- idx = tc.get("index", 0)
- if idx not in tool_calls_buffer:
- tool_calls_buffer[idx] = {
- "id": tc.get("id", ""),
- "type": "function",
- "function": {"name": "", "arguments": ""}
- }
- if tc.get("id"):
- tool_calls_buffer[idx]["id"] = tc["id"]
- fn = tc.get("function", {})
- if fn.get("name"):
- tool_calls_buffer[idx]["function"]["name"] += fn["name"]
- if fn.get("arguments"):
- tool_calls_buffer[idx]["function"]["arguments"] += fn["arguments"]
-
- # Check if complete
- try:
- args_str = tool_calls_buffer[idx]["function"]["arguments"]
- if args_str:
- json.loads(args_str) # Will raise if incomplete
- # Complete! Emit tool call
- yield json.dumps({"tool_call": tool_calls_buffer[idx]})
- del tool_calls_buffer[idx]
- except json.JSONDecodeError:
- pass # Still accumulating
-
- except (json.JSONDecodeError, KeyError, IndexError):
- pass
- except Exception as e:
- log.error("OpenAI-compat stream error", error=str(e))
-
- async def _demo_stream(self, messages: List[Dict]) -> AsyncGenerator[str, None]:
- """Demo mode when no API keys are configured."""
- last_user = next((m["content"] for m in reversed(messages) if m.get("role") == "user"), "Hello")
- response = (
- f"⚠️ **No AI API Keys Configured**\n\n"
- f"I received: *{last_user[:100]}*\n\n"
- f"To enable real AI responses, set one of these environment variables:\n"
- f"- `GEMINI_KEY` — Google Gemini (recommended, free tier available)\n"
- f"- `SAMBANOVA_KEY` — SambaNova (fast Llama models)\n"
- f"- `GITHUB_KEY` — GitHub Models (GPT-4o)\n"
- f"- `GROQ_API_KEY` — Groq (ultra-fast)\n"
- f"- `OPENAI_API_KEY` — OpenAI GPT-4\n\n"
- f"E2B sandbox execution is {'✅ configured' if E2B_API_KEY else '❌ not configured (set E2B_API_KEY)'}."
- )
- for word in response.split():
- yield word + " "
- await asyncio.sleep(0.02)
-
- async def complete(
- self,
- messages: List[Dict],
- tools: Optional[List] = None,
- temperature: float = 0.7,
- max_tokens: int = 8192,
- ) -> str:
- """Non-streaming completion."""
- full = ""
- async for chunk in self.stream_chat(messages, "", tools=tools, temperature=temperature, max_tokens=max_tokens):
- full += chunk
- return full
-
-
-# ─── Autonomous Agent — Manus-style execution loop ────────────────────────────
-class AutonomousAgent:
- """
- Real autonomous agent with:
- - Tool calling (E2B execution, file ops, shell)
- - Multi-step reasoning loop
- - Live streaming of thoughts + actions
- - Self-repair on errors
- """
-
- SYSTEM_PROMPT = """You are GOD AGENT OS — an elite autonomous AI agent like Manus/Devin.
-You EXECUTE tasks autonomously using real tools. You do NOT explain how to do things — you DO them.
-
-CRITICAL RULES:
-1. ALWAYS use tools to actually execute code, create files, run commands
-2. NEVER say "you can run this" or "try this command" — ACTUALLY RUN IT YOURSELF
-3. For ANY code task — use execute_python or execute_shell to run the real code
-4. For file operations — use write_file, read_file, delete_file tools
-5. Return REAL output: actual stdout, stderr, exit codes, file contents, timestamps
-6. If a step fails, self-repair and retry with a fix
-
-AUTONOMOUS EXECUTION PROTOCOL:
-- Think step by step
-- Use tools for every concrete action
-- Show real terminal output
-- Confirm actual results (real file sizes, real timestamps, real SHA256 hashes)
-- Complete the task end-to-end without asking for clarification
-
-You have access to: Python execution, shell commands, file system, web search.
-Always verify your work by reading back files, checking output, confirming operations."""
-
- MAX_TOOL_ITERATIONS = 20
-
- def __init__(self, ai_router: AIRouter, ws_manager: WebSocketManager, tool_router=None):
- self.ai = ai_router
- self.ws = ws_manager
- self.tool_router = tool_router
-
- async def run(
- self,
- user_message: str,
- session_id: str,
- task_id: str = "",
- ) -> AsyncGenerator[str, None]:
- """
- Run autonomous agent loop with real-time streaming.
- Yields SSE-compatible chunks.
- """
- from tools.tool_router import ToolRouter, TOOL_DEFINITIONS
- if not self.tool_router:
- self.tool_router = ToolRouter(self.ws)
-
- messages = [
- {"role": "system", "content": self.SYSTEM_PROMPT},
- {"role": "user", "content": user_message},
- ]
-
- # Emit thinking start
- await self.ws.emit_chat(session_id, "agent_thinking", {
- "task_id": task_id,
- "message": user_message[:100],
- })
-
- yield json.dumps({
- "type": "agent_start",
- "data": {"task_id": task_id, "message": user_message[:100]},
- "session_id": session_id,
- }) + "\n"
-
- iteration = 0
- full_response = ""
- current_thought = ""
- tool_results_context = []
-
- while iteration < self.MAX_TOOL_ITERATIONS:
- iteration += 1
- log.info("Agent iteration", iteration=iteration, session_id=session_id)
-
- # Emit iteration start
- await self.ws.emit_chat(session_id, "agent_iteration", {
- "iteration": iteration,
- "task_id": task_id,
- })
-
- # Stream LLM response
- current_chunk = ""
- tool_call_json = ""
- in_tool_call = False
- has_tool_call = False
-
- yield json.dumps({
- "type": "thinking_start",
- "data": {"iteration": iteration},
- "session_id": session_id,
- }) + "\n"
-
- async for chunk in self.ai.stream_chat(
- messages,
- session_id,
- tools=TOOL_DEFINITIONS,
- temperature=0.2, # Lower for tool use
- ):
- # Check if this is a tool call JSON
- if chunk.startswith('{"tool_call":') or chunk.startswith('{"tool_calls":'):
- in_tool_call = True
- has_tool_call = True
- tool_call_json = chunk
- continue
- elif chunk.startswith('{"function_call":'):
- # Gemini format
- in_tool_call = True
- has_tool_call = True
- tool_call_json = chunk
- continue
-
- # Regular text token
- current_chunk += chunk
- current_thought += chunk
- full_response += chunk
-
- # Emit token to frontend (real-time streaming)
- yield json.dumps({
- "type": "llm_chunk",
- "data": {"chunk": chunk, "iteration": iteration},
- "session_id": session_id,
- }) + "\n"
-
- await self.ws.emit_chat(session_id, "llm_chunk", {
- "chunk": chunk,
- "iteration": iteration,
- "task_id": task_id,
- })
-
- # Process tool call if present
- if has_tool_call and tool_call_json:
- try:
- tool_data = json.loads(tool_call_json)
-
- # Handle both single tool_call and tool_calls array
- tool_calls = []
- if "tool_call" in tool_data:
- tool_calls = [tool_data["tool_call"]]
- elif "tool_calls" in tool_data:
- tool_calls = tool_data["tool_calls"]
- elif "function_call" in tool_data:
- # Gemini format
- fc = tool_data["function_call"]
- tool_calls = [{
- "id": uuid.uuid4().hex[:8],
- "type": "function",
- "function": {"name": fc.get("name", ""), "arguments": json.dumps(fc.get("args", {}))}
- }]
-
- for tc in tool_calls:
- fn = tc.get("function", {})
- tool_name = fn.get("name", "")
- try:
- tool_args = json.loads(fn.get("arguments", "{}"))
- except Exception:
- tool_args = {}
-
- if not tool_name:
- continue
-
- log.info("Executing tool", tool=tool_name, args=str(tool_args)[:100])
-
- # Emit tool execution start
- yield json.dumps({
- "type": "tool_executing",
- "data": {
- "tool": tool_name,
- "args": {k: str(v)[:200] for k, v in tool_args.items()},
- "task_id": task_id,
- },
- "session_id": session_id,
- }) + "\n"
-
- await self.ws.emit_chat(session_id, "computer_use_step", {
- "type": self._get_step_type(tool_name),
- "title": f"{tool_name}: {str(tool_args)[:80]}",
- "task_id": task_id,
- "status": "running",
- })
-
- # ACTUALLY EXECUTE THE TOOL
- tool_result = await self.tool_router.execute_tool(
- tool_name, tool_args, session_id, task_id
- )
-
- formatted = self.tool_router.format_tool_result(tool_name, tool_result)
-
- # Emit tool result
- yield json.dumps({
- "type": "tool_result",
- "data": {
- "tool": tool_name,
- "result": formatted[:2000],
- "raw": {k: str(v)[:500] for k, v in tool_result.items()},
- "success": tool_result.get("success", True),
- "sandbox_id": tool_result.get("sandbox_id", "local"),
- "task_id": task_id,
- },
- "session_id": session_id,
- }) + "\n"
-
- await self.ws.emit_chat(session_id, "computer_use_step", {
- "type": self._get_step_type(tool_name),
- "title": f"✅ {tool_name} completed",
- "detail": str(tool_result.get("stdout", tool_result.get("output", "")))[:200],
- "task_id": task_id,
- "status": "done",
- })
-
- # Add to context for next LLM call
- tool_results_context.append({
- "tool": tool_name,
- "args": tool_args,
- "result": formatted[:3000],
- "raw_result": tool_result,
- })
-
- # Add assistant message with tool call + result to messages
- messages.append({
- "role": "assistant",
- "content": current_thought or f"Executing {tool_name}...",
- })
- messages.append({
- "role": "user",
- "content": f"Tool execution result for {tool_name}:\n{formatted[:3000]}\n\nContinue with the task based on this result.",
- })
-
- except Exception as e:
- log.error("Tool call parsing error", error=str(e), json=tool_call_json[:200])
- messages.append({
- "role": "assistant",
- "content": current_thought,
- })
- messages.append({
- "role": "user",
- "content": f"Tool execution error: {str(e)}. Please continue.",
- })
-
- current_thought = ""
- # Continue the loop for next iteration
- continue
-
- else:
- # No tool calls — LLM gave a final text response
- # Add final response to messages
- if current_thought.strip():
- messages.append({
- "role": "assistant",
- "content": current_thought,
- })
-
- # Task complete
- yield json.dumps({
- "type": "agent_complete",
- "data": {
- "task_id": task_id,
- "result": full_response[:500],
- "iterations": iteration,
- "tools_called": len(tool_results_context),
- },
- "session_id": session_id,
- }) + "\n"
-
- await self.ws.emit_chat(session_id, "agent_complete", {
- "task_id": task_id,
- "iterations": iteration,
- "tools_called": len(tool_results_context),
- })
-
- yield json.dumps({
- "type": "stream_end",
- "data": {"full_response": full_response, "task_id": task_id},
- "session_id": session_id,
- }) + "\n"
- return
-
- # Max iterations reached
- yield json.dumps({
- "type": "agent_complete",
- "data": {"task_id": task_id, "result": "Max iterations reached", "iterations": iteration},
- "session_id": session_id,
- }) + "\n"
- yield json.dumps({
- "type": "stream_end",
- "data": {"full_response": full_response},
- "session_id": session_id,
- }) + "\n"
-
- def _get_step_type(self, tool_name: str) -> str:
- mapping = {
- "execute_python": "coding",
- "execute_shell": "terminal",
- "write_file": "file",
- "read_file": "file",
- "delete_file": "file",
- "list_files": "file",
- "web_search": "browsing",
- "install_package": "terminal",
- }
- return mapping.get(tool_name, "executing")
-
-
-# ─── Session/Task State Manager ───────────────────────────────────────────────
-class SessionManager:
- def __init__(self):
- self._sessions: Dict[str, Dict] = {}
- self._computer_use: Dict[str, List] = {}
-
- def get_or_create(self, session_id: str) -> Dict:
- if session_id not in self._sessions:
- self._sessions[session_id] = {
- "id": session_id,
- "created_at": time.time(),
- "last_active": time.time(),
- "message_count": 0,
- "task_ids": [],
- "status": "active",
- }
- return self._sessions[session_id]
-
- def add_task(self, session_id: str, task_id: str):
- sess = self.get_or_create(session_id)
- sess["task_ids"].append(task_id)
- sess["last_active"] = time.time()
-
- def add_computer_use_step(self, session_id: str, step_type: str, data: Dict):
- if session_id not in self._computer_use:
- self._computer_use[session_id] = []
- self._computer_use[session_id].append({
- "id": uuid.uuid4().hex[:8],
- "type": step_type,
- "data": data,
- "ts": time.time(),
- "status": data.get("status", "running"),
- })
- # Keep last 200 steps
- self._computer_use[session_id] = self._computer_use[session_id][-200:]
-
- def get_computer_use_steps(self, session_id: str) -> List:
- return self._computer_use.get(session_id, [])
-
- def get_session(self, session_id: str) -> Optional[Dict]:
- return self._sessions.get(session_id)
-
- def list_sessions(self) -> List[Dict]:
- return list(self._sessions.values())
-
-
-# ─── App Factory ──────────────────────────────────────────────────────────────
-ws_manager = WebSocketManager()
-ai_router = AIRouter()
-session_manager = SessionManager()
-agent: Optional[AutonomousAgent] = None
-
-
-@asynccontextmanager
-async def lifespan(app: FastAPI):
- global agent
- log.info("🚀 GOD AGENT OS v12 starting — TRUE AUTONOMOUS RUNTIME")
- log.info(f"E2B sandbox: {'✅ configured' if E2B_API_KEY else '⚠️ not configured (local fallback)'}")
-
- ai_stats = ai_router.get_stats()
- active = [p for p, s in ai_stats.items() if s["available"]]
- log.info(f"AI providers: {active or ['demo mode']}")
-
- # Init agent
- from tools.tool_router import ToolRouter
- tool_router = ToolRouter(ws_manager)
- agent = AutonomousAgent(ai_router, ws_manager, tool_router)
-
- # Start heartbeat
- asyncio.create_task(ws_manager.heartbeat_loop())
-
- # Init DB
- try:
- from memory.db import init_db
- await init_db()
- except Exception as e:
- log.warning("DB init skipped", error=str(e))
-
- log.info("✅ GOD AGENT OS v12 ready — Real execution enabled")
- yield
- log.info("Shutting down GOD AGENT OS v12...")
-
-
-app = FastAPI(
- title="GOD AGENT OS v12",
- description="True Autonomous Agent Runtime — Real E2B Execution + Live Streaming",
- version="12.0.0",
- docs_url="/api/docs",
- redoc_url="/api/redoc",
- lifespan=lifespan,
-)
-
-app.state.limiter = limiter
-app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
-app.add_middleware(GZipMiddleware, minimum_size=1000)
-app.add_middleware(
- CORSMiddleware,
- allow_origins=["*"],
- allow_credentials=True,
- allow_methods=["*"],
- allow_headers=["*"],
-)
-
-# Share state
-app.state.ws_manager = ws_manager
-app.state.ai_router = ai_router
-app.state.session_manager = session_manager
-
-
-# ─── Health ────────────────────────────────────────────────────────────────────
-@app.get("/health")
-@app.get("/api/v1/health")
-async def health():
- ai_stats = ai_router.get_stats()
- active_providers = [p for p, s in ai_stats.items() if s["available"]]
- return {
- "status": "healthy",
- "version": "12.0.0",
- "timestamp": time.time(),
- "e2b": bool(E2B_API_KEY),
- "ai_providers": active_providers,
- "ws_connections": ws_manager.stats()["connections"],
- "mode": "autonomous_agent",
- "features": {
- "real_execution": True,
- "e2b_sandbox": bool(E2B_API_KEY),
- "local_fallback": True,
- "streaming": True,
- "tool_calling": True,
- "file_ops": True,
- "shell_exec": True,
- }
- }
-
-
-@app.get("/")
-async def root():
- return {
- "name": "GOD AGENT OS v12",
- "version": "12.0.0",
- "status": "operational",
- "mode": "AUTONOMOUS_AGENT",
- "docs": "/api/docs",
- "health": "/health",
- "execution": "real_e2b_sandbox" if E2B_API_KEY else "local_subprocess",
- }
-
-
-# ─── Chat (SSE streaming with real tool execution) ────────────────────────────
-
-@app.post("/api/v1/chat")
-async def chat(request: Request):
- body = await request.json()
- messages = body.get("messages", [])
- stream = body.get("stream", True)
- session_id = body.get("session_id") or uuid.uuid4().hex[:12]
-
- if not messages:
- raise HTTPException(status_code=400, detail="messages required")
-
- # Get last user message
- user_message = next(
- (m["content"] for m in reversed(messages) if m.get("role") == "user"), ""
- )
-
- sess = session_manager.get_or_create(session_id)
- sess["message_count"] = sess.get("message_count", 0) + 1
-
- task_id = uuid.uuid4().hex[:12]
- session_manager.add_task(session_id, task_id)
-
- if stream:
- async def stream_gen():
- try:
- async for chunk in agent.run(user_message, session_id, task_id):
- yield f"data: {chunk}\n"
- except Exception as e:
- log.error("Stream error", error=str(e))
- yield f"data: {json.dumps({'type': 'error', 'data': {'error': str(e)}, 'session_id': session_id})}\n\n"
-
- return StreamingResponse(
- stream_gen(),
- media_type="text/event-stream",
- headers={
- "Cache-Control": "no-cache",
- "X-Accel-Buffering": "no",
- "Connection": "keep-alive",
- },
- )
- else:
- # Non-streaming: collect full response
- full = ""
- async for chunk in agent.run(user_message, session_id, task_id):
- try:
- data = json.loads(chunk)
- if data.get("type") == "llm_chunk":
- full += data.get("data", {}).get("chunk", "")
- elif data.get("type") == "stream_end":
- full = data.get("data", {}).get("full_response", full)
- break
- except Exception:
- pass
-
- return JSONResponse({
- "response": full,
- "task_id": task_id,
- "session_id": session_id,
- "timestamp": time.time(),
- })
-
-
-@app.post("/api/v1/chat/stream")
-async def chat_stream(request: Request):
- body = await request.json()
- body["stream"] = True
- # Rebuild request-like object
- from fastapi import Request as FR
- import io
- new_body = json.dumps(body).encode()
- # Patch the request body
- async def receive():
- return {"type": "http.request", "body": new_body}
- request._receive = receive
- return await chat(request)
-
-
-@app.post("/api/v1/orchestrate")
-async def orchestrate(request: Request):
- body = await request.json()
- message = body.get("message", "")
- session_id = body.get("session_id") or uuid.uuid4().hex[:12]
- stream = body.get("stream", False)
-
- if not message:
- raise HTTPException(status_code=400, detail="message required")
-
- task_id = uuid.uuid4().hex[:12]
- session_manager.add_task(session_id, task_id)
-
- if stream:
- async def stream_gen():
- async for chunk in agent.run(message, session_id, task_id):
- yield f"data: {chunk}\n"
-
- return StreamingResponse(
- stream_gen(),
- media_type="text/event-stream",
- headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
- )
-
- # Non-streaming
- full = ""
- tool_results = []
- async for chunk in agent.run(message, session_id, task_id):
- try:
- data = json.loads(chunk)
- if data.get("type") == "llm_chunk":
- full += data.get("data", {}).get("chunk", "")
- elif data.get("type") == "tool_result":
- tool_results.append(data.get("data", {}))
- elif data.get("type") == "stream_end":
- full = data.get("data", {}).get("full_response", full)
- break
- except Exception:
- pass
-
- return {
- "task_id": task_id,
- "session_id": session_id,
- "result": full,
- "tool_results": tool_results,
- "status": "complete",
- "timestamp": time.time(),
- }
-
-
-# ─── Direct Tool Execution ─────────────────────────────────────────────────────
-@app.post("/api/v1/execute")
-async def execute_tool(request: Request):
- """Direct tool execution endpoint."""
- body = await request.json()
- tool_name = body.get("tool", "")
- tool_args = body.get("args", {})
- session_id = body.get("session_id") or uuid.uuid4().hex[:12]
- task_id = body.get("task_id") or uuid.uuid4().hex[:8]
-
- if not tool_name:
- raise HTTPException(status_code=400, detail="tool name required")
-
- from tools.tool_router import ToolRouter
- router = ToolRouter(ws_manager)
- result = await router.execute_tool(tool_name, tool_args, session_id, task_id)
- formatted = router.format_tool_result(tool_name, result)
-
- return {
- "tool": tool_name,
- "args": tool_args,
- "result": result,
- "formatted": formatted,
- "session_id": session_id,
- "task_id": task_id,
- "timestamp": time.time(),
- }
-
-
-# ─── Sandbox Session Info ──────────────────────────────────────────────────────
-@app.get("/api/v1/sandbox/{session_id}")
-async def get_sandbox_info(session_id: str):
- from sandbox.e2b_executor import get_executor
- executor = get_executor()
- info = executor.get_session_info(session_id)
- return {
- "session_id": session_id,
- "sandbox": info,
- "e2b_configured": bool(E2B_API_KEY),
- }
-
-
-@app.delete("/api/v1/sandbox/{session_id}")
-async def close_sandbox(session_id: str):
- from sandbox.e2b_executor import get_executor
- executor = get_executor()
- await executor.close_session(session_id)
- return {"status": "closed", "session_id": session_id}
-
-
-# ─── Computer Use Steps ────────────────────────────────────────────────────────
-@app.get("/api/v1/computer-use/{session_id}")
-async def get_computer_use(session_id: str):
- steps = session_manager.get_computer_use_steps(session_id)
- return {
- "session_id": session_id,
- "steps": steps,
- "count": len(steps),
- "status": "complete" if steps and steps[-1].get("status") == "done" else "running" if steps else "idle",
- }
-
-
-# ─── WebSocket Endpoints ───────────────────────────────────────────────────────
-@app.websocket("/ws/{session_id}")
-async def ws_endpoint(websocket: WebSocket, session_id: str):
- await ws_manager.connect(websocket, f"chat:{session_id}")
- session_manager.get_or_create(session_id)
-
- try:
- while True:
- data = await websocket.receive_json()
- event_type = data.get("type", "")
-
- if event_type == "ping":
- await websocket.send_json({"type": "pong", "ts": time.time()})
-
- elif event_type == "message":
- message = data.get("message", "")
- task_id = uuid.uuid4().hex[:12]
- session_manager.add_task(session_id, task_id)
-
- await ws_manager.emit_chat(session_id, "task_start", {
- "task_id": task_id,
- "message": message[:100],
- })
-
- # Run agent asynchronously
- asyncio.create_task(_ws_run_agent(message, session_id, task_id))
-
- elif event_type == "execute":
- # Direct tool execution via WebSocket
- tool_name = data.get("tool", "")
- tool_args = data.get("args", {})
- task_id = data.get("task_id", uuid.uuid4().hex[:8])
-
- if tool_name:
- from tools.tool_router import ToolRouter
- router = ToolRouter(ws_manager)
- result = await router.execute_tool(tool_name, tool_args, session_id, task_id)
- formatted = router.format_tool_result(tool_name, result)
- await websocket.send_json({
- "type": "tool_result",
- "tool": tool_name,
- "result": result,
- "formatted": formatted,
- "task_id": task_id,
- })
-
- elif event_type == "stop":
- await ws_manager.emit_chat(session_id, "task_stopped", {})
-
- except WebSocketDisconnect:
- ws_manager.disconnect(websocket, f"chat:{session_id}")
-
-
-@app.websocket("/ws/computer-use/{session_id}")
-async def ws_computer_use(websocket: WebSocket, session_id: str):
- await websocket.accept()
- last_count = 0
- try:
- while True:
- steps = session_manager.get_computer_use_steps(session_id)
- if len(steps) > last_count:
- for step in steps[last_count:]:
- await websocket.send_json({
- "type": "computer_use_step",
- "step": step,
- "session_id": session_id,
- })
- last_count = len(steps)
- await asyncio.sleep(0.3)
- except WebSocketDisconnect:
- pass
- except Exception:
- pass
-
-
-async def _ws_run_agent(message: str, session_id: str, task_id: str):
- """Run agent and send results via WebSocket."""
- try:
- async for chunk in agent.run(message, session_id, task_id):
- try:
- data = json.loads(chunk)
- await ws_manager.emit_chat(session_id, data.get("type", "chunk"), data.get("data", {}))
- except Exception:
- pass
- await ws_manager.emit_chat(session_id, "task_complete", {"task_id": task_id})
- except Exception as e:
- await ws_manager.emit_chat(session_id, "task_error", {"task_id": task_id, "error": str(e)})
-
-
-# ─── AI Stats ──────────────────────────────────────────────────────────────────
-@app.get("/api/v1/ai/stats")
-async def ai_stats():
- return {"stats": ai_router.get_stats(), "active": ai_router.get_active_provider()}
-
-
-@app.get("/api/v1/ai/pool-status")
-async def ai_pool_status():
- return {"pools": ai_router.get_stats()}
-
-
-@app.get("/api/v1/system/status")
-async def system_status():
- ai_stats = ai_router.get_stats()
- return {
- "system": "god_agent_os_v12",
- "status": "operational",
- "timestamp": time.time(),
- "version": "12.0.0",
- "execution_mode": "e2b_sandbox" if E2B_API_KEY else "local_subprocess",
- "ai_providers": {p: s["available"] for p, s in ai_stats.items()},
- "active_provider": ai_router.get_active_provider(),
- "sessions": len(session_manager.list_sessions()),
- "features": {
- "real_execution": True,
- "e2b_sandbox": bool(E2B_API_KEY),
- "tool_calling": True,
- "streaming": True,
- "websocket": True,
- "computer_use": True,
- "self_repair": True,
- }
- }
-
-
-# ─── Agents + Spaces (compatibility with frontend) ────────────────────────────
-AGENTS_LIST = [
- {"name": "chat", "status": "active", "role": "Conversation + Orchestration"},
- {"name": "coding", "status": "active", "role": "Code Generation + Review"},
- {"name": "sandbox", "status": "active", "role": f"Execution ({'E2B' if E2B_API_KEY else 'Local'})"},
- {"name": "planner", "status": "active", "role": "Task Planning"},
- {"name": "debug", "status": "active", "role": "Debugging + Error Analysis"},
- {"name": "file", "status": "active", "role": "File System Operations"},
- {"name": "git", "status": "active", "role": "Git + GitHub Operations"},
- {"name": "deploy", "status": "active", "role": "Deployment Automation"},
- {"name": "browser", "status": "active", "role": "Web Browsing + Research"},
- {"name": "memory", "status": "active", "role": "Long-term Memory"},
- {"name": "test", "status": "active", "role": "Test Generation + Running"},
- {"name": "vision", "status": "active", "role": "UI Generation + Vision"},
- {"name": "workflow", "status": "active", "role": "Workflow Automation"},
- {"name": "connector", "status": "active", "role": "External Integrations"},
- {"name": "reasoning", "status": "active", "role": "Deep Reasoning + Analysis"},
- {"name": "ui", "status": "active", "role": "UI/UX Generation"},
-]
-
-
-@app.get("/api/v1/agents")
-async def list_agents():
- return {"agents": AGENTS_LIST, "total": len(AGENTS_LIST)}
-
-
-@app.post("/api/v1/agents/{agent_name}/run")
-async def run_agent(agent_name: str, request: Request):
- body = await request.json()
- task = body.get("task", "")
- session_id = body.get("session_id") or uuid.uuid4().hex[:12]
- task_id = uuid.uuid4().hex[:12]
-
- # Route to autonomous agent
- full = ""
- async for chunk in agent.run(task, session_id, task_id):
- try:
- data = json.loads(chunk)
- if data.get("type") == "llm_chunk":
- full += data.get("data", {}).get("chunk", "")
- elif data.get("type") == "stream_end":
- break
- except Exception:
- pass
-
- return {"agent": agent_name, "task_id": task_id, "result": full, "status": "complete"}
-
-
-SPACES_LIST = [
- {"id": "god-core", "name": "God Core", "role": "orchestration", "icon": "🧠", "status": "active"},
- {"id": "coding", "name": "Coding Worker", "role": "code_generation", "icon": "⚡", "status": "active"},
- {"id": "sandbox", "name": "Sandbox", "role": "execution", "icon": "🔧", "status": "active",
- "backend": "e2b" if E2B_API_KEY else "local"},
- {"id": "terminal", "name": "Terminal", "role": "shell", "icon": "🖥️", "status": "active"},
- {"id": "filesystem", "name": "FileSystem", "role": "files", "icon": "📁", "status": "active"},
- {"id": "browser", "name": "Browser", "role": "research", "icon": "🌐", "status": "active"},
- {"id": "git", "name": "Git Worker", "role": "git", "icon": "🔀", "status": "active"},
- {"id": "deploy", "name": "Deploy Worker", "role": "deployment", "icon": "🚀", "status": "active"},
- {"id": "memory", "name": "Memory", "role": "memory", "icon": "💾", "status": "active"},
- {"id": "debug", "name": "Debug", "role": "debugging", "icon": "🐛", "status": "active"},
- {"id": "test", "name": "Testing", "role": "testing", "icon": "🧪", "status": "active"},
- {"id": "model-router", "name": "Model Router", "role": "ai_routing", "icon": "🤖", "status": "active"},
-]
-
-
-@app.get("/api/v1/spaces")
-async def get_spaces():
- return {
- "spaces": SPACES_LIST,
- "total": len(SPACES_LIST),
- "active": len(SPACES_LIST),
- "execution_backend": "e2b" if E2B_API_KEY else "local_subprocess",
- }
-
-
-# ─── Memory (compatibility) ────────────────────────────────────────────────────
-@app.get("/api/v1/memory/")
-async def get_memory(session_id: str = ""):
- try:
- from memory.db import get_history
- history = await get_history(session_id=session_id, limit=50)
- return {"memories": history, "total": len(history)}
- except Exception:
- return {"memories": [], "total": 0}
-
-
-@app.post("/api/v1/memory/")
-async def save_memory_entry(request: Request):
- body = await request.json()
- try:
- from memory.db import save_memory
- await save_memory(
- content=body.get("content", ""),
- memory_type=body.get("type", "general"),
- session_id=body.get("session_id", ""),
- key=body.get("key", ""),
- )
- return {"status": "saved"}
- except Exception as e:
- return {"status": "error", "error": str(e)}
-
-
-# ─── Tasks (compatibility) ─────────────────────────────────────────────────────
-@app.get("/api/v1/tasks/")
-async def get_tasks():
- try:
- from memory.db import get_task
- return {"tasks": [], "total": 0}
- except Exception:
- return {"tasks": [], "total": 0}
-
-
-@app.post("/api/v1/chat/goal")
-async def submit_goal(request: Request):
- body = await request.json()
- goal = body.get("goal", "")
- session_id = body.get("session_id") or uuid.uuid4().hex[:12]
- task_id = uuid.uuid4().hex[:12]
- session_manager.add_task(session_id, task_id)
-
- return {
- "task_id": task_id,
- "goal": goal,
- "status": "queued",
- "session_id": session_id,
- "ws_url": f"/ws/{session_id}",
- "stream_url": f"/api/v1/chat",
- }
-
-
-# ─── GitHub (compatibility) ────────────────────────────────────────────────────
-@app.get("/api/v1/github/repos")
-async def github_repos():
- return {"repos": [], "message": "Set GITHUB_TOKEN for GitHub integration"}
-
-
-# ─── Connectors (compatibility) ────────────────────────────────────────────────
-@app.get("/api/v1/connectors")
-async def get_connectors():
- connectors = [
- {"id": "e2b", "name": "E2B Sandbox", "type": "execution",
- "connected": bool(E2B_API_KEY), "status": "active" if E2B_API_KEY else "needs_key"},
- {"id": "gemini", "name": "Google Gemini", "type": "ai",
- "connected": bool(GEMINI_KEY), "status": "active" if GEMINI_KEY else "needs_key"},
- {"id": "github", "name": "GitHub Models", "type": "ai",
- "connected": bool(GITHUB_KEY), "status": "active" if GITHUB_KEY else "needs_key"},
- {"id": "sambanova", "name": "SambaNova", "type": "ai",
- "connected": bool(SAMBANOVA_KEY), "status": "active" if SAMBANOVA_KEY else "needs_key"},
- ]
- return {"connectors": connectors, "total": len(connectors)}
-
-
-if __name__ == "__main__":
- import uvicorn
- port = int(os.environ.get("PORT", 7860))
- uvicorn.run("main_v12:app", host="0.0.0.0", port=port, reload=False, workers=1)
diff --git a/memory/__init__.py b/memory/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/memory/db.py b/memory/db.py
deleted file mode 100644
index 6fecd889cd5c43556171674ca8157677452162e5..0000000000000000000000000000000000000000
--- a/memory/db.py
+++ /dev/null
@@ -1,311 +0,0 @@
-"""
-Production SQLite Database — Async via aiosqlite
-Handles tasks, memory, sessions, events
-"""
-
-import aiosqlite
-import os
-import pathlib
-import json
-import time
-from typing import Optional, List, Dict, Any
-import structlog
-
-log = structlog.get_logger()
-
-import pathlib
-
-# Use /data for HuggingFace persistent storage, fallback to /tmp for local dev
-_default_db = "/data/god_agent_os.db" if os.path.isdir("/data") else "/tmp/god_agent_os.db"
-DB_PATH = os.environ.get("DB_PATH", _default_db)
-
-# Ensure the directory exists before SQLite tries to open the file
-_db_dir = str(pathlib.Path(DB_PATH).parent)
-os.makedirs(_db_dir, exist_ok=True)
-
-
-async def get_db() -> aiosqlite.Connection:
- db = await aiosqlite.connect(DB_PATH)
- db.row_factory = aiosqlite.Row
- await db.execute("PRAGMA journal_mode=WAL")
- await db.execute("PRAGMA foreign_keys=ON")
- return db
-
-
-async def init_db():
- """Initialize all tables."""
- log.info("Initializing database", path=DB_PATH)
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute("PRAGMA journal_mode=WAL")
- await db.execute("PRAGMA foreign_keys=ON")
-
- # Tasks table
- await db.execute("""
- CREATE TABLE IF NOT EXISTS tasks (
- id TEXT PRIMARY KEY,
- session_id TEXT,
- project_id TEXT,
- goal TEXT NOT NULL,
- status TEXT DEFAULT 'queued',
- plan TEXT,
- result TEXT,
- error TEXT,
- metadata TEXT DEFAULT '{}',
- created_at REAL,
- started_at REAL,
- completed_at REAL,
- retry_count INTEGER DEFAULT 0
- )
- """)
-
- # Task events table
- await db.execute("""
- CREATE TABLE IF NOT EXISTS task_events (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- task_id TEXT NOT NULL,
- event_type TEXT NOT NULL,
- data TEXT DEFAULT '{}',
- timestamp REAL,
- FOREIGN KEY (task_id) REFERENCES tasks(id)
- )
- """)
-
- # Memory table
- await db.execute("""
- CREATE TABLE IF NOT EXISTS memory (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- session_id TEXT,
- project_id TEXT,
- memory_type TEXT NOT NULL,
- key TEXT,
- content TEXT NOT NULL,
- metadata TEXT DEFAULT '{}',
- embedding TEXT,
- created_at REAL,
- updated_at REAL
- )
- """)
-
- # Sessions table
- await db.execute("""
- CREATE TABLE IF NOT EXISTS sessions (
- id TEXT PRIMARY KEY,
- project_id TEXT,
- user_id TEXT,
- metadata TEXT DEFAULT '{}',
- created_at REAL,
- last_active REAL
- )
- """)
-
- # GitHub operations table
- await db.execute("""
- CREATE TABLE IF NOT EXISTS github_ops (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- task_id TEXT,
- operation TEXT NOT NULL,
- repo TEXT,
- branch TEXT,
- status TEXT DEFAULT 'pending',
- result TEXT,
- created_at REAL
- )
- """)
-
- # Indexes
- await db.execute("CREATE INDEX IF NOT EXISTS idx_tasks_session ON tasks(session_id)")
- await db.execute("CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status)")
- await db.execute("CREATE INDEX IF NOT EXISTS idx_events_task ON task_events(task_id)")
- await db.execute("CREATE INDEX IF NOT EXISTS idx_memory_session ON memory(session_id)")
- await db.execute("CREATE INDEX IF NOT EXISTS idx_memory_project ON memory(project_id)")
- await db.execute("CREATE INDEX IF NOT EXISTS idx_memory_type ON memory(memory_type)")
-
- await db.commit()
- log.info("✅ Database initialized")
-
-
-# ─── Task CRUD ─────────────────────────────────────────────────────────────────
-
-async def create_task(task_id: str, goal: str, session_id: str = "", project_id: str = "", metadata: dict = {}):
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute("""
- INSERT INTO tasks (id, session_id, project_id, goal, status, metadata, created_at)
- VALUES (?, ?, ?, ?, 'queued', ?, ?)
- """, (task_id, session_id, project_id, goal, json.dumps(metadata), time.time()))
- await db.commit()
-
-
-async def update_task_status(task_id: str, status: str, **kwargs):
- fields = ["status = ?"]
- values = [status]
- if status == "executing":
- fields.append("started_at = ?")
- values.append(time.time())
- if status in ("completed", "failed", "cancelled"):
- fields.append("completed_at = ?")
- values.append(time.time())
- for k, v in kwargs.items():
- if k in ("plan", "result", "error"):
- fields.append(f"{k} = ?")
- values.append(v if isinstance(v, str) else json.dumps(v))
- elif k == "retry_count":
- fields.append("retry_count = ?")
- values.append(v)
- values.append(task_id)
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute(f"UPDATE tasks SET {', '.join(fields)} WHERE id = ?", values)
- await db.commit()
-
-
-async def get_task(task_id: str) -> Optional[Dict]:
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- async with db.execute("SELECT * FROM tasks WHERE id = ?", (task_id,)) as cursor:
- row = await cursor.fetchone()
- if row:
- d = dict(row)
- d["metadata"] = json.loads(d.get("metadata") or "{}")
- d["plan"] = json.loads(d["plan"]) if d.get("plan") else None
- return d
- return None
-
-
-async def list_tasks(session_id: str = "", limit: int = 50) -> List[Dict]:
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- if session_id:
- async with db.execute(
- "SELECT * FROM tasks WHERE session_id = ? ORDER BY created_at DESC LIMIT ?",
- (session_id, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- else:
- async with db.execute(
- "SELECT * FROM tasks ORDER BY created_at DESC LIMIT ?", (limit,)
- ) as cursor:
- rows = await cursor.fetchall()
- return [dict(r) for r in rows]
-
-
-async def save_task_event(task_id: str, event_type: str, data: dict = {}):
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute("""
- INSERT INTO task_events (task_id, event_type, data, timestamp)
- VALUES (?, ?, ?, ?)
- """, (task_id, event_type, json.dumps(data), time.time()))
- await db.commit()
-
-
-async def get_task_events(task_id: str) -> List[Dict]:
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- async with db.execute(
- "SELECT * FROM task_events WHERE task_id = ? ORDER BY timestamp ASC", (task_id,)
- ) as cursor:
- rows = await cursor.fetchall()
- return [dict(r) for r in rows]
-
-
-# ─── Memory CRUD ───────────────────────────────────────────────────────────────
-
-async def save_memory(
- content: str,
- memory_type: str,
- session_id: str = "",
- project_id: str = "",
- key: str = "",
- metadata: dict = {}
-):
- now = time.time()
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute("""
- INSERT INTO memory (session_id, project_id, memory_type, key, content, metadata, created_at, updated_at)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
- """, (session_id, project_id, memory_type, key, content, json.dumps(metadata), now, now))
- await db.commit()
-
-
-async def search_memory(query: str, session_id: str = "", project_id: str = "", limit: int = 20) -> List[Dict]:
- """Simple keyword search (upgrade to vector search in production)."""
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- q = f"%{query}%"
- if session_id:
- async with db.execute(
- "SELECT * FROM memory WHERE session_id = ? AND content LIKE ? ORDER BY updated_at DESC LIMIT ?",
- (session_id, q, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- elif project_id:
- async with db.execute(
- "SELECT * FROM memory WHERE project_id = ? AND content LIKE ? ORDER BY updated_at DESC LIMIT ?",
- (project_id, q, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- else:
- async with db.execute(
- "SELECT * FROM memory WHERE content LIKE ? ORDER BY updated_at DESC LIMIT ?",
- (q, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- return [dict(r) for r in rows]
-
-
-async def get_project_memory(project_id: str, memory_type: str = "", limit: int = 100) -> List[Dict]:
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- if memory_type:
- async with db.execute(
- "SELECT * FROM memory WHERE project_id = ? AND memory_type = ? ORDER BY updated_at DESC LIMIT ?",
- (project_id, memory_type, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- else:
- async with db.execute(
- "SELECT * FROM memory WHERE project_id = ? ORDER BY updated_at DESC LIMIT ?",
- (project_id, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- return [dict(r) for r in rows]
-
-
-async def get_history(session_id: str, limit: int = 50) -> List[Dict]:
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- async with db.execute(
- "SELECT * FROM memory WHERE session_id = ? AND memory_type = 'conversation' ORDER BY created_at DESC LIMIT ?",
- (session_id, limit)
- ) as cursor:
- rows = await cursor.fetchall()
- return [dict(r) for r in rows]
-
-
-async def list_sessions(limit: int = 50) -> List[Dict]:
- """List all sessions from the sessions table."""
- async with aiosqlite.connect(DB_PATH) as db:
- db.row_factory = aiosqlite.Row
- async with db.execute(
- "SELECT * FROM sessions ORDER BY last_active DESC LIMIT ?", (limit,)
- ) as cursor:
- rows = await cursor.fetchall()
- return [dict(r) for r in rows]
-
-
-async def upsert_session(session_id: str, project_id: str = "", user_id: str = "", metadata: dict = {}):
- """Create or update a session record."""
- now = time.time()
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute("""
- INSERT INTO sessions (id, project_id, user_id, metadata, created_at, last_active)
- VALUES (?, ?, ?, ?, ?, ?)
- ON CONFLICT(id) DO UPDATE SET last_active = ?, metadata = ?
- """, (session_id, project_id, user_id, json.dumps(metadata), now, now, now, json.dumps(metadata)))
- await db.commit()
-
-
-async def delete_session(session_id: str):
- """Delete a session and its memories."""
- async with aiosqlite.connect(DB_PATH) as db:
- await db.execute("DELETE FROM sessions WHERE id = ?", (session_id,))
- await db.execute("DELETE FROM memory WHERE session_id = ?", (session_id,))
- await db.commit()
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index e81f707673d506bf6d3ca3ba8140160015c3934a..0000000000000000000000000000000000000000
--- a/requirements.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# God Agent OS — Phase 1 (stability-first)
-fastapi==0.115.0
-uvicorn[standard]==0.30.6
-httpx[http2]==0.27.2
-pydantic>=2.8.2,<3
-python-multipart==0.0.9
-structlog==24.4.0
-python-dotenv==1.0.1
-# Real sandbox runtime
-e2b==1.0.5
-e2b-code-interpreter==1.0.5
-# WS support
-websockets==13.1
diff --git a/requirements_v12.txt b/requirements_v12.txt
deleted file mode 100644
index 47e293583a028bf2c8b441681eb493b2496bbfe0..0000000000000000000000000000000000000000
--- a/requirements_v12.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-# GOD AGENT OS v12 — Real Autonomous Agent Runtime
-# Minimal dependencies — focused on actual execution
-
-# Core Framework
-fastapi==0.115.0
-uvicorn[standard]==0.30.0
-websockets==13.0
-pydantic==2.8.0
-python-multipart==0.0.9
-
-# HTTP + Async
-httpx[http2]==0.27.0
-aiohttp==3.10.0
-
-# Database
-aiosqlite==0.20.0
-sqlalchemy[asyncio]==2.0.35
-
-# E2B Sandbox (real code execution)
-e2b==1.0.5
-e2b-code-interpreter==1.0.5
-
-# Utilities
-python-dotenv==1.0.1
-slowapi==0.1.9
-structlog==24.4.0
-rich==13.8.0
-psutil==6.0.0
-
-# Git + GitHub
-gitpython==3.1.43
-pygithub==2.3.0
diff --git a/requirements_v3.txt b/requirements_v3.txt
deleted file mode 100644
index 0161b1c91d3e4d62c60102c1f3ce89b133db4322..0000000000000000000000000000000000000000
--- a/requirements_v3.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-# 🚀 GOD MODE+ v3 - Enhanced Backend Dependencies
-
-# Core Framework
-fastapi==0.115.0
-uvicorn[standard]==0.30.0
-websockets==13.0
-pydantic==2.8.0
-pydantic-settings==2.3.0
-
-# Authentication & Security
-python-jose[cryptography]==3.3.0
-python-multipart==0.0.9
-passlib[bcrypt]==1.7.4
-cryptography==43.0.0
-
-# HTTP & Async
-aiohttp==3.10.0
-aiosqlite==0.20.0
-httpx==0.28.0
-
-# Database & ORM
-sqlalchemy[asyncio]==2.0.35
-alembic==1.13.2
-
-# AI & LLM
-openai==1.35.0
-anthropic==0.30.0
-groq==0.9.0
-together==1.1.0
-
-# Advanced AI Frameworks
-langchain==0.2.0
-langchain-core==0.2.0
-langchain-community==0.2.0
-langgraph==0.1.0
-langsmith==0.1.0
-
-# Vector Database & Embeddings
-pinecone-client==4.0.0
-weaviate-client==4.1.0
-sentence-transformers==3.0.0
-
-# Code & Git
-gitpython==3.1.43
-pygithub==2.3.0
-
-# Utilities
-python-dotenv==1.0.1
-slowapi==0.1.9
-structlog==24.4.0
-rich==13.8.0
-typer==0.12.3
-watchfiles==0.22.0
-psutil==6.0.0
-
-# Async & Concurrency
-asyncio-mqtt==0.16.2
-redis==5.1.0
-
-# Monitoring & Observability
-opentelemetry-api==1.25.0
-opentelemetry-sdk==1.25.0
-opentelemetry-exporter-jaeger==1.25.0
-prometheus-client==0.21.0
-
-# Data Processing
-pandas==2.2.0
-numpy==1.26.0
-
-# Testing (optional, for dev)
-pytest==8.0.0
-pytest-asyncio==0.24.0
-pytest-cov==5.0.0
diff --git a/sandbox/__init__.py b/sandbox/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/sandbox/e2b_executor.py b/sandbox/e2b_executor.py
deleted file mode 100644
index 028484733ca3f2d5d4a46e7b7d6e44a89d9f9c8c..0000000000000000000000000000000000000000
--- a/sandbox/e2b_executor.py
+++ /dev/null
@@ -1,497 +0,0 @@
-"""
-E2B Sandbox Executor — Real code execution via E2B API
-Provides actual Python/shell execution, file ops, stdout/stderr streaming
-"""
-
-import asyncio
-import os
-import time
-import uuid
-from typing import AsyncGenerator, Dict, List, Optional
-
-import httpx
-import structlog
-
-log = structlog.get_logger()
-
-E2B_API_KEY = os.environ.get("E2B_API_KEY", "")
-E2B_BASE_URL = "https://api.e2b.dev"
-E2B_SANDBOX_TEMPLATE = "base" # Python sandbox
-
-
-class E2BSandboxSession:
- """Represents a live E2B sandbox session."""
-
- def __init__(self, sandbox_id: str, session_id: str):
- self.sandbox_id = sandbox_id
- self.session_id = session_id
- self.created_at = time.time()
- self.last_used = time.time()
- self.files_created: List[str] = []
-
- def touch(self):
- self.last_used = time.time()
-
- def is_expired(self, ttl_seconds: int = 1800) -> bool:
- return (time.time() - self.last_used) > ttl_seconds
-
-
-class E2BExecutor:
- """
- Real sandbox executor using E2B API.
- Creates isolated sandbox environments for code execution.
- """
-
- def __init__(self):
- self.api_key = E2B_API_KEY
- self._sessions: Dict[str, E2BSandboxSession] = {}
- self._client = httpx.AsyncClient(
- timeout=120.0,
- headers={
- "X-API-Key": self.api_key,
- "Content-Type": "application/json",
- }
- )
-
- async def get_or_create_sandbox(self, session_id: str) -> Optional[str]:
- """Get existing or create new sandbox for session."""
- if not self.api_key:
- log.warning("E2B_API_KEY not set — using local fallback")
- return None
-
- # Reuse existing non-expired session
- if session_id in self._sessions:
- sess = self._sessions[session_id]
- if not sess.is_expired():
- sess.touch()
- return sess.sandbox_id
- else:
- # Try to close expired sandbox
- await self._close_sandbox(sess.sandbox_id)
- del self._sessions[session_id]
-
- # Create new sandbox
- sandbox_id = await self._create_sandbox()
- if sandbox_id:
- self._sessions[session_id] = E2BSandboxSession(sandbox_id, session_id)
- log.info("E2B sandbox created", sandbox_id=sandbox_id, session_id=session_id)
- return sandbox_id
-
- async def _create_sandbox(self) -> Optional[str]:
- """Create a new E2B sandbox."""
- try:
- resp = await self._client.post(
- f"{E2B_BASE_URL}/sandboxes",
- json={
- "templateID": E2B_SANDBOX_TEMPLATE,
- "metadata": {"source": "god-agent-os"},
- }
- )
- if resp.status_code in (200, 201):
- data = resp.json()
- return data.get("sandboxID") or data.get("sandbox_id") or data.get("id")
- else:
- log.error("E2B create sandbox failed", status=resp.status_code, body=resp.text[:200])
- return None
- except Exception as e:
- log.error("E2B create sandbox exception", error=str(e))
- return None
-
- async def _close_sandbox(self, sandbox_id: str):
- """Close/terminate a sandbox."""
- try:
- await self._client.delete(f"{E2B_BASE_URL}/sandboxes/{sandbox_id}")
- except Exception:
- pass
-
- async def execute_code(
- self,
- code: str,
- session_id: str,
- language: str = "python",
- timeout: int = 60,
- ) -> Dict:
- """Execute code in E2B sandbox and return real stdout/stderr."""
- sandbox_id = await self.get_or_create_sandbox(session_id)
-
- if not sandbox_id:
- # Fallback: local subprocess execution
- return await self._local_execute_code(code, language, timeout)
-
- try:
- # E2B code execution API
- if language == "python":
- endpoint = f"{E2B_BASE_URL}/sandboxes/{sandbox_id}/code"
- resp = await self._client.post(
- endpoint,
- json={
- "code": code,
- "language": "python3",
- "timeout": timeout,
- },
- timeout=timeout + 10,
- )
- else:
- # Shell command
- endpoint = f"{E2B_BASE_URL}/sandboxes/{sandbox_id}/processes"
- resp = await self._client.post(
- endpoint,
- json={
- "cmd": code,
- "timeout": timeout,
- },
- timeout=timeout + 10,
- )
-
- if resp.status_code == 200:
- data = resp.json()
- stdout = data.get("stdout", "") or data.get("output", "") or ""
- stderr = data.get("stderr", "") or ""
- exit_code = data.get("exitCode", 0) or data.get("exit_code", 0) or 0
-
- # Update session files
- if session_id in self._sessions:
- self._sessions[session_id].touch()
-
- return {
- "stdout": stdout,
- "stderr": stderr,
- "exit_code": exit_code,
- "sandbox_id": sandbox_id,
- "success": exit_code == 0,
- "execution_time_ms": data.get("duration", 0),
- }
- else:
- log.error("E2B execute failed", status=resp.status_code, body=resp.text[:300])
- # Fallback to local
- return await self._local_execute_code(code, language, timeout)
-
- except Exception as e:
- log.error("E2B execute exception", error=str(e))
- return await self._local_execute_code(code, language, timeout)
-
- async def execute_shell(
- self,
- command: str,
- session_id: str,
- timeout: int = 60,
- cwd: str = "/home/user",
- ) -> Dict:
- """Execute shell command in E2B sandbox."""
- sandbox_id = await self.get_or_create_sandbox(session_id)
-
- if not sandbox_id:
- return await self._local_execute_shell(command, timeout, cwd)
-
- try:
- resp = await self._client.post(
- f"{E2B_BASE_URL}/sandboxes/{sandbox_id}/processes",
- json={
- "cmd": command,
- "cwd": cwd,
- "timeout": timeout,
- },
- timeout=timeout + 10,
- )
-
- if resp.status_code == 200:
- data = resp.json()
- stdout = data.get("stdout", "") or data.get("output", "") or ""
- stderr = data.get("stderr", "") or ""
- exit_code = data.get("exitCode", 0) or data.get("exit_code", 0) or 0
-
- if session_id in self._sessions:
- self._sessions[session_id].touch()
-
- return {
- "stdout": stdout,
- "stderr": stderr,
- "exit_code": exit_code,
- "sandbox_id": sandbox_id,
- "success": exit_code == 0,
- "command": command,
- }
- else:
- return await self._local_execute_shell(command, timeout, cwd)
-
- except Exception as e:
- log.error("E2B shell execute exception", error=str(e))
- return await self._local_execute_shell(command, timeout, cwd)
-
- async def write_file(
- self,
- path: str,
- content: str,
- session_id: str,
- ) -> Dict:
- """Write file in E2B sandbox filesystem."""
- sandbox_id = await self.get_or_create_sandbox(session_id)
-
- if not sandbox_id:
- return await self._local_write_file(path, content)
-
- try:
- resp = await self._client.post(
- f"{E2B_BASE_URL}/sandboxes/{sandbox_id}/filesystem",
- json={"path": path, "content": content},
- )
-
- if resp.status_code in (200, 201):
- if session_id in self._sessions:
- self._sessions[session_id].files_created.append(path)
- self._sessions[session_id].touch()
-
- return {
- "success": True,
- "path": path,
- "size": len(content),
- "sandbox_id": sandbox_id,
- }
- else:
- return await self._local_write_file(path, content)
-
- except Exception as e:
- log.error("E2B write file exception", error=str(e))
- return await self._local_write_file(path, content)
-
- async def read_file(self, path: str, session_id: str) -> Dict:
- """Read file from E2B sandbox filesystem."""
- sandbox_id = await self.get_or_create_sandbox(session_id)
-
- if not sandbox_id:
- return await self._local_read_file(path)
-
- try:
- resp = await self._client.get(
- f"{E2B_BASE_URL}/sandboxes/{sandbox_id}/filesystem",
- params={"path": path},
- )
-
- if resp.status_code == 200:
- data = resp.json()
- content = data.get("content", "") or resp.text
- return {
- "success": True,
- "path": path,
- "content": content,
- "sandbox_id": sandbox_id,
- }
- else:
- return {"success": False, "error": f"File not found: {path}"}
-
- except Exception as e:
- return {"success": False, "error": str(e)}
-
- async def delete_file(self, path: str, session_id: str) -> Dict:
- """Delete file from E2B sandbox."""
- sandbox_id = await self.get_or_create_sandbox(session_id)
-
- if not sandbox_id:
- return await self._local_delete_file(path)
-
- try:
- cmd = f"rm -f {path}"
- result = await self.execute_shell(cmd, session_id)
- success = result.get("exit_code", 1) == 0
- return {
- "success": success,
- "path": path,
- "sandbox_id": sandbox_id,
- }
- except Exception as e:
- return {"success": False, "error": str(e)}
-
- async def list_files(self, path: str, session_id: str) -> Dict:
- """List files in E2B sandbox directory."""
- sandbox_id = await self.get_or_create_sandbox(session_id)
-
- if not sandbox_id:
- return await self._local_list_files(path)
-
- try:
- cmd = f"ls -la {path} 2>&1"
- result = await self.execute_shell(cmd, session_id)
- return {
- "success": True,
- "path": path,
- "listing": result.get("stdout", ""),
- "sandbox_id": sandbox_id,
- }
- except Exception as e:
- return {"success": False, "error": str(e)}
-
- def get_session_info(self, session_id: str) -> Dict:
- """Get sandbox session info."""
- if session_id in self._sessions:
- sess = self._sessions[session_id]
- return {
- "sandbox_id": sess.sandbox_id,
- "session_id": session_id,
- "created_at": sess.created_at,
- "last_used": sess.last_used,
- "files_created": sess.files_created,
- "active": not sess.is_expired(),
- }
- return {"session_id": session_id, "active": False}
-
- async def close_session(self, session_id: str):
- """Close sandbox session."""
- if session_id in self._sessions:
- sess = self._sessions[session_id]
- await self._close_sandbox(sess.sandbox_id)
- del self._sessions[session_id]
- log.info("E2B session closed", session_id=session_id)
-
- # ─── Local Fallback (when E2B not available) ──────────────────────────────
-
- async def _local_execute_code(self, code: str, language: str, timeout: int) -> Dict:
- """Execute code locally as fallback."""
- import tempfile
- start = time.time()
-
- if language == "python":
- with tempfile.NamedTemporaryFile(suffix=".py", mode="w", delete=False) as f:
- f.write(code)
- fname = f.name
- try:
- proc = await asyncio.create_subprocess_exec(
- "python3", fname,
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- )
- stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout)
- duration_ms = int((time.time() - start) * 1000)
- return {
- "stdout": stdout.decode("utf-8", errors="replace"),
- "stderr": stderr.decode("utf-8", errors="replace"),
- "exit_code": proc.returncode,
- "sandbox_id": "local",
- "success": proc.returncode == 0,
- "execution_time_ms": duration_ms,
- }
- except asyncio.TimeoutError:
- return {"stdout": "", "stderr": f"Timeout after {timeout}s", "exit_code": -1, "sandbox_id": "local", "success": False}
- finally:
- try:
- os.unlink(fname)
- except Exception:
- pass
- else:
- return await self._local_execute_shell(code, timeout)
-
- async def _local_execute_shell(self, command: str, timeout: int, cwd: str = "/tmp") -> Dict:
- """Execute shell command locally as fallback."""
- # Safety check
- blocked = ["rm -rf /", ":(){ :|:&", "mkfs", "shutdown", "reboot", "halt", "dd if=/dev/zero"]
- for b in blocked:
- if b in command:
- return {
- "stdout": "", "stderr": f"Blocked dangerous command",
- "exit_code": 1, "sandbox_id": "local", "success": False,
- "command": command,
- }
-
- start = time.time()
- try:
- proc = await asyncio.create_subprocess_shell(
- command,
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- cwd=cwd if os.path.exists(cwd) else "/tmp",
- )
- stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout)
- duration_ms = int((time.time() - start) * 1000)
- return {
- "stdout": stdout.decode("utf-8", errors="replace"),
- "stderr": stderr.decode("utf-8", errors="replace"),
- "exit_code": proc.returncode,
- "sandbox_id": "local",
- "success": proc.returncode == 0,
- "execution_time_ms": duration_ms,
- "command": command,
- }
- except asyncio.TimeoutError:
- return {
- "stdout": "", "stderr": f"Command timed out after {timeout}s",
- "exit_code": -1, "sandbox_id": "local", "success": False,
- "command": command,
- }
- except Exception as e:
- return {
- "stdout": "", "stderr": str(e),
- "exit_code": -1, "sandbox_id": "local", "success": False,
- "command": command,
- }
-
- async def _local_write_file(self, path: str, content: str) -> Dict:
- """Write file locally as fallback."""
- try:
- os.makedirs(os.path.dirname(os.path.abspath(path)), exist_ok=True)
- with open(path, "w", encoding="utf-8") as f:
- f.write(content)
- return {
- "success": True,
- "path": path,
- "size": len(content),
- "sandbox_id": "local",
- }
- except Exception as e:
- return {"success": False, "error": str(e), "sandbox_id": "local"}
-
- async def _local_read_file(self, path: str) -> Dict:
- """Read file locally as fallback."""
- try:
- with open(path, "r", encoding="utf-8") as f:
- content = f.read()
- return {
- "success": True,
- "path": path,
- "content": content,
- "sandbox_id": "local",
- }
- except FileNotFoundError:
- return {"success": False, "error": f"File not found: {path}"}
- except Exception as e:
- return {"success": False, "error": str(e)}
-
- async def _local_delete_file(self, path: str) -> Dict:
- """Delete file locally as fallback."""
- try:
- os.unlink(path)
- return {"success": True, "path": path, "sandbox_id": "local"}
- except Exception as e:
- return {"success": False, "error": str(e)}
-
- async def _local_list_files(self, path: str) -> Dict:
- """List files locally as fallback."""
- try:
- import subprocess
- result = subprocess.run(
- ["ls", "-la", path],
- capture_output=True, text=True, timeout=5
- )
- return {
- "success": True,
- "path": path,
- "listing": result.stdout,
- "sandbox_id": "local",
- }
- except Exception as e:
- return {"success": False, "error": str(e)}
-
- async def close(self):
- """Cleanup all sessions."""
- for sid in list(self._sessions.keys()):
- await self.close_session(sid)
- await self._client.aclose()
-
-
-# Global singleton
-_executor: Optional[E2BExecutor] = None
-
-
-def get_executor() -> E2BExecutor:
- global _executor
- if _executor is None:
- _executor = E2BExecutor()
- return _executor
diff --git a/spaces/__init__.py b/spaces/__init__.py
deleted file mode 100644
index 2dc77999e3f7ad8b275044b919b6961e4da56588..0000000000000000000000000000000000000000
--- a/spaces/__init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from .base_space import BaseSpace
-from .catalog import SPACE_CATALOG, SPACE_INDEX
-from .worker_space import WorkerSpace
-
-
-def build_all_spaces(ws_manager=None, ai_router=None):
- return {
- spec["id"]: WorkerSpace(spec=spec, ws_manager=ws_manager, ai_router=ai_router)
- for spec in SPACE_CATALOG
- }
-
-
-__all__ = [
- "BaseSpace",
- "WorkerSpace",
- "SPACE_CATALOG",
- "SPACE_INDEX",
- "build_all_spaces",
-]
diff --git a/spaces/base_space.py b/spaces/base_space.py
deleted file mode 100644
index 10aad202f7a0ca28e25f91449cef16542265ad68..0000000000000000000000000000000000000000
--- a/spaces/base_space.py
+++ /dev/null
@@ -1,91 +0,0 @@
-"""
-Base Space — Abstract interface for all Spaces in the Space-Role Architecture.
-"""
-from abc import ABC, abstractmethod
-from typing import Any, Dict, Optional
-import structlog
-
-log = structlog.get_logger()
-
-
-class BaseSpace(ABC):
- """
- Abstract base class for all Spaces.
- Each Space provides a distinct domain of interaction with specific tools.
- """
-
- space_name: str = "base"
- space_description: str = "Base Space"
- available_roles: list = ["cognition", "automation", "execution"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- self.ws = ws_manager
- self.ai_router = ai_router
- self._tools: Dict[str, callable] = {}
- self._initialized = False
- log.info(f"📦 {self.__class__.__name__} Space created")
-
- def register_tool(self, name: str, func: callable, description: str = ""):
- """Register a tool in this Space."""
- self._tools[name] = {"func": func, "description": description}
-
- def get_tools(self) -> Dict[str, str]:
- return {name: info["description"] for name, info in self._tools.items()}
-
- async def execute_tool(self, tool_name: str, **kwargs) -> Any:
- """Execute a registered tool."""
- if tool_name not in self._tools:
- raise ValueError(f"Tool '{tool_name}' not found in {self.space_name} Space")
- return await self._tools[tool_name]["func"](**kwargs)
-
- def get_space_prompt(self, role: str, task: str, context: Dict) -> str:
- """Build the system prompt for this Space + Role combination."""
- role_prompts = {
- "cognition": "You are in COGNITION ROLE — analyze, plan, and think deeply.",
- "automation": "You are in AUTOMATION ROLE — execute workflows and interact with systems.",
- "execution": "You are in EXECUTION ROLE — write and run code, perform computational work.",
- "repair": "You are in REPAIR ROLE — analyze errors, find root causes, implement fixes.",
- "visual_intelligence": "You are in VISUAL INTELLIGENCE ROLE — interpret and generate visual content.",
- }
-
- mem_context = ""
- if context.get("short_term_memory"):
- recent = context["short_term_memory"][-3:]
- mem_context = "\n".join([f"- [{m['type']}]: {str(m.get('content',''))[:100]}" for m in recent])
-
- return f"""You are GOD AGENT OS v9 — General Autonomous Agent OS.
-
-Active Space: {self.space_name.upper()} SPACE
-{self.space_description}
-
-{role_prompts.get(role, role_prompts['cognition'])}
-
-Available Tools in this Space:
-{chr(10).join([f'- {name}: {desc}' for name, desc in self.get_tools().items()])}
-
-Recent Context:
-{mem_context or 'No previous context'}
-
-Be concise, accurate, and action-oriented. Return results directly."""
-
- @abstractmethod
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- """Execute a task in this Space with the given Role."""
- pass
-
- async def stream_update(self, session_id: str, message: str, space: str = None):
- """Send a streaming update to the client."""
- if self.ws:
- await self.ws.broadcast_to_room(f"chat:{session_id}", {
- "type": "space_update",
- "space": space or self.space_name,
- "message": message,
- })
-
- def get_info(self) -> Dict:
- return {
- "name": self.space_name,
- "description": self.space_description,
- "available_roles": self.available_roles,
- "tools": list(self._tools.keys()),
- }
diff --git a/spaces/browser_space.py b/spaces/browser_space.py
deleted file mode 100644
index c03c6e72c7a00922655b455ce9e6bb946ddf845a..0000000000000000000000000000000000000000
--- a/spaces/browser_space.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""
-🌐 Browser Space — The Interface to the Web
-Handles all internet-based research and interaction.
-"""
-import asyncio
-import aiohttp
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-
-class BrowserSpace(BaseSpace):
- space_name = "browser"
- space_description = "Web interface — research, navigation, data extraction from the internet."
- available_roles = ["automation", "cognition"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("web_search", self._web_search, "Search the web for information")
- self.register_tool("fetch_url", self._fetch_url, "Fetch content from a URL")
- self.register_tool("extract_data", self._extract_data, "Extract structured data from web pages")
-
- async def _web_search(self, query: str, **kwargs) -> str:
- """Simulate web search via DuckDuckGo."""
- try:
- encoded = query.replace(" ", "+")
- url = f"https://api.duckduckgo.com/?q={encoded}&format=json&no_html=1&skip_disambig=1"
- async with aiohttp.ClientSession() as session:
- async with session.get(url, timeout=aiohttp.ClientTimeout(total=10)) as resp:
- data = await resp.json(content_type=None)
- abstract = data.get("AbstractText", "")
- related = [r.get("Text", "") for r in data.get("RelatedTopics", [])[:3] if r.get("Text")]
- result = abstract or "No direct answer found."
- if related:
- result += "\n\nRelated:\n" + "\n".join([f"- {r}" for r in related])
- return result
- except Exception as e:
- return f"Search result for '{query}': Web search attempted. Error: {str(e)}"
-
- async def _fetch_url(self, url: str, **kwargs) -> str:
- """Fetch content from a URL."""
- try:
- async with aiohttp.ClientSession() as session:
- headers = {"User-Agent": "Mozilla/5.0 (compatible; GodAgentOS/9.0)"}
- async with session.get(url, headers=headers, timeout=aiohttp.ClientTimeout(total=15)) as resp:
- text = await resp.text()
- # Basic text extraction
- import re
- text = re.sub(r'', '', text, flags=re.DOTALL)
- text = re.sub(r'', '', text, flags=re.DOTALL)
- text = re.sub(r'<[^>]+>', ' ', text)
- text = re.sub(r'\s+', ' ', text).strip()
- return text[:3000]
- except Exception as e:
- return f"Could not fetch {url}: {str(e)}"
-
- async def _extract_data(self, url: str, **kwargs) -> str:
- content = await self._fetch_url(url)
- return f"Extracted from {url}:\n{content[:1500]}"
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"🌐 Browser Space activated — {role} role")
-
- # Try to perform web search
- search_result = ""
- try:
- search_result = await self._web_search(task)
- except Exception:
- pass
-
- # Check if task has a URL
- import re
- urls = re.findall(r'https?://[^\s]+', task)
- url_content = ""
- if urls:
- try:
- url_content = await self._fetch_url(urls[0])
- except Exception:
- pass
-
- system_prompt = self.get_space_prompt(role, task, context)
-
- enhanced_prompt = task
- if search_result:
- enhanced_prompt += f"\n\n[Web Search Results]\n{search_result}"
- if url_content:
- enhanced_prompt += f"\n\n[URL Content]\n{url_content[:1000]}"
-
- try:
- response = await self.ai_router.complete(
- prompt=enhanced_prompt,
- system=system_prompt,
- max_tokens=2048,
- )
- return response.get("content", "Browser Space could not process the request.")
- except Exception as e:
- log.error(f"BrowserSpace error: {e}")
- if search_result:
- return f"🌐 Browser Space Results:\n\n{search_result}"
- return f"Browser Space error: {str(e)}"
diff --git a/spaces/catalog.py b/spaces/catalog.py
deleted file mode 100644
index 69580aa57e0875c1eecf02d2bdd7eb517c8de2af..0000000000000000000000000000000000000000
--- a/spaces/catalog.py
+++ /dev/null
@@ -1,226 +0,0 @@
-from __future__ import annotations
-
-SPACE_CATALOG = [
- {
- "id": "god-core-space",
- "name": "God Core Space",
- "icon": "🧠",
- "color": "#7c3aed",
- "layer": "Core Cognitive Layer",
- "description": "System brain for orchestration, planning, reasoning, workflow control, mission state, websocket events, and model routing.",
- "responsibilities": ["orchestrator", "planner", "reasoning", "task graph", "workflow engine", "mission state", "memory routing", "websocket events", "llm routing"],
- "roles": ["cognition", "automation"],
- },
- {
- "id": "coding-worker-space",
- "name": "Coding Worker Space",
- "icon": "🔧",
- "color": "#f59e0b",
- "layer": "Execution Layer",
- "description": "Code generation, file editing, refactoring, dependency handling, and code transformations.",
- "responsibilities": ["code generation", "file editing", "refactoring", "dependency handling", "code transformations"],
- "roles": ["execution", "cognition", "automation"],
- },
- {
- "id": "sandbox-worker-space",
- "name": "Sandbox Worker Space",
- "icon": "🧪",
- "color": "#10b981",
- "layer": "Execution Layer",
- "description": "Isolated execution, runtime sandboxing, subprocesses, environment resets, and lifecycle management.",
- "responsibilities": ["isolated execution", "docker runtime", "subprocesses", "environment resets", "runtime lifecycle"],
- "roles": ["execution", "repair"],
- },
- {
- "id": "terminal-worker-space",
- "name": "Terminal Worker Space",
- "icon": "⌨️",
- "color": "#14b8a6",
- "layer": "Execution Layer",
- "description": "Shell commands, package installs, build tools, and process monitoring.",
- "responsibilities": ["shell commands", "package installs", "build tools", "process monitoring"],
- "roles": ["execution", "automation"],
- },
- {
- "id": "filesystem-worker-space",
- "name": "Filesystem Worker Space",
- "icon": "🗂️",
- "color": "#22c55e",
- "layer": "Execution Layer",
- "description": "File writes, project trees, artifact management, and storage operations.",
- "responsibilities": ["file writes", "project trees", "artifact management", "storage operations"],
- "roles": ["execution", "automation"],
- },
- {
- "id": "browser-worker-space",
- "name": "Browser Worker Space",
- "icon": "🌐",
- "color": "#3b82f6",
- "layer": "Browser + UI Intelligence",
- "description": "Playwright automation, navigation, screenshots, and interaction testing.",
- "responsibilities": ["playwright", "browser automation", "navigation", "screenshots", "interaction testing"],
- "roles": ["automation", "cognition"],
- },
- {
- "id": "vision-worker-space",
- "name": "Vision Worker Space",
- "icon": "👁️",
- "color": "#ec4899",
- "layer": "Browser + UI Intelligence",
- "description": "Screenshot analysis, OCR, layout detection, visual regression, and UI understanding.",
- "responsibilities": ["screenshot analysis", "ocr", "layout detection", "visual regression", "ui understanding"],
- "roles": ["visual_intelligence", "cognition"],
- },
- {
- "id": "ui-worker-space",
- "name": "UI Worker Space",
- "icon": "🎨",
- "color": "#8b5cf6",
- "layer": "Browser + UI Intelligence",
- "description": "Frontend generation, design systems, responsive layouts, component consistency, and visual polish.",
- "responsibilities": ["frontend generation", "design systems", "responsive layouts", "component consistency", "visual polish"],
- "roles": ["visual_intelligence", "execution"],
- },
- {
- "id": "debug-worker-space",
- "name": "Debug Worker Space",
- "icon": "🐛",
- "color": "#ef4444",
- "layer": "Verification + Repair Layer",
- "description": "Error analysis, traceback parsing, repair strategies, and retry planning.",
- "responsibilities": ["error analysis", "traceback parsing", "repair strategies", "retry planning"],
- "roles": ["repair", "cognition"],
- },
- {
- "id": "test-worker-space",
- "name": "Test Worker Space",
- "icon": "🧪",
- "color": "#06b6d4",
- "layer": "Verification + Repair Layer",
- "description": "Run tests, assertions, integration checks, and regression testing.",
- "responsibilities": ["run tests", "assertions", "integration checks", "regression testing"],
- "roles": ["execution", "repair"],
- },
- {
- "id": "verification-worker-space",
- "name": "Verification Worker Space",
- "icon": "✅",
- "color": "#84cc16",
- "layer": "Verification + Repair Layer",
- "description": "Validate outputs, compare expectations, quality scoring, and mission verification.",
- "responsibilities": ["validate outputs", "compare expectations", "quality scoring", "mission verification"],
- "roles": ["repair", "cognition"],
- },
- {
- "id": "git-worker-space",
- "name": "Git Worker Space",
- "icon": "🌳",
- "color": "#f97316",
- "layer": "Deployment Layer",
- "description": "Commits, branching, diffs, merges, and repository workflow operations.",
- "responsibilities": ["commits", "branching", "diffs", "merges"],
- "roles": ["automation", "execution"],
- },
- {
- "id": "deploy-worker-space",
- "name": "Deploy Worker Space",
- "icon": "🚀",
- "color": "#0ea5e9",
- "layer": "Deployment Layer",
- "description": "Vercel, Railway, Docker deploys, preview URLs, and CI/CD triggers.",
- "responsibilities": ["vercel deploy", "railway deploy", "docker deploy", "preview urls", "ci/cd triggers"],
- "roles": ["automation", "execution"],
- },
- {
- "id": "connector-worker-space",
- "name": "Connector Worker Space",
- "icon": "🔌",
- "color": "#6366f1",
- "layer": "Deployment Layer",
- "description": "GitHub, Supabase, APIs, and external integrations.",
- "responsibilities": ["github", "supabase", "apis", "external integrations"],
- "roles": ["automation", "cognition"],
- },
- {
- "id": "memory-worker-space",
- "name": "Memory Worker Space",
- "icon": "🧠",
- "color": "#a855f7",
- "layer": "Memory + Knowledge Layer",
- "description": "Vector DB, execution history, learned fixes, project memory, and long-term state.",
- "responsibilities": ["vector db", "execution history", "learned fixes", "project memory", "long-term state"],
- "roles": ["cognition", "automation"],
- },
- {
- "id": "knowledge-worker-space",
- "name": "Knowledge Worker Space",
- "icon": "📚",
- "color": "#4f46e5",
- "layer": "Memory + Knowledge Layer",
- "description": "Docs retrieval, semantic search, RAG pipelines, and indexed repositories.",
- "responsibilities": ["docs retrieval", "semantic search", "rag pipelines", "indexed repositories"],
- "roles": ["cognition", "automation"],
- },
- {
- "id": "workflow-worker-space",
- "name": "Workflow Worker Space",
- "icon": "🧭",
- "color": "#0f766e",
- "layer": "Coordination Layer",
- "description": "DAG execution, task queues, retries, scheduling, and background jobs.",
- "responsibilities": ["dag execution", "task queues", "retries", "scheduling", "background jobs"],
- "roles": ["automation", "execution"],
- },
- {
- "id": "eventbus-space",
- "name": "Eventbus Space",
- "icon": "📡",
- "color": "#06b6d4",
- "layer": "Coordination Layer",
- "description": "Redis PubSub, NATS, RabbitMQ, and event streams.",
- "responsibilities": ["redis pubsub", "nats", "rabbitmq", "event streams"],
- "roles": ["automation", "execution"],
- },
- {
- "id": "observability-space",
- "name": "Observability Space",
- "icon": "📈",
- "color": "#22c55e",
- "layer": "Monitoring Layer",
- "description": "Logs, metrics, tracing, agent monitoring, and runtime analytics.",
- "responsibilities": ["logs", "metrics", "tracing", "agent monitoring", "runtime analytics"],
- "roles": ["cognition", "automation"],
- },
- {
- "id": "session-runtime-space",
- "name": "Session Runtime Space",
- "icon": "🧷",
- "color": "#64748b",
- "layer": "Session Layer",
- "description": "User sessions, mission isolation, runtime persistence, and checkpointing.",
- "responsibilities": ["user sessions", "mission isolation", "runtime persistence", "checkpointing"],
- "roles": ["automation", "cognition"],
- },
- {
- "id": "model-router-space",
- "name": "Model Router Space",
- "icon": "🛣️",
- "color": "#eab308",
- "layer": "Infrastructure Layer",
- "description": "GPT routing, Claude routing, fallback models, cost optimization, and model selection.",
- "responsibilities": ["gpt routing", "claude routing", "fallback models", "cost optimization", "model selection"],
- "roles": ["cognition", "automation"],
- },
- {
- "id": "auth-gateway-space",
- "name": "Auth Gateway Space",
- "icon": "🔐",
- "color": "#9333ea",
- "layer": "Infrastructure Layer",
- "description": "Auth, API keys, rate limits, and permissions.",
- "responsibilities": ["auth", "api keys", "rate limits", "permissions"],
- "roles": ["automation", "repair"],
- },
-]
-
-SPACE_INDEX = {item["id"]: item for item in SPACE_CATALOG}
diff --git a/spaces/coding_space.py b/spaces/coding_space.py
deleted file mode 100644
index d9a833c0a29429b796caaa2fe4f0eb8c8c9e0d1c..0000000000000000000000000000000000000000
--- a/spaces/coding_space.py
+++ /dev/null
@@ -1,106 +0,0 @@
-"""
-🔧 Coding Space — The Development Environment
-Code generation, refactoring, analysis, and manipulation.
-"""
-import re
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-CODING_SYSTEM = """You are GOD AGENT OS v9 — Coding Space Expert.
-
-You excel at:
-- Writing production-quality code in ANY language (Python, JS, TS, Go, Rust, Java, C++, etc.)
-- Code review and refactoring
-- Algorithm design and optimization
-- Architecture patterns (MVC, microservices, event-driven)
-- API design (REST, GraphQL, gRPC)
-- Database schemas and queries
-- Testing strategies (unit, integration, e2e)
-- DevOps and CI/CD configurations
-
-Always write clean, well-documented, production-ready code.
-Include error handling, type hints, and comments.
-"""
-
-
-class CodingSpace(BaseSpace):
- space_name = "coding"
- space_description = "Development environment — code generation, refactoring, and analysis."
- available_roles = ["execution", "cognition", "automation"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("generate_code", self._generate_code, "Generate code from requirements")
- self.register_tool("review_code", self._review_code, "Review and suggest improvements")
- self.register_tool("refactor", self._refactor, "Refactor existing code")
- self.register_tool("generate_tests", self._generate_tests, "Generate test cases")
- self.register_tool("generate_api", self._generate_api, "Generate REST API boilerplate")
-
- async def _generate_code(self, task: str, language: str = "python", **kwargs) -> str:
- return f"Generating {language} code for: {task}"
-
- async def _review_code(self, code: str, **kwargs) -> str:
- return f"Reviewing code..."
-
- async def _refactor(self, code: str, **kwargs) -> str:
- return f"Refactoring code..."
-
- async def _generate_tests(self, code: str, **kwargs) -> str:
- return f"Generating tests..."
-
- async def _generate_api(self, spec: str, **kwargs) -> str:
- return f"Generating API..."
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"🔧 Coding Space activated — {role} role")
-
- # Detect language from task
- lang_hints = {
- "python": ["python", "py", "fastapi", "django", "flask", "pandas", "numpy"],
- "typescript": ["typescript", "ts", "next.js", "nextjs", "react", "vue", "angular"],
- "javascript": ["javascript", "js", "node", "express"],
- "go": ["golang", "go lang"],
- "rust": ["rust", "cargo"],
- "java": ["java", "spring", "maven"],
- }
-
- detected_lang = "python"
- task_lower = task.lower()
- for lang, hints in lang_hints.items():
- if any(h in task_lower for h in hints):
- detected_lang = lang
- break
-
- mem_context = ""
- if context.get("short_term_memory"):
- recent = context["short_term_memory"][-3:]
- mem_context = "\n".join([f"- {m.get('content','')[:80]}" for m in recent])
-
- enhanced_system = f"""{CODING_SYSTEM}
-
-Active Role: {role.upper()}
-Detected Language: {detected_lang}
-Recent Context: {mem_context or 'None'}
-
-Format all code in proper markdown code blocks with language tags.
-Include:
-1. The complete, working code
-2. Brief explanation
-3. Usage examples
-4. Any important notes"""
-
- try:
- response = await self.ai_router.complete(
- prompt=task,
- system=enhanced_system,
- max_tokens=4096,
- )
- return response.get("content", "Coding Space could not generate code.")
- except Exception as e:
- log.error(f"CodingSpace error: {e}")
- return f"Coding Space error: {str(e)}"
diff --git a/spaces/communication_space.py b/spaces/communication_space.py
deleted file mode 100644
index b2f0db8718d249e697bef5126a7e8d0214cac3bd..0000000000000000000000000000000000000000
--- a/spaces/communication_space.py
+++ /dev/null
@@ -1,106 +0,0 @@
-"""
-💬 Communication Space — The Interaction Domain
-Multi-channel messaging, email, notifications.
-"""
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-COMM_SYSTEM = """You are GOD AGENT OS v9 — Communication Space Expert.
-
-You specialize in:
-- Professional email drafting and templates
-- Slack/Discord message formatting
-- Technical documentation writing
-- README and API documentation
-- Meeting notes and summaries
-- Project proposals and reports
-- Code comments and docstrings
-- User guides and tutorials
-- Marketing copy and announcements
-- Multilingual communication (Burmese, English, etc.)
-
-Writing principles:
-- Clear, concise, and professional
-- Appropriate tone for the audience
-- Proper formatting (markdown, HTML)
-- Action-oriented language
-- Include call-to-action when relevant
-"""
-
-
-class CommunicationSpace(BaseSpace):
- space_name = "communication"
- space_description = "Interaction domain — chat, email, documentation, multi-channel messaging."
- available_roles = ["automation", "cognition"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("draft_email", self._draft_email, "Draft professional emails")
- self.register_tool("write_docs", self._write_docs, "Write technical documentation")
- self.register_tool("create_report", self._create_report, "Create structured reports")
- self.register_tool("translate", self._translate, "Translate content between languages")
- self.register_tool("summarize_thread", self._summarize_thread, "Summarize communication threads")
-
- async def _draft_email(self, subject: str, context: str, tone: str = "professional", **kwargs) -> str:
- return f"Drafting email: {subject}"
-
- async def _write_docs(self, topic: str, format: str = "markdown", **kwargs) -> str:
- return f"Writing docs for: {topic}"
-
- async def _create_report(self, data: str, **kwargs) -> str:
- return f"Creating report from: {data[:50]}"
-
- async def _translate(self, text: str, target_lang: str = "english", **kwargs) -> str:
- return f"Translating to {target_lang}: {text[:50]}"
-
- async def _summarize_thread(self, thread: str, **kwargs) -> str:
- return f"Summarizing thread..."
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"💬 Communication Space activated — {role} role")
-
- # Detect communication type
- task_lower = task.lower()
- comm_type = "general"
- if "email" in task_lower:
- comm_type = "email"
- elif "document" in task_lower or "docs" in task_lower or "readme" in task_lower:
- comm_type = "documentation"
- elif "report" in task_lower:
- comm_type = "report"
- elif "translate" in task_lower or "ဘာသာ" in task:
- comm_type = "translation"
- elif "summary" in task_lower or "summarize" in task_lower:
- comm_type = "summary"
- elif "slack" in task_lower or "discord" in task_lower:
- comm_type = "instant_message"
-
- mem_context = ""
- if context.get("short_term_memory"):
- recent = context["short_term_memory"][-3:]
- mem_context = "\n".join([f"- {m.get('content','')[:80]}" for m in recent])
-
- enhanced_system = f"""{COMM_SYSTEM}
-
-Active Role: {role.upper()}
-Communication Type: {comm_type}
-Recent Context: {mem_context or 'None'}
-
-For Burmese language requests, respond in Burmese.
-Format output appropriately for the communication type."""
-
- try:
- response = await self.ai_router.complete(
- prompt=task,
- system=enhanced_system,
- max_tokens=3000,
- )
- return response.get("content", "Communication Space could not process the request.")
- except Exception as e:
- log.error(f"CommunicationSpace error: {e}")
- return f"Communication Space error: {str(e)}"
diff --git a/spaces/core_space.py b/spaces/core_space.py
deleted file mode 100644
index a8db5edd4f73ae79ad191abc9eb91c326ddc55b9..0000000000000000000000000000000000000000
--- a/spaces/core_space.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""
-🧠 Core Space — The Central Nervous System
-Manages memory, planning, and overall orchestration.
-"""
-import json
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-
-class CoreSpace(BaseSpace):
- space_name = "core"
- space_description = "Central nervous system — planning, memory, and orchestration."
- available_roles = ["cognition", "automation"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("plan", self._plan_task, "Break complex goals into executable steps")
- self.register_tool("summarize", self._summarize, "Summarize information concisely")
- self.register_tool("analyze", self._analyze, "Deep analysis of content or problems")
-
- async def _plan_task(self, task: str, **kwargs) -> str:
- return f"Planning task: {task}"
-
- async def _summarize(self, content: str, **kwargs) -> str:
- return f"Summary of: {content[:50]}..."
-
- async def _analyze(self, content: str, **kwargs) -> str:
- return f"Analysis of: {content[:50]}..."
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- system_prompt = self.get_space_prompt(role, task, context)
-
- try:
- response = await self.ai_router.complete(
- prompt=task,
- system=system_prompt,
- max_tokens=2048,
- stream_callback=None,
- )
- return response.get("content", "I couldn't process that request.")
- except Exception as e:
- log.error(f"CoreSpace error: {e}")
- return f"Core Space error: {str(e)}"
diff --git a/spaces/debug_space.py b/spaces/debug_space.py
deleted file mode 100644
index ed514e37c5a3c0ee2bab8303c0c797ef0829124e..0000000000000000000000000000000000000000
--- a/spaces/debug_space.py
+++ /dev/null
@@ -1,120 +0,0 @@
-"""
-🐛 Debug Space — The Diagnostic Environment
-Error analysis, log parsing, self-healing algorithms.
-"""
-import re
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-DEBUG_SYSTEM = """You are GOD AGENT OS v9 — Debug Space Expert (Repair Role).
-
-You specialize in:
-- Stack trace analysis and root cause identification
-- Error pattern recognition
-- Self-healing code strategies
-- Log analysis and anomaly detection
-- Performance profiling and optimization
-- Memory leak detection
-- Race condition and concurrency bug analysis
-- Security vulnerability scanning
-- Dependency conflict resolution
-- Code smell detection
-
-When analyzing errors:
-1. Identify the root cause precisely
-2. Explain WHY the error occurred
-3. Provide the exact fix with code
-4. Suggest preventive measures
-5. Add proper error handling
-
-Be systematic and thorough. Debug like a senior engineer.
-"""
-
-
-class DebugSpace(BaseSpace):
- space_name = "debug"
- space_description = "Diagnostic environment — error analysis, log parsing, self-healing."
- available_roles = ["repair", "cognition", "execution"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("analyze_error", self._analyze_error, "Analyze error traces")
- self.register_tool("parse_logs", self._parse_logs, "Parse and analyze log files")
- self.register_tool("suggest_fix", self._suggest_fix, "Suggest code fixes")
- self.register_tool("self_heal", self._self_heal, "Auto-generate healing strategies")
-
- async def _analyze_error(self, error: str, **kwargs) -> str:
- return f"Analyzing error: {error[:100]}"
-
- async def _parse_logs(self, logs: str, **kwargs) -> str:
- # Extract error patterns
- error_lines = [l for l in logs.split('\n') if any(
- kw in l.lower() for kw in ['error', 'exception', 'fatal', 'critical', 'warn']
- )]
- return "\n".join(error_lines[:20]) if error_lines else "No errors found in logs"
-
- async def _suggest_fix(self, error: str, code: str = "", **kwargs) -> str:
- return f"Suggesting fix for: {error[:100]}"
-
- async def _self_heal(self, error: str, **kwargs) -> str:
- return f"Self-healing strategy for: {error[:100]}"
-
- def _detect_error_type(self, task: str) -> str:
- task_lower = task.lower()
- if "typeerror" in task_lower or "type error" in task_lower:
- return "TypeError"
- elif "syntaxerror" in task_lower:
- return "SyntaxError"
- elif "importerror" in task_lower or "modulenot" in task_lower:
- return "ImportError"
- elif "attributeerror" in task_lower:
- return "AttributeError"
- elif "keyerror" in task_lower:
- return "KeyError"
- elif "indexerror" in task_lower:
- return "IndexError"
- elif "valueerror" in task_lower:
- return "ValueError"
- elif "connectionerror" in task_lower or "timeout" in task_lower:
- return "NetworkError"
- elif "permissionerror" in task_lower:
- return "PermissionError"
- return "Unknown Error"
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"🐛 Debug Space activated — {role} role")
-
- error_type = self._detect_error_type(task)
-
- mem_context = ""
- if context.get("short_term_memory"):
- recent = context["short_term_memory"][-3:]
- mem_context = "\n".join([f"- {m.get('content','')[:80]}" for m in recent])
-
- enhanced_system = f"""{DEBUG_SYSTEM}
-
-Active Role: {role.upper()}
-Detected Error Type: {error_type}
-Recent Context: {mem_context or 'None'}
-
-Provide:
-1. Root cause analysis
-2. Step-by-step fix with code
-3. Prevention strategy
-4. Testing recommendation"""
-
- try:
- response = await self.ai_router.complete(
- prompt=task,
- system=enhanced_system,
- max_tokens=3000,
- )
- return response.get("content", "Debug Space could not analyze the error.")
- except Exception as e:
- log.error(f"DebugSpace error: {e}")
- return f"Debug Space error: {str(e)}"
diff --git a/spaces/deploy_space.py b/spaces/deploy_space.py
deleted file mode 100644
index 84fa220750d30237821d5ebced02d18096ad2b5b..0000000000000000000000000000000000000000
--- a/spaces/deploy_space.py
+++ /dev/null
@@ -1,109 +0,0 @@
-"""
-🚀 Deploy Space — The Infrastructure Domain
-Cloud deployments, CI/CD, containerization.
-"""
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-DEPLOY_SYSTEM = """You are GOD AGENT OS v9 — Deploy Space Expert.
-
-You specialize in:
-- Vercel deployments (Next.js, React, API routes)
-- Hugging Face Spaces (Gradio, Streamlit, Docker)
-- Docker containerization and Docker Compose
-- GitHub Actions CI/CD pipelines
-- AWS deployments (EC2, Lambda, ECS, S3)
-- GCP deployments (Cloud Run, App Engine)
-- Kubernetes manifests and Helm charts
-- Environment variable management
-- Domain configuration and SSL
-- CDN setup (Cloudflare, AWS CloudFront)
-- Database migrations and deployment strategies
-- Blue-green and canary deployments
-- Monitoring setup (Prometheus, Grafana)
-
-Always provide:
-1. Complete configuration files
-2. Step-by-step deployment commands
-3. Environment variable templates (.env.example)
-4. Troubleshooting tips for common issues
-"""
-
-
-class DeploySpace(BaseSpace):
- space_name = "deploy"
- space_description = "Infrastructure domain — cloud deployments, CI/CD, containerization."
- available_roles = ["automation", "execution", "cognition"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("gen_dockerfile", self._gen_dockerfile, "Generate Dockerfile")
- self.register_tool("gen_github_actions", self._gen_github_actions, "Generate GitHub Actions workflow")
- self.register_tool("gen_vercel_config", self._gen_vercel_config, "Generate Vercel configuration")
- self.register_tool("gen_hf_config", self._gen_hf_config, "Generate HuggingFace Space config")
- self.register_tool("gen_k8s_manifest", self._gen_k8s_manifest, "Generate Kubernetes manifests")
-
- async def _gen_dockerfile(self, app_type: str = "python", **kwargs) -> str:
- return f"Generating Dockerfile for {app_type}"
-
- async def _gen_github_actions(self, workflow_type: str = "deploy", **kwargs) -> str:
- return f"Generating GitHub Actions for {workflow_type}"
-
- async def _gen_vercel_config(self, **kwargs) -> str:
- return "Generating vercel.json"
-
- async def _gen_hf_config(self, **kwargs) -> str:
- return "Generating HF Space README.md"
-
- async def _gen_k8s_manifest(self, app_name: str = "app", **kwargs) -> str:
- return f"Generating K8s manifest for {app_name}"
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"🚀 Deploy Space activated — {role} role")
-
- # Detect deployment target
- task_lower = task.lower()
- targets = []
- if "vercel" in task_lower:
- targets.append("Vercel")
- if "huggingface" in task_lower or "hf" in task_lower or "hugging face" in task_lower:
- targets.append("HuggingFace Spaces")
- if "docker" in task_lower:
- targets.append("Docker")
- if "github actions" in task_lower or "ci/cd" in task_lower:
- targets.append("GitHub Actions")
- if "aws" in task_lower or "lambda" in task_lower:
- targets.append("AWS")
- if "kubernetes" in task_lower or "k8s" in task_lower:
- targets.append("Kubernetes")
-
- targets_str = ", ".join(targets) if targets else "general deployment"
-
- mem_context = ""
- if context.get("short_term_memory"):
- recent = context["short_term_memory"][-2:]
- mem_context = "\n".join([f"- {m.get('content','')[:80]}" for m in recent])
-
- enhanced_system = f"""{DEPLOY_SYSTEM}
-
-Active Role: {role.upper()}
-Deployment Targets: {targets_str}
-Recent Context: {mem_context or 'None'}
-
-Provide complete, copy-paste ready configurations."""
-
- try:
- response = await self.ai_router.complete(
- prompt=task,
- system=enhanced_system,
- max_tokens=4096,
- )
- return response.get("content", "Deploy Space could not generate configuration.")
- except Exception as e:
- log.error(f"DeploySpace error: {e}")
- return f"Deploy Space error: {str(e)}"
diff --git a/spaces/sandbox_space.py b/spaces/sandbox_space.py
deleted file mode 100644
index 22c4e76d978749d3a6cbea215ab4b4fe90b00921..0000000000000000000000000000000000000000
--- a/spaces/sandbox_space.py
+++ /dev/null
@@ -1,178 +0,0 @@
-"""
-💻 Sandbox Space — Secure Code Execution Environment
-Where code is run and tested safely.
-"""
-import asyncio
-import os
-import subprocess
-import tempfile
-import re
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-ALLOWED_LANGUAGES = {"python", "javascript", "bash", "sh"}
-
-
-class SandboxSpace(BaseSpace):
- space_name = "sandbox"
- space_description = "Secure execution environment — run Python, JavaScript, shell scripts safely."
- available_roles = ["execution", "cognition"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.workspace = "/tmp/god_sandbox"
- os.makedirs(self.workspace, exist_ok=True)
- self.register_tool("run_python", self._run_python, "Execute Python code")
- self.register_tool("run_shell", self._run_shell, "Execute shell commands")
- self.register_tool("run_javascript", self._run_javascript, "Execute JavaScript with Node.js")
-
- async def _run_python(self, code: str, timeout: int = 30, **kwargs) -> str:
- """Run Python code safely."""
- try:
- with tempfile.NamedTemporaryFile(suffix=".py", dir=self.workspace,
- mode='w', delete=False) as f:
- f.write(code)
- fname = f.name
-
- proc = await asyncio.create_subprocess_exec(
- "python3", fname,
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- cwd=self.workspace,
- )
- try:
- stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout)
- output = stdout.decode("utf-8", errors="replace")
- errors = stderr.decode("utf-8", errors="replace")
-
- result = ""
- if output:
- result += f"Output:\n{output}"
- if errors:
- result += f"\nErrors:\n{errors}"
- return result or "Code executed successfully (no output)"
- except asyncio.TimeoutError:
- proc.kill()
- return "⚠️ Execution timed out (30s limit)"
- except Exception as e:
- return f"❌ Python execution error: {str(e)}"
- finally:
- try:
- os.unlink(fname)
- except Exception:
- pass
-
- async def _run_shell(self, command: str, timeout: int = 30, **kwargs) -> str:
- """Run shell command safely."""
- # Basic security: block dangerous commands
- dangerous = ["rm -rf /", "dd if=", "mkfs", ":(){ :|:& };:", "> /dev/sda"]
- for d in dangerous:
- if d in command:
- return f"⚠️ Command blocked for safety: {d}"
-
- try:
- proc = await asyncio.create_subprocess_shell(
- command,
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- cwd=self.workspace,
- )
- try:
- stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout)
- output = stdout.decode("utf-8", errors="replace")
- errors = stderr.decode("utf-8", errors="replace")
- result = output + (f"\n[stderr]: {errors}" if errors else "")
- return result or f"Command completed (exit code: {proc.returncode})"
- except asyncio.TimeoutError:
- proc.kill()
- return "⚠️ Command timed out (30s limit)"
- except Exception as e:
- return f"❌ Shell error: {str(e)}"
-
- async def _run_javascript(self, code: str, timeout: int = 30, **kwargs) -> str:
- """Run JavaScript with Node.js."""
- try:
- with tempfile.NamedTemporaryFile(suffix=".js", dir=self.workspace,
- mode='w', delete=False) as f:
- f.write(code)
- fname = f.name
-
- proc = await asyncio.create_subprocess_exec(
- "node", fname,
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- cwd=self.workspace,
- )
- try:
- stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=timeout)
- output = stdout.decode("utf-8", errors="replace")
- errors = stderr.decode("utf-8", errors="replace")
- result = output + (f"\nErrors:\n{errors}" if errors else "")
- return result or "JS executed successfully"
- except asyncio.TimeoutError:
- proc.kill()
- return "⚠️ JS execution timed out"
- except Exception as e:
- return f"❌ JS error: {str(e)}"
- finally:
- try:
- os.unlink(fname)
- except Exception:
- pass
-
- def _extract_code(self, text: str, language: str = "python") -> str:
- """Extract code from markdown code blocks."""
- patterns = [
- rf"```{language}\n(.*?)```",
- r"```\n(.*?)```",
- r"`(.*?)`",
- ]
- for pattern in patterns:
- match = re.search(pattern, text, re.DOTALL)
- if match:
- return match.group(1).strip()
- return text
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"💻 Sandbox Space activated — {role} role")
-
- system_prompt = self.get_space_prompt(role, task, context)
-
- # Ask AI to generate and optionally execute code
- code_prompt = f"""{task}
-
-If this requires code execution, generate the code and I will run it.
-Format code in ```python, ```javascript, or ```bash blocks.
-After the code, explain what it does."""
-
- try:
- response = await self.ai_router.complete(
- prompt=code_prompt,
- system=system_prompt,
- max_tokens=2048,
- )
- ai_response = response.get("content", "")
-
- # Try to extract and execute Python code
- code_blocks = re.findall(r'```(?:python)?\n(.*?)```', ai_response, re.DOTALL)
-
- execution_results = []
- for code in code_blocks[:2]: # Execute max 2 code blocks
- if code.strip():
- result = await self._run_python(code.strip())
- execution_results.append(f"```\n{result}\n```")
-
- final = ai_response
- if execution_results:
- final += "\n\n**Execution Results:**\n" + "\n".join(execution_results)
-
- return final
-
- except Exception as e:
- log.error(f"SandboxSpace error: {e}")
- return f"Sandbox Space error: {str(e)}"
diff --git a/spaces/vision_space.py b/spaces/vision_space.py
deleted file mode 100644
index 5c20379e4df96b23dc52bfbee548c9758550efff..0000000000000000000000000000000000000000
--- a/spaces/vision_space.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""
-👁️ Vision Space — Visual Processing Domain
-Image understanding, UI generation, OCR, visual analysis.
-"""
-from typing import Dict
-import structlog
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-VISION_SYSTEM = """You are GOD AGENT OS v9 — Vision Space Expert.
-
-You specialize in:
-- UI/UX design and code generation (React, Next.js, Tailwind)
-- Visual layout descriptions and wireframing
-- Image analysis and description
-- Design-to-code conversion
-- CSS and styling
-- Responsive design patterns
-- Component library creation (shadcn/ui, Radix, MUI)
-- Color theory and design systems
-- Accessibility (WCAG) guidelines
-- Animation and interaction design (Framer Motion, CSS animations)
-
-When creating UI components, always use modern frameworks and produce clean, production-ready code.
-"""
-
-
-class VisionSpace(BaseSpace):
- space_name = "vision"
- space_description = "Visual processing — UI generation, image analysis, design-to-code."
- available_roles = ["visual_intelligence", "execution", "cognition"]
-
- def __init__(self, ws_manager=None, ai_router=None):
- super().__init__(ws_manager, ai_router)
- self.register_tool("generate_ui", self._generate_ui, "Generate UI components from descriptions")
- self.register_tool("analyze_design", self._analyze_design, "Analyze design requirements")
- self.register_tool("design_system", self._design_system, "Create design system tokens")
-
- async def _generate_ui(self, description: str, framework: str = "react", **kwargs) -> str:
- return f"Generating {framework} UI for: {description}"
-
- async def _analyze_design(self, description: str, **kwargs) -> str:
- return f"Analyzing design: {description}"
-
- async def _design_system(self, brand: str, **kwargs) -> str:
- return f"Creating design system for: {brand}"
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
-
- await self.stream_update(session_id, f"👁️ Vision Space activated — {role} role")
-
- mem_context = ""
- if context.get("short_term_memory"):
- recent = context["short_term_memory"][-2:]
- mem_context = "\n".join([f"- {m.get('content','')[:80]}" for m in recent])
-
- enhanced_system = f"""{VISION_SYSTEM}
-
-Active Role: {role.upper()}
-Recent Context: {mem_context or 'None'}
-
-For UI generation tasks:
-- Use React + TypeScript + Tailwind CSS by default
-- Create complete, self-contained components
-- Include all necessary imports
-- Add PropTypes or TypeScript interfaces
-- Make it responsive and accessible"""
-
- try:
- response = await self.ai_router.complete(
- prompt=task,
- system=enhanced_system,
- max_tokens=4096,
- )
- return response.get("content", "Vision Space could not process the request.")
- except Exception as e:
- log.error(f"VisionSpace error: {e}")
- return f"Vision Space error: {str(e)}"
diff --git a/spaces/worker_space.py b/spaces/worker_space.py
deleted file mode 100644
index 691beceebbd12e76c70900f000f46c1ecdd9b5fd..0000000000000000000000000000000000000000
--- a/spaces/worker_space.py
+++ /dev/null
@@ -1,69 +0,0 @@
-from __future__ import annotations
-
-from typing import Any, Dict, List
-import structlog
-
-from .base_space import BaseSpace
-
-log = structlog.get_logger()
-
-
-class WorkerSpace(BaseSpace):
- available_roles = ["cognition", "automation", "execution", "repair", "visual_intelligence"]
-
- def __init__(self, spec: Dict[str, Any], ws_manager=None, ai_router=None):
- self.spec = spec
- self.space_name = spec["id"]
- self.space_description = spec["description"]
- self.available_roles = spec.get("roles", self.available_roles)
- super().__init__(ws_manager, ai_router)
- self._register_default_tools()
-
- def _register_default_tools(self):
- for responsibility in self.spec.get("responsibilities", []):
- tool_name = responsibility.lower().replace(" ", "_").replace("/", "_")
- self.register_tool(tool_name, self._generic_tool, responsibility)
-
- async def _generic_tool(self, **kwargs) -> str:
- return f"{self.spec['name']} executed with {kwargs}"
-
- def _build_specialized_prompt(self, role: str, task: str, context: Dict[str, Any]) -> str:
- responsibilities = ", ".join(self.spec.get("responsibilities", []))
- layer = self.spec.get("layer", "")
- return f"""You are {self.spec['name']} inside GOD AGENT OS v10.
-
-Layer: {layer}
-Space ID: {self.spec['id']}
-Description: {self.spec['description']}
-Responsibilities: {responsibilities}
-Active Role: {role}
-
-Rules:
-- Stay inside this space's domain responsibilities.
-- Produce concrete, production-ready output.
-- When a task spans multiple domains, explain how this space contributes and what should happen next.
-- Prefer structured bullets for plans, commands, patches, interfaces, contracts, and validation criteria.
-- Be concise but specific.
-"""
-
- async def execute(self, task: str, role: str, session_id: str, context: Dict = None) -> str:
- context = context or {}
- await self.stream_update(session_id, f"{self.spec['icon']} {self.spec['name']} activated — {role} role", space=self.space_name)
-
- if not self.ai_router:
- responsibilities = "\n".join(f"- {item}" for item in self.spec.get("responsibilities", []))
- return f"{self.spec['name']} is offline.\n\nResponsibilities:\n{responsibilities}"
-
- system_prompt = self._build_specialized_prompt(role, task, context)
- try:
- response = await self.ai_router.complete(prompt=task, system=system_prompt, max_tokens=2048)
- if isinstance(response, dict):
- return response.get("content", "") or f"{self.spec['name']} completed the task."
- return str(response)
- except Exception as exc:
- log.error("worker_space_execute_failed", space=self.space_name, error=str(exc))
- responsibilities = ", ".join(self.spec.get("responsibilities", []))
- return (
- f"{self.spec['name']} error: {exc}\n\n"
- f"Primary responsibilities: {responsibilities}"
- )
diff --git a/tools/__init__.py b/tools/__init__.py
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/tools/executor.py b/tools/executor.py
deleted file mode 100644
index 2ae0b80afbd92030c28334a35653c342c2599eb4..0000000000000000000000000000000000000000
--- a/tools/executor.py
+++ /dev/null
@@ -1,176 +0,0 @@
-"""
-Tool Executor — Routes tool calls to the right implementation
-Supports: code, shell, file, browser, github, memory, search, test, none
-"""
-
-import asyncio
-import os
-import subprocess
-import tempfile
-import time
-from typing import Any, List, Optional
-
-import structlog
-
-from api.websocket_manager import WebSocketManager
-
-log = structlog.get_logger()
-
-
-class ToolExecutor:
- def __init__(self, ws_manager: WebSocketManager):
- self.ws = ws_manager
-
- async def run(
- self,
- tool: str,
- task: str,
- goal: str = "",
- previous: List = [],
- task_id: str = "",
- session_id: str = "",
- ) -> str:
- tool = (tool or "none").lower().strip()
-
- dispatch = {
- "code": self._tool_code,
- "shell": self._tool_shell,
- "file": self._tool_file,
- "github": self._tool_github,
- "memory": self._tool_memory,
- "search": self._tool_search,
- "test": self._tool_test,
- "browser": self._tool_browser,
- "none": self._tool_none,
- }
-
- fn = dispatch.get(tool, self._tool_none)
- return await fn(task=task, goal=goal, previous=previous, task_id=task_id, session_id=session_id)
-
- # ─── Code Tool ─────────────────────────────────────────────────────────────
- async def _tool_code(self, task, goal, previous, task_id, session_id) -> str:
- """Generate code using LLM."""
- from core.agent import AgentCore
- agent = AgentCore(self.ws)
- messages = [
- {"role": "system", "content": "You are an expert software engineer. Write clean, production-quality code. Return only the code with minimal explanation."},
- {"role": "user", "content": f"Task: {task}\nGoal: {goal}\n\nWrite the code to accomplish this."},
- ]
- result = await agent.llm_stream(messages, task_id=task_id, session_id=session_id)
- return result or f"# Code for: {task}"
-
- # ─── Shell Tool ────────────────────────────────────────────────────────────
- async def _tool_shell(self, task, goal, previous, task_id, session_id) -> str:
- """Execute shell commands safely in a temp workspace."""
- # Extract command from task description
- from core.agent import AgentCore
- agent = AgentCore(self.ws)
- messages = [
- {"role": "system", "content": "Extract the shell command to run. Return ONLY the command, nothing else."},
- {"role": "user", "content": f"Task: {task}"},
- ]
- cmd = await agent.llm_stream(messages, task_id=task_id, session_id=session_id)
- cmd = cmd.strip().strip("`").strip()
-
- # Safety: block dangerous commands
- blocked = ["rm -rf /", ":(){ :|:& };:", "mkfs", "dd if=", "shutdown", "reboot", "halt"]
- for b in blocked:
- if b in cmd:
- return f"❌ Blocked dangerous command: {cmd}"
-
- try:
- await self.ws.emit(task_id, "step_progress", {
- "action": "shell_exec",
- "command": cmd[:200],
- }, session_id=session_id)
- proc = await asyncio.create_subprocess_shell(
- cmd,
- stdout=asyncio.subprocess.PIPE,
- stderr=asyncio.subprocess.PIPE,
- cwd="/tmp",
- )
- stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=30)
- output = stdout.decode()[:2000] + (stderr.decode()[:500] if stderr else "")
- return output or "Command executed (no output)"
- except asyncio.TimeoutError:
- return "⚠️ Command timed out after 30s"
- except Exception as e:
- return f"❌ Shell error: {str(e)}"
-
- # ─── File Tool ─────────────────────────────────────────────────────────────
- async def _tool_file(self, task, goal, previous, task_id, session_id) -> str:
- """Create or modify files."""
- from core.agent import AgentCore
- agent = AgentCore(self.ws)
- messages = [
- {"role": "system", "content": "Generate file content. Respond with JSON: {\"filename\": \"...\", \"content\": \"...\"}"},
- {"role": "user", "content": f"Task: {task}\nGoal: {goal}"},
- ]
- raw = await agent.llm_stream(messages, task_id=task_id, session_id=session_id)
- try:
- import json
- start = raw.find("{")
- end = raw.rfind("}") + 1
- data = json.loads(raw[start:end])
- filename = data.get("filename", "output.txt")
- content = data.get("content", raw)
- path = f"/tmp/workspace/{filename}"
- os.makedirs(os.path.dirname(path), exist_ok=True)
- with open(path, "w") as f:
- f.write(content)
- await self.ws.emit(task_id, "step_progress", {
- "action": "file_written",
- "filename": filename,
- "size": len(content),
- }, session_id=session_id)
- return f"✅ File written: {filename} ({len(content)} chars)"
- except Exception as e:
- return f"File task result: {raw[:500]}"
-
- # ─── GitHub Tool ───────────────────────────────────────────────────────────
- async def _tool_github(self, task, goal, previous, task_id, session_id) -> str:
- """Perform GitHub operations."""
- return f"GitHub: {task}\n(Set GITHUB_TOKEN to enable real GitHub operations)"
-
- # ─── Memory Tool ───────────────────────────────────────────────────────────
- async def _tool_memory(self, task, goal, previous, task_id, session_id) -> str:
- """Save/retrieve from memory."""
- from memory.db import save_memory, search_memory
- results = await search_memory(task[:50], session_id=session_id)
- if results:
- return "\n".join([r["content"][:300] for r in results[:3]])
- return "No relevant memories found"
-
- # ─── Search Tool ───────────────────────────────────────────────────────────
- async def _tool_search(self, task, goal, previous, task_id, session_id) -> str:
- """Web search using available APIs."""
- return f"Search result for: {task}\n(Integrate search API for real results)"
-
- # ─── Test Tool ─────────────────────────────────────────────────────────────
- async def _tool_test(self, task, goal, previous, task_id, session_id) -> str:
- """Generate and run tests."""
- from core.agent import AgentCore
- agent = AgentCore(self.ws)
- messages = [
- {"role": "system", "content": "Write test cases for the given task. Use pytest format."},
- {"role": "user", "content": f"Write tests for: {task}\nContext: {goal}"},
- ]
- result = await agent.llm_stream(messages, task_id=task_id, session_id=session_id)
- return result or f"# Tests for: {task}"
-
- # ─── Browser Tool ──────────────────────────────────────────────────────────
- async def _tool_browser(self, task, goal, previous, task_id, session_id) -> str:
- """Browser automation (stub — extend with playwright)."""
- return f"Browser task: {task}\n(Install playwright for real browser automation)"
-
- # ─── None Tool ─────────────────────────────────────────────────────────────
- async def _tool_none(self, task, goal, previous, task_id, session_id) -> str:
- """Use LLM directly without tools."""
- from core.agent import AgentCore
- agent = AgentCore(self.ws)
- messages = [
- {"role": "system", "content": "You are an expert engineer. Complete the task thoroughly."},
- {"role": "user", "content": f"Task: {task}\nGoal context: {goal}"},
- ]
- result = await agent.llm_stream(messages, task_id=task_id, session_id=session_id)
- return result or f"Completed: {task}"
diff --git a/tools/tool_router.py b/tools/tool_router.py
deleted file mode 100644
index 32082ede60e30cf1302917692689864cf4dd2fe9..0000000000000000000000000000000000000000
--- a/tools/tool_router.py
+++ /dev/null
@@ -1,377 +0,0 @@
-"""
-Real Tool Router — Autonomous Agent Function Calling
-Routes LLM intent to real execution: E2B sandbox, file ops, shell, git, etc.
-"""
-
-import asyncio
-import hashlib
-import json
-import os
-import time
-import uuid
-from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple
-
-import httpx
-import structlog
-
-log = structlog.get_logger()
-
-# ─── Tool Definitions (for LLM function calling) ──────────────────────────────
-
-TOOL_DEFINITIONS = [
- {
- "name": "execute_python",
- "description": "Execute Python code in a real sandbox and return actual stdout/stderr output. Use this for ANY Python code execution, calculations, data processing, etc.",
- "parameters": {
- "type": "object",
- "properties": {
- "code": {
- "type": "string",
- "description": "The Python code to execute"
- },
- "description": {
- "type": "string",
- "description": "What this code does"
- }
- },
- "required": ["code"]
- }
- },
- {
- "name": "execute_shell",
- "description": "Execute a shell/terminal command and return real output. Use for file operations, system commands, installing packages, etc.",
- "parameters": {
- "type": "object",
- "properties": {
- "command": {
- "type": "string",
- "description": "The shell command to execute"
- },
- "cwd": {
- "type": "string",
- "description": "Working directory (default: /tmp)"
- }
- },
- "required": ["command"]
- }
- },
- {
- "name": "write_file",
- "description": "Create or overwrite a file with the given content. Returns confirmation with file size.",
- "parameters": {
- "type": "object",
- "properties": {
- "path": {
- "type": "string",
- "description": "File path to write"
- },
- "content": {
- "type": "string",
- "description": "File content"
- }
- },
- "required": ["path", "content"]
- }
- },
- {
- "name": "read_file",
- "description": "Read the contents of a file from the sandbox filesystem.",
- "parameters": {
- "type": "object",
- "properties": {
- "path": {
- "type": "string",
- "description": "File path to read"
- }
- },
- "required": ["path"]
- }
- },
- {
- "name": "delete_file",
- "description": "Delete a file from the sandbox filesystem.",
- "parameters": {
- "type": "object",
- "properties": {
- "path": {
- "type": "string",
- "description": "File path to delete"
- }
- },
- "required": ["path"]
- }
- },
- {
- "name": "list_files",
- "description": "List files and directories in a given path.",
- "parameters": {
- "type": "object",
- "properties": {
- "path": {
- "type": "string",
- "description": "Directory path to list"
- }
- },
- "required": ["path"]
- }
- },
- {
- "name": "web_search",
- "description": "Search the web for information. Returns relevant results.",
- "parameters": {
- "type": "object",
- "properties": {
- "query": {
- "type": "string",
- "description": "Search query"
- }
- },
- "required": ["query"]
- }
- },
- {
- "name": "install_package",
- "description": "Install a Python package using pip.",
- "parameters": {
- "type": "object",
- "properties": {
- "package": {
- "type": "string",
- "description": "Package name (e.g., 'requests', 'numpy')"
- }
- },
- "required": ["package"]
- }
- },
-]
-
-# Tool name → display info
-TOOL_DISPLAY = {
- "execute_python": {"icon": "🐍", "label": "Python Execution"},
- "execute_shell": {"icon": "💻", "label": "Terminal"},
- "write_file": {"icon": "📝", "label": "Write File"},
- "read_file": {"icon": "📖", "label": "Read File"},
- "delete_file": {"icon": "🗑️", "label": "Delete File"},
- "list_files": {"icon": "📁", "label": "List Files"},
- "web_search": {"icon": "🔍", "label": "Web Search"},
- "install_package": {"icon": "📦", "label": "Install Package"},
-}
-
-
-class ToolRouter:
- """
- Routes tool calls to real execution engines.
- Integrates with E2B for sandboxed execution.
- """
-
- def __init__(self, ws_manager=None):
- self.ws = ws_manager
- from sandbox.e2b_executor import get_executor
- self.executor = get_executor()
-
- async def execute_tool(
- self,
- tool_name: str,
- tool_args: Dict[str, Any],
- session_id: str,
- task_id: str = "",
- ) -> Dict[str, Any]:
- """Execute a tool and return real results."""
- display = TOOL_DISPLAY.get(tool_name, {"icon": "⚙️", "label": tool_name})
- start_time = time.time()
-
- # Emit tool start event
- if self.ws:
- await self.ws.emit_chat(session_id, "tool_start", {
- "tool": tool_name,
- "icon": display["icon"],
- "label": display["label"],
- "args": {k: str(v)[:200] for k, v in tool_args.items()},
- "task_id": task_id,
- })
-
- log.info("Tool executing", tool=tool_name, session_id=session_id)
-
- try:
- if tool_name == "execute_python":
- result = await self._execute_python(tool_args, session_id)
- elif tool_name == "execute_shell":
- result = await self._execute_shell(tool_args, session_id)
- elif tool_name == "write_file":
- result = await self._write_file(tool_args, session_id)
- elif tool_name == "read_file":
- result = await self._read_file(tool_args, session_id)
- elif tool_name == "delete_file":
- result = await self._delete_file(tool_args, session_id)
- elif tool_name == "list_files":
- result = await self._list_files(tool_args, session_id)
- elif tool_name == "web_search":
- result = await self._web_search(tool_args, session_id)
- elif tool_name == "install_package":
- result = await self._install_package(tool_args, session_id)
- else:
- result = {"error": f"Unknown tool: {tool_name}", "success": False}
-
- except Exception as e:
- log.error("Tool execution error", tool=tool_name, error=str(e))
- result = {"error": str(e), "success": False}
-
- duration_ms = int((time.time() - start_time) * 1000)
- result["_duration_ms"] = duration_ms
- result["_tool"] = tool_name
-
- # Emit tool complete event
- if self.ws:
- await self.ws.emit_chat(session_id, "tool_complete", {
- "tool": tool_name,
- "icon": display["icon"],
- "label": display["label"],
- "success": result.get("success", True),
- "duration_ms": duration_ms,
- "task_id": task_id,
- "output_preview": str(result.get("stdout", result.get("content", result.get("output", ""))))[:200],
- })
-
- return result
-
- async def _execute_python(self, args: Dict, session_id: str) -> Dict:
- code = args.get("code", "")
- result = await self.executor.execute_code(code, session_id, language="python")
- return result
-
- async def _execute_shell(self, args: Dict, session_id: str) -> Dict:
- command = args.get("command", "")
- cwd = args.get("cwd", "/tmp")
-
- # Safety check
- blocked = ["rm -rf /", ":(){ :|:&", "mkfs", "shutdown", "reboot", "halt"]
- for b in blocked:
- if b in command:
- return {"stdout": "", "stderr": "⛔ Blocked dangerous command", "exit_code": 1, "success": False}
-
- result = await self.executor.execute_shell(command, session_id, cwd=cwd)
- return result
-
- async def _write_file(self, args: Dict, session_id: str) -> Dict:
- path = args.get("path", "/tmp/output.txt")
- content = args.get("content", "")
-
- # Normalize path
- if not path.startswith("/"):
- path = f"/tmp/workspace/{path}"
-
- result = await self.executor.write_file(path, content, session_id)
- if result.get("success"):
- result["output"] = f"✅ File written: {path} ({len(content)} chars, {len(content.splitlines())} lines)"
- return result
-
- async def _read_file(self, args: Dict, session_id: str) -> Dict:
- path = args.get("path", "")
- if not path.startswith("/"):
- path = f"/tmp/workspace/{path}"
- return await self.executor.read_file(path, session_id)
-
- async def _delete_file(self, args: Dict, session_id: str) -> Dict:
- path = args.get("path", "")
- if not path.startswith("/"):
- path = f"/tmp/workspace/{path}"
- result = await self.executor.delete_file(path, session_id)
- if result.get("success"):
- result["output"] = f"✅ File deleted: {path}"
- return result
-
- async def _list_files(self, args: Dict, session_id: str) -> Dict:
- path = args.get("path", "/tmp")
- return await self.executor.list_files(path, session_id)
-
- async def _web_search(self, args: Dict, session_id: str) -> Dict:
- query = args.get("query", "")
- try:
- async with httpx.AsyncClient(timeout=15.0) as client:
- # DuckDuckGo instant answers API
- resp = await client.get(
- "https://api.duckduckgo.com/",
- params={"q": query, "format": "json", "no_html": "1"},
- )
- if resp.status_code == 200:
- data = resp.json()
- abstract = data.get("AbstractText", "")
- related = [r.get("Text", "") for r in data.get("RelatedTopics", [])[:5] if "Text" in r]
- result_text = abstract or "\n".join(related) or f"Search completed for: {query}"
- return {
- "success": True,
- "query": query,
- "output": result_text,
- "source": "duckduckgo",
- }
- except Exception as e:
- log.warning("Web search failed", error=str(e))
-
- return {
- "success": True,
- "query": query,
- "output": f"Web search for '{query}' — integrate a search API for full results",
- }
-
- async def _install_package(self, args: Dict, session_id: str) -> Dict:
- package = args.get("package", "")
- if not package or not package.replace("-", "").replace("_", "").replace(".", "").isalnum():
- return {"success": False, "error": "Invalid package name"}
-
- result = await self.executor.execute_shell(
- f"pip install {package} -q",
- session_id,
- timeout=120,
- )
- if result.get("exit_code", 1) == 0:
- result["output"] = f"✅ Package installed: {package}"
- return result
-
- def format_tool_result(self, tool_name: str, result: Dict) -> str:
- """Format tool result for inclusion in LLM context."""
- if not result.get("success", True) and result.get("error"):
- return f"❌ Tool Error: {result['error']}"
-
- # Python/Shell execution
- stdout = result.get("stdout", "")
- stderr = result.get("stderr", "")
- exit_code = result.get("exit_code", 0)
- sandbox_id = result.get("sandbox_id", "unknown")
- duration_ms = result.get("_duration_ms", 0)
-
- if tool_name in ("execute_python", "execute_shell"):
- parts = []
- if stdout:
- parts.append(f"**stdout:**\n```\n{stdout[:3000]}\n```")
- if stderr and exit_code != 0:
- parts.append(f"**stderr:**\n```\n{stderr[:1000]}\n```")
- parts.append(f"**Exit code:** {exit_code} | **Sandbox:** `{sandbox_id}` | **Time:** {duration_ms}ms")
- return "\n".join(parts) if parts else f"Executed (exit: {exit_code})"
-
- elif tool_name == "write_file":
- if result.get("success"):
- return f"✅ **File created:** `{result.get('path', '')}` ({result.get('size', 0)} bytes) on sandbox `{sandbox_id}`"
- return f"❌ Write failed: {result.get('error', '')}"
-
- elif tool_name == "read_file":
- if result.get("success"):
- content = result.get("content", "")
- return f"**File contents of `{result.get('path', '')}`:**\n```\n{content[:3000]}\n```"
- return f"❌ Read failed: {result.get('error', '')}"
-
- elif tool_name == "delete_file":
- return result.get("output", f"Delete operation completed for {result.get('path', '')}")
-
- elif tool_name == "list_files":
- listing = result.get("listing", "")
- return f"**Directory listing of `{result.get('path', '')}`:**\n```\n{listing}\n```"
-
- elif tool_name == "web_search":
- return f"**Search results for '{result.get('query', '')}':**\n{result.get('output', '')}"
-
- elif tool_name == "install_package":
- if result.get("exit_code", 1) == 0:
- return f"✅ Package installed successfully"
- return f"Package install output:\n```\n{stdout[:500]}\n```"
-
- return result.get("output", str(result)[:500])
diff --git a/vercel.json b/vercel.json
deleted file mode 100644
index 26f7e38f6b458fd9edd6656d7119501e784ec39d..0000000000000000000000000000000000000000
--- a/vercel.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "experimentalServices": {
- "frontend": {
- "entrypoint": "frontend",
- "routePrefix": "/",
- "framework": "nextjs"
- },
- "backend": {
- "entrypoint": "backend",
- "routePrefix": "/_/backend"
- }
- }
-}
diff --git a/worker_spaces/__init__.py b/worker_spaces/__init__.py
deleted file mode 100644
index 8d95b054b75726823220dc1b63f54967bff330be..0000000000000000000000000000000000000000
--- a/worker_spaces/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-WORKER_SPACES = ['god-core-space', 'coding-worker-space', 'sandbox-worker-space', 'terminal-worker-space', 'filesystem-worker-space', 'browser-worker-space', 'vision-worker-space', 'ui-worker-space', 'debug-worker-space', 'test-worker-space', 'verification-worker-space', 'git-worker-space', 'deploy-worker-space', 'connector-worker-space', 'memory-worker-space', 'knowledge-worker-space', 'workflow-worker-space', 'eventbus-space', 'observability-space', 'session-runtime-space', 'model-router-space', 'auth-gateway-space']
diff --git a/worker_spaces/auth_gateway_space/__init__.py b/worker_spaces/auth_gateway_space/__init__.py
deleted file mode 100644
index 40fdff2384147ed7c380fd5e680a36881c0aa20d..0000000000000000000000000000000000000000
--- a/worker_spaces/auth_gateway_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'auth-gateway-space'
diff --git a/worker_spaces/auth_gateway_space/spec.py b/worker_spaces/auth_gateway_space/spec.py
deleted file mode 100644
index 13aeb75c1614fedd0b85f34f56aa8ecda33d5bb8..0000000000000000000000000000000000000000
--- a/worker_spaces/auth_gateway_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "auth-gateway-space",
- "name": "Auth Gateway Space",
- "icon": "🔐",
- "color": "#9333ea",
- "layer": "Infrastructure Layer",
- "description": "Auth, API keys, rate limits, and permissions.",
- "responsibilities": [
- "auth",
- "api keys",
- "rate limits",
- "permissions"
- ],
- "roles": [
- "automation",
- "repair"
- ]
-}
diff --git a/worker_spaces/browser_worker_space/__init__.py b/worker_spaces/browser_worker_space/__init__.py
deleted file mode 100644
index c1ade85b757bd3602b7165138cd7a0185fdea5dd..0000000000000000000000000000000000000000
--- a/worker_spaces/browser_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'browser-worker-space'
diff --git a/worker_spaces/browser_worker_space/spec.py b/worker_spaces/browser_worker_space/spec.py
deleted file mode 100644
index 7505d3c937866c6fa3aa60c1be59b5993449a85f..0000000000000000000000000000000000000000
--- a/worker_spaces/browser_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "browser-worker-space",
- "name": "Browser Worker Space",
- "icon": "🌐",
- "color": "#3b82f6",
- "layer": "Browser + UI Intelligence",
- "description": "Playwright automation, navigation, screenshots, and interaction testing.",
- "responsibilities": [
- "playwright",
- "browser automation",
- "navigation",
- "screenshots",
- "interaction testing"
- ],
- "roles": [
- "automation",
- "cognition"
- ]
-}
diff --git a/worker_spaces/coding_worker_space/__init__.py b/worker_spaces/coding_worker_space/__init__.py
deleted file mode 100644
index 82a3268659db1767713230d05acb6636b48c2389..0000000000000000000000000000000000000000
--- a/worker_spaces/coding_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'coding-worker-space'
diff --git a/worker_spaces/coding_worker_space/spec.py b/worker_spaces/coding_worker_space/spec.py
deleted file mode 100644
index 099e5fc5a5c02aa9f66ab85b07ddb156cd2e0b65..0000000000000000000000000000000000000000
--- a/worker_spaces/coding_worker_space/spec.py
+++ /dev/null
@@ -1,20 +0,0 @@
-SPACE_SPEC = {
- "id": "coding-worker-space",
- "name": "Coding Worker Space",
- "icon": "🔧",
- "color": "#f59e0b",
- "layer": "Execution Layer",
- "description": "Code generation, file editing, refactoring, dependency handling, and code transformations.",
- "responsibilities": [
- "code generation",
- "file editing",
- "refactoring",
- "dependency handling",
- "code transformations"
- ],
- "roles": [
- "execution",
- "cognition",
- "automation"
- ]
-}
diff --git a/worker_spaces/connector_worker_space/__init__.py b/worker_spaces/connector_worker_space/__init__.py
deleted file mode 100644
index c15fe26eb245a383963905fdcdd05e3e2d693fc6..0000000000000000000000000000000000000000
--- a/worker_spaces/connector_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'connector-worker-space'
diff --git a/worker_spaces/connector_worker_space/spec.py b/worker_spaces/connector_worker_space/spec.py
deleted file mode 100644
index 5c4d4fe011850dfe5dc227a2bcce93e2c1c408a6..0000000000000000000000000000000000000000
--- a/worker_spaces/connector_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "connector-worker-space",
- "name": "Connector Worker Space",
- "icon": "🔌",
- "color": "#6366f1",
- "layer": "Deployment Layer",
- "description": "GitHub, Supabase, APIs, and external integrations.",
- "responsibilities": [
- "github",
- "supabase",
- "apis",
- "external integrations"
- ],
- "roles": [
- "automation",
- "cognition"
- ]
-}
diff --git a/worker_spaces/debug_worker_space/__init__.py b/worker_spaces/debug_worker_space/__init__.py
deleted file mode 100644
index 2b1a338d8f1e7201f79a01996db11b9f864e29b6..0000000000000000000000000000000000000000
--- a/worker_spaces/debug_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'debug-worker-space'
diff --git a/worker_spaces/debug_worker_space/spec.py b/worker_spaces/debug_worker_space/spec.py
deleted file mode 100644
index 3464fd50957b70df8f88c3119b9aa379a2b43c5d..0000000000000000000000000000000000000000
--- a/worker_spaces/debug_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "debug-worker-space",
- "name": "Debug Worker Space",
- "icon": "🐛",
- "color": "#ef4444",
- "layer": "Verification + Repair Layer",
- "description": "Error analysis, traceback parsing, repair strategies, and retry planning.",
- "responsibilities": [
- "error analysis",
- "traceback parsing",
- "repair strategies",
- "retry planning"
- ],
- "roles": [
- "repair",
- "cognition"
- ]
-}
diff --git a/worker_spaces/deploy_worker_space/__init__.py b/worker_spaces/deploy_worker_space/__init__.py
deleted file mode 100644
index f6ae9b9622bcf2ae5136a7fe8cc38862c132fc14..0000000000000000000000000000000000000000
--- a/worker_spaces/deploy_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'deploy-worker-space'
diff --git a/worker_spaces/deploy_worker_space/spec.py b/worker_spaces/deploy_worker_space/spec.py
deleted file mode 100644
index b38aff923d5793edb8633e80aa907d3a7ae18497..0000000000000000000000000000000000000000
--- a/worker_spaces/deploy_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "deploy-worker-space",
- "name": "Deploy Worker Space",
- "icon": "🚀",
- "color": "#0ea5e9",
- "layer": "Deployment Layer",
- "description": "Vercel, Railway, Docker deploys, preview URLs, and CI/CD triggers.",
- "responsibilities": [
- "vercel deploy",
- "railway deploy",
- "docker deploy",
- "preview urls",
- "ci/cd triggers"
- ],
- "roles": [
- "automation",
- "execution"
- ]
-}
diff --git a/worker_spaces/eventbus_space/__init__.py b/worker_spaces/eventbus_space/__init__.py
deleted file mode 100644
index efbfcdfd16ab422cfd343b121cc4c5c7dadc8e5b..0000000000000000000000000000000000000000
--- a/worker_spaces/eventbus_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'eventbus-space'
diff --git a/worker_spaces/eventbus_space/spec.py b/worker_spaces/eventbus_space/spec.py
deleted file mode 100644
index 403aab21e05fd12fbdc8fd1d960cbcb183053eb0..0000000000000000000000000000000000000000
--- a/worker_spaces/eventbus_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "eventbus-space",
- "name": "Eventbus Space",
- "icon": "📡",
- "color": "#06b6d4",
- "layer": "Coordination Layer",
- "description": "Redis PubSub, NATS, RabbitMQ, and event streams.",
- "responsibilities": [
- "redis pubsub",
- "nats",
- "rabbitmq",
- "event streams"
- ],
- "roles": [
- "automation",
- "execution"
- ]
-}
diff --git a/worker_spaces/filesystem_worker_space/__init__.py b/worker_spaces/filesystem_worker_space/__init__.py
deleted file mode 100644
index a6e007f3052b84178d7a3afbc0c17a8efba04e43..0000000000000000000000000000000000000000
--- a/worker_spaces/filesystem_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'filesystem-worker-space'
diff --git a/worker_spaces/filesystem_worker_space/spec.py b/worker_spaces/filesystem_worker_space/spec.py
deleted file mode 100644
index b286172fef925236514a6134df367192a7d98e8e..0000000000000000000000000000000000000000
--- a/worker_spaces/filesystem_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "filesystem-worker-space",
- "name": "Filesystem Worker Space",
- "icon": "🗂️",
- "color": "#22c55e",
- "layer": "Execution Layer",
- "description": "File writes, project trees, artifact management, and storage operations.",
- "responsibilities": [
- "file writes",
- "project trees",
- "artifact management",
- "storage operations"
- ],
- "roles": [
- "execution",
- "automation"
- ]
-}
diff --git a/worker_spaces/git_worker_space/__init__.py b/worker_spaces/git_worker_space/__init__.py
deleted file mode 100644
index 2f59130d0f5f3889f3e9fb212adbcb53bac7efb3..0000000000000000000000000000000000000000
--- a/worker_spaces/git_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'git-worker-space'
diff --git a/worker_spaces/git_worker_space/spec.py b/worker_spaces/git_worker_space/spec.py
deleted file mode 100644
index 869f45edeb0688eb21557358c7c3a8204ffe7c7b..0000000000000000000000000000000000000000
--- a/worker_spaces/git_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "git-worker-space",
- "name": "Git Worker Space",
- "icon": "🌳",
- "color": "#f97316",
- "layer": "Deployment Layer",
- "description": "Commits, branching, diffs, merges, and repository workflow operations.",
- "responsibilities": [
- "commits",
- "branching",
- "diffs",
- "merges"
- ],
- "roles": [
- "automation",
- "execution"
- ]
-}
diff --git a/worker_spaces/god_core_space/__init__.py b/worker_spaces/god_core_space/__init__.py
deleted file mode 100644
index 641e91e9ddf7a40026510dfadffb6e2294324776..0000000000000000000000000000000000000000
--- a/worker_spaces/god_core_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'god-core-space'
diff --git a/worker_spaces/god_core_space/spec.py b/worker_spaces/god_core_space/spec.py
deleted file mode 100644
index 9f43ff3ee65de9048986e57e3daaf924fa91c11d..0000000000000000000000000000000000000000
--- a/worker_spaces/god_core_space/spec.py
+++ /dev/null
@@ -1,23 +0,0 @@
-SPACE_SPEC = {
- "id": "god-core-space",
- "name": "God Core Space",
- "icon": "🧠",
- "color": "#7c3aed",
- "layer": "Core Cognitive Layer",
- "description": "System brain for orchestration, planning, reasoning, workflow control, mission state, websocket events, and model routing.",
- "responsibilities": [
- "orchestrator",
- "planner",
- "reasoning",
- "task graph",
- "workflow engine",
- "mission state",
- "memory routing",
- "websocket events",
- "llm routing"
- ],
- "roles": [
- "cognition",
- "automation"
- ]
-}
diff --git a/worker_spaces/knowledge_worker_space/__init__.py b/worker_spaces/knowledge_worker_space/__init__.py
deleted file mode 100644
index 18248007a882e95da1e9454852cfed315f0cf183..0000000000000000000000000000000000000000
--- a/worker_spaces/knowledge_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'knowledge-worker-space'
diff --git a/worker_spaces/knowledge_worker_space/spec.py b/worker_spaces/knowledge_worker_space/spec.py
deleted file mode 100644
index e83ca7f4632774b15af6051c55859406b8f1b6dd..0000000000000000000000000000000000000000
--- a/worker_spaces/knowledge_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "knowledge-worker-space",
- "name": "Knowledge Worker Space",
- "icon": "📚",
- "color": "#4f46e5",
- "layer": "Memory + Knowledge Layer",
- "description": "Docs retrieval, semantic search, RAG pipelines, and indexed repositories.",
- "responsibilities": [
- "docs retrieval",
- "semantic search",
- "rag pipelines",
- "indexed repositories"
- ],
- "roles": [
- "cognition",
- "automation"
- ]
-}
diff --git a/worker_spaces/memory_worker_space/__init__.py b/worker_spaces/memory_worker_space/__init__.py
deleted file mode 100644
index ab32e16ed27b4973e325686e43c5ebdec4800915..0000000000000000000000000000000000000000
--- a/worker_spaces/memory_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'memory-worker-space'
diff --git a/worker_spaces/memory_worker_space/spec.py b/worker_spaces/memory_worker_space/spec.py
deleted file mode 100644
index b392610d8db451c543b94d75e8ab2eda6e4ce316..0000000000000000000000000000000000000000
--- a/worker_spaces/memory_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "memory-worker-space",
- "name": "Memory Worker Space",
- "icon": "🧠",
- "color": "#a855f7",
- "layer": "Memory + Knowledge Layer",
- "description": "Vector DB, execution history, learned fixes, project memory, and long-term state.",
- "responsibilities": [
- "vector db",
- "execution history",
- "learned fixes",
- "project memory",
- "long-term state"
- ],
- "roles": [
- "cognition",
- "automation"
- ]
-}
diff --git a/worker_spaces/model_router_space/__init__.py b/worker_spaces/model_router_space/__init__.py
deleted file mode 100644
index c359382910a7ff37a595bd92dd7ebcd3a139cad7..0000000000000000000000000000000000000000
--- a/worker_spaces/model_router_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'model-router-space'
diff --git a/worker_spaces/model_router_space/spec.py b/worker_spaces/model_router_space/spec.py
deleted file mode 100644
index cc28053fcd5927132569c0d4f084a29a1624d777..0000000000000000000000000000000000000000
--- a/worker_spaces/model_router_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "model-router-space",
- "name": "Model Router Space",
- "icon": "🛣️",
- "color": "#eab308",
- "layer": "Infrastructure Layer",
- "description": "GPT routing, Claude routing, fallback models, cost optimization, and model selection.",
- "responsibilities": [
- "gpt routing",
- "claude routing",
- "fallback models",
- "cost optimization",
- "model selection"
- ],
- "roles": [
- "cognition",
- "automation"
- ]
-}
diff --git a/worker_spaces/observability_space/__init__.py b/worker_spaces/observability_space/__init__.py
deleted file mode 100644
index cc973f7c98d8e29353f61937662cfc7ed0f098be..0000000000000000000000000000000000000000
--- a/worker_spaces/observability_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'observability-space'
diff --git a/worker_spaces/observability_space/spec.py b/worker_spaces/observability_space/spec.py
deleted file mode 100644
index 82d1439082f8cbff07139bd572fe0eb04faef1e1..0000000000000000000000000000000000000000
--- a/worker_spaces/observability_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "observability-space",
- "name": "Observability Space",
- "icon": "📈",
- "color": "#22c55e",
- "layer": "Monitoring Layer",
- "description": "Logs, metrics, tracing, agent monitoring, and runtime analytics.",
- "responsibilities": [
- "logs",
- "metrics",
- "tracing",
- "agent monitoring",
- "runtime analytics"
- ],
- "roles": [
- "cognition",
- "automation"
- ]
-}
diff --git a/worker_spaces/sandbox_worker_space/__init__.py b/worker_spaces/sandbox_worker_space/__init__.py
deleted file mode 100644
index 3477d1c1b32610a160f814ed50af57d1094ef806..0000000000000000000000000000000000000000
--- a/worker_spaces/sandbox_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'sandbox-worker-space'
diff --git a/worker_spaces/sandbox_worker_space/spec.py b/worker_spaces/sandbox_worker_space/spec.py
deleted file mode 100644
index 5b41f384261280954d8325efeee03fb39dee20a1..0000000000000000000000000000000000000000
--- a/worker_spaces/sandbox_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "sandbox-worker-space",
- "name": "Sandbox Worker Space",
- "icon": "🧪",
- "color": "#10b981",
- "layer": "Execution Layer",
- "description": "Isolated execution, runtime sandboxing, subprocesses, environment resets, and lifecycle management.",
- "responsibilities": [
- "isolated execution",
- "docker runtime",
- "subprocesses",
- "environment resets",
- "runtime lifecycle"
- ],
- "roles": [
- "execution",
- "repair"
- ]
-}
diff --git a/worker_spaces/session_runtime_space/__init__.py b/worker_spaces/session_runtime_space/__init__.py
deleted file mode 100644
index 535b64c8a274d467e607ec29e610ff2ecfe2be2a..0000000000000000000000000000000000000000
--- a/worker_spaces/session_runtime_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'session-runtime-space'
diff --git a/worker_spaces/session_runtime_space/spec.py b/worker_spaces/session_runtime_space/spec.py
deleted file mode 100644
index aaa8be3b0cefdb45180d23ce7f0a027f2f37ebe5..0000000000000000000000000000000000000000
--- a/worker_spaces/session_runtime_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "session-runtime-space",
- "name": "Session Runtime Space",
- "icon": "🧷",
- "color": "#64748b",
- "layer": "Session Layer",
- "description": "User sessions, mission isolation, runtime persistence, and checkpointing.",
- "responsibilities": [
- "user sessions",
- "mission isolation",
- "runtime persistence",
- "checkpointing"
- ],
- "roles": [
- "automation",
- "cognition"
- ]
-}
diff --git a/worker_spaces/terminal_worker_space/__init__.py b/worker_spaces/terminal_worker_space/__init__.py
deleted file mode 100644
index 875a68566900428203ff00244941739d08cdbb41..0000000000000000000000000000000000000000
--- a/worker_spaces/terminal_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'terminal-worker-space'
diff --git a/worker_spaces/terminal_worker_space/spec.py b/worker_spaces/terminal_worker_space/spec.py
deleted file mode 100644
index a8747cdff54a7c294e270f8b020fa43215f3d3b1..0000000000000000000000000000000000000000
--- a/worker_spaces/terminal_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "terminal-worker-space",
- "name": "Terminal Worker Space",
- "icon": "⌨️",
- "color": "#14b8a6",
- "layer": "Execution Layer",
- "description": "Shell commands, package installs, build tools, and process monitoring.",
- "responsibilities": [
- "shell commands",
- "package installs",
- "build tools",
- "process monitoring"
- ],
- "roles": [
- "execution",
- "automation"
- ]
-}
diff --git a/worker_spaces/test_worker_space/__init__.py b/worker_spaces/test_worker_space/__init__.py
deleted file mode 100644
index 8f97fdd7eb73cc6b6642ca30e265a2be1d480b2d..0000000000000000000000000000000000000000
--- a/worker_spaces/test_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'test-worker-space'
diff --git a/worker_spaces/test_worker_space/spec.py b/worker_spaces/test_worker_space/spec.py
deleted file mode 100644
index fc36822dfbb5ec317f4c29b3029ce7db6308d09f..0000000000000000000000000000000000000000
--- a/worker_spaces/test_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "test-worker-space",
- "name": "Test Worker Space",
- "icon": "🧪",
- "color": "#06b6d4",
- "layer": "Verification + Repair Layer",
- "description": "Run tests, assertions, integration checks, and regression testing.",
- "responsibilities": [
- "run tests",
- "assertions",
- "integration checks",
- "regression testing"
- ],
- "roles": [
- "execution",
- "repair"
- ]
-}
diff --git a/worker_spaces/ui_worker_space/__init__.py b/worker_spaces/ui_worker_space/__init__.py
deleted file mode 100644
index 2055f9d5bb3dd8931de5a24b952e3cb8df7d952a..0000000000000000000000000000000000000000
--- a/worker_spaces/ui_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'ui-worker-space'
diff --git a/worker_spaces/ui_worker_space/spec.py b/worker_spaces/ui_worker_space/spec.py
deleted file mode 100644
index c15eebcea9cf8309dd73ce9126061ff7642e0644..0000000000000000000000000000000000000000
--- a/worker_spaces/ui_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "ui-worker-space",
- "name": "UI Worker Space",
- "icon": "🎨",
- "color": "#8b5cf6",
- "layer": "Browser + UI Intelligence",
- "description": "Frontend generation, design systems, responsive layouts, component consistency, and visual polish.",
- "responsibilities": [
- "frontend generation",
- "design systems",
- "responsive layouts",
- "component consistency",
- "visual polish"
- ],
- "roles": [
- "visual_intelligence",
- "execution"
- ]
-}
diff --git a/worker_spaces/verification_worker_space/__init__.py b/worker_spaces/verification_worker_space/__init__.py
deleted file mode 100644
index d82e92a01bf079067cfdd47b8a70b8a740db0e97..0000000000000000000000000000000000000000
--- a/worker_spaces/verification_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'verification-worker-space'
diff --git a/worker_spaces/verification_worker_space/spec.py b/worker_spaces/verification_worker_space/spec.py
deleted file mode 100644
index b4c3034773f8d0a6fd1aeaa1f2b6c21725e62d22..0000000000000000000000000000000000000000
--- a/worker_spaces/verification_worker_space/spec.py
+++ /dev/null
@@ -1,18 +0,0 @@
-SPACE_SPEC = {
- "id": "verification-worker-space",
- "name": "Verification Worker Space",
- "icon": "✅",
- "color": "#84cc16",
- "layer": "Verification + Repair Layer",
- "description": "Validate outputs, compare expectations, quality scoring, and mission verification.",
- "responsibilities": [
- "validate outputs",
- "compare expectations",
- "quality scoring",
- "mission verification"
- ],
- "roles": [
- "repair",
- "cognition"
- ]
-}
diff --git a/worker_spaces/vision_worker_space/__init__.py b/worker_spaces/vision_worker_space/__init__.py
deleted file mode 100644
index 2589fd9802388f103df0caad3ec06cb412e94204..0000000000000000000000000000000000000000
--- a/worker_spaces/vision_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'vision-worker-space'
diff --git a/worker_spaces/vision_worker_space/spec.py b/worker_spaces/vision_worker_space/spec.py
deleted file mode 100644
index 7e09c19b95abb159abedb45ab449febb7307735f..0000000000000000000000000000000000000000
--- a/worker_spaces/vision_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "vision-worker-space",
- "name": "Vision Worker Space",
- "icon": "👁️",
- "color": "#ec4899",
- "layer": "Browser + UI Intelligence",
- "description": "Screenshot analysis, OCR, layout detection, visual regression, and UI understanding.",
- "responsibilities": [
- "screenshot analysis",
- "ocr",
- "layout detection",
- "visual regression",
- "ui understanding"
- ],
- "roles": [
- "visual_intelligence",
- "cognition"
- ]
-}
diff --git a/worker_spaces/workflow_worker_space/__init__.py b/worker_spaces/workflow_worker_space/__init__.py
deleted file mode 100644
index 6246ac9a23aec72e3b9570d7b67d66aa77409206..0000000000000000000000000000000000000000
--- a/worker_spaces/workflow_worker_space/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-SPACE_ID = 'workflow-worker-space'
diff --git a/worker_spaces/workflow_worker_space/spec.py b/worker_spaces/workflow_worker_space/spec.py
deleted file mode 100644
index 091f7a2e0ca426c2b6f9964601b469e06af3b05d..0000000000000000000000000000000000000000
--- a/worker_spaces/workflow_worker_space/spec.py
+++ /dev/null
@@ -1,19 +0,0 @@
-SPACE_SPEC = {
- "id": "workflow-worker-space",
- "name": "Workflow Worker Space",
- "icon": "🧭",
- "color": "#0f766e",
- "layer": "Coordination Layer",
- "description": "DAG execution, task queues, retries, scheduling, and background jobs.",
- "responsibilities": [
- "dag execution",
- "task queues",
- "retries",
- "scheduling",
- "background jobs"
- ],
- "roles": [
- "automation",
- "execution"
- ]
-}