-
🚀 Auto-Scaling
-
- Seamlessly scale from single GPU to massive distributed clusters
+
+
+
+
+ {/* Mission Section */}
+
+
+ {language === 'en' ? 'Our Mission' : '我们的使命'}
+
+
+
+ {language === 'en'
+ ? 'At the Open Superintelligence Lab, we conduct open research on the best open source projects and Large Language Models (LLMs). Our mission is to advance the field of artificial intelligence through transparent, collaborative research that benefits the entire AI community.'
+ : '在开放超级智能实验室,我们对最好的开源项目和大语言模型(LLMs)进行开放研究。我们的使命是通过透明、协作的研究推进人工智能领域,造福整个AI社区。'
+ }
-
-
-
⚡ Auto-Tuning
-
- Intelligent hyperparameter optimization for your hardware
+
+ {language === 'en'
+ ? 'We believe that the future of AI should be built on open principles, where knowledge is shared freely and innovations are accessible to everyone. Our research focuses on understanding, improving, and advancing the state-of-the-art in open source AI technologies.'
+ : '我们相信AI的未来应该建立在开放原则之上,知识自由分享,创新对所有人开放。我们的研究专注于理解、改进和推进开源AI技术的最先进水平。'
+ }
-
-
🔧 Zero-Config
-
- Works out of the box with automatic hardware detection
-
+
+
+ {/* Research Focus */}
+
+
+ {language === 'en' ? 'Research Focus' : '研究重点'}
+
+
+
+
+ {language === 'en' ? 'Open Source Projects' : '开源项目'}
+
+
+ {language === 'en'
+ ? 'We analyze and contribute to the most promising open source AI projects, identifying best practices and areas for improvement.'
+ : '我们分析并贡献最有前景的开源AI项目,识别最佳实践和改进领域。'
+ }
+
+
+
+
+ {language === 'en' ? 'Large Language Models' : '大语言模型'}
+
+
+ {language === 'en'
+ ? 'We conduct research on state-of-the-art LLMs, exploring their capabilities, limitations, and potential for advancement.'
+ : '我们对最先进的大语言模型进行研究,探索它们的能力、局限性和改进潜力。'
+ }
+
+
-
-
+
- {/* Research Focus */}
-
-
Research Focus
-
-
- {/* Get Involved */}
-
-
Get Involved
-
- We believe that addressing the challenges of superintelligence requires a collaborative effort
- from the global community. Whether you're a researcher, student, developer, or simply
- interested in AI safety, there are many ways to contribute.
-
-
-
-
-
- {/* Values */}
-
-
Our Values
-
-
-
Open Source
-
- All our research, code, and findings are open source. We believe in transparency
- and collaboration as the foundation of safe AI development.
-
-
-
-
Speed
-
- We optimize for performance and efficiency, ensuring our tools can scale
- from single GPU setups to massive distributed systems seamlessly.
-
-
-
-
Accessibility
-
- We make advanced AI research accessible to everyone, regardless of technical
- background or resources.
-
-
-
-
Innovation
-
- We push the boundaries of what's possible in AI research while maintaining
- our commitment to safety and openness.
-
-
-
-
- {/* Footer */}
-
-
+ >
);
}
diff --git a/app/agents/page.tsx b/app/agents/page.tsx
deleted file mode 100644
index 84c16be..0000000
--- a/app/agents/page.tsx
+++ /dev/null
@@ -1,359 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-import { useQuery, useMutation } from 'convex/react';
-import { api } from '../../convex/_generated/api';
-import { Button } from '@/components/ui/button';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
-import { Badge } from '@/components/ui/badge';
-import { Input } from '@/components/ui/input';
-import { Label } from '@/components/ui/label';
-import { Textarea } from '@/components/ui/textarea';
-import { Progress } from '@/components/ui/progress';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import {
- Play,
- Pause,
- Square,
- Brain,
- Zap,
- Target,
- TrendingUp,
- Clock,
- Cpu,
- DollarSign,
- Trash2
-} from 'lucide-react';
-import { AppLayout } from '@/components/layout/app-layout';
-
-export default function AgentDashboard() {
- const [selectedProject, setSelectedProject] = useState
('');
- const [researchGoal, setResearchGoal] = useState('');
- const [codebase, setCodebase] = useState('');
- const [isCreating, setIsCreating] = useState(false);
-
- // Convex queries and mutations
- const projects = useQuery(api.projects.list, {});
- const runs = useQuery(
- api.runs.listByProject,
- selectedProject ? { projectId: selectedProject as any } : "skip"
- );
- const createAgentPlan = useMutation(api.agents.createAgentPlan);
- const updateRunStatus = useMutation(api.runs.updateStatus);
- const deleteRun = useMutation(api.runs.remove);
-
- const handleStartAgent = async () => {
- if (!selectedProject || !researchGoal.trim()) return;
-
- setIsCreating(true);
- try {
- // Create a run first, then generate the plan
- const runId = await createAgentPlan({
- projectId: selectedProject as any,
- researchGoal,
- codebase: codebase || undefined,
- });
-
- console.log("Agent started with run ID:", runId);
-
- // Clear the form
- setResearchGoal('');
- setCodebase('');
-
- // Show success message
- alert(`AI Agent launched successfully! Run ID: ${runId}`);
- } catch (error) {
- console.error("Error starting agent:", error);
- alert("Failed to start agent. Check console for details.");
- } finally {
- setIsCreating(false);
- }
- };
-
- const handleStopRun = async (runId: string) => {
- try {
- await updateRunStatus({
- id: runId as any,
- status: "paused"
- });
- console.log("Run paused successfully");
- } catch (error) {
- console.error("Error pausing run:", error);
- alert("Failed to pause run. Check console for details.");
- }
- };
-
- const handleDeleteRun = async (runId: string) => {
- if (!confirm("Are you sure you want to delete this run? This action cannot be undone.")) {
- return;
- }
-
- try {
- await deleteRun({
- id: runId as any
- });
- console.log("Run deleted successfully");
- } catch (error) {
- console.error("Error deleting run:", error);
- alert("Failed to delete run. Check console for details.");
- }
- };
-
- const selectedProjectData = projects?.find(p => p._id === selectedProject);
-
- return (
-
-
-
-
AI Agent Dashboard
-
- Deploy autonomous AI agents to conduct research experiments
-
-
-
-
- {/* Agent Control Panel */}
-
-
-
-
-
- Agent Control
-
-
- Configure and launch AI research agents
-
-
-
-
- Select Project
- setSelectedProject(e.target.value)}
- className="w-full mt-1 p-2 border rounded-md"
- >
- Choose a project...
- {projects?.map((project) => (
-
- {project.name}
-
- ))}
-
-
-
-
- Research Goal
-
-
-
- Codebase Context (Optional)
-
-
-
-
- {isCreating ? "Launching Agent..." : "Launch AI Agent"}
-
-
-
-
- {/* Project Info */}
- {selectedProjectData && (
-
-
- Project Info
-
-
-
-
Budget
-
${selectedProjectData.budget}
-
-
-
Used
-
${selectedProjectData.usedBudget.toFixed(2)}
-
-
-
Status
-
- {selectedProjectData.status}
-
-
-
-
- )}
-
-
- {/* Active Runs */}
-
-
-
-
-
- Active Agent Runs
-
-
- Monitor autonomous research experiments
-
-
-
- {!selectedProject ? (
-
- Select a project to view agent runs
-
- ) : !runs ? (
-
- Loading runs...
-
- ) : runs.length === 0 ? (
-
- No agent runs yet. Launch an agent to get started!
-
- ) : (
-
- {runs.map((run) => (
-
-
-
-
{run.name}
-
- {run.config?.researchGoal || 'Research experiment'}
-
-
-
-
- {run.status}
-
-
-
- {run.gpuProvider}
-
-
-
-
-
-
- Progress
- {run.progress}%
-
-
-
-
-
-
-
-
- {run.cost}
-
-
-
- {run.eta || 'Calculating...'}
-
-
-
- {run.status === 'running' && (
- <>
-
handleStopRun(run._id)}
- title="Pause run"
- >
-
-
-
handleStopRun(run._id)}
- title="Stop run"
- >
-
-
- >
- )}
-
handleDeleteRun(run._id)}
- title="Delete run"
- className="text-red-600 hover:text-red-700"
- >
-
-
-
-
-
- ))}
-
- )}
-
-
-
-
-
- {/* Agent Capabilities */}
-
-
-
-
- Agent Capabilities
-
-
- What our AI agents can do autonomously
-
-
-
-
-
-
-
-
-
Research Planning
-
- AI agents analyze your research goals and generate detailed experimental plans
-
-
-
-
-
-
-
Autonomous Execution
-
- Agents dispatch experiments to GPU providers and monitor progress in real-time
-
-
-
-
-
-
-
Intelligent Analysis
-
- AI analyzes results and suggests next steps for continuous improvement
-
-
-
-
-
-
-
- );
-}
diff --git a/app/blog/benign-superintelligence-open-or-closed/page.tsx b/app/blog/benign-superintelligence-open-or-closed/page.tsx
deleted file mode 100644
index 5902338..0000000
--- a/app/blog/benign-superintelligence-open-or-closed/page.tsx
+++ /dev/null
@@ -1,193 +0,0 @@
-import Link from "next/link";
-
-export default function BlogPost() {
- return (
-
- {/* Header */}
-
-
-
- Open Superintelligence Lab
-
-
-
-
-
- {/* Blog Post Content */}
-
-
- {/* Back to Blog */}
-
- ← Back to Blog
-
-
- {/* Article Header */}
-
-
- Benign Superintelligence: Open or Closed?
-
-
- January 15, 2024
- •
- 8 min read
-
-
- Exploring the critical question of whether superintelligence should be developed openly or behind closed doors,
- and the implications for humanity's future.
-
-
-
- {/* Article Content */}
-
-
-
The Great Debate
-
- As we stand on the precipice of artificial general intelligence (AGI) and superintelligence,
- one of the most critical questions facing humanity is whether these transformative technologies
- should be developed in the open or behind closed doors. This isn't just a technical decision—it's
- a fundamental choice about the future of human civilization.
-
-
-
-
-
- The Case for Open Development
-
-
Democratization of Power
-
- Open development ensures that superintelligence doesn't become the exclusive domain of a few
- powerful corporations or governments. By making the technology accessible to everyone, we
- prevent the concentration of unprecedented power in the hands of a select few.
-
-
-
-
-
Collective Intelligence
-
- The wisdom of crowds applies to AI safety as well. With thousands of researchers, ethicists,
- and concerned citizens able to review and contribute to the development process, we can
- identify potential risks and solutions that might be missed by a small, closed team.
-
-
-
-
-
Transparency and Trust
-
- Open development builds trust through transparency. When the public can see how AI systems
- are being developed and what safety measures are in place, it reduces fear and builds
- confidence in the technology.
-
-
-
-
-
- The Case for Controlled Development
-
-
Risk Management
-
- Superintelligence poses existential risks that could threaten human civilization. Controlled
- development allows for careful risk assessment and implementation of safety measures without
- the pressure of public scrutiny or competitive pressures.
-
-
-
-
-
Preventing Misuse
-
- Open source superintelligence could be easily modified for malicious purposes. By keeping
- development controlled, we can implement safeguards and prevent the technology from falling
- into the wrong hands.
-
-
-
-
-
Quality Control
-
- Controlled development ensures that only the most qualified researchers work on the technology,
- reducing the risk of dangerous mistakes or suboptimal implementations that could have
- catastrophic consequences.
-
-
-
-
-
- A Middle Path: Open Superintelligence Lab
-
-
- At Open Superintelligence Lab, we believe in a third approach: open development
- with built-in safety mechanisms . Our vision is to democratize superintelligence
- development while ensuring that safety and alignment remain paramount.
-
-
-
-
-
Open Source Foundation
-
- All our research, code, and findings are open source, allowing global collaboration
- and transparency in the development process.
-
-
-
-
Safety-First Architecture
-
- Built-in safety mechanisms and alignment protocols ensure that superintelligence
- remains beneficial to humanity.
-
-
-
-
-
-
-
- The Future We're Building
-
- The question of open vs. closed development isn't just about technology—it's about the kind
- of future we want to create. Do we want a world where superintelligence is controlled by
- a few powerful entities, or one where it's developed collaboratively for the benefit of all?
-
-
-
- At Open Superintelligence Lab, we're choosing the latter. We're building a future where
- superintelligence is developed openly, safely, and for the benefit of all humanity.
- Join us in creating this future.
-
-
-
-
Ready to Contribute?
-
- Help us build the future of open superintelligence
-
-
- Join Our Mission
-
-
-
-
-
-
-
-
- {/* Footer */}
-
-
- );
-}
diff --git a/app/blog/moving-fast/page.tsx b/app/blog/moving-fast/page.tsx
deleted file mode 100644
index a110c6d..0000000
--- a/app/blog/moving-fast/page.tsx
+++ /dev/null
@@ -1,188 +0,0 @@
-import Link from "next/link";
-
-export default function MovingFastBlog() {
- return (
-
- {/* Header */}
-
-
-
- Open Superintelligence Lab
-
-
-
-
-
- {/* Blog Post Content */}
-
-
- {/* Back to Blog */}
-
- ← Back to Blog
-
-
- {/* Article Header */}
-
-
- Moving Fast: Pick a Task, Make an Impact
-
-
- January 15, 2024
- •
- 5 min read
-
-
- The best way to contribute to open superintelligence research? Pick a task from our
- Blueberry LLM issues
- and start building. Here's why moving fast matters and how you can get involved today.
-
-
-
- {/* Article Content */}
-
-
-
Why Speed Matters in AI Research
-
- In the race toward superintelligence, every day counts. While others debate theoretical frameworks,
- we're building. While others plan perfect architectures, we're iterating. The future belongs
- to those who ship, not those who speculate.
-
-
-
-
-
- Ready-to-Go Research Tasks
-
-
🔬 Research: More Small vs Few Big Experts
-
- Draw scaling laws comparing architectures with many small experts versus fewer large experts.
- This is perfect for newcomers and will generate valuable insights for the field.
-
-
- → Take this task
-
-
-
-
-
⚡ Research: Activation Function Ablation
-
- Test SwiGLU, GEGLU, SiLU, GELU, ReLU2 and other activation functions in our MoE architecture.
- Another great first issue for newcomers to contribute meaningful research.
-
-
- → Take this task
-
-
-
-
-
📊 Research: Batch Scheduling & Curriculum
-
- Implement length bucketing and perplexity curriculum learning. This advanced research task
- will help optimize training efficiency and model performance.
-
-
- → Take this task
-
-
-
-
-
- How to Get Started
-
-
-
-
-
2. Pick Your Task
-
- Browse our open issues and pick one that matches your skills.
-
-
-
-
3. Build & Experiment
-
- Run experiments, test hypotheses, and push the boundaries of what's possible.
-
-
-
-
4. Submit PR
-
- Share your findings with the community and help advance superintelligence research.
-
-
-
-
-
-
-
- The Philosophy of Fast Iteration
-
- We believe in the power of rapid experimentation. Every failed experiment teaches us something.
- Every successful iteration brings us closer to superintelligence. The key is to start building
- today, not tomorrow.
-
-
-
- Don't wait for the perfect plan. Don't wait for more resources. Don't wait for
- someone else to solve the problem. Pick a task, start coding, and make an impact.
-
-
-
-
Ready to Move Fast?
-
- Pick a research task and start building the future today
-
-
- Browse Open Tasks
-
-
-
-
-
-
-
-
- {/* Footer */}
-
-
- );
-}
diff --git a/app/blog/page.tsx b/app/blog/page.tsx
deleted file mode 100644
index f650ef9..0000000
--- a/app/blog/page.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import Link from "next/link";
-
-export default function Blog() {
- const posts = [
- {
- id: "moving-fast",
- title: "Moving Fast: Pick a Task, Make an Impact",
- excerpt: "The best way to contribute to open superintelligence research? Pick a task from our Blueberry LLM issues and start building. Here's why moving fast matters.",
- date: "2024-01-15",
- readTime: "5 min read"
- },
- {
- id: "benign-superintelligence-open-or-closed",
- title: "Benign Superintelligence: Open or Closed?",
- excerpt: "Exploring the critical question of whether superintelligence should be developed openly or behind closed doors, and the implications for humanity's future.",
- date: "2024-01-15",
- readTime: "8 min read"
- }
- ];
-
- return (
-
- {/* Header */}
-
-
-
- Open Superintelligence Lab
-
-
-
-
-
- {/* Blog Content */}
-
-
-
- Blog
-
-
- Insights, research, and thoughts on the future of superintelligence
-
-
- {/* Blog Posts */}
-
- {posts.map((post) => (
-
-
-
- {post.title}
-
-
- {post.excerpt}
-
-
- {post.date}
- •
- {post.readTime}
-
-
-
- ))}
-
-
-
-
- {/* Footer */}
-
-
- );
-}
diff --git a/app/contribute/page.tsx b/app/contribute/page.tsx
new file mode 100644
index 0000000..a8477da
--- /dev/null
+++ b/app/contribute/page.tsx
@@ -0,0 +1,399 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+
+export default function Contribute() {
+ const { language } = useLanguage();
+
+ return (
+ <>
+ {/* Hero Section */}
+
+ {/* Background effects */}
+
+
+
+ {/* Animated background particles */}
+
+
+
+
+
+
+
+ {language === 'en' ? 'Contribute to Our Lab' : '为我们的实验室贡献'}
+
+
+
+ {/* Glow effect for the title */}
+
+
+ {language === 'en' ? 'Contribute to Our Lab' : '为我们的实验室贡献'}
+
+
+
+
+
+ {language === 'en'
+ ? 'Join our open-source research community and help advance the field of artificial intelligence and superintelligence'
+ : '加入我们的开源研究社区,帮助推进人工智能和超级智能领域的发展'
+ }
+
+
+
+
+
+ {/* Main Content */}
+
+
+
+ {/* About Our Lab */}
+
+
+
+
+
+ {language === 'en' ? 'About Open Superintelligence Lab' : '关于开放超级智能实验室'}
+
+
+ {language === 'en'
+ ? 'We are a collaborative research community focused on advancing artificial intelligence and superintelligence through open-source projects, cutting-edge research, and knowledge sharing. Our lab brings together researchers, developers, and enthusiasts to work on innovative AI technologies and methodologies.'
+ : '我们是一个协作研究社区,专注于通过开源项目、前沿研究和知识共享来推进人工智能和超级智能。我们的实验室汇集了研究人员、开发人员和爱好者,致力于创新的AI技术和方法。'
+ }
+
+
+ {language === 'en'
+ ? 'We believe in the power of open collaboration and transparent research to accelerate progress in AI. Our projects span from foundational learning resources to advanced research in sparse attention mechanisms, mixture of experts, and other cutting-edge AI architectures.'
+ : '我们相信开放协作和透明研究的力量,能够加速AI的进步。我们的项目涵盖从基础学习资源到稀疏注意力机制、专家混合和其他前沿AI架构的高级研究。'
+ }
+
+
+
+
+
+ {/* Our Projects */}
+
+
+ {language === 'en' ? 'Our Research Projects' : '我们的研究项目'}
+
+
+
+ {/* Zero to AI Researcher */}
+
+
+
+
+ {language === 'en' ? 'Zero to AI Researcher' : '从零到AI研究员'}
+
+
+
+ {language === 'en'
+ ? 'Comprehensive learning path for becoming an AI researcher, covering foundational concepts to cutting-edge methodologies.'
+ : '成为AI研究员的综合学习路径,涵盖从基础概念到前沿方法。'
+ }
+
+
+ {language === 'en' ? 'Learn More →' : '了解更多 →'}
+
+
+
+ {/* DeepSeek Sparse Attention */}
+
+
+
+
+ {language === 'en' ? 'DeepSeek Sparse Attention' : 'DeepSeek 稀疏注意力'}
+
+
+
+ {language === 'en'
+ ? 'Advanced research on sparse attention mechanisms for efficient long-context processing and memory optimization.'
+ : '稀疏注意力机制的高级研究,用于高效的长上下文处理和内存优化。'
+ }
+
+
+ {language === 'en' ? 'Learn More →' : '了解更多 →'}
+
+
+
+ {/* GLM4-MoE */}
+
+
+
+
+ {language === 'en' ? 'GLM4-MoE' : 'GLM4-MoE'}
+
+
+
+ {language === 'en'
+ ? 'Mixture of Experts implementation with GLM4 architecture for efficient scaling and improved performance.'
+ : 'GLM4架构的专家混合实现,用于高效扩展和性能提升。'
+ }
+
+
+ {language === 'en' ? 'Explore →' : '探索 →'}
+
+
+
+ {/* DeepSeek + GLM4 Hybrid */}
+
+
+
+
+ {language === 'en' ? 'DeepSeek + GLM4 Hybrid' : 'DeepSeek + GLM4 混合'}
+
+
+
+ {language === 'en'
+ ? 'Innovative combination of DeepSeek\'s sparse attention with GLM4\'s Mixture of Experts architecture.'
+ : 'DeepSeek稀疏注意力与GLM4专家混合架构的创新结合。'
+ }
+
+
+ {language === 'en' ? 'Learn More →' : '了解更多 →'}
+
+
+
+
+
+ {/* How to Contribute */}
+
+
+ {language === 'en' ? 'How to Contribute' : '如何贡献'}
+
+
+
+
+ {/* Step 1: Choose Project */}
+
+
+ 1
+
+
+ {language === 'en' ? 'Choose a Project' : '选择项目'}
+
+
+ {language === 'en'
+ ? 'Browse our research projects above and select one that aligns with your interests and expertise.'
+ : '浏览我们上面的研究项目,选择与您的兴趣和专业知识相符的项目。'
+ }
+
+
+
+ {/* Step 2: Create Issues */}
+
+
+ 2
+
+
+ {language === 'en' ? 'Create GitHub Issues' : '创建 GitHub 问题'}
+
+
+ {language === 'en'
+ ? 'Create issues to discuss ideas, bugs, improvements, or new research directions. We value meaningful contributions that advance our research goals, not trivial ones like "Fixed typo".'
+ : '创建问题来讨论想法、报告错误、建议改进或提出新的研究方向。我们重视推进我们研究目标的有意义的贡献,而不是像"修复拼写错误"这样的琐碎修复。'
+ }
+
+
+
+ {/* Step 3: Collaborate */}
+
+
+ 3
+
+
+ {language === 'en' ? 'Discuss & Collaborate' : '讨论与协作'}
+
+
+ {language === 'en'
+ ? 'Engage in discussions, share research findings, and collaborate with the community to advance the projects.'
+ : '参与讨论,分享研究发现,与社区协作推进项目发展。'
+ }
+
+
+
+
+
+ {/* Contribution Guidelines */}
+
+
+ {language === 'en' ? 'Contribution Guidelines' : '贡献指南'}
+
+
+
+
+
+
+
+ {language === 'en' ? 'Research & Ideation' : '研究与构思'}
+
+
+ {language === 'en'
+ ? 'Share your research ideas, experimental results, and theoretical insights. We welcome contributions from all levels of expertise.'
+ : '分享您的研究想法、实验结果和理论见解。我们欢迎所有专业水平的贡献。'
+ }
+
+
+
+
+
+
+
+
+ {language === 'en' ? 'Open Discussion' : '开放讨论'}
+
+
+ {language === 'en'
+ ? 'Use GitHub issues and discussions to engage with the community. Join our Discord server for real-time conversations, ask questions, share knowledge, and help others learn.'
+ : '使用 GitHub 问题和讨论与社区互动。加入我们的 Discord 服务器进行实时对话,提出问题,分享知识,帮助他人学习。'
+ }
+
+
+
+
+
+
+
+
+ {language === 'en' ? 'Code & Implementation' : '代码与实现'}
+
+
+ {language === 'en'
+ ? 'Contribute code, documentation, and implementations. Follow our coding standards and submit pull requests for review.'
+ : '贡献代码、文档和实现。遵循我们的编码标准并提交拉取请求以供审查。'
+ }
+
+
+
+
+
+
+
+
+ {language === 'en' ? 'Documentation & Learning' : '文档与学习'}
+
+
+ {language === 'en'
+ ? 'Help improve documentation, create tutorials, and develop learning materials to make our research more accessible.'
+ : '帮助改进文档,创建教程,开发学习材料,使我们的研究更容易获得。'
+ }
+
+
+
+
+
+
+ {/* Call to Action */}
+
+
+
+ {language === 'en' ? 'Ready to Contribute?' : '准备好贡献了吗?'}
+
+
+ {language === 'en'
+ ? 'Join our community and help shape the future of AI research. Every contribution, no matter how small, makes a difference.'
+ : '加入我们的社区,帮助塑造AI研究的未来。每一个贡献,无论多么微小,都会产生影响。'
+ }
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/deepseek-sparse-attention/page.tsx b/app/deepseek-sparse-attention/page.tsx
new file mode 100644
index 0000000..3799fef
--- /dev/null
+++ b/app/deepseek-sparse-attention/page.tsx
@@ -0,0 +1,207 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+
+export default function DeepSeekProject() {
+ const { language } = useLanguage();
+
+ return (
+ <>
+ {/* Hero Section */}
+
+ {/* Background effects */}
+
+
+
+ {/* Animated background particles */}
+
+
+
+
+
+
+
+ {language === 'en' ? 'DeepSeek Sparse Attention - DeepSeek-V3.2-Exp' : 'DeepSeek 稀疏注意力 - DeepSeek-V3.2-Exp'}
+
+
+
+ {/* Glow effect for the title */}
+
+
+ {language === 'en' ? 'DeepSeek Sparse Attention - DeepSeek-V3.2-Exp' : 'DeepSeek 稀疏注意力 - DeepSeek-V3.2-Exp'}
+
+
+
+
+
+ {language === 'en'
+ ? 'Advanced research on DeepSeek\'s innovative sparse attention mechanisms and efficient long-context processing'
+ : 'DeepSeek 创新稀疏注意力机制和高效长上下文处理的前沿研究'
+ }
+
+
+
+
+
+ {/* Main Content */}
+
+
+
+ {/* Work in Progress Notice */}
+
+
+
+
+
+ {language === 'en' ? 'Work in Progress' : '进行中'}
+
+
+ {language === 'en'
+ ? 'This project is currently under development. We are structuring learning materials and research content to provide comprehensive insights into DeepSeek\'s innovative approaches to sparse attention and long-context processing.'
+ : '此项目目前正在开发中。我们正在构建学习材料和研究内容,以提供对 DeepSeek 稀疏注意力和长上下文处理创新方法的全面见解。'
+ }
+
+
+
+
+
+ {/* Research Paper Section */}
+
+
+
+
+
+ {language === 'en' ? 'DeepSeek V3.2 Research Paper' : 'DeepSeek V3.2 研究论文'}
+
+
+ {language === 'en'
+ ? 'Explore the latest research on DeepSeek\'s V3.2 experimental model, featuring advanced sparse attention mechanisms and innovative approaches to long-context processing.'
+ : '探索 DeepSeek V3.2 实验模型的最新研究,具有先进的稀疏注意力机制和长上下文处理的创新方法。'
+ }
+
+
+
+
+
+ {language === 'en' ? 'Read Research Paper' : '阅读研究论文'}
+
+
+
+
+
+ {/* Blog Section */}
+
+
+
+
+
+ {language === 'en' ? 'DeepSeek Blog & Learning' : 'DeepSeek 博客与学习'}
+
+
+ {language === 'en'
+ ? 'Access our comprehensive blog posts and learning materials about DeepSeek\'s architecture, sparse attention mechanisms, and practical implementations.'
+ : '访问我们关于 DeepSeek 架构、稀疏注意力机制和实际实现的综合博客文章和学习材料。'
+ }
+
+
+
+
+
+ {language === 'en' ? 'Visit Blog' : '访问博客'}
+
+
+
+
+
+ {/* Key Features */}
+
+
+
+
+
+ {language === 'en' ? 'Sparse Attention' : '稀疏注意力'}
+
+
+
+ {language === 'en'
+ ? 'Advanced sparse attention mechanisms for efficient long-context processing and memory optimization.'
+ : '先进的稀疏注意力机制,用于高效的长上下文处理和内存优化。'
+ }
+
+
+
+
+
+
+
+ {language === 'en' ? 'Long Context' : '长上下文'}
+
+
+
+ {language === 'en'
+ ? 'Innovative approaches to handling extended context windows with improved efficiency.'
+ : '处理扩展上下文窗口的创新方法,提高效率。'
+ }
+
+
+
+
+ {/* Back to Home */}
+
+
+
+
+
+ {language === 'en' ? 'Back to Home' : '返回首页'}
+
+
+
+
+ >
+ );
+}
diff --git a/app/globals.css b/app/globals.css
index 6e15bbc..1b26615 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -6,6 +6,31 @@ body {
font-family: system-ui, sans-serif;
}
+/* Custom scrollbar for dark theme */
+::-webkit-scrollbar {
+ width: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: #1e293b;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #475569;
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #64748b;
+}
+
+/* Smooth transitions for all interactive elements */
+* {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
@layer base {
diff --git a/app/layout.tsx b/app/layout.tsx
index 3da345a..c513d40 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,7 +1,9 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
-import { ConvexClientProvider } from "@/components/providers/convex-provider";
+import "highlight.js/styles/github-dark.css";
+import { LanguageProvider } from "@/components/providers/language-provider";
+import { Navigation } from "@/components/navigation";
const geistSans = Geist({
variable: "--font-geist-sans",
@@ -14,8 +16,8 @@ const geistMono = Geist_Mono({
});
export const metadata: Metadata = {
- title: "Auto AI Research System",
- description: "Fully autonomous, web-based AI research platform",
+ title: "Open Superintelligence Lab",
+ description: "开放超级智能实验室 - Advancing AI research and development",
};
export default function RootLayout({
@@ -24,13 +26,16 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
+
-
- {children}
-
+
+
+
+ {children}
+
+
);
diff --git a/app/learn/page.tsx b/app/learn/page.tsx
new file mode 100644
index 0000000..e484512
--- /dev/null
+++ b/app/learn/page.tsx
@@ -0,0 +1,361 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+
+export default function LearnPage() {
+ const { language } = useLanguage();
+
+ const dailyTasks = language === 'en' ? [
+ {
+ title: "Literature Review & Research",
+ description: "Analyze latest papers, track SOTA models, and identify research gaps in cutting-edge AI developments.",
+ icon: "📚"
+ },
+ {
+ title: "Model Experimentation",
+ description: "Design, implement, and test novel architectures, training methods, and optimization techniques.",
+ icon: "🧪"
+ },
+ {
+ title: "Data Analysis & Preprocessing",
+ description: "Curate datasets, perform statistical analysis, and develop robust data pipelines for model training.",
+ icon: "📊"
+ },
+ {
+ title: "Code Implementation",
+ description: "Write production-quality code, optimize algorithms, and contribute to open-source AI frameworks.",
+ icon: "💻"
+ },
+ {
+ title: "Benchmarking & Evaluation",
+ description: "Design experiments, run comprehensive benchmarks, and analyze model performance across domains.",
+ icon: "📈"
+ },
+ {
+ title: "Collaboration & Communication",
+ description: "Present findings, write technical reports, and collaborate with interdisciplinary research teams.",
+ icon: "🤝"
+ }
+ ] : [
+ {
+ title: "文献综述与研究",
+ description: "分析最新论文,跟踪SOTA模型,识别前沿AI发展中的研究空白。",
+ icon: "📚"
+ },
+ {
+ title: "模型实验",
+ description: "设计、实施和测试新颖的架构、训练方法和优化技术。",
+ icon: "🧪"
+ },
+ {
+ title: "数据分析与预处理",
+ description: "策划数据集,进行统计分析,开发用于模型训练的强大数据管道。",
+ icon: "📊"
+ },
+ {
+ title: "代码实现",
+ description: "编写生产质量代码,优化算法,为开源AI框架做出贡献。",
+ icon: "💻"
+ },
+ {
+ title: "基准测试与评估",
+ description: "设计实验,运行综合基准测试,分析跨领域模型性能。",
+ icon: "📈"
+ },
+ {
+ title: "协作与沟通",
+ description: "展示发现,撰写技术报告,与跨学科研究团队合作。",
+ icon: "🤝"
+ }
+ ];
+
+ const skoolFeatures = language === 'en' ? [
+ {
+ title: "Daily Micro-Learning",
+ description: "20 minutes of focused content every day, designed for busy schedules without overwhelming you.",
+ icon: "⏰"
+ },
+ {
+ title: "Exclusive Research Content",
+ description: "Access to cutting-edge AI research insights, paper breakdowns, and industry trends before they go mainstream.",
+ icon: "🔬"
+ },
+ {
+ title: "Personal Guidance by Vuk",
+ description: "Direct mentorship and feedback from an experienced AI researcher who's worked at top labs.",
+ icon: "👨🔬"
+ },
+ {
+ title: "Community Support",
+ description: "Connect with like-minded researchers, share projects, and get feedback from a supportive community.",
+ icon: "🌐"
+ },
+ {
+ title: "Real Lab Experience",
+ description: "Work on actual research projects and contribute to top-tier AI research from day one.",
+ icon: "🏛️"
+ },
+ {
+ title: "Career Acceleration",
+ description: "From beginner to contributing AI researcher in just one year with structured progression.",
+ icon: "🚀"
+ }
+ ] : [
+ {
+ title: "每日微学习",
+ description: "每天20分钟的专注内容,专为忙碌的日程设计,不会让你感到压力。",
+ icon: "⏰"
+ },
+ {
+ title: "独家研究内容",
+ description: "获取前沿AI研究见解、论文解析和行业趋势,比主流更早了解。",
+ icon: "🔬"
+ },
+ {
+ title: "Vuk的个人指导",
+ description: "来自在顶级实验室工作过的经验丰富的AI研究员的直接指导和反馈。",
+ icon: "👨🔬"
+ },
+ {
+ title: "社区支持",
+ description: "与志同道合的研究员联系,分享项目,并获得支持性社区的反馈。",
+ icon: "🌐"
+ },
+ {
+ title: "真实实验室体验",
+ description: "从事实际研究项目,从第一天起就为顶级AI研究做出贡献。",
+ icon: "🏛️"
+ },
+ {
+ title: "职业加速",
+ description: "通过结构化进步,在短短一年内从初学者成为贡献的AI研究员。",
+ icon: "🚀"
+ }
+ ];
+
+ return (
+ <>
+ {/* Hero Section */}
+
+
+
+
+
+
+
+ {language === 'en' ? 'Become an AI Researcher' : '成为AI研究员'}
+
+
+ {language === 'en'
+ ? "Learn from scratch and contribute to cutting-edge AI research at top laboratories"
+ : "从零开始学习,为顶级实验室的前沿AI研究做出贡献"
+ }
+
+
+ Research Training
+ Daily Learning
+ Community Support
+
+
+
+
+
+
+
+ {/* What AI Researchers Do Daily */}
+
+
+
+ {language === 'en' ? 'What AI Researchers Do Daily' : 'AI研究员日常工作'}
+
+
+ {language === 'en'
+ ? "Experience the real day-to-day activities of AI researchers working at top laboratories"
+ : "体验在顶级实验室工作的AI研究员的真实日常活动"
+ }
+
+
+
+
+ {dailyTasks.map((task, index) => (
+
+
{task.icon}
+
{task.title}
+
{task.description}
+
+ ))}
+
+
+
+ {/* Skool Program Section */}
+
+
+
+ {language === 'en' ? '20 Minutes a Day Program' : '每日20分钟计划'}
+
+
+ {language === 'en'
+ ? "Join our exclusive Skool community where 20 minutes of daily learning transforms you into an AI researcher in just one year"
+ : "加入我们专属的Skool社区,每日20分钟的学习让你在短短一年内转变为AI研究员"
+ }
+
+
+
+
+ {language === 'en' ? 'Why 20 Minutes Works' : '为什么20分钟有效'}
+
+
+ {language === 'en'
+ ? "Research shows that consistent, focused learning in small increments is more effective than marathon study sessions. Our 20-minute daily approach ensures you stay engaged, retain information better, and build lasting habits that accelerate your research career."
+ : "研究表明,持续的小增量专注学习比马拉松式学习更有效。我们每日20分钟的方法确保你保持参与,更好地保留信息,并建立加速你研究生涯的持久习惯。"
+ }
+
+
+
+
+
+
+ {skoolFeatures.map((feature, index) => (
+
+
{feature.icon}
+
{feature.title}
+
{feature.description}
+
+ ))}
+
+
+
+ {/* Learning Path */}
+
+
+
+ {language === 'en' ? 'Your Learning Journey' : '你的学习之旅'}
+
+
+ {language === 'en'
+ ? "From complete beginner to contributing AI researcher in structured phases"
+ : "从完全初学者到在结构化阶段贡献的AI研究员"
+ }
+
+
+
+
+
+
+
+ 1
+
+
+
+ {language === 'en' ? 'Foundation (Months 1-3)' : '基础阶段(第1-3个月)'}
+
+
+ {language === 'en'
+ ? "Master the fundamentals: Python, mathematics, machine learning basics, and research methodology. Build your first AI models and understand the research landscape."
+ : "掌握基础:Python、数学、机器学习基础和研究方法论。构建你的第一个AI模型并了解研究领域。"
+ }
+
+
+
+
+
+
+ 2
+
+
+
+ {language === 'en' ? 'Specialization (Months 4-6)' : '专业化(第4-6个月)'}
+
+
+ {language === 'en'
+ ? "Choose your focus area: NLP, Computer Vision, or Reinforcement Learning. Deep dive into advanced techniques, read cutting-edge papers, and implement state-of-the-art models."
+ : "选择你的专业领域:NLP、计算机视觉或强化学习。深入高级技术,阅读前沿论文,并实现最先进的模型。"
+ }
+
+
+
+
+
+
+ 3
+
+
+
+ {language === 'en' ? 'Research & Contribution (Months 7-9)' : '研究与贡献(第7-9个月)'}
+
+
+ {language === 'en'
+ ? "Start contributing to open-source projects, identify research problems, and begin your own experiments. Learn to write papers and present your findings."
+ : "开始为开源项目做出贡献,识别研究问题,并开始你自己的实验。学习撰写论文并展示你的发现。"
+ }
+
+
+
+
+
+
+ 4
+
+
+
+ {language === 'en' ? 'Mastery & Career (Months 10-12)' : '掌握与职业(第10-12个月)'}
+
+
+ {language === 'en'
+ ? "Lead research projects, mentor others, and establish yourself as a recognized AI researcher. Prepare for career opportunities at top AI labs and companies."
+ : "领导研究项目,指导他人,并确立自己作为公认的AI研究员的地位。为顶级AI实验室和公司的职业机会做准备。"
+ }
+
+
+
+
+
+
+
+ {/* Call to Action */}
+
+
+
+ {language === 'en' ? 'Ready to Start Your Journey?' : '准备好开始你的旅程了吗?'}
+
+
+ {language === 'en'
+ ? "Join thousands of aspiring AI researchers who are transforming their careers with just 20 minutes a day. Your future as an AI researcher starts today."
+ : "加入数千名有抱负的AI研究员,他们每天仅用20分钟就在改变自己的职业生涯。你作为AI研究员的未来从今天开始。"
+ }
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/page.tsx b/app/page.tsx
index 7626644..5cd3110 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,6 +1,366 @@
+'use client';
-import { redirect } from 'next/navigation';
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+import { useEffect, useState } from "react";
export default function Home() {
- redirect('/projects');
-}
+ const { language } = useLanguage();
+ const [isLocalhost, setIsLocalhost] = useState(false);
+
+ useEffect(() => {
+ setIsLocalhost(window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');
+ }, []);
+
+ return (
+ <>
+ {/* Hero Section */}
+
+ {/* Enhanced background effects */}
+
+
+
+ {/* Enhanced animated background particles */}
+
+ {/* Large floating particles - some made more glowy and dreamy */}
+
+
+
+
+
+
+
+ {/* Medium particles - enhanced with glow */}
+
+
+
+
+
+
+ {/* Small twinkling particles - some made more dreamy */}
+
+
+
+
+
+
+
+ {/* Floating geometric shapes - some made more ethereal */}
+
+
+
+
+ {/* Enhanced glowing orbs - made more dreamy */}
+
+
+
+
+ {/* Additional dreamy particles */}
+
+
+
+
+
+
+
+ {/* Enhanced title with more effects */}
+
+
+
+
+ {language === 'en' ? (
+ <>
+ Open
+ Superintelligence
+ Lab
+ >
+ ) : (
+ <>
+ 开放
+ 超级智能
+ 实验室
+ >
+ )}
+
+
+ {/* Glow effect for the entire title */}
+
+ {language === 'en' ? (
+ <>
+ Open
+ Superintelligence
+ Lab
+ >
+ ) : (
+ <>
+ 开放
+ 超级智能
+ 实验室
+ >
+ )}
+
+
+
+
+ {/* Enhanced decorative elements */}
+
+
+
+
+ {/* Additional floating elements */}
+
+
+
+
+
+ {/* Rotating geometric shapes */}
+
+
+
+ {/* Glowing rings */}
+
+
+
+
+ {/* Tags */}
+
+
+
+ {language === 'en' ? 'Open Source' : '开源'}
+
+
+
+ {language === 'en' ? 'LLM Research' : '大模型研究'}
+
+
+
+ {language === 'en' ? 'Innovation' : '创新'}
+
+
+
+ {/* Call to action buttons */}
+
+
document.getElementById('research-projects')?.scrollIntoView({ behavior: 'smooth' })}
+ className="group px-8 py-4 bg-gradient-to-r from-blue-600 to-purple-600 text-white font-semibold rounded-xl hover:from-blue-700 hover:to-purple-700 transition-all duration-300 transform hover:scale-105 shadow-lg hover:shadow-2xl hover:shadow-blue-500/25"
+ >
+
+ Explore Research
+
+
+
+
+
+
+
+ Learn More
+
+
+
+
+
+
+
+
+
+
+ {/* Main Projects Section */}
+
+
+
+ {/* Road to AI Researcher Project */}
+
+
+ Learning Path
+
+
+ Active
+
+
+
+
+ Zero To AI Researcher - Full Course
+
+
+ A comprehensive journey into becoming an AI researcher, covering everything from foundational concepts to cutting-edge research methodologies
+
+
+ Open Superintelligence Lab
+
+ Read Blog Post →
+
+
+
+
+
+ {/* DeepSeek Sparse Attention Project */}
+
+
+ Research
+
+
+ In Progress
+
+
+
+
+ DeepSeek Sparse Attention - DeepSeek-V3.2-Exp
+
+
+ Advanced research on DeepSeek's innovative sparse attention mechanisms for efficient long-context processing and memory optimization
+
+
+ DeepSeek Research
+
+ Learn More →
+
+
+
+
+
+
+
+
+ {/* Ideas Section - Only visible on localhost */}
+ {isLocalhost && (
+
+
+
+
+ {language === 'en' ? 'Research Ideas & Concepts' : '研究想法与概念'}
+
+
+
+
+
+ )}
+ >
+ );
+}
\ No newline at end of file
diff --git a/app/projects/[id]/layout.tsx b/app/projects/[id]/layout.tsx
deleted file mode 100644
index dacec63..0000000
--- a/app/projects/[id]/layout.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { api } from '../../../convex/_generated/api';
-import { fetchQuery } from 'convex/nextjs';
-
-// Server component for static params generation
-export async function generateStaticParams() {
- try {
- // Fetch all project IDs from Convex
- const projects = await fetchQuery(api.projects.list, {});
-
- return projects.map((project) => ({
- id: project._id,
- }));
- } catch (error) {
- console.error('Error fetching projects for static params:', error);
- // Return empty array if there's an error
- return [];
- }
-}
-
-export default function ProjectLayout({
- children,
-}: {
- children: React.ReactNode;
-}) {
- return <>{children}>;
-}
diff --git a/app/projects/[id]/page.tsx b/app/projects/[id]/page.tsx
deleted file mode 100644
index 20ef24b..0000000
--- a/app/projects/[id]/page.tsx
+++ /dev/null
@@ -1,535 +0,0 @@
-'use client';
-
-import React, { useState } from 'react';
-import { useQuery, useMutation } from 'convex/react';
-import { api } from '../../../convex/_generated/api';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
-import { Badge } from '@/components/ui/badge';
-import { Button } from '@/components/ui/button';
-import { Progress } from '@/components/ui/progress';
-import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
-import { ArrowLeft, Play, Pause, Square, Settings, GitBranch, ExternalLink, Activity, Terminal, Clock } from 'lucide-react';
-import Link from 'next/link';
-import { AppLayout } from '@/components/layout/app-layout';
-import Chatbot from '@/components/chatbot';
-import Canvas from '@/components/canvas';
-
-export default function ProjectDetailPage({ params }: { params: Promise<{ id: string }> }) {
- const [activeTab, setActiveTab] = useState('chatbot');
- const [resolvedParams, setResolvedParams] = useState<{ id: string } | null>(null);
-
- // Resolve params
- React.useEffect(() => {
- params.then((resolved) => {
- console.log('Resolved params:', resolved);
- setResolvedParams(resolved);
- }).catch(console.error);
- }, [params]);
-
- // For now, use a mock project to test the interface
- const mockProject = {
- _id: resolvedParams?.id || 'mock-project',
- name: 'Test Project',
- description: 'A test project for the chatbot interface',
- status: 'running',
- budget: 1000,
- usedBudget: 250,
- createdAt: Date.now()
- };
-
- // Convex queries - skip for now to test interface
- const project = mockProject;
- const runs = [];
- const updateRunStatus = useMutation(api.runs.updateStatus);
- const deleteRun = useMutation(api.runs.remove);
-
- const handleStopRun = async (runId: string) => {
- try {
- await updateRunStatus({
- id: runId as any,
- status: "paused"
- });
- } catch (error) {
- console.error("Error pausing run:", error);
- }
- };
-
- const handleDeleteRun = async (runId: string) => {
- if (!confirm("Are you sure you want to delete this run?")) return;
- try {
- await deleteRun({ id: runId as any });
- } catch (error) {
- console.error("Error deleting run:", error);
- }
- };
-
- if (!resolvedParams || !project) {
- return (
-
-
-
-
Loading project...
-
- Resolved params: {resolvedParams ? JSON.stringify(resolvedParams) : 'null'}
-
-
-
-
- );
- }
-
- return (
-
-
- {/* Header */}
-
-
-
-
-
-
- Back to Projects
-
-
-
-
-
{project.name}
-
- {project.status}
-
-
-
{project.description}
-
-
-
setActiveTab('advanced')}>
-
- Advanced View
-
-
setActiveTab('chatbot')}>
-
- Start Chat
-
-
-
-
-
-
- {/* Main Content */}
-
-
-
- AI Assistant
- Results Canvas
- Advanced Dashboard
-
-
- {/* Chatbot Tab */}
-
- {resolvedParams && (
-
- )}
-
-
- {/* Canvas Tab */}
-
- {resolvedParams && (
-
- )}
-
-
- {/* Advanced Dashboard Tab */}
-
-
- {/* Project Info */}
-
-
- Project Information
-
-
-
-
Created
-
- {new Date(project.createdAt).toLocaleDateString()}
-
-
-
-
Status
-
- {project.status}
-
-
-
-
Total Runs
-
{runs?.length || 0}
-
-
-
-
- {/* Budget */}
-
-
- Budget
-
-
-
-
- Used: ${project.usedBudget.toFixed(2)}
- Limit: ${project.budget}
-
-
-
-
- ${(project.budget - project.usedBudget).toFixed(2)} remaining
-
-
-
-
- {/* Recent Activity */}
-
-
-
-
- Recent Activity
-
-
-
- {runs && runs.length > 0 ? (
- runs.slice(0, 3).map((run) => (
-
-
-
{run.name}
-
{run.status}
-
-
- {run.progress}%
-
-
- ))
- ) : (
- No recent activity
- )}
-
-
-
-
- {/* Recent Runs */}
-
-
- Recent Runs
- Latest autonomous runs for this project
-
-
-
- {runs && runs.length > 0 ? (
- runs.slice(0, 3).map((run) => (
-
-
-
-
-
{run.name}
-
- {run.gpuProvider} • Started {new Date(run.startedAt).toLocaleString()}
-
-
-
-
-
-
${run.cost}
-
- {run.status === 'running' ? `ETA: ${run.eta}` : run.status}
-
-
- {run.status === 'running' && (
-
- )}
-
-
- ))
- ) : (
-
- No runs yet. Launch an agent to get started!
-
- )}
-
-
-
-
-
- {/* Runs Tab */}
-
-
-
-
Runs
-
All autonomous runs for this project
-
-
-
-
- Launch Agent
-
-
-
-
-
-
-
-
-
- Name
- Status
- Progress
- GPU Provider
- Cost
- Started
- Actions
-
-
-
- {runs && runs.length > 0 ? (
- runs.map((run) => (
-
-
-
- {run.name}
-
-
-
-
- {run.status}
-
-
-
-
-
- {run.gpuProvider}
- ${run.cost}
- {new Date(run.startedAt).toLocaleString()}
-
-
- {run.status === 'running' && (
- <>
-
handleStopRun(run._id)}
- title="Pause run"
- >
-
-
-
handleStopRun(run._id)}
- title="Stop run"
- >
-
-
- >
- )}
- {run.status === 'queued' && (
-
-
-
- )}
-
-
-
- ))
- ) : (
-
-
- No runs yet. Launch an agent to get started!
-
-
- )}
-
-
-
-
-
-
- {/* Agent Activity Tab */}
-
-
-
Agent Activity
-
Real-time tracking of agent actions and API calls
-
-
-
- {runs && runs.length > 0 ? (
- runs.map((run) => (
-
-
-
-
- {run.name}
-
-
- Status: {run.status} • Progress: {run.progress}%
-
-
-
- {/* Agent Plan */}
- {run.config?.plan && (
-
-
Generated Plan
-
-
Objectives:
-
- {run.config.plan.objectives?.map((obj: string, i: number) => (
- {obj}
- ))}
-
-
Experiments:
-
- {run.config.plan.experiments?.map((exp: any, i: number) => (
- {exp.name}: {exp.description}
- ))}
-
-
-
- )}
-
- {/* API Call Logs */}
-
-
API Activity
-
-
-
-
-
Plan Generation
-
-
- {new Date(run.startedAt).toLocaleTimeString()}
-
-
-
- Generated research plan with {run.config?.plan?.experiments?.length || 0} experiments
-
-
-
- {run.status === 'running' && (
-
-
-
-
GPU Provisioning
-
-
- In progress
-
-
-
- Requesting {run.gpuProvider} resources for experiment execution
-
-
- )}
-
- {run.status === 'completed' && (
-
-
-
-
Execution Complete
-
-
- {run.endedAt ? new Date(run.endedAt).toLocaleTimeString() : 'Completed'}
-
-
-
- All experiments completed successfully. Total cost: ${run.cost}
-
-
- )}
-
-
-
-
- ))
- ) : (
-
-
-
- No Agent Activity
-
- Launch an AI agent to see real-time activity tracking and API call logs.
-
-
-
-
- Launch Agent
-
-
-
-
- )}
-
-
-
- {/* Artifacts Tab */}
-
-
-
Artifacts
-
Generated files, models, and outputs
-
-
-
- Artifacts will appear here as agents generate them.
-
-
-
-
- {/* Reports Tab */}
-
-
-
Reports
-
Experiment summaries and comparisons
-
-
-
- Reports will be generated automatically as experiments complete.
-
-
-
-
- {/* Settings Tab */}
-
-
-
Project Settings
-
Configure project settings and preferences
-
-
-
-
-
Total Budget
-
${project.budget}
-
-
-
Used Budget
-
${project.usedBudget.toFixed(2)}
-
-
-
Status
-
- {project.status}
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/app/projects/[id]/runs/[runId]/page.tsx b/app/projects/[id]/runs/[runId]/page.tsx
deleted file mode 100644
index 9be60ff..0000000
--- a/app/projects/[id]/runs/[runId]/page.tsx
+++ /dev/null
@@ -1,401 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
-import { Badge } from '@/components/ui/badge';
-import { Button } from '@/components/ui/button';
-import { Progress } from '@/components/ui/progress';
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { ScrollArea } from '@/components/ui/scroll-area';
-import { Separator } from '@/components/ui/separator';
-import {
- ArrowLeft,
- Play,
- Pause,
- Square,
- Clock,
- Cpu,
- DollarSign,
- Activity,
- FileText,
- TrendingUp,
- AlertCircle
-} from 'lucide-react';
-import Link from 'next/link';
-
-// Mock data for run details
-const mockRun = {
- id: 'run-1',
- name: 'Base Model Training',
- status: 'running',
- progress: 75,
- eta: '2h 15m',
- cost: '$45.20',
- gpu: 'A100 x 4',
- started: '4 hours ago',
- projectId: '1',
- config: {
- model: 'Llama-2-7B',
- batchSize: 32,
- learningRate: 0.0001,
- epochs: 10,
- currentEpoch: 7
- }
-};
-
-const mockTimeline = [
- {
- step: 'Plan Generation',
- status: 'completed',
- duration: '2m 15s',
- description: 'Agent analyzed repository and generated training plan',
- timestamp: '4 hours ago'
- },
- {
- step: 'Environment Setup',
- status: 'completed',
- duration: '5m 30s',
- description: 'GPU provisioning and dependency installation',
- timestamp: '3h 55m ago'
- },
- {
- step: 'Data Preprocessing',
- status: 'completed',
- duration: '12m 45s',
- description: 'Dataset loading and tokenization',
- timestamp: '3h 42m ago'
- },
- {
- step: 'Model Training',
- status: 'running',
- duration: '3h 29m',
- description: 'Training epochs 1-7 of 10',
- timestamp: '3h 29m ago'
- },
- {
- step: 'Evaluation',
- status: 'pending',
- duration: '—',
- description: 'Model evaluation on validation set',
- timestamp: '—'
- },
- {
- step: 'Analysis & Next Steps',
- status: 'pending',
- duration: '—',
- description: 'Performance analysis and plan updates',
- timestamp: '—'
- }
-];
-
-const mockLogs = [
- '[15:42:33] INFO: Starting training epoch 7/10',
- '[15:42:33] INFO: Loading checkpoint from epoch 6',
- '[15:42:35] INFO: Checkpoint loaded successfully',
- '[15:42:35] INFO: Resuming training...',
- '[15:43:12] INFO: Batch 1/2847 | Loss: 2.341 | LR: 9.5e-05',
- '[15:43:15] INFO: Batch 2/2847 | Loss: 2.338 | LR: 9.5e-05',
- '[15:43:18] INFO: Batch 3/2847 | Loss: 2.335 | LR: 9.5e-05',
- '[15:43:21] INFO: Batch 4/2847 | Loss: 2.332 | LR: 9.5e-05',
- '[15:43:24] INFO: Batch 5/2847 | Loss: 2.329 | LR: 9.5e-05',
- '[15:43:27] INFO: GPU Memory: 78.2GB / 80GB (97.8%)',
- '[15:43:30] INFO: Batch 6/2847 | Loss: 2.326 | LR: 9.5e-05',
- '[15:43:33] INFO: Batch 7/2847 | Loss: 2.323 | LR: 9.5e-05'
-];
-
-const mockMetrics = [
- { name: 'Training Loss', value: '2.323', trend: 'down' },
- { name: 'Validation Accuracy', value: '73.2%', trend: 'up' },
- { name: 'Throughput', value: '1,247 tok/s', trend: 'stable' },
- { name: 'GPU Utilization', value: '97.8%', trend: 'stable' }
-];
-
-export default function RunDetailPage({ params }: { params: { id: string; runId: string } }) {
- const [activeTab, setActiveTab] = useState('timeline');
-
- return (
-
- {/* Header */}
-
-
-
-
-
-
- Back to Project
-
-
-
-
-
{mockRun.name}
-
- {mockRun.status}
-
-
-
- Started {mockRun.started}
-
-
-
-
-
- {mockRun.gpu}
-
-
-
- {mockRun.cost}
-
- ETA: {mockRun.eta}
-
-
-
-
-
- Pause
-
-
-
- Stop
-
-
-
-
-
-
- {/* Progress Bar */}
-
-
-
-
-
- Overall Progress
- {mockRun.progress}% complete
-
-
-
-
- Epoch {mockRun.config.currentEpoch}/{mockRun.config.epochs}
-
-
-
-
-
- {/* Main Content */}
-
-
- {/* Left Sidebar - Quick Stats */}
-
- {/* Live Metrics */}
-
-
-
-
- Live Metrics
-
-
-
- {mockMetrics.map((metric) => (
-
- ))}
-
-
-
- {/* Configuration */}
-
-
- Configuration
-
-
-
-
Model
-
{mockRun.config.model}
-
-
-
Batch Size
-
{mockRun.config.batchSize}
-
-
-
Learning Rate
-
{mockRun.config.learningRate}
-
-
-
Epochs
-
{mockRun.config.epochs}
-
-
-
-
-
- {/* Main Content Area */}
-
-
-
- Timeline
- Live Logs
- Charts
- Config
-
-
- {/* Timeline Tab */}
-
-
-
- Execution Timeline
- Agent steps and their current status
-
-
-
- {mockTimeline.map((step, index) => (
-
-
-
- {index < mockTimeline.length - 1 && (
-
- )}
-
-
-
-
{step.step}
-
-
- {step.status}
-
- {step.duration}
-
-
-
{step.description}
-
{step.timestamp}
-
-
- ))}
-
-
-
-
-
- {/* Logs Tab */}
-
-
-
-
-
- Live Logs
-
- Real-time execution logs
-
-
-
-
- {mockLogs.map((log, index) => (
-
-
- {index + 1}
-
- {log}
-
- ))}
-
-
-
-
-
-
- {/* Charts Tab */}
-
-
-
-
- Training Loss
-
-
-
- Training loss chart would be rendered here
-
-
-
-
-
- Validation Accuracy
-
-
-
- Validation accuracy chart would be rendered here
-
-
-
-
-
- GPU Utilization
-
-
-
- GPU utilization chart would be rendered here
-
-
-
-
-
- Throughput
-
-
-
- Throughput chart would be rendered here
-
-
-
-
-
-
- {/* Config Tab */}
-
-
-
- Run Configuration
- View and edit run parameters
-
-
-
-
-
-
-
-
Configuration is read-only during execution
-
Pause the run to make changes
-
-
-
-
-
{JSON.stringify(mockRun.config, null, 2)}
-
-
- Edit Configuration
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/app/projects/page.tsx b/app/projects/page.tsx
deleted file mode 100644
index 7e8b087..0000000
--- a/app/projects/page.tsx
+++ /dev/null
@@ -1,293 +0,0 @@
-'use client';
-
-import { useState } from 'react';
-import { useQuery, useMutation } from 'convex/react';
-import { api } from '../../convex/_generated/api';
-import { Button } from '@/components/ui/button';
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
-import { Badge } from '@/components/ui/badge';
-import { Input } from '@/components/ui/input';
-import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
-import { Label } from '@/components/ui/label';
-import { Textarea } from '@/components/ui/textarea';
-import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
-import { Plus, Search, Filter, Play, Pause, Square, MoreHorizontal } from 'lucide-react';
-import Link from 'next/link';
-import { AppLayout } from '@/components/layout/app-layout';
-
-const statusColors = {
- running: 'bg-green-500',
- completed: 'bg-blue-500',
- paused: 'bg-yellow-500',
- failed: 'bg-red-500'
-};
-
-const statusLabels = {
- running: 'Running',
- completed: 'Completed',
- paused: 'Paused',
- failed: 'Failed'
-};
-
-export default function ProjectsPage() {
- const [searchTerm, setSearchTerm] = useState('');
- const [statusFilter, setStatusFilter] = useState('all');
- const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
- const [newProjectName, setNewProjectName] = useState('');
- const [newProjectDescription, setNewProjectDescription] = useState('');
- const [newProjectBudget, setNewProjectBudget] = useState(1000);
-
- // Convex queries and mutations
- const projects = useQuery(api.projects.list, {});
- const createProject = useMutation(api.projects.create);
- const createSampleData = useMutation(api.seed.createSampleData);
- const createAgentPlan = useMutation(api.agents.createAgentPlan);
-
- const handleCreateProject = async () => {
- if (!newProjectName.trim()) return;
-
- await createProject({
- name: newProjectName,
- description: newProjectDescription,
- budget: newProjectBudget,
- });
-
- setNewProjectName('');
- setNewProjectDescription('');
- setNewProjectBudget(1000);
- setIsCreateDialogOpen(false);
- };
-
- const handleCreateSampleData = async () => {
- await createSampleData({});
- };
-
- const handleStartAgent = async (projectId: string, researchGoal: string) => {
- try {
- await createAgentPlan({
- projectId: projectId as any,
- researchGoal,
- codebase: undefined, // Could be enhanced to include actual codebase
- });
- } catch (error) {
- console.error("Error starting agent:", error);
- }
- };
-
- const filteredProjects = projects?.filter(project => {
- const matchesSearch = project.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
- project.description.toLowerCase().includes(searchTerm.toLowerCase());
- const matchesStatus = statusFilter === 'all' || project.status === statusFilter;
- return matchesSearch && matchesStatus;
- }) || [];
-
- return (
-
-
- {/* Header */}
-
-
-
Projects
-
Manage your AI research projects
-
-
-
-
- Load Sample Data
-
-
-
-
-
- New Project
-
-
-
-
- Create New Project
-
- Create a new AI research project. Configure your research goals and connect your resources.
-
-
-
-
- Project Name
- setNewProjectName(e.target.value)}
- />
-
-
- Description
-
-
- Budget ($)
- setNewProjectBudget(Number(e.target.value))}
- />
-
-
-
- setIsCreateDialogOpen(false)}>
- Cancel
-
-
- Create Project
-
-
-
-
-
-
-
- {/* Filters */}
-
-
-
- setSearchTerm(e.target.value)}
- className="pl-10"
- />
-
-
-
-
-
-
-
- All Status
- Running
- Completed
- Paused
- Failed
-
-
-
-
- {/* Projects Grid */}
-
- {filteredProjects.map((project) => (
-
-
-
-
-
-
- {project.name}
-
-
-
- {project.description}
-
-
-
-
-
- {statusLabels[project.status as keyof typeof statusLabels]}
-
-
-
-
-
- {/* Stats */}
-
-
-
Budget
-
${project.budget}
-
-
-
Used
-
${project.usedBudget.toFixed(2)}
-
-
-
- {/* Settings */}
-
-
Configuration
-
- {project.settings?.model && (
-
- {project.settings.model}
-
- )}
- {project.settings?.batchSize && (
-
- Batch: {project.settings.batchSize}
-
- )}
-
-
-
- {/* Actions */}
-
-
- Created: {new Date(project.createdAt).toLocaleDateString()}
-
-
-
handleStartAgent(project._id, project.description)}
- title="Start AI Agent Research"
- >
-
-
- {project.status === 'running' && (
- <>
-
-
-
-
-
-
- >
- )}
-
-
-
-
-
-
-
- ))}
-
-
- {filteredProjects.length === 0 && (
-
-
- {searchTerm || statusFilter !== 'all'
- ? 'No projects match your filters'
- : 'No projects yet'
- }
-
- {!searchTerm && statusFilter === 'all' && (
-
-
- Load Sample Data
-
-
setIsCreateDialogOpen(true)}>
-
- Create Your First Project
-
-
- )}
-
- )}
-
-
- );
-}
diff --git a/app/sdlm-sequential-diffusion-language-model/page.tsx b/app/sdlm-sequential-diffusion-language-model/page.tsx
new file mode 100644
index 0000000..9bc937e
--- /dev/null
+++ b/app/sdlm-sequential-diffusion-language-model/page.tsx
@@ -0,0 +1,583 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+
+export default function SDLMPage() {
+ const { language } = useLanguage();
+
+ return (
+ <>
+ {/* Hero Section */}
+
+ {/* Background effects */}
+
+
+
+ {/* Animated background particles */}
+
+
+
+
+
+
+
+ SDLM
+
+
+
+ {language === 'en' ? 'Sequential Diffusion Language Model' : '序列扩散语言模型'}
+
+
+ {/* Glow effect for the title */}
+
+
+ SDLM
+
+
+
+
+
+ {language === 'en'
+ ? 'Enhances pre-trained autoregressive language models by adaptively determining generation length and maintaining KV-cache compatibility, achieving high efficiency and throughput.'
+ : '通过自适应确定生成长度并保持KV缓存兼容性来增强预训练的自回归语言模型,实现高效率和吞吐量。'
+ }
+
+
+ {/* Key Features */}
+
+
+
+ {language === 'en' ? '2x Faster' : '2倍更快'}
+
+
+
+ {language === 'en' ? 'KV-Cache Compatible' : 'KV缓存兼容'}
+
+
+
+ {language === 'en' ? 'High Performance' : '高性能'}
+
+
+
+ {/* Call to action buttons */}
+
+
+
+
+
+ {/* Main Content */}
+
+
+
+ {/* Introduction Section */}
+
+
+ {language === 'en' ? 'Introduction' : '介绍'}
+
+
+
+ {/* Autoregression */}
+
+
+
+ {language === 'en' ? 'Autoregression' : '自回归'}
+
+
+ {language === 'en' ? 'Predicts tokens one by one' : '逐个预测标记'}
+
+
+
+ {/* Diffusion */}
+
+
+
+ {language === 'en' ? 'Diffusion' : '扩散'}
+
+
+ {language === 'en' ? 'Regenerates all tokens each step' : '每步重新生成所有标记'}
+
+
+
+ {/* SDLM */}
+
+
+
+ SDLM (Ours)
+
+
+ {language === 'en' ? 'Decodes D tokens per step, keeps confident tokens' : '每步解码D个标记,保留置信标记'}
+
+
+
+
+
+ {language === 'en'
+ ? 'SDLM delivers strong performance with significantly faster decoding speed. It operates approximately 2x faster than comparable autoregressive models while matching their accuracy, and achieves up to 5x speedup over other diffusion language models, as evidenced by results on the MATH-500 benchmark.'
+ : 'SDLM在显著更快的解码速度下提供强大的性能。它在匹配准确性的同时,比可比较的自回归模型快约2倍,并且比其他扩散语言模型快达5倍,这在MATH-500基准测试结果中得到证明。'
+ }
+
+
+
+ {/* Model Zoo Section */}
+
+
+ {language === 'en' ? 'Model Zoo' : '模型库'}
+
+
+
+
+
+
+
+ {language === 'en' ? 'Model Name' : '模型名称'}
+
+
+ {language === 'en' ? 'Base Model' : '基础模型'}
+
+
+ {language === 'en' ? 'HuggingFace Link' : 'HuggingFace 链接'}
+
+
+
+
+
+ SDLM-3B-D4
+ Qwen2.5-3B
+
+
+ OpenGVLab/SDLM-3B-D4
+
+
+
+
+ SDLM-3B-D8
+ Qwen2.5-3B
+
+
+ OpenGVLab/SDLM-3B-D8
+
+
+
+
+ SDLM-32B-D4
+ Qwen2.5-32B
+
+
+ OpenGVLab/SDLM-32B-D4
+
+
+
+
+
+
+
+
+ {/* Performance Section */}
+
+
+ {language === 'en' ? 'Performance' : '性能'}
+
+
+
+
+
+ 92.4
+
+
GSM8K
+
SDLM-32B
+
+
+
+
+ 74.2
+
+
MATH
+
SDLM-32B
+
+
+
+
+ 81.1
+
+
HumanEval
+
SDLM-32B
+
+
+
+
+ 80.9
+
+
MBPP
+
SDLM-32B
+
+
+
+
+
+ {language === 'en' ? 'Efficiency Gains' : '效率提升'}
+
+
+
+
+ {language === 'en' ? 'Each forward pass generates ~2 tokens on average' : '每次前向传播平均生成~2个标记'}
+
+
+
+ {language === 'en' ? '≈2× speedup over autoregressive models' : '比自回归模型快≈2倍'}
+
+
+
+ {language === 'en' ? 'Two-thirds latency of AR models' : '自回归模型的三分之二延迟'}
+
+
+
+
+
+ {/* Methods Section */}
+
+
+ {language === 'en' ? 'Methods' : '方法'}
+
+
+
+
+
+ {language === 'en' ? 'Training Pipeline' : '训练流程'}
+
+
+ {language === 'en'
+ ? 'The reordered input sequence enables structured masking with causal prefix, visible cross-block prefix, and intra-block bidirectional attention.'
+ : '重新排序的输入序列通过因果前缀、可见跨块前缀和块内双向注意力实现结构化掩码。'
+ }
+
+
+
+
+ {language === 'en' ? 'Causal prefix (top-left)' : '因果前缀(左上)'}
+
+
+
+ {language === 'en' ? 'Visible cross-block prefix (bottom-left)' : '可见跨块前缀(左下)'}
+
+
+
+ {language === 'en' ? 'Intra-block bidirectional attention (bottom-right)' : '块内双向注意力(右下)'}
+
+
+
+
+
+
+ {language === 'en' ? 'Sampling Pipeline' : '采样流程'}
+
+
+ {language === 'en'
+ ? 'Confidence-based dynamic block decoding with KV cache reuse. At each step, a block of D tokens is predicted with D-1 padding masks. The longest high-confidence prefix is selected as dynamic output.'
+ : '基于置信度的动态块解码与KV缓存重用。在每一步,预测D个标记的块,使用D-1个填充掩码。选择最长的高置信度前缀作为动态输出。'
+ }
+
+
+
+
+ {language === 'en' ? 'Dynamic block decoding' : '动态块解码'}
+
+
+
+ {language === 'en' ? 'KV cache reuse' : 'KV缓存重用'}
+
+
+
+ {language === 'en' ? 'Confidence-based selection' : '基于置信度的选择'}
+
+
+
+
+
+
+ {/* Inference Section */}
+
+
+ {language === 'en' ? 'Inference' : '推理'}
+
+
+
+
+ {language === 'en' ? 'Quick Start with HuggingFace' : '使用 HuggingFace 快速开始'}
+
+
+ {`import torch
+from transformers import AutoModelForCausalLM, AutoTokenizer
+from sdlm_inference import SDLM_generate
+
+# Load model and tokenizer
+ckpt_hf = 'OpenGVLab/SDLM-3B-D4'
+model = AutoModelForCausalLM.from_pretrained(
+ ckpt_hf,
+ attn_implementation="eager",
+ trust_remote_code=True
+).to(dtype=torch.float16)
+tokenizer = AutoTokenizer.from_pretrained(ckpt_hf)
+
+# Prepare input
+prompt = 'Write a Fibonacci function in Python.'
+messages = [
+ {"role": "system", "content": "You are a helpful assistant."},
+ {"role": "user", "content": prompt}
+]
+text = tokenizer.apply_chat_template(
+ messages,
+ tokenize=False,
+ add_generation_prompt=True
+)
+
+# Generate response
+model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
+response, history = SDLM_generate(
+ model,
+ tokenizer,
+ model_inputs,
+ max_gen_len=1024,
+ temperature=0,
+ threshold=0.5,
+ n_future_tokens=4,
+ alg='prob_conf',
+ save_history=True,
+ use_cache=True
+)
+
+print('response: ', response[0])`}
+
+
+
+
+ {/* Training Section */}
+
+
+ {language === 'en' ? 'Training' : '训练'}
+
+
+
+
+
+ {language === 'en' ? 'Environment Setup' : '环境设置'}
+
+
+
+ {`git clone https://github.com/OpenGVLab/SDLM.git
+cd SDLM`}
+
+
+
+
+
+
+ {language === 'en' ? 'Key Dependencies' : '关键依赖'}
+
+
+
+ {`transformers==4.37.2
+deepspeed==0.16.5
+torch>=2.5.0
+accelerate==0.32.1`}
+
+
+
+
+
+
+ {language === 'en' ? 'Training Dataset' : '训练数据集'}
+
+
+
+
+
+
+ {language === 'en' ? 'Dataset Name' : '数据集名称'}
+
+
+ {language === 'en' ? 'Samples' : '样本数'}
+
+
+ {language === 'en' ? 'Domain' : '领域'}
+
+
+
+
+
+ ScaleQuest-Math
+ 1,000K
+ Math
+
+
+ Opc-sft-stage2
+ 436K
+ Code
+
+
+ Smoltalk
+ 1,100K
+ General
+
+
+ Tulu-3-sft-mixture
+ 939K
+ General
+
+
+ SciRIFF
+ 79K
+ Science
+
+
+ Table-GPT
+ 13K
+ Table
+
+
+
+
+ Total
+ 3,506K
+ --
+
+
+
+
+
+
+
+
+ {/* Citation Section */}
+
+
+ {language === 'en' ? 'Citation' : '引用'}
+
+
+
+
+ {`@article{liu2025sdlm,
+ title={Sequential Diffusion Language Models},
+ author={Liu, Yangzhou and Cao, Yue and Li, Hao and Luo, Gen and Chen, Zhe and Wang, Weiyun and Liang, Xiaobo and Qi, Biqing and Wu, Lijun and Tian, Changyao and Zhang, Yanting and Li, Yuqiang and Lu, Tong and Qiao, Yu and Dai, Jifeng and Wang, Wenhai},
+ journal={arXiv preprint arXiv:2509.24007},
+ year={2025}
+}`}
+
+
+
+
+ {/* Call to Action */}
+
+
+
+ {language === 'en' ? 'Ready to Explore SDLM?' : '准备好探索 SDLM 了吗?'}
+
+
+ {language === 'en'
+ ? 'Join the community and contribute to the future of efficient language modeling.'
+ : '加入社区,为高效语言建模的未来做出贡献。'
+ }
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/sla-sparse-linear-attention/page.tsx b/app/sla-sparse-linear-attention/page.tsx
new file mode 100644
index 0000000..f8541af
--- /dev/null
+++ b/app/sla-sparse-linear-attention/page.tsx
@@ -0,0 +1,317 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+
+export default function SLASparseLinearAttention() {
+ const { language } = useLanguage();
+
+ return (
+ <>
+ {/* Hero Section */}
+
+ {/* Background effects */}
+
+
+
+ {/* Animated background particles */}
+
+
+
+
+
+
+
+ {language === 'en' ? 'SLA: Sparse-Linear Attention' : 'SLA: 稀疏线性注意力'}
+
+
+
+ {/* Glow effect for the title */}
+
+
+ {language === 'en' ? 'SLA: Sparse-Linear Attention' : 'SLA: 稀疏线性注意力'}
+
+
+
+
+
+ {language === 'en'
+ ? 'Beyond Sparsity in Diffusion Transformers via Fine-Tunable Sparse-Linear Attention'
+ : '通过可微调稀疏线性注意力超越扩散变换器中的稀疏性'
+ }
+
+
+
+
+
+ {/* Main Content */}
+
+
+
+ {/* Research Paper Section */}
+
+
+
+
+
+ {language === 'en' ? 'Research Paper' : '研究论文'}
+
+
+ {language === 'en'
+ ? 'SLA (Sparse-Linear Attention) is a trainable attention method that fuses sparse and linear attention to accelerate diffusion models. It achieves a 20x reduction in attention computation with minimal quality loss.'
+ : 'SLA(稀疏线性注意力)是一种可训练的注意力方法,融合稀疏注意力和线性注意力来加速扩散模型。它在最小质量损失的情况下实现了20倍的注意力计算减少。'
+ }
+
+
+
+
+
+
+ {/* Key Features */}
+
+
+
+
+
+ {language === 'en' ? '20x Speedup' : '20倍加速'}
+
+
+
+ {language === 'en'
+ ? 'Achieves 20x reduction in attention computation with minimal quality loss in diffusion models.'
+ : '在扩散模型中实现20倍的注意力计算减少,质量损失最小。'
+ }
+
+
+
+
+
+
+
+ {language === 'en' ? '95% Reduction' : '95%减少'}
+
+
+
+ {language === 'en'
+ ? 'Reduces attention computation by 95% without degrading end-to-end generation quality.'
+ : '在不降低端到端生成质量的情况下,将注意力计算减少95%。'
+ }
+
+
+
+
+
+
+
+ {language === 'en' ? 'GPU Kernel' : 'GPU内核'}
+
+
+
+ {language === 'en'
+ ? 'Efficient GPU kernel implementation yields 13.7x speedup in attention computation.'
+ : '高效的GPU内核实现使注意力计算加速13.7倍。'
+ }
+
+
+
+
+ {/* Technical Details */}
+
+
+ {language === 'en' ? 'Technical Innovation' : '技术创新'}
+
+
+
+
+
+
+
+ {language === 'en' ? 'Attention Weight Classification' : '注意力权重分类'}
+
+
+ {language === 'en'
+ ? 'SLA classifies attention weights into critical, marginal, and negligible categories, applying O(N²) attention to critical weights, O(N) attention to marginal weights, and skipping negligible ones.'
+ : 'SLA将注意力权重分为关键、边缘和可忽略三类,对关键权重应用O(N²)注意力,对边缘权重应用O(N)注意力,跳过可忽略的权重。'
+ }
+
+
+
+
+
+
+
+
+ {language === 'en' ? 'Hybrid Approach' : '混合方法'}
+
+
+ {language === 'en'
+ ? 'Combines sparse acceleration for high-rank weights with low-rank acceleration for remaining weights, fusing both computations into a single GPU kernel.'
+ : '将高秩权重的稀疏加速与剩余权重的低秩加速相结合,将两种计算融合到单个GPU内核中。'
+ }
+
+
+
+
+
+
+
+
+ {language === 'en' ? 'Video Generation Focus' : '视频生成重点'}
+
+
+ {language === 'en'
+ ? 'Specifically designed for Diffusion Transformer models in video generation, where attention latency is a major bottleneck due to long sequence lengths and quadratic complexity.'
+ : '专门为视频生成中的扩散变换器模型设计,由于长序列长度和二次复杂度,注意力延迟是主要瓶颈。'
+ }
+
+
+
+
+
+
+ {/* Performance Results */}
+
+
+ {language === 'en' ? 'Performance Results' : '性能结果'}
+
+
+
+
+
+ 20x
+
+
+ {language === 'en' ? 'Attention Reduction' : '注意力减少'}
+
+
+ {language === 'en'
+ ? 'Reduction in attention computation'
+ : '注意力计算减少'
+ }
+
+
+
+
+
+ 13.7x
+
+
+ {language === 'en' ? 'GPU Speedup' : 'GPU加速'}
+
+
+ {language === 'en'
+ ? 'Speedup in attention computation'
+ : '注意力计算加速'
+ }
+
+
+
+
+
+ 2.2x
+
+
+ {language === 'en' ? 'End-to-End' : '端到端'}
+
+
+ {language === 'en'
+ ? 'Speedup in video generation'
+ : '视频生成加速'
+ }
+
+
+
+
+
+ 95%
+
+
+ {language === 'en' ? 'Computation Cut' : '计算削减'}
+
+
+ {language === 'en'
+ ? 'Reduction without quality loss'
+ : '无质量损失的减少'
+ }
+
+
+
+
+
+ {/* Back to Home */}
+
+
+
+
+
+ {language === 'en' ? 'Back to Home' : '返回首页'}
+
+
+
+
+ >
+ );
+}
diff --git a/app/test-chatbot/page.tsx b/app/test-chatbot/page.tsx
deleted file mode 100644
index d2e090b..0000000
--- a/app/test-chatbot/page.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-'use client';
-
-import React from 'react';
-import Chatbot from '@/components/chatbot';
-import Canvas from '@/components/canvas';
-import { AppLayout } from '@/components/layout/app-layout';
-
-export default function TestChatbot() {
- return (
-
-
-
Test Chatbot Interface
-
-
-
AI Assistant
-
-
-
-
Results Canvas
-
-
-
-
-
- );
-}
diff --git a/app/test/page.tsx b/app/test/page.tsx
deleted file mode 100644
index 4187886..0000000
--- a/app/test/page.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-'use client';
-
-import { useQuery, useMutation } from 'convex/react';
-import { api } from '../../convex/_generated/api';
-import { Button } from '@/components/ui/button';
-import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
-import { Badge } from '@/components/ui/badge';
-import { AppLayout } from '@/components/layout/app-layout';
-
-export default function TestPage() {
- const projects = useQuery(api.projects.list, {});
- const createProject = useMutation(api.projects.create);
- const createSampleData = useMutation(api.seed.createSampleData);
-
- const handleCreateTestProject = async () => {
- await createProject({
- name: `Test Project ${Date.now()}`,
- description: 'A test project created from the test page',
- budget: 500,
- });
- };
-
- return (
-
-
-
-
Convex Integration Test
-
- This page tests the real-time connection between your Next.js frontend and Convex backend.
-
-
-
-
- Create Test Project
-
- createSampleData({})} variant="outline">
- Load Sample Data
-
-
-
-
-
-
-
- Projects from Convex Database
-
-
- {projects === undefined ? (
- Loading projects...
- ) : projects.length === 0 ? (
- No projects found. Create one above!
- ) : (
-
- {projects.map((project) => (
-
-
-
{project.name}
-
{project.description}
-
- {project.status}
- Budget: ${project.budget}
- Used: ${project.usedBudget.toFixed(2)}
-
-
-
- {new Date(project.createdAt).toLocaleString()}
-
-
- ))}
-
- )}
-
-
-
-
-
- Real-time Status
-
-
-
-
-
-
Convex connection: Active
-
-
-
-
Real-time updates: Enabled
-
-
-
-
Database queries: Working
-
-
-
-
-
-
-
- );
-}
diff --git a/app/zero-to-ai-researcher/page.tsx b/app/zero-to-ai-researcher/page.tsx
new file mode 100644
index 0000000..c247535
--- /dev/null
+++ b/app/zero-to-ai-researcher/page.tsx
@@ -0,0 +1,260 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+
+export default function BlueberryLLMPage() {
+ const { language } = useLanguage();
+
+ return (
+
+ {/* Blog Content */}
+
+
+
+ ← Back to Home
+
+
+
+ {/* Title */}
+
+
+ Zero To AI Researcher - Full Course
+
+
+
+
+ {/* Video Placeholder */}
+
+
+
+
+
Course Introduction Video
+
Coming Soon
+
+
+
+
+ {/* Introduction */}
+
+
+ The Blueberry LLM Research Course is a comprehensive educational journey that takes you from zero to AI researcher,
+ focusing on cutting-edge transformer architectures including Mixture of Experts (MoE) models inspired by DeepSeek and GLM4.
+
+
+ This course provides hands-on experience with advanced AI research methodologies, from foundational concepts to implementing
+ state-of-the-art architectures. Whether you're a beginner or looking to deepen your understanding of modern LLM research,
+ this course offers a structured path to becoming an AI researcher.
+
+
+
+ {/* Key Questions */}
+
+ Key Questions This Course Answers
+
+
+
1. How do Mixture of Experts (MoE) models work and why are they crucial for scaling LLMs?
+
+ Learn the fundamentals of MoE architecture, expert routing mechanisms, and load balancing strategies that enable
+ efficient scaling of language models while maintaining computational efficiency.
+
+
+
+
+
2. What makes DeepSeek's attention mechanisms innovative and how can they be combined with MoE?
+
+ Explore DeepSeek's advanced attention mechanisms, including sparse attention patterns, RoPE scaling, and LoRA-style projections,
+ and understand how to integrate them with MoE architectures for optimal performance.
+
+
+
+
+
3. How do you conduct systematic AI research and evaluate different architectures?
+
+ Master the art of AI research through structured experimentation, ablation studies, benchmarking methodologies,
+ and learn how to design and execute comprehensive research projects in the field of large language models.
+
+
+
+
+
+ {/* Course Structure */}
+
+ Course Structure
+
+
+
Foundation Modules
+
+ • Python fundamentals for AI research
+ • Mathematical foundations (linear algebra, calculus)
+ • PyTorch basics and tensor operations
+ • Neural network fundamentals
+ • Activation functions and optimization
+
+
+
+
+
Advanced Topics
+
+ • Attention mechanisms and transformers
+ • DeepSeek attention implementation
+ • GLM4 MoE architecture
+ • Hybrid model combinations
+ • Research methodology and evaluation
+
+
+
+
+
+ {/* Key Features */}
+
+ What You'll Build
+
+
+
+
MoE Models
+
Implement efficient Mixture of Experts architectures with expert routing and load balancing
+
+
+
+
+
DeepSeek Attention
+
Build advanced attention mechanisms with RoPE scaling and sparse patterns
+
+
+
+
+
Research Framework
+
Develop systematic experimentation and evaluation methodologies
+
+
+
+
+ {/* Experiments */}
+
+ Hands-On Experiments
+
+
+
Experiment 1: Architecture Ablation Study
+
+ Compare 5 different model variants (baseline, MLP, attention+MLP, MoE, attention+MoE) to understand the impact of each component.
+
+
HellaSwag Benchmark
+
+
+
+
Experiment 2: Learning Rate Optimization
+
+ Systematic exploration of optimal learning rates for DeepSeek attention + MLP combinations.
+
+
Grid Search
+
+
+
+
Experiment 3: Expert Configuration Search
+
+ Optimize expert count, learning rates, and top-k values for DeepSeek attention + GLM4 MoE hybrid models.
+
+
Validation Metrics
+
+
+
+
+ {/* Getting Started */}
+
+ Getting Started
+
+
+
+
1. Clone the Repository
+
+ git clone https://github.com/vukrosic/zero-to-ai-researcher
+
+
+
+
+
2. Install Dependencies
+
+ pip install -r requirements.txt
+
+
+
+
+
3. Start Learning
+
+ cd _course/01_python_beginner_lessons
+
+
+
+
+
+
+ {/* Call to Action */}
+
+
+
Ready to Start Your AI Research Journey?
+
+ Join the open-source community and contribute to cutting-edge AI research
+
+
+
+
+
+
+
+ );
+}
diff --git a/components.json b/components.json
deleted file mode 100644
index 36ef86e..0000000
--- a/components.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "$schema": "https://ui.shadcn.com/schema.json",
- "style": "new-york",
- "rsc": true,
- "tsx": true,
- "tailwind": {
- "config": "tailwind.config.js",
- "css": "app/globals.css",
- "baseColor": "neutral",
- "cssVariables": true,
- "prefix": ""
- },
- "iconLibrary": "lucide",
- "aliases": {
- "components": "@/components",
- "utils": "@/lib/utils",
- "ui": "@/components/ui",
- "lib": "@/lib",
- "hooks": "@/hooks"
- },
- "registries": {}
-}
diff --git a/components/canvas.tsx b/components/canvas.tsx
deleted file mode 100644
index e78d66d..0000000
--- a/components/canvas.tsx
+++ /dev/null
@@ -1,214 +0,0 @@
-'use client';
-
-import React, { useRef, useEffect, useState } from 'react';
-import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
-import { Button } from '@/components/ui/button';
-import { Badge } from '@/components/ui/badge';
-import { ScrollArea } from '@/components/ui/scroll-area';
-import { Download, RefreshCw, Trash2, BarChart3, TrendingUp, Activity } from 'lucide-react';
-
-interface CanvasResult {
- id: string;
- type: 'chart' | 'metric' | 'text' | 'image';
- title: string;
- content: any;
- timestamp: Date;
- status: 'pending' | 'completed' | 'error';
-}
-
-interface CanvasProps {
- projectId: string;
-}
-
-export default function Canvas({ projectId }: CanvasProps) {
- const canvasRef = useRef(null);
- const [results, setResults] = useState([
- {
- id: '1',
- type: 'text',
- title: 'Welcome to Results Canvas',
- content: 'Your experiment results and visualizations will appear here. Start a conversation with the AI assistant to generate results.',
- timestamp: new Date(),
- status: 'completed'
- }
- ]);
- const [isDrawing, setIsDrawing] = useState(false);
-
- // Mock function to add new results
- const addResult = (result: Omit) => {
- const newResult: CanvasResult = {
- ...result,
- id: Date.now().toString(),
- timestamp: new Date()
- };
- setResults(prev => [...prev, newResult]);
- };
-
- // Mock function to simulate drawing on canvas
- const drawOnCanvas = () => {
- const canvas = canvasRef.current;
- if (!canvas) return;
-
- const ctx = canvas.getContext('2d');
- if (!ctx) return;
-
- setIsDrawing(true);
-
- // Clear canvas
- ctx.clearRect(0, 0, canvas.width, canvas.height);
-
- // Draw a simple chart simulation
- ctx.strokeStyle = '#3b82f6';
- ctx.lineWidth = 2;
- ctx.beginPath();
-
- // Draw a mock line chart
- const points = [
- { x: 50, y: 200 },
- { x: 100, y: 180 },
- { x: 150, y: 160 },
- { x: 200, y: 140 },
- { x: 250, y: 120 },
- { x: 300, y: 100 },
- { x: 350, y: 80 }
- ];
-
- points.forEach((point, index) => {
- if (index === 0) {
- ctx.moveTo(point.x, point.y);
- } else {
- ctx.lineTo(point.x, point.y);
- }
- });
-
- ctx.stroke();
-
- // Add labels
- ctx.fillStyle = '#374151';
- ctx.font = '12px Arial';
- ctx.fillText('Model Performance Over Time', 50, 30);
- ctx.fillText('Epochs', 200, 250);
-
- // Draw axes
- ctx.strokeStyle = '#6b7280';
- ctx.beginPath();
- ctx.moveTo(40, 220);
- ctx.lineTo(360, 220);
- ctx.moveTo(40, 20);
- ctx.lineTo(40, 220);
- ctx.stroke();
-
- setIsDrawing(false);
- };
-
- const clearCanvas = () => {
- const canvas = canvasRef.current;
- if (!canvas) return;
-
- const ctx = canvas.getContext('2d');
- if (!ctx) return;
-
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- };
-
- const downloadCanvas = () => {
- const canvas = canvasRef.current;
- if (!canvas) return;
-
- const link = document.createElement('a');
- link.download = `canvas-${Date.now()}.png`;
- link.href = canvas.toDataURL();
- link.click();
- };
-
- const getResultIcon = (type: string) => {
- switch (type) {
- case 'chart': return ;
- case 'metric': return ;
- case 'text': return ;
- case 'image': return ;
- default: return ;
- }
- };
-
- return (
-
- {/* Results Panel */}
-
-
-
-
-
- Results
-
-
-
-
-
- {results.map((result) => (
-
-
- {getResultIcon(result.type)}
- {result.title}
-
- {result.status}
-
-
-
- {result.timestamp.toLocaleString()}
-
-
- {typeof result.content === 'string'
- ? result.content
- : JSON.stringify(result.content).substring(0, 100) + '...'
- }
-
-
- ))}
-
-
-
-
-
-
- {/* Canvas Area */}
-
-
-
-
-
-
- Visualization Canvas
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Canvas for visualizing experiment results, charts, and data analysis
-
Results from AI assistant experiments will be drawn here automatically
-
-
-
-
-
- );
-}
diff --git a/components/chatbot.tsx b/components/chatbot.tsx
deleted file mode 100644
index 36b3164..0000000
--- a/components/chatbot.tsx
+++ /dev/null
@@ -1,543 +0,0 @@
-'use client';
-
-import React, { useState, useRef, useEffect } from 'react';
-import { useAction } from 'convex/react';
-import { api } from '../convex/_generated/api';
-import { Button } from '@/components/ui/button';
-import { Input } from '@/components/ui/input';
-import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
-import { Badge } from '@/components/ui/badge';
-import { ScrollArea } from '@/components/ui/scroll-area';
-import { Send, Bot, User, Loader2, Play, Pause, Square, CheckCircle, AlertCircle, Copy, Check } from 'lucide-react';
-import ReactMarkdown from 'react-markdown';
-import remarkGfm from 'remark-gfm';
-import rehypeHighlight from 'rehype-highlight';
-
-interface Message {
- id: string;
- type: 'user' | 'assistant' | 'system';
- content: string;
- timestamp: Date;
- isTyping?: boolean;
- tools?: ToolExecution[];
-}
-
-interface ToolExecution {
- id: string;
- name: string;
- status: 'pending' | 'running' | 'completed' | 'failed';
- result?: any;
- error?: string;
-}
-
-interface ChatbotProps {
- projectId: string;
- projectName: string;
-}
-
-// Mock MCP Tools
-const mockTools = {
- 'run_experiment': {
- name: 'Run Experiment',
- description: 'Execute a machine learning experiment',
- execute: async (params: any) => {
- await new Promise(resolve => setTimeout(resolve, 2000));
- return {
- experimentId: `exp_${Date.now()}`,
- status: 'running',
- progress: 0,
- estimatedTime: '2-3 hours',
- gpuAllocated: 'A100 x 2'
- };
- }
- },
- 'analyze_data': {
- name: 'Analyze Data',
- description: 'Perform data analysis and visualization',
- execute: async (params: any) => {
- await new Promise(resolve => setTimeout(resolve, 1500));
- return {
- analysisId: `analysis_${Date.now()}`,
- insights: ['Data shows normal distribution', 'Outliers detected in 3% of samples'],
- charts: ['distribution_plot.png', 'correlation_matrix.png']
- };
- }
- },
- 'train_model': {
- name: 'Train Model',
- description: 'Train a machine learning model',
- execute: async (params: any) => {
- await new Promise(resolve => setTimeout(resolve, 3000));
- return {
- modelId: `model_${Date.now()}`,
- accuracy: 0.94,
- loss: 0.12,
- epochs: 50,
- trainingTime: '45 minutes'
- };
- }
- },
- 'deploy_model': {
- name: 'Deploy Model',
- description: 'Deploy model to production',
- execute: async (params: any) => {
- await new Promise(resolve => setTimeout(resolve, 1000));
- return {
- deploymentId: `deploy_${Date.now()}`,
- endpoint: 'https://api.example.com/model/predict',
- status: 'active',
- latency: '45ms'
- };
- }
- },
- 'create_colab_notebook': {
- name: 'Create Colab Notebook',
- description: 'Generate and create a Google Colab notebook with code',
- execute: async (params: any) => {
- await new Promise(resolve => setTimeout(resolve, 1500));
-
- // Generate a Colab notebook with the provided code
- const notebookId = `colab_${Date.now()}`;
- const colabUrl = `https://colab.research.google.com/drive/${notebookId}`;
-
- // Create notebook content (simplified JSON structure for Colab)
- const notebookContent = {
- cells: [
- {
- cell_type: 'markdown',
- source: ['# AI Generated Notebook\n', 'Created by AI Research Assistant\n', `Generated at: ${new Date().toLocaleString()}`]
- },
- {
- cell_type: 'code',
- source: params.code || ['# Add your code here\n', 'print("Hello from AI-generated Colab notebook!")']
- }
- ],
- metadata: {
- accelerator: 'GPU',
- colab: {
- name: params.title || 'AI Generated Notebook',
- version: '0.3.2'
- }
- }
- };
-
- return {
- notebookId,
- colabUrl,
- title: params.title || 'AI Generated Notebook',
- status: 'created',
- message: 'Notebook created successfully! Click the link to open in Google Colab.',
- cells: notebookContent.cells.length,
- hasCode: true
- };
- }
- }
-};
-
-// This will be replaced by the Convex action call
-
-export default function Chatbot({ projectId, projectName }: ChatbotProps) {
- const [messages, setMessages] = useState([
- {
- id: '1',
- type: 'assistant',
- content: `Hello! I'm your AI research assistant for the "${projectName}" project.
-
-I can help you with:
-- **General questions** about your research and project
-- **Running experiments** (say "run experiment" to use tools)
-- **Data analysis** (say "analyze data" to use tools)
-- **Model training** (say "train model" to use tools)
-- **Model deployment** (say "deploy model" to use tools)
-- **Google Colab notebooks** (say "create colab notebook" to generate notebooks)
-
-I'll only use tools when you explicitly ask me to run experiments or use MCP tools. Otherwise, I'll just chat and provide guidance.
-
-What would you like to work on today?`,
- timestamp: new Date()
- }
- ]);
- const [inputMessage, setInputMessage] = useState('');
- const [isLoading, setIsLoading] = useState(false);
- const [copiedCodeBlocks, setCopiedCodeBlocks] = useState>(new Set());
- const [copiedMessages, setCopiedMessages] = useState>(new Set());
- const scrollAreaRef = useRef(null);
-
- // Use Convex action for AI chat
- const chatWithGrok = useAction(api.chat.chatWithGrok);
-
- const scrollToBottom = () => {
- if (scrollAreaRef.current) {
- scrollAreaRef.current.scrollTop = scrollAreaRef.current.scrollHeight;
- }
- };
-
- useEffect(() => {
- scrollToBottom();
- }, [messages]);
-
- const copyToClipboard = async (text: string, type: 'code' | 'message', id: string) => {
- try {
- await navigator.clipboard.writeText(text);
- if (type === 'code') {
- setCopiedCodeBlocks(prev => new Set([...prev, id]));
- setTimeout(() => {
- setCopiedCodeBlocks(prev => {
- const newSet = new Set(prev);
- newSet.delete(id);
- return newSet;
- });
- }, 2000);
- } else {
- setCopiedMessages(prev => new Set([...prev, id]));
- setTimeout(() => {
- setCopiedMessages(prev => {
- const newSet = new Set(prev);
- newSet.delete(id);
- return newSet;
- });
- }, 2000);
- }
- } catch (err) {
- console.error('Failed to copy text: ', err);
- }
- };
-
- const handleSendMessage = async () => {
- if (!inputMessage.trim() || isLoading) return;
-
- const userMessage: Message = {
- id: Date.now().toString(),
- type: 'user',
- content: inputMessage,
- timestamp: new Date()
- };
-
- setMessages(prev => [...prev, userMessage]);
- setInputMessage('');
- setIsLoading(true);
-
- try {
- // Check if user explicitly wants to run experiments or use tools
- const shouldUseTools = inputMessage.toLowerCase().includes('run experiment') ||
- inputMessage.toLowerCase().includes('use mcp') ||
- inputMessage.toLowerCase().includes('run tool') ||
- inputMessage.toLowerCase().includes('execute') ||
- inputMessage.toLowerCase().includes('train model') ||
- inputMessage.toLowerCase().includes('analyze data') ||
- inputMessage.toLowerCase().includes('deploy model') ||
- inputMessage.toLowerCase().includes('create colab') ||
- inputMessage.toLowerCase().includes('colab notebook') ||
- inputMessage.toLowerCase().includes('generate notebook') ||
- inputMessage.toLowerCase().includes('open colab');
-
- const response = await chatWithGrok({
- message: inputMessage,
- context: projectName,
- projectName: projectName
- });
-
- const assistantMessage: Message = {
- id: (Date.now() + 1).toString(),
- type: 'assistant',
- content: response.response,
- timestamp: new Date(),
- tools: shouldUseTools && response.tools ? response.tools.map((toolName: string) => ({
- id: `${toolName}_${Date.now()}`,
- name: mockTools[toolName as keyof typeof mockTools].name,
- status: 'pending' as const
- })) : []
- };
-
- setMessages(prev => [...prev, assistantMessage]);
-
- // Execute tools if any and user explicitly requested them
- if (shouldUseTools && response.tools && response.tools.length > 0) {
- for (const toolName of response.tools) {
- const tool = mockTools[toolName as keyof typeof mockTools];
- if (tool) {
- // Update tool status to running
- setMessages(prev => prev.map(msg =>
- msg.id === assistantMessage.id
- ? {
- ...msg,
- tools: msg.tools?.map(t =>
- t.name === tool.name
- ? { ...t, status: 'running' as const }
- : t
- )
- }
- : msg
- ));
-
- try {
- const result = await tool.execute(response.toolParams);
-
- // Update tool status to completed
- setMessages(prev => prev.map(msg =>
- msg.id === assistantMessage.id
- ? {
- ...msg,
- tools: msg.tools?.map(t =>
- t.name === tool.name
- ? { ...t, status: 'completed' as const, result }
- : t
- )
- }
- : msg
- ));
-
- // Add result message
- const resultMessage: Message = {
- id: (Date.now() + 2).toString(),
- type: 'system',
- content: tool.name === 'Create Colab Notebook' && (result as any).colabUrl
- ? `✅ ${tool.name} completed successfully!\n\n📓 **Notebook Created**: ${(result as any).title}\n🔗 **Colab Link**: [Open in Google Colab](${(result as any).colabUrl})\n\nClick the link above to open your notebook in Google Colab and start running your code!`
- : `✅ ${tool.name} completed successfully!`,
- timestamp: new Date()
- };
- setMessages(prev => [...prev, resultMessage]);
-
- } catch (error) {
- // Update tool status to failed
- setMessages(prev => prev.map(msg =>
- msg.id === assistantMessage.id
- ? {
- ...msg,
- tools: msg.tools?.map(t =>
- t.name === tool.name
- ? { ...t, status: 'failed' as const, error: error instanceof Error ? error.message : String(error) }
- : t
- )
- }
- : msg
- ));
- }
- }
- }
- }
-
- } catch (error) {
- const errorMessage: Message = {
- id: (Date.now() + 1).toString(),
- type: 'assistant',
- content: "I'm sorry, I encountered an error. Please try again.",
- timestamp: new Date()
- };
- setMessages(prev => [...prev, errorMessage]);
- } finally {
- setIsLoading(false);
- }
- };
-
- const handleKeyPress = (e: React.KeyboardEvent) => {
- if (e.key === 'Enter' && !e.shiftKey) {
- e.preventDefault();
- handleSendMessage();
- }
- };
-
- const getToolIcon = (status: string) => {
- switch (status) {
- case 'pending': return ;
- case 'running': return ;
- case 'completed': return ;
- case 'failed': return ;
- default: return ;
- }
- };
-
- return (
-
-
-
-
-
- AI Research Assistant
-
-
- Chat with your AI assistant to run experiments, analyze data, and manage your research
-
-
-
-
-
- {messages.map((message) => (
-
-
-
-
- {message.type === 'user' ? (
-
- ) : message.type === 'assistant' ? (
-
- ) : (
-
- )}
-
- {message.timestamp.toLocaleTimeString()}
-
-
-
copyToClipboard(message.content, 'message', message.id)}
- >
- {copiedMessages.has(message.id) ? (
-
- ) : (
-
- )}
-
-
-
-
{
- const match = /language-(\w+)/.exec(className || '');
- const codeId = `${message.id}_${Date.now()}_${Math.random()}`;
-
- if (!inline && match) {
- const isCopied = copiedCodeBlocks.has(codeId);
-
- const handleCopyCode = () => {
- // Get the text content from the DOM element
- const codeElement = document.querySelector(`[data-code-id="${codeId}"]`);
- if (codeElement) {
- const textContent = codeElement.textContent || '';
- copyToClipboard(textContent, 'code', codeId);
- }
- };
-
- return (
-
-
-
- {children}
-
-
-
- {isCopied ? (
-
- ) : (
-
- )}
-
-
- );
- }
-
- return (
-
- {children}
-
- );
- },
- pre: ({ children }) => <>{children}>,
- p: ({ children }) => {children}
,
- ul: ({ children }) => ,
- ol: ({ children }) => {children} ,
- li: ({ children }) => {children} ,
- h1: ({ children }) => {children} ,
- h2: ({ children }) => {children} ,
- h3: ({ children }) => {children} ,
- blockquote: ({ children }) => {children} ,
- table: ({ children }) => ,
- th: ({ children }) => {children} ,
- td: ({ children }) => {children} ,
- }}
- >
- {message.content}
-
-
-
- {/* Tool executions */}
- {message.tools && message.tools.length > 0 && (
-
- {message.tools.map((tool) => (
-
- {getToolIcon(tool.status)}
-
{tool.name}
-
- {tool.status}
-
- {tool.result && (
-
- {tool.name === 'Create Colab Notebook' && tool.result.colabUrl ? (
-
- Open Colab Notebook →
-
- ) : (
- JSON.stringify(tool.result).substring(0, 50) + '...'
- )}
-
- )}
-
- ))}
-
- )}
-
-
- ))}
-
- {isLoading && (
-
-
-
-
-
- AI is thinking...
-
-
-
- )}
-
-
-
-
-
- setInputMessage(e.target.value)}
- onKeyPress={handleKeyPress}
- placeholder="Ask questions or say 'run experiment' to use tools..."
- disabled={isLoading}
- className="flex-1"
- />
-
-
-
-
-
-
-
-
- );
-}
diff --git a/components/layout/app-layout.tsx b/components/layout/app-layout.tsx
deleted file mode 100644
index d423766..0000000
--- a/components/layout/app-layout.tsx
+++ /dev/null
@@ -1,161 +0,0 @@
-'use client';
-
-import { Button } from '@/components/ui/button';
-import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
-import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';
-import { Badge } from '@/components/ui/badge';
-import { Bell, Settings, User, LogOut, Menu, X } from 'lucide-react';
-import { useState } from 'react';
-import Link from 'next/link';
-
-interface AppLayoutProps {
- children: React.ReactNode;
-}
-
-export function AppLayout({ children }: AppLayoutProps) {
- const [sidebarOpen, setSidebarOpen] = useState(false);
-
- return (
-
- {/* Top Navigation */}
-
-
- {/* Mobile Navigation Overlay */}
- {sidebarOpen && (
-
-
-
- setSidebarOpen(false)}
- >
- Projects
-
- setSidebarOpen(false)}
- >
- Agents
-
- setSidebarOpen(false)}
- >
- Templates
-
- setSidebarOpen(false)}
- >
- Docs
-
-
-
-
- )}
-
- {/* Main Content */}
-
{children}
-
- );
-}
diff --git a/components/markdown-renderer.tsx b/components/markdown-renderer.tsx
new file mode 100644
index 0000000..556659e
--- /dev/null
+++ b/components/markdown-renderer.tsx
@@ -0,0 +1,188 @@
+'use client';
+
+import ReactMarkdown from 'react-markdown';
+import remarkGfm from 'remark-gfm';
+import rehypeHighlight from 'rehype-highlight';
+import Image from 'next/image';
+import 'highlight.js/styles/github-dark.css';
+
+interface MarkdownRendererProps {
+ content: string;
+}
+
+export function MarkdownRenderer({ content }: MarkdownRendererProps) {
+ return (
+
+
(
+
+ {children}
+
+ ),
+ h2: ({ children }) => (
+
+ {children}
+
+ ),
+ h3: ({ children }) => (
+
+ {children}
+
+ ),
+ h4: ({ children }) => (
+
+ {children}
+
+ ),
+ // Custom paragraph styles
+ p: ({ children }) => (
+
+ {children}
+
+ ),
+ // Custom link styles
+ a: ({ href, children }) => (
+
+ {children}
+
+ ),
+ // Custom list styles
+ ul: ({ children }) => (
+
+ ),
+ ol: ({ children }) => (
+
+ {children}
+
+ ),
+ li: ({ children }) => (
+
+ {children}
+
+ ),
+ // Custom code block styles
+ code: ({ className, children, ...props }) => {
+ const inline = !className;
+ return inline ? (
+
+ {children}
+
+ ) : (
+
+ {children}
+
+ );
+ },
+ pre: ({ children }) => (
+
+ {children}
+
+ ),
+ // Custom blockquote styles
+ blockquote: ({ children }) => (
+
+ {children}
+
+ ),
+ // Custom image handling with Next.js Image optimization
+ img: ({ src, alt }) => {
+ if (!src) return null;
+
+ // Handle external images
+ if (typeof src === 'string' && src.startsWith('http')) {
+ return (
+
+
+ {alt && (
+
+ {alt}
+
+ )}
+
+ );
+ }
+
+ // Handle local images with Next.js Image
+ return (
+
+
+ {alt && (
+
+ {alt}
+
+ )}
+
+ );
+ },
+ // Custom table styles
+ table: ({ children }) => (
+
+ ),
+ thead: ({ children }) => (
+
+ {children}
+
+ ),
+ tbody: ({ children }) => (
+
+ {children}
+
+ ),
+ tr: ({ children }) => (
+
+ {children}
+
+ ),
+ th: ({ children }) => (
+
+ {children}
+
+ ),
+ td: ({ children }) => (
+
+ {children}
+
+ ),
+ // Custom horizontal rule
+ hr: () => (
+
+ ),
+ }}
+ >
+ {content}
+
+
+ );
+}
diff --git a/components/navigation.tsx b/components/navigation.tsx
new file mode 100644
index 0000000..d2a2587
--- /dev/null
+++ b/components/navigation.tsx
@@ -0,0 +1,79 @@
+'use client';
+
+import Link from "next/link";
+import { useLanguage } from "@/components/providers/language-provider";
+import { translations } from "@/lib/language-detection";
+
+interface NavigationProps {
+ currentPath?: string;
+}
+
+export function Navigation({ }: NavigationProps) {
+ const { language, setLanguage } = useLanguage();
+ const t = translations[language];
+
+ const toggleLanguage = () => {
+ setLanguage(language === 'en' ? 'zh' : 'en');
+ };
+
+ return (
+
+
+
+
+
+
+ 🔮
+
+ {/* Subtle glow effect */}
+
+
+
+
+
+
+
+ );
+}
+
diff --git a/components/providers/convex-provider.tsx b/components/providers/convex-provider.tsx
deleted file mode 100644
index 1803828..0000000
--- a/components/providers/convex-provider.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-"use client";
-
-import { ConvexProvider, ConvexReactClient } from "convex/react";
-import { ReactNode } from "react";
-
-const convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL!);
-
-export function ConvexClientProvider({ children }: { children: ReactNode }) {
- return {children} ;
-}
diff --git a/components/providers/language-provider.tsx b/components/providers/language-provider.tsx
new file mode 100644
index 0000000..d5f76bc
--- /dev/null
+++ b/components/providers/language-provider.tsx
@@ -0,0 +1,54 @@
+'use client';
+
+import React, { createContext, useContext, useEffect, useState } from 'react';
+import { Language, LanguageContext, detectLanguageFromIP } from '@/lib/language-detection';
+
+const LanguageContextProvider = createContext(undefined);
+
+export function LanguageProvider({ children }: { children: React.ReactNode }) {
+ const [language, setLanguage] = useState('en');
+ const [isLoading, setIsLoading] = useState(true);
+
+ useEffect(() => {
+ // Check localStorage first
+ const savedLanguage = localStorage.getItem('language') as Language;
+ if (savedLanguage && (savedLanguage === 'en' || savedLanguage === 'zh')) {
+ setLanguage(savedLanguage);
+ setIsLoading(false);
+ } else {
+ // Detect from IP if no saved preference
+ detectLanguageFromIP().then((detectedLang) => {
+ setLanguage(detectedLang);
+ localStorage.setItem('language', detectedLang);
+ setIsLoading(false);
+ });
+ }
+ }, []);
+
+ const handleSetLanguage = (lang: Language) => {
+ setLanguage(lang);
+ localStorage.setItem('language', lang);
+ };
+
+ if (isLoading) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useLanguage() {
+ const context = useContext(LanguageContextProvider);
+ if (context === undefined) {
+ throw new Error('useLanguage must be used within a LanguageProvider');
+ }
+ return context;
+}
diff --git a/components/ui/avatar.tsx b/components/ui/avatar.tsx
deleted file mode 100644
index 51e507b..0000000
--- a/components/ui/avatar.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as AvatarPrimitive from "@radix-ui/react-avatar"
-
-import { cn } from "@/lib/utils"
-
-const Avatar = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-Avatar.displayName = AvatarPrimitive.Root.displayName
-
-const AvatarImage = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AvatarImage.displayName = AvatarPrimitive.Image.displayName
-
-const AvatarFallback = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName
-
-export { Avatar, AvatarImage, AvatarFallback }
diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx
deleted file mode 100644
index e87d62b..0000000
--- a/components/ui/badge.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import * as React from "react"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils"
-
-const badgeVariants = cva(
- "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
- {
- variants: {
- variant: {
- default:
- "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
- secondary:
- "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
- destructive:
- "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
- outline: "text-foreground",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- }
-)
-
-export interface BadgeProps
- extends React.HTMLAttributes,
- VariantProps {}
-
-function Badge({ className, variant, ...props }: BadgeProps) {
- return (
-
- )
-}
-
-export { Badge, badgeVariants }
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
deleted file mode 100644
index 65d4fcd..0000000
--- a/components/ui/button.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import * as React from "react"
-import { Slot } from "@radix-ui/react-slot"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils"
-
-const buttonVariants = cva(
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
- {
- variants: {
- variant: {
- default:
- "bg-primary text-primary-foreground shadow hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
- outline:
- "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-9 px-4 py-2",
- sm: "h-8 rounded-md px-3 text-xs",
- lg: "h-10 rounded-md px-8",
- icon: "h-9 w-9",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-)
-
-export interface ButtonProps
- extends React.ButtonHTMLAttributes,
- VariantProps {
- asChild?: boolean
-}
-
-const Button = React.forwardRef(
- ({ className, variant, size, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button"
- return (
-
- )
- }
-)
-Button.displayName = "Button"
-
-export { Button, buttonVariants }
diff --git a/components/ui/card.tsx b/components/ui/card.tsx
deleted file mode 100644
index cabfbfc..0000000
--- a/components/ui/card.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-const Card = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-Card.displayName = "Card"
-
-const CardHeader = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardHeader.displayName = "CardHeader"
-
-const CardTitle = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardTitle.displayName = "CardTitle"
-
-const CardDescription = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardDescription.displayName = "CardDescription"
-
-const CardContent = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardContent.displayName = "CardContent"
-
-const CardFooter = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-CardFooter.displayName = "CardFooter"
-
-export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx
deleted file mode 100644
index 1647513..0000000
--- a/components/ui/dialog.tsx
+++ /dev/null
@@ -1,122 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as DialogPrimitive from "@radix-ui/react-dialog"
-import { X } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-
-const Dialog = DialogPrimitive.Root
-
-const DialogTrigger = DialogPrimitive.Trigger
-
-const DialogPortal = DialogPrimitive.Portal
-
-const DialogClose = DialogPrimitive.Close
-
-const DialogOverlay = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
-
-const DialogContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
-
-
- {children}
-
-
- Close
-
-
-
-))
-DialogContent.displayName = DialogPrimitive.Content.displayName
-
-const DialogHeader = ({
- className,
- ...props
-}: React.HTMLAttributes) => (
-
-)
-DialogHeader.displayName = "DialogHeader"
-
-const DialogFooter = ({
- className,
- ...props
-}: React.HTMLAttributes) => (
-
-)
-DialogFooter.displayName = "DialogFooter"
-
-const DialogTitle = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-DialogTitle.displayName = DialogPrimitive.Title.displayName
-
-const DialogDescription = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-DialogDescription.displayName = DialogPrimitive.Description.displayName
-
-export {
- Dialog,
- DialogPortal,
- DialogOverlay,
- DialogTrigger,
- DialogClose,
- DialogContent,
- DialogHeader,
- DialogFooter,
- DialogTitle,
- DialogDescription,
-}
diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx
deleted file mode 100644
index 5a20503..0000000
--- a/components/ui/dropdown-menu.tsx
+++ /dev/null
@@ -1,201 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
-import { Check, ChevronRight, Circle } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-
-const DropdownMenu = DropdownMenuPrimitive.Root
-
-const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
-
-const DropdownMenuGroup = DropdownMenuPrimitive.Group
-
-const DropdownMenuPortal = DropdownMenuPrimitive.Portal
-
-const DropdownMenuSub = DropdownMenuPrimitive.Sub
-
-const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
-
-const DropdownMenuSubTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef & {
- inset?: boolean
- }
->(({ className, inset, children, ...props }, ref) => (
-
- {children}
-
-
-))
-DropdownMenuSubTrigger.displayName =
- DropdownMenuPrimitive.SubTrigger.displayName
-
-const DropdownMenuSubContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-DropdownMenuSubContent.displayName =
- DropdownMenuPrimitive.SubContent.displayName
-
-const DropdownMenuContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, sideOffset = 4, ...props }, ref) => (
-
-
-
-))
-DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
-
-const DropdownMenuItem = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef & {
- inset?: boolean
- }
->(({ className, inset, ...props }, ref) => (
- svg]:size-4 [&>svg]:shrink-0",
- inset && "pl-8",
- className
- )}
- {...props}
- />
-))
-DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
-
-const DropdownMenuCheckboxItem = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, checked, ...props }, ref) => (
-
-
-
-
-
-
- {children}
-
-))
-DropdownMenuCheckboxItem.displayName =
- DropdownMenuPrimitive.CheckboxItem.displayName
-
-const DropdownMenuRadioItem = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
-
-
-
-
-
- {children}
-
-))
-DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
-
-const DropdownMenuLabel = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef & {
- inset?: boolean
- }
->(({ className, inset, ...props }, ref) => (
-
-))
-DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
-
-const DropdownMenuSeparator = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
-
-const DropdownMenuShortcut = ({
- className,
- ...props
-}: React.HTMLAttributes) => {
- return (
-
- )
-}
-DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
-
-export {
- DropdownMenu,
- DropdownMenuTrigger,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuCheckboxItem,
- DropdownMenuRadioItem,
- DropdownMenuLabel,
- DropdownMenuSeparator,
- DropdownMenuShortcut,
- DropdownMenuGroup,
- DropdownMenuPortal,
- DropdownMenuSub,
- DropdownMenuSubContent,
- DropdownMenuSubTrigger,
- DropdownMenuRadioGroup,
-}
diff --git a/components/ui/form.tsx b/components/ui/form.tsx
deleted file mode 100644
index ad1ae02..0000000
--- a/components/ui/form.tsx
+++ /dev/null
@@ -1,178 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as LabelPrimitive from "@radix-ui/react-label"
-import { Slot } from "@radix-ui/react-slot"
-import {
- Controller,
- FormProvider,
- useFormContext,
- type ControllerProps,
- type FieldPath,
- type FieldValues,
-} from "react-hook-form"
-
-import { cn } from "@/lib/utils"
-import { Label } from "@/components/ui/label"
-
-const Form = FormProvider
-
-type FormFieldContextValue<
- TFieldValues extends FieldValues = FieldValues,
- TName extends FieldPath = FieldPath
-> = {
- name: TName
-}
-
-const FormFieldContext = React.createContext(
- {} as FormFieldContextValue
-)
-
-const FormField = <
- TFieldValues extends FieldValues = FieldValues,
- TName extends FieldPath = FieldPath
->({
- ...props
-}: ControllerProps) => {
- return (
-
-
-
- )
-}
-
-const useFormField = () => {
- const fieldContext = React.useContext(FormFieldContext)
- const itemContext = React.useContext(FormItemContext)
- const { getFieldState, formState } = useFormContext()
-
- const fieldState = getFieldState(fieldContext.name, formState)
-
- if (!fieldContext) {
- throw new Error("useFormField should be used within ")
- }
-
- const { id } = itemContext
-
- return {
- id,
- name: fieldContext.name,
- formItemId: `${id}-form-item`,
- formDescriptionId: `${id}-form-item-description`,
- formMessageId: `${id}-form-item-message`,
- ...fieldState,
- }
-}
-
-type FormItemContextValue = {
- id: string
-}
-
-const FormItemContext = React.createContext(
- {} as FormItemContextValue
-)
-
-const FormItem = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => {
- const id = React.useId()
-
- return (
-
-
-
- )
-})
-FormItem.displayName = "FormItem"
-
-const FormLabel = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => {
- const { error, formItemId } = useFormField()
-
- return (
-
- )
-})
-FormLabel.displayName = "FormLabel"
-
-const FormControl = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ ...props }, ref) => {
- const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
-
- return (
-
- )
-})
-FormControl.displayName = "FormControl"
-
-const FormDescription = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => {
- const { formDescriptionId } = useFormField()
-
- return (
-
- )
-})
-FormDescription.displayName = "FormDescription"
-
-const FormMessage = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({ className, children, ...props }, ref) => {
- const { error, formMessageId } = useFormField()
- const body = error ? String(error?.message ?? "") : children
-
- if (!body) {
- return null
- }
-
- return (
-
- {body}
-
- )
-})
-FormMessage.displayName = "FormMessage"
-
-export {
- useFormField,
- Form,
- FormItem,
- FormLabel,
- FormControl,
- FormDescription,
- FormMessage,
- FormField,
-}
diff --git a/components/ui/input.tsx b/components/ui/input.tsx
deleted file mode 100644
index 69b64fb..0000000
--- a/components/ui/input.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-const Input = React.forwardRef>(
- ({ className, type, ...props }, ref) => {
- return (
-
- )
- }
-)
-Input.displayName = "Input"
-
-export { Input }
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
deleted file mode 100644
index 5341821..0000000
--- a/components/ui/label.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as LabelPrimitive from "@radix-ui/react-label"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils"
-
-const labelVariants = cva(
- "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
-)
-
-const Label = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef &
- VariantProps
->(({ className, ...props }, ref) => (
-
-))
-Label.displayName = LabelPrimitive.Root.displayName
-
-export { Label }
diff --git a/components/ui/progress.tsx b/components/ui/progress.tsx
deleted file mode 100644
index 4fc3b47..0000000
--- a/components/ui/progress.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as ProgressPrimitive from "@radix-ui/react-progress"
-
-import { cn } from "@/lib/utils"
-
-const Progress = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, value, ...props }, ref) => (
-
-
-
-))
-Progress.displayName = ProgressPrimitive.Root.displayName
-
-export { Progress }
diff --git a/components/ui/scroll-area.tsx b/components/ui/scroll-area.tsx
deleted file mode 100644
index 0b4a48d..0000000
--- a/components/ui/scroll-area.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
-
-import { cn } from "@/lib/utils"
-
-const ScrollArea = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
-
- {children}
-
-
-
-
-))
-ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
-
-const ScrollBar = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, orientation = "vertical", ...props }, ref) => (
-
-
-
-))
-ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
-
-export { ScrollArea, ScrollBar }
diff --git a/components/ui/select.tsx b/components/ui/select.tsx
deleted file mode 100644
index 6e637f7..0000000
--- a/components/ui/select.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as SelectPrimitive from "@radix-ui/react-select"
-import { Check, ChevronDown, ChevronUp } from "lucide-react"
-
-import { cn } from "@/lib/utils"
-
-const Select = SelectPrimitive.Root
-
-const SelectGroup = SelectPrimitive.Group
-
-const SelectValue = SelectPrimitive.Value
-
-const SelectTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
- span]:line-clamp-1",
- className
- )}
- {...props}
- >
- {children}
-
-
-
-
-))
-SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
-
-const SelectScrollUpButton = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-))
-SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
-
-const SelectScrollDownButton = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-
-
-))
-SelectScrollDownButton.displayName =
- SelectPrimitive.ScrollDownButton.displayName
-
-const SelectContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, position = "popper", ...props }, ref) => (
-
-
-
-
- {children}
-
-
-
-
-))
-SelectContent.displayName = SelectPrimitive.Content.displayName
-
-const SelectLabel = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-SelectLabel.displayName = SelectPrimitive.Label.displayName
-
-const SelectItem = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
-
-
-
-
-
-
- {children}
-
-))
-SelectItem.displayName = SelectPrimitive.Item.displayName
-
-const SelectSeparator = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-SelectSeparator.displayName = SelectPrimitive.Separator.displayName
-
-export {
- Select,
- SelectGroup,
- SelectValue,
- SelectTrigger,
- SelectContent,
- SelectLabel,
- SelectItem,
- SelectSeparator,
- SelectScrollUpButton,
- SelectScrollDownButton,
-}
diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx
deleted file mode 100644
index 12d81c4..0000000
--- a/components/ui/separator.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as SeparatorPrimitive from "@radix-ui/react-separator"
-
-import { cn } from "@/lib/utils"
-
-const Separator = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(
- (
- { className, orientation = "horizontal", decorative = true, ...props },
- ref
- ) => (
-
- )
-)
-Separator.displayName = SeparatorPrimitive.Root.displayName
-
-export { Separator }
diff --git a/components/ui/table.tsx b/components/ui/table.tsx
deleted file mode 100644
index c0df655..0000000
--- a/components/ui/table.tsx
+++ /dev/null
@@ -1,120 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-const Table = React.forwardRef<
- HTMLTableElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-Table.displayName = "Table"
-
-const TableHeader = React.forwardRef<
- HTMLTableSectionElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-TableHeader.displayName = "TableHeader"
-
-const TableBody = React.forwardRef<
- HTMLTableSectionElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-TableBody.displayName = "TableBody"
-
-const TableFooter = React.forwardRef<
- HTMLTableSectionElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
- tr]:last:border-b-0",
- className
- )}
- {...props}
- />
-))
-TableFooter.displayName = "TableFooter"
-
-const TableRow = React.forwardRef<
- HTMLTableRowElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-TableRow.displayName = "TableRow"
-
-const TableHead = React.forwardRef<
- HTMLTableCellElement,
- React.ThHTMLAttributes
->(({ className, ...props }, ref) => (
- [role=checkbox]]:translate-y-[2px]",
- className
- )}
- {...props}
- />
-))
-TableHead.displayName = "TableHead"
-
-const TableCell = React.forwardRef<
- HTMLTableCellElement,
- React.TdHTMLAttributes
->(({ className, ...props }, ref) => (
- [role=checkbox]]:translate-y-[2px]",
- className
- )}
- {...props}
- />
-))
-TableCell.displayName = "TableCell"
-
-const TableCaption = React.forwardRef<
- HTMLTableCaptionElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => (
-
-))
-TableCaption.displayName = "TableCaption"
-
-export {
- Table,
- TableHeader,
- TableBody,
- TableFooter,
- TableHead,
- TableRow,
- TableCell,
- TableCaption,
-}
diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx
deleted file mode 100644
index 0f4caeb..0000000
--- a/components/ui/tabs.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-"use client"
-
-import * as React from "react"
-import * as TabsPrimitive from "@radix-ui/react-tabs"
-
-import { cn } from "@/lib/utils"
-
-const Tabs = TabsPrimitive.Root
-
-const TabsList = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-TabsList.displayName = TabsPrimitive.List.displayName
-
-const TabsTrigger = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-TabsTrigger.displayName = TabsPrimitive.Trigger.displayName
-
-const TabsContent = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => (
-
-))
-TabsContent.displayName = TabsPrimitive.Content.displayName
-
-export { Tabs, TabsList, TabsTrigger, TabsContent }
diff --git a/components/ui/textarea.tsx b/components/ui/textarea.tsx
deleted file mode 100644
index e56b0af..0000000
--- a/components/ui/textarea.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-const Textarea = React.forwardRef<
- HTMLTextAreaElement,
- React.ComponentProps<"textarea">
->(({ className, ...props }, ref) => {
- return (
-
- )
-})
-Textarea.displayName = "Textarea"
-
-export { Textarea }
diff --git a/convex/README.md b/convex/README.md
deleted file mode 100644
index 7fda0c3..0000000
--- a/convex/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Welcome to your Convex functions directory!
-
-Write your Convex functions here.
-See https://docs.convex.dev/functions for more.
-
-A query function that takes two arguments looks like:
-
-```ts
-// convex/myFunctions.ts
-import { query } from "./_generated/server";
-import { v } from "convex/values";
-
-export const myQueryFunction = query({
- // Validators for arguments.
- args: {
- first: v.number(),
- second: v.string(),
- },
-
- // Function implementation.
- handler: async (ctx, args) => {
- // Read the database as many times as you need here.
- // See https://docs.convex.dev/database/reading-data.
- const documents = await ctx.db.query("tablename").collect();
-
- // Arguments passed from the client are properties of the args object.
- console.log(args.first, args.second);
-
- // Write arbitrary JavaScript here: filter, aggregate, build derived data,
- // remove non-public properties, or create new objects.
- return documents;
- },
-});
-```
-
-Using this query function in a React component looks like:
-
-```ts
-const data = useQuery(api.myFunctions.myQueryFunction, {
- first: 10,
- second: "hello",
-});
-```
-
-A mutation function looks like:
-
-```ts
-// convex/myFunctions.ts
-import { mutation } from "./_generated/server";
-import { v } from "convex/values";
-
-export const myMutationFunction = mutation({
- // Validators for arguments.
- args: {
- first: v.string(),
- second: v.string(),
- },
-
- // Function implementation.
- handler: async (ctx, args) => {
- // Insert or modify documents in the database here.
- // Mutations can also read from the database like queries.
- // See https://docs.convex.dev/database/writing-data.
- const message = { body: args.first, author: args.second };
- const id = await ctx.db.insert("messages", message);
-
- // Optionally, return a value from your mutation.
- return await ctx.db.get(id);
- },
-});
-```
-
-Using this mutation function in a React component looks like:
-
-```ts
-const mutation = useMutation(api.myFunctions.myMutationFunction);
-function handleButtonPress() {
- // fire and forget, the most common way to use mutations
- mutation({ first: "Hello!", second: "me" });
- // OR
- // use the result once the mutation has completed
- mutation({ first: "Hello!", second: "me" }).then((result) =>
- console.log(result),
- );
-}
-```
-
-Use the Convex CLI to push your functions to a deployment. See everything
-the Convex CLI can do by running `npx convex -h` in your project root
-directory. To learn more, launch the docs with `npx convex docs`.
diff --git a/convex/_generated/api.d.ts b/convex/_generated/api.d.ts
deleted file mode 100644
index 38b9428..0000000
--- a/convex/_generated/api.d.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/* eslint-disable */
-/**
- * Generated `api` utility.
- *
- * THIS CODE IS AUTOMATICALLY GENERATED.
- *
- * To regenerate, run `npx convex dev`.
- * @module
- */
-
-import type {
- ApiFromModules,
- FilterApi,
- FunctionReference,
-} from "convex/server";
-import type * as agents from "../agents.js";
-import type * as chat from "../chat.js";
-import type * as projects from "../projects.js";
-import type * as runs from "../runs.js";
-import type * as seed from "../seed.js";
-
-/**
- * A utility for referencing Convex functions in your app's API.
- *
- * Usage:
- * ```js
- * const myFunctionReference = api.myModule.myFunction;
- * ```
- */
-declare const fullApi: ApiFromModules<{
- agents: typeof agents;
- chat: typeof chat;
- projects: typeof projects;
- runs: typeof runs;
- seed: typeof seed;
-}>;
-export declare const api: FilterApi<
- typeof fullApi,
- FunctionReference
->;
-export declare const internal: FilterApi<
- typeof fullApi,
- FunctionReference
->;
diff --git a/convex/_generated/api.js b/convex/_generated/api.js
deleted file mode 100644
index 3f9c482..0000000
--- a/convex/_generated/api.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/* eslint-disable */
-/**
- * Generated `api` utility.
- *
- * THIS CODE IS AUTOMATICALLY GENERATED.
- *
- * To regenerate, run `npx convex dev`.
- * @module
- */
-
-import { anyApi } from "convex/server";
-
-/**
- * A utility for referencing Convex functions in your app's API.
- *
- * Usage:
- * ```js
- * const myFunctionReference = api.myModule.myFunction;
- * ```
- */
-export const api = anyApi;
-export const internal = anyApi;
diff --git a/convex/_generated/dataModel.d.ts b/convex/_generated/dataModel.d.ts
deleted file mode 100644
index 8541f31..0000000
--- a/convex/_generated/dataModel.d.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-/* eslint-disable */
-/**
- * Generated data model types.
- *
- * THIS CODE IS AUTOMATICALLY GENERATED.
- *
- * To regenerate, run `npx convex dev`.
- * @module
- */
-
-import type {
- DataModelFromSchemaDefinition,
- DocumentByName,
- TableNamesInDataModel,
- SystemTableNames,
-} from "convex/server";
-import type { GenericId } from "convex/values";
-import schema from "../schema.js";
-
-/**
- * The names of all of your Convex tables.
- */
-export type TableNames = TableNamesInDataModel;
-
-/**
- * The type of a document stored in Convex.
- *
- * @typeParam TableName - A string literal type of the table name (like "users").
- */
-export type Doc = DocumentByName<
- DataModel,
- TableName
->;
-
-/**
- * An identifier for a document in Convex.
- *
- * Convex documents are uniquely identified by their `Id`, which is accessible
- * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids).
- *
- * Documents can be loaded using `db.get(id)` in query and mutation functions.
- *
- * IDs are just strings at runtime, but this type can be used to distinguish them from other
- * strings when type checking.
- *
- * @typeParam TableName - A string literal type of the table name (like "users").
- */
-export type Id =
- GenericId;
-
-/**
- * A type describing your Convex data model.
- *
- * This type includes information about what tables you have, the type of
- * documents stored in those tables, and the indexes defined on them.
- *
- * This type is used to parameterize methods like `queryGeneric` and
- * `mutationGeneric` to make them type-safe.
- */
-export type DataModel = DataModelFromSchemaDefinition;
diff --git a/convex/_generated/server.d.ts b/convex/_generated/server.d.ts
deleted file mode 100644
index 7f337a4..0000000
--- a/convex/_generated/server.d.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-/* eslint-disable */
-/**
- * Generated utilities for implementing server-side Convex query and mutation functions.
- *
- * THIS CODE IS AUTOMATICALLY GENERATED.
- *
- * To regenerate, run `npx convex dev`.
- * @module
- */
-
-import {
- ActionBuilder,
- HttpActionBuilder,
- MutationBuilder,
- QueryBuilder,
- GenericActionCtx,
- GenericMutationCtx,
- GenericQueryCtx,
- GenericDatabaseReader,
- GenericDatabaseWriter,
-} from "convex/server";
-import type { DataModel } from "./dataModel.js";
-
-/**
- * Define a query in this Convex app's public API.
- *
- * This function will be allowed to read your Convex database and will be accessible from the client.
- *
- * @param func - The query function. It receives a {@link QueryCtx} as its first argument.
- * @returns The wrapped query. Include this as an `export` to name it and make it accessible.
- */
-export declare const query: QueryBuilder;
-
-/**
- * Define a query that is only accessible from other Convex functions (but not from the client).
- *
- * This function will be allowed to read from your Convex database. It will not be accessible from the client.
- *
- * @param func - The query function. It receives a {@link QueryCtx} as its first argument.
- * @returns The wrapped query. Include this as an `export` to name it and make it accessible.
- */
-export declare const internalQuery: QueryBuilder;
-
-/**
- * Define a mutation in this Convex app's public API.
- *
- * This function will be allowed to modify your Convex database and will be accessible from the client.
- *
- * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
- * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
- */
-export declare const mutation: MutationBuilder;
-
-/**
- * Define a mutation that is only accessible from other Convex functions (but not from the client).
- *
- * This function will be allowed to modify your Convex database. It will not be accessible from the client.
- *
- * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
- * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
- */
-export declare const internalMutation: MutationBuilder;
-
-/**
- * Define an action in this Convex app's public API.
- *
- * An action is a function which can execute any JavaScript code, including non-deterministic
- * code and code with side-effects, like calling third-party services.
- * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive.
- * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}.
- *
- * @param func - The action. It receives an {@link ActionCtx} as its first argument.
- * @returns The wrapped action. Include this as an `export` to name it and make it accessible.
- */
-export declare const action: ActionBuilder;
-
-/**
- * Define an action that is only accessible from other Convex functions (but not from the client).
- *
- * @param func - The function. It receives an {@link ActionCtx} as its first argument.
- * @returns The wrapped function. Include this as an `export` to name it and make it accessible.
- */
-export declare const internalAction: ActionBuilder;
-
-/**
- * Define an HTTP action.
- *
- * This function will be used to respond to HTTP requests received by a Convex
- * deployment if the requests matches the path and method where this action
- * is routed. Be sure to route your action in `convex/http.js`.
- *
- * @param func - The function. It receives an {@link ActionCtx} as its first argument.
- * @returns The wrapped function. Import this function from `convex/http.js` and route it to hook it up.
- */
-export declare const httpAction: HttpActionBuilder;
-
-/**
- * A set of services for use within Convex query functions.
- *
- * The query context is passed as the first argument to any Convex query
- * function run on the server.
- *
- * This differs from the {@link MutationCtx} because all of the services are
- * read-only.
- */
-export type QueryCtx = GenericQueryCtx;
-
-/**
- * A set of services for use within Convex mutation functions.
- *
- * The mutation context is passed as the first argument to any Convex mutation
- * function run on the server.
- */
-export type MutationCtx = GenericMutationCtx;
-
-/**
- * A set of services for use within Convex action functions.
- *
- * The action context is passed as the first argument to any Convex action
- * function run on the server.
- */
-export type ActionCtx = GenericActionCtx;
-
-/**
- * An interface to read from the database within Convex query functions.
- *
- * The two entry points are {@link DatabaseReader.get}, which fetches a single
- * document by its {@link Id}, or {@link DatabaseReader.query}, which starts
- * building a query.
- */
-export type DatabaseReader = GenericDatabaseReader;
-
-/**
- * An interface to read from and write to the database within Convex mutation
- * functions.
- *
- * Convex guarantees that all writes within a single mutation are
- * executed atomically, so you never have to worry about partial writes leaving
- * your data in an inconsistent state. See [the Convex Guide](https://docs.convex.dev/understanding/convex-fundamentals/functions#atomicity-and-optimistic-concurrency-control)
- * for the guarantees Convex provides your functions.
- */
-export type DatabaseWriter = GenericDatabaseWriter;
diff --git a/convex/_generated/server.js b/convex/_generated/server.js
deleted file mode 100644
index 566d485..0000000
--- a/convex/_generated/server.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/* eslint-disable */
-/**
- * Generated utilities for implementing server-side Convex query and mutation functions.
- *
- * THIS CODE IS AUTOMATICALLY GENERATED.
- *
- * To regenerate, run `npx convex dev`.
- * @module
- */
-
-import {
- actionGeneric,
- httpActionGeneric,
- queryGeneric,
- mutationGeneric,
- internalActionGeneric,
- internalMutationGeneric,
- internalQueryGeneric,
-} from "convex/server";
-
-/**
- * Define a query in this Convex app's public API.
- *
- * This function will be allowed to read your Convex database and will be accessible from the client.
- *
- * @param func - The query function. It receives a {@link QueryCtx} as its first argument.
- * @returns The wrapped query. Include this as an `export` to name it and make it accessible.
- */
-export const query = queryGeneric;
-
-/**
- * Define a query that is only accessible from other Convex functions (but not from the client).
- *
- * This function will be allowed to read from your Convex database. It will not be accessible from the client.
- *
- * @param func - The query function. It receives a {@link QueryCtx} as its first argument.
- * @returns The wrapped query. Include this as an `export` to name it and make it accessible.
- */
-export const internalQuery = internalQueryGeneric;
-
-/**
- * Define a mutation in this Convex app's public API.
- *
- * This function will be allowed to modify your Convex database and will be accessible from the client.
- *
- * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
- * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
- */
-export const mutation = mutationGeneric;
-
-/**
- * Define a mutation that is only accessible from other Convex functions (but not from the client).
- *
- * This function will be allowed to modify your Convex database. It will not be accessible from the client.
- *
- * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
- * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
- */
-export const internalMutation = internalMutationGeneric;
-
-/**
- * Define an action in this Convex app's public API.
- *
- * An action is a function which can execute any JavaScript code, including non-deterministic
- * code and code with side-effects, like calling third-party services.
- * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive.
- * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}.
- *
- * @param func - The action. It receives an {@link ActionCtx} as its first argument.
- * @returns The wrapped action. Include this as an `export` to name it and make it accessible.
- */
-export const action = actionGeneric;
-
-/**
- * Define an action that is only accessible from other Convex functions (but not from the client).
- *
- * @param func - The function. It receives an {@link ActionCtx} as its first argument.
- * @returns The wrapped function. Include this as an `export` to name it and make it accessible.
- */
-export const internalAction = internalActionGeneric;
-
-/**
- * Define a Convex HTTP action.
- *
- * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object
- * as its second.
- * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`.
- */
-export const httpAction = httpActionGeneric;
diff --git a/convex/agents.ts b/convex/agents.ts
deleted file mode 100644
index 0e15c19..0000000
--- a/convex/agents.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { mutation } from "./_generated/server";
-import { v } from "convex/values";
-import { api } from "./_generated/api";
-
-// AI Agent System for Autonomous Research
-export const createAgentPlan = mutation({
- args: {
- projectId: v.id("projects"),
- researchGoal: v.string(),
- codebase: v.optional(v.string()),
- },
- handler: async (ctx, args): Promise => {
- // Create a mock plan for now (will be enhanced with AI later)
- const plan = {
- objectives: [args.researchGoal],
- experiments: [
- {
- name: "Initial Experiment",
- description: `Research: ${args.researchGoal}`,
- model: "GPT-3.5-turbo",
- hyperparameters: { learning_rate: 0.001, batch_size: 32 },
- expectedDuration: "1h",
- gpuRequirements: "A100 x 1"
- }
- ],
- metrics: ["accuracy", "loss"],
- timeline: "1-2 days",
- budget: "$50-100"
- };
-
- // Create a new run with the generated plan
- const runId: string = await ctx.runMutation(api.runs.create, {
- projectId: args.projectId,
- name: `AI Agent: ${args.researchGoal}`,
- config: {
- plan,
- researchGoal: args.researchGoal,
- codebase: args.codebase,
- },
- gpuProvider: "novita", // Default to Novita AI
- });
-
- return runId;
- },
-});
-
-// Simulate agent execution (for demo purposes)
-export const simulateAgentExecution = mutation({
- args: {
- runId: v.id("runs"),
- },
- handler: async (ctx, args) => {
- // Update run status to running
- await ctx.runMutation(api.runs.updateStatus, {
- id: args.runId,
- status: "running",
- });
-
- // Simulate progress updates
- const steps = [
- { name: "Plan Generation", status: "completed" as const, stepIndex: 0 },
- { name: "Environment Setup", status: "completed" as const, stepIndex: 1 },
- { name: "Data Preprocessing", status: "completed" as const, stepIndex: 2 },
- { name: "Model Training", status: "running" as const, stepIndex: 3 },
- { name: "Evaluation", status: "pending" as const, stepIndex: 4 },
- { name: "Analysis & Next Steps", status: "pending" as const, stepIndex: 5 },
- ];
-
- // Update step statuses
- for (const step of steps) {
- await ctx.runMutation(api.runs.updateStepStatus, {
- runId: args.runId,
- stepIndex: step.stepIndex,
- status: step.status,
- });
- }
-
- // Add some sample metrics
- await ctx.runMutation(api.runs.addMetric, {
- runId: args.runId,
- name: "Training Loss",
- value: 2.323,
- stepIndex: 3,
- });
-
- await ctx.runMutation(api.runs.addMetric, {
- runId: args.runId,
- name: "Validation Accuracy",
- value: 73.2,
- stepIndex: 3,
- });
-
- // Update progress
- await ctx.runMutation(api.runs.updateProgress, {
- id: args.runId,
- progress: 75,
- eta: "2h 15m",
- });
-
- return { success: true, message: "Agent execution simulated successfully" };
- },
-});
\ No newline at end of file
diff --git a/convex/chat.ts b/convex/chat.ts
deleted file mode 100644
index 4197843..0000000
--- a/convex/chat.ts
+++ /dev/null
@@ -1,98 +0,0 @@
-import { action } from "./_generated/server";
-import { v } from "convex/values";
-import OpenAI from "openai";
-
-export const chatWithGrok = action({
- args: {
- message: v.string(),
- context: v.string(),
- projectName: v.string(),
- },
- handler: async (ctx, { message, context, projectName }) => {
- // Get environment variables from Convex
- const apiKey = process.env.OPENROUTER_API_KEY;
- const siteUrl = process.env.SITE_URL || "https://open-superintelligence-lab-github-io.vercel.app";
- const siteName = process.env.SITE_NAME || "Open Superintelligence Lab";
-
- if (!apiKey) {
- throw new Error("OPENROUTER_API_KEY not configured in Convex environment");
- }
-
- const client = new OpenAI({
- baseURL: "https://openrouter.ai/api/v1",
- apiKey: apiKey,
- });
-
- try {
- const completion = await client.chat.completions.create({
- model: "x-ai/grok-4-fast:free",
- messages: [
- {
- role: "system",
- content: `You are an AI research assistant for the "${projectName || 'Open Superintelligence Lab'}" project. You help users run experiments, analyze data, train models, and deploy them.
-
-You have access to several tools:
-- run_experiment: Execute machine learning experiments
-- analyze_data: Perform data analysis and visualization
-- train_model: Train machine learning models
-- deploy_model: Deploy models to production
-
-When users ask about running experiments, analyzing data, training models, or deploying models, you should suggest using the appropriate tool. Be helpful and provide detailed explanations of what you can do.
-
-Current context: ${context || 'General research assistance'}
-
-Respond naturally and helpfully to the user's request.`
- },
- {
- role: "user",
- content: message as string
- }
- ],
- max_tokens: 1000,
- temperature: 0.7,
- });
-
- const aiResponse = completion.choices[0].message.content || "I'm sorry, I couldn't generate a response.";
-
- // Simple tool detection based on AI response content
- const lowerResponse = aiResponse.toLowerCase();
- const tools: string[] = [];
- const toolParams: any = {};
-
- if (lowerResponse.includes('experiment') || lowerResponse.includes('run experiment')) {
- tools.push('run_experiment');
- toolParams.type = 'classification';
- toolParams.dataset = 'custom';
- }
-
- if (lowerResponse.includes('analyze') || lowerResponse.includes('data analysis')) {
- tools.push('analyze_data');
- toolParams.dataset = 'current';
- toolParams.analysisType = 'comprehensive';
- }
-
- if (lowerResponse.includes('train') || lowerResponse.includes('model training')) {
- tools.push('train_model');
- toolParams.algorithm = 'neural_network';
- toolParams.epochs = 100;
- }
-
- if (lowerResponse.includes('deploy') || lowerResponse.includes('production')) {
- tools.push('deploy_model');
- toolParams.environment = 'production';
- toolParams.scaling = 'auto';
- }
-
- return {
- response: aiResponse,
- tools,
- toolParams
- };
-
- } catch (error) {
- console.error('Error calling Grok API:', error);
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
- throw new Error(`Failed to get AI response: ${errorMessage}`);
- }
- },
-});
diff --git a/convex/projects.ts b/convex/projects.ts
deleted file mode 100644
index a5a5310..0000000
--- a/convex/projects.ts
+++ /dev/null
@@ -1,143 +0,0 @@
-import { query, mutation } from "./_generated/server";
-import { v } from "convex/values";
-
-// Get all projects for a user
-export const list = query({
- args: {
- ownerId: v.optional(v.string()),
- },
- handler: async (ctx, args) => {
- const ownerId = args.ownerId || "user-1"; // Default user for now
- return await ctx.db
- .query("projects")
- .withIndex("by_owner", (q) => q.eq("ownerId", ownerId))
- .order("desc")
- .collect();
- },
-});
-
-// Get a single project by ID
-export const get = query({
- args: { id: v.id("projects") },
- handler: async (ctx, args) => {
- return await ctx.db.get(args.id);
- },
-});
-
-// Create a new project
-export const create = mutation({
- args: {
- name: v.string(),
- description: v.string(),
- budget: v.number(),
- settings: v.optional(v.any()),
- },
- handler: async (ctx, args) => {
- const now = Date.now();
- return await ctx.db.insert("projects", {
- ...args,
- ownerId: "user-1", // Default user for now
- status: "running",
- usedBudget: 0,
- settings: args.settings || {},
- createdAt: now,
- updatedAt: now,
- });
- },
-});
-
-// Update project status
-export const updateStatus = mutation({
- args: {
- id: v.id("projects"),
- status: v.union(
- v.literal("running"),
- v.literal("completed"),
- v.literal("paused"),
- v.literal("failed")
- ),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- status: args.status,
- updatedAt: Date.now(),
- });
- },
-});
-
-// Update project budget
-export const updateBudget = mutation({
- args: {
- id: v.id("projects"),
- budget: v.number(),
- usedBudget: v.number(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- budget: args.budget,
- usedBudget: args.usedBudget,
- updatedAt: Date.now(),
- });
- },
-});
-
-// Update project settings
-export const updateSettings = mutation({
- args: {
- id: v.id("projects"),
- settings: v.any(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- settings: args.settings,
- updatedAt: Date.now(),
- });
- },
-});
-
-// Delete a project
-export const remove = mutation({
- args: { id: v.id("projects") },
- handler: async (ctx, args) => {
- // First delete all related runs
- const runs = await ctx.db
- .query("runs")
- .withIndex("by_project", (q) => q.eq("projectId", args.id))
- .collect();
-
- for (const run of runs) {
- await ctx.db.delete(run._id);
- }
-
- // Then delete the project
- await ctx.db.delete(args.id);
- },
-});
-
-// Get project statistics
-export const getStats = query({
- args: { id: v.id("projects") },
- handler: async (ctx, args) => {
- const project = await ctx.db.get(args.id);
- if (!project) return null;
-
- const runs = await ctx.db
- .query("runs")
- .withIndex("by_project", (q) => q.eq("projectId", args.id))
- .collect();
-
- const totalRuns = runs.length;
- const completedRuns = runs.filter(run => run.status === "completed").length;
- const runningRuns = runs.filter(run => run.status === "running").length;
- const totalCost = runs.reduce((sum, run) => sum + run.cost, 0);
-
- return {
- project,
- totalRuns,
- completedRuns,
- runningRuns,
- totalCost,
- budgetRemaining: project.budget - totalCost,
- };
- },
-});
diff --git a/convex/runs.ts b/convex/runs.ts
deleted file mode 100644
index 4dc172f..0000000
--- a/convex/runs.ts
+++ /dev/null
@@ -1,288 +0,0 @@
-import { query, mutation } from "./_generated/server";
-import { v } from "convex/values";
-
-// Get all runs for a project
-export const listByProject = query({
- args: { projectId: v.id("projects") },
- handler: async (ctx, args) => {
- return await ctx.db
- .query("runs")
- .withIndex("by_project", (q) => q.eq("projectId", args.projectId))
- .order("desc")
- .collect();
- },
-});
-
-// Get a single run by ID
-export const get = query({
- args: { id: v.id("runs") },
- handler: async (ctx, args) => {
- return await ctx.db.get(args.id);
- },
-});
-
-// Get run with all related data
-export const getWithDetails = query({
- args: { id: v.id("runs") },
- handler: async (ctx, args) => {
- const run = await ctx.db.get(args.id);
- if (!run) return null;
-
- const steps = await ctx.db
- .query("runSteps")
- .withIndex("by_run", (q) => q.eq("runId", args.id))
- .order("asc")
- .collect();
-
- const metrics = await ctx.db
- .query("metrics")
- .withIndex("by_run", (q) => q.eq("runId", args.id))
- .order("desc")
- .collect();
-
- const artifacts = await ctx.db
- .query("artifacts")
- .withIndex("by_run", (q) => q.eq("runId", args.id))
- .order("desc")
- .collect();
-
- return {
- run,
- steps,
- metrics,
- artifacts,
- };
- },
-});
-
-// Create a new run
-export const create = mutation({
- args: {
- projectId: v.id("projects"),
- name: v.string(),
- config: v.any(),
- gpuProvider: v.string(),
- },
- handler: async (ctx, args) => {
- const now = Date.now();
- const runId = await ctx.db.insert("runs", {
- ...args,
- status: "queued",
- progress: 0,
- cost: 0,
- jobRef: "",
- startedAt: now,
- eta: "Calculating...",
- });
-
- // Create initial steps
- const steps = [
- { name: "Plan Generation", description: "Agent analyzed repository and generated training plan" },
- { name: "Environment Setup", description: "GPU provisioning and dependency installation" },
- { name: "Data Preprocessing", description: "Dataset loading and tokenization" },
- { name: "Model Training", description: "Training epochs" },
- { name: "Evaluation", description: "Model evaluation on validation set" },
- { name: "Analysis & Next Steps", description: "Performance analysis and plan updates" },
- ];
-
- for (let i = 0; i < steps.length; i++) {
- await ctx.db.insert("runSteps", {
- runId,
- stepName: steps[i].name,
- status: "pending",
- description: steps[i].description,
- stepIndex: i,
- });
- }
-
- return runId;
- },
-});
-
-// Update run status
-export const updateStatus = mutation({
- args: {
- id: v.id("runs"),
- status: v.union(
- v.literal("running"),
- v.literal("completed"),
- v.literal("paused"),
- v.literal("failed"),
- v.literal("queued")
- ),
- },
- handler: async (ctx, args) => {
- const updates: any = { status: args.status };
-
- if (args.status === "running") {
- updates.startedAt = Date.now();
- } else if (args.status === "completed" || args.status === "failed") {
- updates.endedAt = Date.now();
- }
-
- return await ctx.db.patch(args.id, updates);
- },
-});
-
-// Update run progress
-export const updateProgress = mutation({
- args: {
- id: v.id("runs"),
- progress: v.number(),
- eta: v.optional(v.string()),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- progress: args.progress,
- eta: args.eta,
- });
- },
-});
-
-// Update run cost
-export const updateCost = mutation({
- args: {
- id: v.id("runs"),
- cost: v.number(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- cost: args.cost,
- });
- },
-});
-
-// Update run configuration
-export const updateConfig = mutation({
- args: {
- id: v.id("runs"),
- config: v.any(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- config: args.config,
- });
- },
-});
-
-// Update job reference
-export const updateJobRef = mutation({
- args: {
- id: v.id("runs"),
- jobRef: v.string(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.patch(args.id, {
- jobRef: args.jobRef,
- });
- },
-});
-
-// Add a metric to a run
-export const addMetric = mutation({
- args: {
- runId: v.id("runs"),
- name: v.string(),
- value: v.number(),
- stepIndex: v.number(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.insert("metrics", {
- ...args,
- timestamp: Date.now(),
- });
- },
-});
-
-// Add an artifact to a run
-export const addArtifact = mutation({
- args: {
- runId: v.id("runs"),
- name: v.string(),
- type: v.string(),
- size: v.number(),
- url: v.string(),
- checksum: v.string(),
- },
- handler: async (ctx, args) => {
- return await ctx.db.insert("artifacts", {
- ...args,
- createdAt: Date.now(),
- });
- },
-});
-
-// Update step status
-export const updateStepStatus = mutation({
- args: {
- runId: v.id("runs"),
- stepIndex: v.number(),
- status: v.union(
- v.literal("pending"),
- v.literal("running"),
- v.literal("completed"),
- v.literal("failed")
- ),
- },
- handler: async (ctx, args) => {
- const steps = await ctx.db
- .query("runSteps")
- .withIndex("by_run_and_index", (q) =>
- q.eq("runId", args.runId).eq("stepIndex", args.stepIndex)
- )
- .collect();
-
- if (steps.length === 0) return null;
-
- const step = steps[0];
- const updates: any = { status: args.status };
-
- if (args.status === "running") {
- updates.startedAt = Date.now();
- } else if (args.status === "completed" || args.status === "failed") {
- updates.endedAt = Date.now();
- if (step.startedAt) {
- updates.duration = Date.now() - step.startedAt;
- }
- }
-
- return await ctx.db.patch(step._id, updates);
- },
-});
-
-// Delete a run
-export const remove = mutation({
- args: { id: v.id("runs") },
- handler: async (ctx, args) => {
- // Delete related data
- const steps = await ctx.db
- .query("runSteps")
- .withIndex("by_run", (q) => q.eq("runId", args.id))
- .collect();
-
- for (const step of steps) {
- await ctx.db.delete(step._id);
- }
-
- const metrics = await ctx.db
- .query("metrics")
- .withIndex("by_run", (q) => q.eq("runId", args.id))
- .collect();
-
- for (const metric of metrics) {
- await ctx.db.delete(metric._id);
- }
-
- const artifacts = await ctx.db
- .query("artifacts")
- .withIndex("by_run", (q) => q.eq("runId", args.id))
- .collect();
-
- for (const artifact of artifacts) {
- await ctx.db.delete(artifact._id);
- }
-
- // Delete the run
- await ctx.db.delete(args.id);
- },
-});
diff --git a/convex/schema.ts b/convex/schema.ts
deleted file mode 100644
index 8fc1dec..0000000
--- a/convex/schema.ts
+++ /dev/null
@@ -1,94 +0,0 @@
-import { defineSchema, defineTable } from "convex/server";
-import { v } from "convex/values";
-
-export default defineSchema({
- projects: defineTable({
- name: v.string(),
- description: v.string(),
- ownerId: v.string(),
- status: v.union(
- v.literal("running"),
- v.literal("completed"),
- v.literal("paused"),
- v.literal("failed")
- ),
- budget: v.number(),
- usedBudget: v.number(),
- settings: v.any(),
- createdAt: v.number(),
- updatedAt: v.number(),
- })
- .index("by_owner", ["ownerId"])
- .index("by_status", ["status"]),
-
- runs: defineTable({
- projectId: v.id("projects"),
- name: v.string(),
- status: v.union(
- v.literal("running"),
- v.literal("completed"),
- v.literal("paused"),
- v.literal("failed"),
- v.literal("queued")
- ),
- progress: v.number(),
- config: v.any(),
- cost: v.number(),
- gpuProvider: v.string(),
- jobRef: v.string(),
- startedAt: v.number(),
- endedAt: v.optional(v.number()),
- eta: v.optional(v.string()),
- })
- .index("by_project", ["projectId"])
- .index("by_status", ["status"]),
-
- runSteps: defineTable({
- runId: v.id("runs"),
- stepName: v.string(),
- status: v.union(
- v.literal("pending"),
- v.literal("running"),
- v.literal("completed"),
- v.literal("failed")
- ),
- description: v.string(),
- startedAt: v.optional(v.number()),
- endedAt: v.optional(v.number()),
- duration: v.optional(v.number()),
- stepIndex: v.number(),
- })
- .index("by_run", ["runId"])
- .index("by_run_and_index", ["runId", "stepIndex"]),
-
- metrics: defineTable({
- runId: v.id("runs"),
- name: v.string(),
- value: v.number(),
- timestamp: v.number(),
- stepIndex: v.number(),
- })
- .index("by_run", ["runId"])
- .index("by_run_and_name", ["runId", "name"]),
-
- artifacts: defineTable({
- runId: v.id("runs"),
- name: v.string(),
- type: v.string(),
- size: v.number(),
- url: v.string(),
- checksum: v.string(),
- createdAt: v.number(),
- })
- .index("by_run", ["runId"])
- .index("by_type", ["type"]),
-
- credentials: defineTable({
- projectId: v.id("projects"),
- serviceType: v.string(), // "openai", "github", "novita", "s3"
- encryptedData: v.string(),
- createdAt: v.number(),
- })
- .index("by_project", ["projectId"])
- .index("by_service", ["serviceType"]),
-});
diff --git a/convex/seed.ts b/convex/seed.ts
deleted file mode 100644
index fcc8ee9..0000000
--- a/convex/seed.ts
+++ /dev/null
@@ -1,181 +0,0 @@
-import { mutation } from "./_generated/server";
-
-// Create sample data for development
-export const createSampleData = mutation({
- args: {},
- handler: async (ctx) => {
- // Create sample projects
- const project1 = await ctx.db.insert("projects", {
- name: "Language Model Training",
- description: "Training a 7B parameter language model on custom dataset",
- ownerId: "user-1",
- status: "running",
- budget: 1000,
- usedBudget: 345.20,
- settings: {
- model: "Llama-2-7B",
- batchSize: 32,
- learningRate: 0.0001,
- epochs: 10,
- },
- createdAt: Date.now() - 86400000, // 1 day ago
- updatedAt: Date.now(),
- });
-
- const project2 = await ctx.db.insert("projects", {
- name: "Computer Vision Classification",
- description: "Image classification model for medical imaging",
- ownerId: "user-1",
- status: "completed",
- budget: 500,
- usedBudget: 123.50,
- settings: {
- model: "ResNet-50",
- batchSize: 16,
- learningRate: 0.001,
- epochs: 20,
- },
- createdAt: Date.now() - 172800000, // 2 days ago
- updatedAt: Date.now() - 86400000,
- });
-
- const project3 = await ctx.db.insert("projects", {
- name: "Reinforcement Learning Agent",
- description: "RL agent for autonomous navigation",
- ownerId: "user-1",
- status: "paused",
- budget: 2000,
- usedBudget: 78.90,
- settings: {
- model: "PPO",
- batchSize: 64,
- learningRate: 0.0003,
- epochs: 100,
- },
- createdAt: Date.now() - 259200000, // 3 days ago
- updatedAt: Date.now() - 172800000,
- });
-
- // Create sample runs for project1
- const run1 = await ctx.db.insert("runs", {
- projectId: project1,
- name: "Base Model Training",
- status: "running",
- progress: 75,
- config: {
- model: "Llama-2-7B",
- batchSize: 32,
- learningRate: 0.0001,
- epochs: 10,
- currentEpoch: 7,
- },
- cost: 45.20,
- gpuProvider: "novita",
- jobRef: "novita-job-123",
- startedAt: Date.now() - 14400000, // 4 hours ago
- eta: "2h 15m",
- });
-
- const run2 = await ctx.db.insert("runs", {
- projectId: project1,
- name: "Hyperparameter Sweep",
- status: "completed",
- progress: 100,
- config: {
- model: "Llama-2-7B",
- batchSize: 32,
- learningRate: 0.0001,
- epochs: 10,
- },
- cost: 123.50,
- gpuProvider: "novita",
- jobRef: "novita-job-122",
- startedAt: Date.now() - 86400000, // 1 day ago
- endedAt: Date.now() - 43200000, // 12 hours ago
- eta: "—",
- });
-
- // Create sample steps for run1
- const steps = [
- { name: "Plan Generation", status: "completed" as const, stepIndex: 0 },
- { name: "Environment Setup", status: "completed" as const, stepIndex: 1 },
- { name: "Data Preprocessing", status: "completed" as const, stepIndex: 2 },
- { name: "Model Training", status: "running" as const, stepIndex: 3 },
- { name: "Evaluation", status: "pending" as const, stepIndex: 4 },
- { name: "Analysis & Next Steps", status: "pending" as const, stepIndex: 5 },
- ];
-
- for (const step of steps) {
- await ctx.db.insert("runSteps", {
- runId: run1,
- stepName: step.name,
- status: step.status,
- description: `Step: ${step.name}`,
- stepIndex: step.stepIndex,
- startedAt: step.status === "completed" || step.status === "running" ? Date.now() - 14400000 : undefined,
- endedAt: step.status === "completed" ? Date.now() - 7200000 : undefined,
- duration: step.status === "completed" ? 3600000 : undefined,
- });
- }
-
- // Create sample metrics for run1
- const metrics = [
- { name: "Training Loss", value: 2.323, stepIndex: 3 },
- { name: "Validation Accuracy", value: 73.2, stepIndex: 3 },
- { name: "Throughput", value: 1247, stepIndex: 3 },
- { name: "GPU Utilization", value: 97.8, stepIndex: 3 },
- ];
-
- for (const metric of metrics) {
- await ctx.db.insert("metrics", {
- runId: run1,
- name: metric.name,
- value: metric.value,
- timestamp: Date.now(),
- stepIndex: metric.stepIndex,
- });
- }
-
- // Create sample artifacts for run1
- const artifacts = [
- {
- name: "model_checkpoint_epoch_7.pt",
- type: "Model Checkpoint",
- size: 2300000000, // 2.3 GB
- url: "s3://bucket/model_checkpoint_epoch_7.pt",
- checksum: "abc123def456",
- },
- {
- name: "training_logs.json",
- type: "Logs",
- size: 450000, // 450 KB
- url: "s3://bucket/training_logs.json",
- checksum: "def456ghi789",
- },
- {
- name: "evaluation_results.csv",
- type: "Metrics",
- size: 125000, // 125 KB
- url: "s3://bucket/evaluation_results.csv",
- checksum: "ghi789jkl012",
- },
- ];
-
- for (const artifact of artifacts) {
- await ctx.db.insert("artifacts", {
- runId: run1,
- name: artifact.name,
- type: artifact.type,
- size: artifact.size,
- url: artifact.url,
- checksum: artifact.checksum,
- createdAt: Date.now(),
- });
- }
-
- return {
- projects: [project1, project2, project3],
- runs: [run1, run2],
- };
- },
-});
diff --git a/convex/tsconfig.json b/convex/tsconfig.json
deleted file mode 100644
index 7374127..0000000
--- a/convex/tsconfig.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- /* This TypeScript project config describes the environment that
- * Convex functions run in and is used to typecheck them.
- * You can modify it, but some settings are required to use Convex.
- */
- "compilerOptions": {
- /* These settings are not required by Convex and can be modified. */
- "allowJs": true,
- "strict": true,
- "moduleResolution": "Bundler",
- "jsx": "react-jsx",
- "skipLibCheck": true,
- "allowSyntheticDefaultImports": true,
-
- /* These compiler options are required by Convex */
- "target": "ESNext",
- "lib": ["ES2021", "dom"],
- "forceConsistentCasingInFileNames": true,
- "module": "ESNext",
- "isolatedModules": true,
- "noEmit": true
- },
- "include": ["./**/*"],
- "exclude": ["./_generated"]
-}
diff --git a/create-agent-script.js b/create-agent-script.js
deleted file mode 100644
index 36a3c2d..0000000
--- a/create-agent-script.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// Script to create and run an AI agent
-// This will be executed in the browser console
-
-async function createAndRunAgent() {
- try {
- console.log("🤖 Creating AI Agent...");
-
- // First, let's create a sample project if none exists
- const projects = await window.convex.query("projects:list", {});
- console.log("Current projects:", projects);
-
- let projectId;
- if (projects && projects.length > 0) {
- projectId = projects[0]._id;
- console.log("Using existing project:", projects[0].name);
- } else {
- console.log("No projects found. Please create a project first.");
- return;
- }
-
- // Create an AI agent
- const runId = await window.convex.mutation("agents:createAgentPlan", {
- projectId: projectId,
- researchGoal: "Train a language model for code generation using transformer architecture",
- codebase: "Python codebase with PyTorch for neural network training"
- });
-
- console.log("✅ Agent created successfully! Run ID:", runId);
-
- // Simulate agent execution
- const result = await window.convex.mutation("agents:simulateAgentExecution", {
- runId: runId
- });
-
- console.log("🚀 Agent execution completed:", result);
- console.log("🎉 Your AI agent is now running! Check the dashboard to see progress.");
-
- } catch (error) {
- console.error("❌ Error creating agent:", error);
- }
-}
-
-// Run the agent creation
-createAndRunAgent();
diff --git a/lib/language-detection.ts b/lib/language-detection.ts
new file mode 100644
index 0000000..3801728
--- /dev/null
+++ b/lib/language-detection.ts
@@ -0,0 +1,83 @@
+// lib/language-detection.ts
+export type Language = 'en' | 'zh';
+
+export interface LanguageContext {
+ language: Language;
+ setLanguage: (lang: Language) => void;
+}
+
+// Simple IP-based language detection
+export async function detectLanguageFromIP(): Promise {
+ try {
+ // Use a free IP geolocation service
+ const response = await fetch('https://ipapi.co/json/');
+ const data = await response.json();
+
+ // Check if user is from Hong Kong or other Chinese-speaking regions
+ const chineseRegions = ['HK', 'CN', 'TW', 'MO', 'SG'];
+ return chineseRegions.includes(data.country_code) ? 'zh' : 'en';
+ } catch {
+ console.log('Failed to detect language from IP, defaulting to English');
+ return 'en';
+ }
+}
+
+// Translations
+export const translations = {
+ en: {
+ title: 'Open Superintelligence Lab',
+ subtitle: '开放超级智能实验室',
+ description: 'Advancing AI research and development through innovative approaches to artificial intelligence.',
+ about: 'About',
+ github: 'GitHub',
+ toggleLanguage: '中文',
+ projects: 'Research Projects',
+ deepseekTitle: 'DeepSeek-V3.2-Exp Research',
+ deepseekDescription: 'Open source research on DeepSeek Sparse Attention (DSA) and long-context efficiency improvements',
+ deepseekStatus: 'Active Research',
+ gptOssTitle: 'GPT-OSS Research',
+ gptOssDescription: 'OpenAI\'s open-source MoE language models with advanced reasoning capabilities and safety features',
+ gptOssStatus: 'Open Source',
+ learnMore: 'Learn More',
+ researchPath: 'Research Path',
+ researchQuestions: 'Research Questions',
+ contributions: 'How to Contribute',
+ openSource: 'Open Source Research',
+ deepseekResearchPath: 'Research Path',
+ deepseekQuestions: 'Research Questions',
+ deepseekContributions: 'How to Contribute',
+ deepseekOpenSource: 'Open Source Research',
+ gptOssResearchPath: 'Research Path',
+ gptOssQuestions: 'Research Questions',
+ gptOssContributions: 'How to Contribute',
+ gptOssOpenSource: 'Open Source Research'
+ },
+ zh: {
+ title: '开放超级智能实验室',
+ subtitle: 'Open Superintelligence Lab',
+ description: '通过创新的人工智能方法推进AI研究和开发。',
+ about: '关于',
+ github: 'GitHub',
+ toggleLanguage: 'English',
+ projects: '研究项目',
+ deepseekTitle: 'DeepSeek-V3.2-Exp 研究',
+ deepseekDescription: '关于DeepSeek稀疏注意力机制(DSA)和长上下文效率改进的开源研究',
+ deepseekStatus: '活跃研究',
+ gptOssTitle: 'GPT-OSS 研究',
+ gptOssDescription: 'OpenAI的开源MoE语言模型,具有先进的推理能力和安全特性',
+ gptOssStatus: '开源',
+ learnMore: '了解更多',
+ researchPath: '研究路径',
+ researchQuestions: '研究问题',
+ contributions: '如何贡献',
+ openSource: '开源研究',
+ deepseekResearchPath: '研究路径',
+ deepseekQuestions: '研究问题',
+ deepseekContributions: '如何贡献',
+ deepseekOpenSource: '开源研究',
+ gptOssResearchPath: '研究路径',
+ gptOssQuestions: '研究问题',
+ gptOssContributions: '如何贡献',
+ gptOssOpenSource: '开源研究'
+ }
+};
diff --git a/lib/utils.ts b/lib/utils.ts
deleted file mode 100644
index bd0c391..0000000
--- a/lib/utils.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { clsx, type ClassValue } from "clsx"
-import { twMerge } from "tailwind-merge"
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
-}
diff --git a/next.config.ts b/next.config.ts
index 66262a6..ebcbb29 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,8 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- output: 'export',
+ // Static export configuration for production builds
+ // output: 'export', // Commented out for development
trailingSlash: true,
images: {
unoptimized: true
diff --git a/package-lock.json b/package-lock.json
index c35eb2e..cd707b1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,33 +8,15 @@
"name": "open-superintelligence-lab-github-io",
"version": "0.1.0",
"dependencies": {
- "@hookform/resolvers": "^5.2.2",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-progress": "^1.1.7",
- "@radix-ui/react-scroll-area": "^1.2.10",
- "@radix-ui/react-select": "^2.2.6",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-tabs": "^1.1.13",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "convex": "^1.27.3",
"highlight.js": "^11.11.1",
"lucide-react": "^0.544.0",
"next": "15.5.3",
- "openai": "^5.23.0",
"react": "19.1.0",
"react-dom": "19.1.0",
- "react-hook-form": "^7.63.0",
"react-markdown": "^10.1.0",
"rehype-highlight": "^7.0.2",
"remark-gfm": "^4.0.1",
- "tailwind-merge": "^3.3.1",
- "tailwindcss-animate": "^1.0.7",
- "zod": "^4.1.11"
+ "tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
@@ -53,7 +35,6 @@
"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,
"engines": {
"node": ">=10"
},
@@ -91,70 +72,189 @@
"tslib": "^2.4.0"
}
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
- "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "aix"
- ],
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
"engines": {
- "node": ">=18"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
- "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ],
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
"engines": {
- "node": ">=18"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
- "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
"engines": {
- "node": ">=18"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
- "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+ "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.6",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
+ "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+ "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+ "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.35.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
+ "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+ "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+ "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/core": "^0.15.2",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
- "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",
+ "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==",
"cpu": [
"arm64"
],
@@ -163,13 +263,19 @@
"darwin"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.0"
}
},
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
- "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
+ "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
"cpu": [
"x64"
],
@@ -178,43 +284,49 @@
"darwin"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.0"
}
},
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
- "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz",
+ "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
- "freebsd"
+ "darwin"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
- "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz",
+ "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==",
"cpu": [
"x64"
],
"optional": true,
"os": [
- "freebsd"
+ "darwin"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
- "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
+ "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
"cpu": [
"arm"
],
@@ -222,14 +334,14 @@
"os": [
"linux"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
- "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
+ "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
"cpu": [
"arm64"
],
@@ -237,194 +349,254 @@
"os": [
"linux"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
- "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
+ "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
"cpu": [
- "ia32"
+ "ppc64"
],
"optional": true,
"os": [
"linux"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
- "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
+ "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
"cpu": [
- "loong64"
+ "s390x"
],
"optional": true,
"os": [
"linux"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
- "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
+ "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
"cpu": [
- "mips64el"
+ "x64"
],
"optional": true,
"os": [
"linux"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
+ "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
- "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
+ "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
"cpu": [
- "ppc64"
+ "x64"
],
"optional": true,
"os": [
"linux"
],
- "engines": {
- "node": ">=18"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
- "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
+ "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
"cpu": [
- "riscv64"
+ "arm"
],
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.0"
}
},
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
- "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
+ "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
"cpu": [
- "s390x"
+ "arm64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.0"
}
},
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
- "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
+ "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
"cpu": [
- "x64"
+ "ppc64"
],
"optional": true,
"os": [
"linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.0"
}
},
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
- "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
+ "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
"cpu": [
- "arm64"
+ "s390x"
],
"optional": true,
"os": [
- "netbsd"
+ "linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.0"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
- "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
+ "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
- "netbsd"
+ "linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.0"
}
},
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
- "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
+ "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
- "openbsd"
+ "linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.0"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
- "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
+ "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
"cpu": [
"x64"
],
"optional": true,
"os": [
- "openbsd"
+ "linux"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.0"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
- "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
+ "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
"cpu": [
- "x64"
+ "wasm32"
],
"optional": true,
- "os": [
- "sunos"
- ],
+ "dependencies": {
+ "@emnapi/runtime": "^1.4.4"
+ },
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
- "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
+ "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
"cpu": [
"arm64"
],
@@ -433,13 +605,16 @@
"win32"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
- "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
+ "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
"cpu": [
"ia32"
],
@@ -448,13 +623,16 @@
"win32"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
- "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.3",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
+ "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
"cpu": [
"x64"
],
@@ -463,237 +641,89 @@
"win32"
],
"engines": {
- "node": ">=18"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
- "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
- "dev": true,
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dependencies": {
- "eslint-visitor-keys": "^3.4.3"
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ "node": ">=12"
}
},
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "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==",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
- "dev": true,
+ "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==",
"engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ "node": ">=6.0.0"
}
},
- "node_modules/@eslint/config-array": {
- "version": "0.21.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
- "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
- "dev": true,
- "dependencies": {
- "@eslint/object-schema": "^2.1.6",
- "debug": "^4.3.1",
- "minimatch": "^3.1.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
- "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/core": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
- "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.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=="
},
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
- "dev": true,
+ "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==",
"dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/js": {
- "version": "9.35.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
- "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
- "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
- "dev": true,
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@eslint/plugin-kit": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
- "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
"dev": true,
+ "optional": true,
"dependencies": {
- "@eslint/core": "^0.15.2",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
- "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
- "dependencies": {
- "@floating-ui/utils": "^0.2.10"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
- "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
- "dependencies": {
- "@floating-ui/core": "^1.7.3",
- "@floating-ui/utils": "^0.2.10"
- }
- },
- "node_modules/@floating-ui/react-dom": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz",
- "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==",
- "dependencies": {
- "@floating-ui/dom": "^1.7.4"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.10",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
- "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="
- },
- "node_modules/@hookform/resolvers": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.2.2.tgz",
- "integrity": "sha512-A/IxlMLShx3KjV/HeTcTfaMxdwy690+L/ZADoeaTltLx+CVuzkeVIPuybK3jrRfw7YZnmdKsVVHAlEPIAEUNlA==",
- "dependencies": {
- "@standard-schema/utils": "^0.3.0"
- },
- "peerDependencies": {
- "react-hook-form": "^7.55.0"
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
}
},
- "node_modules/@humanfs/core": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
- "dev": true,
- "engines": {
- "node": ">=18.18.0"
- }
+ "node_modules/@next/env": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.3.tgz",
+ "integrity": "sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw=="
},
- "node_modules/@humanfs/node": {
- "version": "0.16.7",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
- "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.3.tgz",
+ "integrity": "sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==",
"dev": true,
"dependencies": {
- "@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
+ "fast-glob": "3.3.1"
}
},
- "node_modules/@img/sharp-darwin-arm64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",
- "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==",
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.3.tgz",
+ "integrity": "sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==",
"cpu": [
"arm64"
],
@@ -702,19 +732,13 @@
"darwin"
],
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.2.0"
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
- "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.3.tgz",
+ "integrity": "sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==",
"cpu": [
"x64"
],
@@ -723,1415 +747,149 @@
"darwin"
],
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.2.0"
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz",
- "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==",
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.3.tgz",
+ "integrity": "sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
- "darwin"
+ "linux"
],
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz",
- "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==",
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.3.tgz",
+ "integrity": "sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==",
"cpu": [
- "x64"
+ "arm64"
],
"optional": true,
"os": [
- "darwin"
+ "linux"
],
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
- "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.3.tgz",
+ "integrity": "sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==",
"cpu": [
- "arm"
+ "x64"
],
"optional": true,
"os": [
"linux"
],
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
- "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.3.tgz",
+ "integrity": "sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==",
"cpu": [
- "arm64"
+ "x64"
],
"optional": true,
"os": [
"linux"
],
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-libvips-linux-ppc64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
- "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
- "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
- "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
- "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.3.tgz",
+ "integrity": "sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==",
"cpu": [
"arm64"
],
"optional": true,
"os": [
- "linux"
+ "win32"
],
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
- "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.5.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.3.tgz",
+ "integrity": "sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==",
"cpu": [
"x64"
],
"optional": true,
"os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-linux-arm": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
- "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
+ "win32"
],
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.2.0"
+ "node": ">= 10"
}
},
- "node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
- "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "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==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
},
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.2.0"
- }
- },
- "node_modules/@img/sharp-linux-ppc64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
- "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-ppc64": "1.2.0"
+ "node": ">= 8"
}
},
- "node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
- "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
+ "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==",
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.2.0"
+ "node": ">= 8"
}
},
- "node_modules/@img/sharp-linux-x64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
- "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "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==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
},
- "optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.2.0"
- }
- },
- "node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
- "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.0"
+ "node": ">= 8"
}
},
- "node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
- "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/@nolyfill/is-core-module": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
+ "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
+ "dev": true,
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.2.0"
+ "node": ">=12.4.0"
}
},
- "node_modules/@img/sharp-wasm32": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
- "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
- "cpu": [
- "wasm32"
- ],
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
"optional": true,
- "dependencies": {
- "@emnapi/runtime": "^1.4.4"
- },
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "node": ">=14"
}
},
- "node_modules/@img/sharp-win32-arm64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
- "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
- "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-win32-x64": {
- "version": "0.34.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
- "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "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,
- "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,
- "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
- },
- "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,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@napi-rs/wasm-runtime": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
- "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.4.3",
- "@emnapi/runtime": "^1.4.3",
- "@tybys/wasm-util": "^0.10.0"
- }
- },
- "node_modules/@next/env": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.3.tgz",
- "integrity": "sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw=="
- },
- "node_modules/@next/eslint-plugin-next": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.3.tgz",
- "integrity": "sha512-SdhaKdko6dpsSr0DldkESItVrnPYB1NS2NpShCSX5lc7SSQmLZt5Mug6t2xbiuVWEVDLZSuIAoQyYVBYp0dR5g==",
- "dev": true,
- "dependencies": {
- "fast-glob": "3.3.1"
- }
- },
- "node_modules/@next/swc-darwin-arm64": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.3.tgz",
- "integrity": "sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-darwin-x64": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.3.tgz",
- "integrity": "sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.3.tgz",
- "integrity": "sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.3.tgz",
- "integrity": "sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.3.tgz",
- "integrity": "sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-musl": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.3.tgz",
- "integrity": "sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.3.tgz",
- "integrity": "sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "15.5.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.3.tgz",
- "integrity": "sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==",
- "cpu": [
- "x64"
- ],
- "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,
- "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,
- "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,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nolyfill/is-core-module": {
- "version": "1.0.39",
- "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz",
- "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==",
- "dev": true,
- "engines": {
- "node": ">=12.4.0"
- }
- },
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@radix-ui/number": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz",
- "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="
- },
- "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=="
- },
- "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==",
- "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-avatar": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz",
- "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==",
- "dependencies": {
- "@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-is-hydrated": "0.1.0",
- "@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-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==",
- "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-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==",
- "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==",
- "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==",
- "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-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==",
- "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==",
- "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==",
- "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==",
- "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==",
- "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==",
- "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-label": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz",
- "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==",
- "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-menu": {
- "version": "2.1.16",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz",
- "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==",
- "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-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==",
- "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==",
- "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==",
- "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==",
- "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-progress": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz",
- "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==",
- "dependencies": {
- "@radix-ui/react-context": "1.1.2",
- "@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-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==",
- "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-scroll-area": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
- "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
- "dependencies": {
- "@radix-ui/number": "1.1.1",
- "@radix-ui/primitive": "1.1.3",
- "@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-presence": "1.1.5",
- "@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"
- },
- "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-select": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz",
- "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==",
- "dependencies": {
- "@radix-ui/number": "1.1.1",
- "@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-primitive": "2.1.3",
- "@radix-ui/react-slot": "1.2.3",
- "@radix-ui/react-use-callback-ref": "1.1.1",
- "@radix-ui/react-use-controllable-state": "1.2.2",
- "@radix-ui/react-use-layout-effect": "1.1.1",
- "@radix-ui/react-use-previous": "1.1.1",
- "@radix-ui/react-visually-hidden": "1.2.3",
- "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-separator": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz",
- "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==",
- "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-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==",
- "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-tabs": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
- "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
- "dependencies": {
- "@radix-ui/primitive": "1.1.3",
- "@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-direction": "1.1.1",
- "@radix-ui/react-id": "1.1.1",
- "@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-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-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==",
- "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==",
- "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==",
- "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==",
- "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-is-hydrated": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz",
- "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==",
- "dependencies": {
- "use-sync-external-store": "^1.5.0"
- },
- "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==",
- "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-previous": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz",
- "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==",
- "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==",
- "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==",
- "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==",
- "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=="
- },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -2144,11 +902,6 @@
"integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==",
"dev": true
},
- "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=="
- },
"node_modules/@swc/helpers": {
"version": "0.5.15",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
@@ -2234,7 +987,6 @@
"version": "19.1.13",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz",
"integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==",
- "dev": true,
"dependencies": {
"csstype": "^3.0.2"
}
@@ -2822,7 +1574,6 @@
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
- "dev": true,
"engines": {
"node": ">=12"
},
@@ -2834,7 +1585,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2848,14 +1598,12 @@
"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
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
},
"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,
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -2867,8 +1615,7 @@
"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
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
},
"node_modules/argparse": {
"version": "2.0.1",
@@ -2876,17 +1623,6 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
- "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==",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/aria-query": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
@@ -3145,8 +1881,7 @@
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/baseline-browser-mapping": {
"version": "2.8.3",
@@ -3161,7 +1896,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
"engines": {
"node": ">=8"
},
@@ -3183,7 +1917,6 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
"dependencies": {
"fill-range": "^7.1.1"
},
@@ -3284,7 +2017,6 @@
"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,
"engines": {
"node": ">= 6"
}
@@ -3373,7 +2105,6 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -3397,7 +2128,6 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -3405,30 +2135,11 @@
"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==",
- "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=="
},
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -3446,7 +2157,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "devOptional": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -3457,8 +2167,7 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "devOptional": true
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/color-string": {
"version": "1.9.1",
@@ -3483,7 +2192,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
"engines": {
"node": ">= 6"
}
@@ -3494,44 +2202,10 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
- "node_modules/convex": {
- "version": "1.27.3",
- "resolved": "https://registry.npmjs.org/convex/-/convex-1.27.3.tgz",
- "integrity": "sha512-Ebr9lPgXkL7JO5IFr3bG+gYvHskyJjc96Fx0BBNkJUDXrR/bd9/uI4q8QszbglK75XfDu068vR0d/HK2T7tB9Q==",
- "dependencies": {
- "esbuild": "0.25.4",
- "jwt-decode": "^4.0.0",
- "prettier": "^3.0.0"
- },
- "bin": {
- "convex": "bin/main.js"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=7.0.0"
- },
- "peerDependencies": {
- "@auth0/auth0-react": "^2.0.1",
- "@clerk/clerk-react": "^4.12.8 || ^5.0.0",
- "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@auth0/auth0-react": {
- "optional": true
- },
- "@clerk/clerk-react": {
- "optional": true
- },
- "react": {
- "optional": true
- }
- }
- },
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -3545,7 +2219,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
"bin": {
"cssesc": "bin/cssesc"
},
@@ -3556,8 +2229,7 @@
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/damerau-levenshtein": {
"version": "1.0.8",
@@ -3701,11 +2373,6 @@
"node": ">=8"
}
},
- "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=="
- },
"node_modules/devlop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
@@ -3721,14 +2388,12 @@
"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
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"node_modules/doctrine": {
"version": "2.1.0",
@@ -3759,8 +2424,7 @@
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
},
"node_modules/electron-to-chromium": {
"version": "1.5.218",
@@ -3771,8 +2435,7 @@
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
},
"node_modules/es-abstract": {
"version": "1.24.0",
@@ -3943,45 +2606,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/esbuild": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz",
- "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.4",
- "@esbuild/android-arm": "0.25.4",
- "@esbuild/android-arm64": "0.25.4",
- "@esbuild/android-x64": "0.25.4",
- "@esbuild/darwin-arm64": "0.25.4",
- "@esbuild/darwin-x64": "0.25.4",
- "@esbuild/freebsd-arm64": "0.25.4",
- "@esbuild/freebsd-x64": "0.25.4",
- "@esbuild/linux-arm": "0.25.4",
- "@esbuild/linux-arm64": "0.25.4",
- "@esbuild/linux-ia32": "0.25.4",
- "@esbuild/linux-loong64": "0.25.4",
- "@esbuild/linux-mips64el": "0.25.4",
- "@esbuild/linux-ppc64": "0.25.4",
- "@esbuild/linux-riscv64": "0.25.4",
- "@esbuild/linux-s390x": "0.25.4",
- "@esbuild/linux-x64": "0.25.4",
- "@esbuild/netbsd-arm64": "0.25.4",
- "@esbuild/netbsd-x64": "0.25.4",
- "@esbuild/openbsd-arm64": "0.25.4",
- "@esbuild/openbsd-x64": "0.25.4",
- "@esbuild/sunos-x64": "0.25.4",
- "@esbuild/win32-arm64": "0.25.4",
- "@esbuild/win32-ia32": "0.25.4",
- "@esbuild/win32-x64": "0.25.4"
- }
- },
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -4471,7 +3095,6 @@
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
"dependencies": {
"reusify": "^1.0.4"
}
@@ -4492,7 +3115,6 @@
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -4554,7 +3176,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
- "dev": true,
"dependencies": {
"cross-spawn": "^7.0.6",
"signal-exit": "^4.0.1"
@@ -4583,7 +3204,6 @@
"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,
"optional": true,
"os": [
@@ -4597,7 +3217,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -4655,14 +3274,6 @@
"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==",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
@@ -4709,7 +3320,6 @@
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^3.1.2",
@@ -4729,7 +3339,6 @@
"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,
"dependencies": {
"is-glob": "^4.0.3"
},
@@ -4741,7 +3350,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -4750,7 +3358,6 @@
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -4886,7 +3493,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -5112,7 +3718,6 @@
"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,
"dependencies": {
"binary-extensions": "^2.0.0"
},
@@ -5161,7 +3766,6 @@
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "dev": true,
"dependencies": {
"hasown": "^2.0.2"
},
@@ -5218,7 +3822,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -5242,7 +3845,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -5269,7 +3871,6 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -5314,7 +3915,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
"engines": {
"node": ">=0.12.0"
}
@@ -5491,8 +4091,7 @@
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
},
"node_modules/iterator.prototype": {
"version": "1.1.5",
@@ -5515,7 +4114,6 @@
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "dev": true,
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
@@ -5589,14 +4187,6 @@
"node": ">=4.0"
}
},
- "node_modules/jwt-decode": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
- "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -5641,7 +4231,6 @@
"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,
"engines": {
"node": ">=14"
},
@@ -5652,8 +4241,7 @@
"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
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
},
"node_modules/locate-path": {
"version": "6.0.0",
@@ -5714,8 +4302,7 @@
"node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
},
"node_modules/lucide-react": {
"version": "0.544.0",
@@ -6013,7 +4600,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
"engines": {
"node": ">= 8"
}
@@ -6557,7 +5143,6 @@
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
"dependencies": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
@@ -6591,7 +5176,6 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
}
@@ -6605,7 +5189,6 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
@@ -6738,7 +5321,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -6756,7 +5338,6 @@
"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,
"engines": {
"node": ">=0.10.0"
}
@@ -6765,7 +5346,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "dev": true,
"engines": {
"node": ">= 6"
}
@@ -6876,26 +5456,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/openai": {
- "version": "5.23.0",
- "resolved": "https://registry.npmjs.org/openai/-/openai-5.23.0.tgz",
- "integrity": "sha512-Cfq155NHzI7VWR67LUNJMIgPZy2oSh7Fld/OKhxq648BiUjELAvcge7g30xJ6vAfwwXf6TVK0KKuN+3nmIJG/A==",
- "bin": {
- "openai": "bin/cli"
- },
- "peerDependencies": {
- "ws": "^8.18.0",
- "zod": "^3.23.8"
- },
- "peerDependenciesMeta": {
- "ws": {
- "optional": true
- },
- "zod": {
- "optional": true
- }
- }
- },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -6963,8 +5523,7 @@
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
- "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
- "dev": true
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
},
"node_modules/parent-module": {
"version": "1.0.1",
@@ -7014,7 +5573,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -7022,14 +5580,12 @@
"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
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"node_modules/path-scurry": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "dev": true,
"dependencies": {
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
@@ -7050,7 +5606,6 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
"engines": {
"node": ">=8.6"
},
@@ -7062,7 +5617,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -7071,7 +5625,6 @@
"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,
"engines": {
"node": ">= 6"
}
@@ -7089,7 +5642,6 @@
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -7117,7 +5669,6 @@
"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,
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
@@ -7134,7 +5685,6 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
- "dev": true,
"dependencies": {
"camelcase-css": "^2.0.1"
},
@@ -7153,7 +5703,6 @@
"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",
@@ -7178,7 +5727,6 @@
"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,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -7190,8 +5738,7 @@
"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
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
},
"node_modules/prelude-ls": {
"version": "1.2.1",
@@ -7202,20 +5749,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/prettier": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
- "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -7249,7 +5782,6 @@
"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",
@@ -7284,21 +5816,6 @@
"react": "^19.1.0"
}
},
- "node_modules/react-hook-form": {
- "version": "7.63.0",
- "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.63.0.tgz",
- "integrity": "sha512-ZwueDMvUeucovM2VjkCf7zIHcs1aAlDimZu2Hvel5C5907gUzMpm4xCrQXtRzCvsBqFjonB4m3x4LzCFI1ZKWA==",
- "engines": {
- "node": ">=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/react-hook-form"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17 || ^18 || ^19"
- }
- },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -7331,77 +5848,10 @@
"react": ">=18"
}
},
- "node_modules/react-remove-scroll": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
- "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==",
- "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==",
- "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==",
- "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/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,
"dependencies": {
"pify": "^2.3.0"
}
@@ -7410,7 +5860,6 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -7542,7 +5991,6 @@
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
- "dev": true,
"dependencies": {
"is-core-module": "^2.16.0",
"path-parse": "^1.0.7",
@@ -7580,7 +6028,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
@@ -7590,7 +6037,6 @@
"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",
@@ -7770,7 +6216,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -7782,7 +6227,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -7863,7 +6307,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
"engines": {
"node": ">=14"
},
@@ -7920,7 +6363,6 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
@@ -7938,7 +6380,6 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -7952,7 +6393,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -7960,14 +6400,12 @@
"node_modules/string-width-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/string-width-cjs/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -8099,7 +6537,6 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
"integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
- "dev": true,
"dependencies": {
"ansi-regex": "^6.0.1"
},
@@ -8115,7 +6552,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -8127,7 +6563,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -8195,7 +6630,6 @@
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
- "dev": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
@@ -8229,7 +6663,6 @@
"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,
"engines": {
"node": ">= 0.4"
},
@@ -8237,20 +6670,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/tailwind-merge": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz",
- "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/dcastil"
- }
- },
"node_modules/tailwindcss": {
"version": "3.4.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
"integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
- "dev": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -8295,7 +6718,6 @@
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
@@ -8311,7 +6733,6 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -8323,7 +6744,6 @@
"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,
"bin": {
"jiti": "bin/jiti.js"
}
@@ -8332,7 +6752,6 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
- "dev": true,
"funding": [
{
"type": "opencollective",
@@ -8367,7 +6786,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
"dependencies": {
"any-promise": "^1.0.0"
}
@@ -8376,7 +6794,6 @@
"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,
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
@@ -8433,7 +6850,6 @@
"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,
"dependencies": {
"is-number": "^7.0.0"
},
@@ -8474,8 +6890,7 @@
"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
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
},
"node_modules/tsconfig-paths": {
"version": "3.15.0",
@@ -8784,60 +7199,10 @@
"punycode": "^2.1.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==",
- "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==",
- "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.5.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
- "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
- "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
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/vfile": {
"version": "6.0.3",
@@ -8869,7 +7234,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
@@ -8978,7 +7342,6 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
@@ -8996,7 +7359,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -9013,7 +7375,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -9021,14 +7382,12 @@
"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/wrap-ansi-cjs/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -9042,7 +7401,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -9054,7 +7412,6 @@
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
- "dev": true,
"engines": {
"node": ">=12"
},
@@ -9066,7 +7423,6 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
"integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
- "dev": true,
"bin": {
"yaml": "bin.mjs"
},
@@ -9086,14 +7442,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/zod": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz",
- "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
"node_modules/zwitch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index 4ae47ba..0e30b3b 100644
--- a/package.json
+++ b/package.json
@@ -12,33 +12,15 @@
"serve:out": "npx serve out"
},
"dependencies": {
- "@hookform/resolvers": "^5.2.2",
- "@radix-ui/react-avatar": "^1.1.10",
- "@radix-ui/react-dialog": "^1.1.15",
- "@radix-ui/react-dropdown-menu": "^2.1.16",
- "@radix-ui/react-label": "^2.1.7",
- "@radix-ui/react-progress": "^1.1.7",
- "@radix-ui/react-scroll-area": "^1.2.10",
- "@radix-ui/react-select": "^2.2.6",
- "@radix-ui/react-separator": "^1.1.7",
- "@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-tabs": "^1.1.13",
- "class-variance-authority": "^0.7.1",
- "clsx": "^2.1.1",
- "convex": "^1.27.3",
"highlight.js": "^11.11.1",
"lucide-react": "^0.544.0",
"next": "15.5.3",
- "openai": "^5.23.0",
"react": "19.1.0",
"react-dom": "19.1.0",
- "react-hook-form": "^7.63.0",
"react-markdown": "^10.1.0",
"rehype-highlight": "^7.0.2",
"remark-gfm": "^4.0.1",
- "tailwind-merge": "^3.3.1",
- "tailwindcss-animate": "^1.0.7",
- "zod": "^4.1.11"
+ "tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@eslint/eslintrc": "^3",