.')
- .with_llm(OpenAI(model='gpt-4o-mini'))
- .build()
-)
-
-# Define variables at runtime
-variables = {
- 'dataset_path': '/data/sales_q4_2024.csv',
- 'key_metric': 'revenue growth',
- 'target_audience': 'executive team'
-}
-
-result = await agent.run(
- 'Please provide a comprehensive analysis with actionable recommendations.',
- variables=variables
-)
-```
-
-### Document Processing
-
-Process PDF and TXT documents with AI agents:
-
-```python
-from flo_ai.models.document import DocumentMessage, DocumentType
-
- # Create document message
- document = DocumentMessage(
- document_type=DocumentType.PDF,
- document_file_path='business_report.pdf'
- )
-
-# Process with agent
-agent = (
- AgentBuilder()
- .with_name('Document Analyzer')
- .with_prompt('Analyze the provided document and extract key insights.')
- .with_llm(OpenAI(model='gpt-4o-mini'))
- .build()
-)
-
- result = await agent.run([document])
-```
-
-### Output Formatting
-
-Use Pydantic models for structured outputs:
-
-```python
-from pydantic import BaseModel, Field
-
-class AnalysisResult(BaseModel):
- summary: str = Field(description="Executive summary")
- key_findings: list = Field(description="List of key findings")
- recommendations: list = Field(description="Actionable recommendations")
-
-agent = (
- AgentBuilder()
- .with_name('Business Analyst')
- .with_llm(OpenAI(model='gpt-4o'))
- .with_output_schema(AnalysisResult)
- .build()
-)
-```
-
-### Error Handling
-
-Built-in retry mechanisms and error recovery:
-
-```python
-agent = (
- AgentBuilder()
- .with_name('Robust Agent')
- .with_llm(OpenAI(model='gpt-4o'))
- .with_retries(3) # Retry up to 3 times on failure
- .build()
-)
-```
-
-## π Agent Orchestration with Arium
-
-Arium is Flo AI's powerful workflow orchestration engine for creating complex multi-agent workflows.
-
-### Simple Agent Chains
-
-```python
-from flo_ai.arium import AriumBuilder
-from flo_ai.models.agent import Agent
-from flo_ai.llm import OpenAI
-
-async def simple_chain():
- llm = OpenAI(model='gpt-4o-mini')
-
- # Create agents
- analyst = Agent(
- name='content_analyst',
- system_prompt='Analyze the input and extract key insights.',
- llm=llm
- )
-
- summarizer = Agent(
- name='summarizer',
- system_prompt='Create a concise summary based on the analysis.',
- llm=llm
- )
-
- # Build and run workflow
- result = await (
- AriumBuilder()
- .add_agents([analyst, summarizer])
- .start_with(analyst)
- .connect(analyst, summarizer)
- .end_with(summarizer)
- .build_and_run(["Analyze this complex business report..."])
- )
-
- return result
-```
-
-### Conditional Routing
-
-```python
-from flo_ai.arium.memory import BaseMemory
-
- def route_by_type(memory: BaseMemory) -> str:
- """Route based on classification result"""
- messages = memory.get()
- last_message = str(messages[-1]) if messages else ""
-
- if "technical" in last_message.lower():
- return "tech_specialist"
- else:
- return "business_specialist"
-
- # Build workflow with conditional routing
-result = await (
- AriumBuilder()
- .add_agents([classifier, tech_specialist, business_specialist, final_agent])
- .start_with(classifier)
- .add_edge(classifier, [tech_specialist, business_specialist], route_by_type)
- .connect(tech_specialist, final_agent)
- .connect(business_specialist, final_agent)
- .end_with(final_agent)
- .build_and_run(["How can we optimize our database performance?"])
- )
-```
-
-### YAML-Based Workflows
-
-Define entire workflows in YAML:
-
-```yaml
-metadata:
- name: "content-analysis-workflow"
- version: "1.0.0"
- description: "Multi-agent content analysis pipeline"
-
-arium:
- agents:
- - name: "analyzer"
- role: "Content Analyst"
- job: "Analyze the input content and extract key insights."
- model:
- provider: "openai"
- name: "gpt-4o-mini"
-
- - name: "summarizer"
- role: "Content Summarizer"
- job: "Create a concise summary based on the analysis."
- model:
- provider: "anthropic"
- name: "claude-3-5-sonnet-20240620"
-
- workflow:
- start: "analyzer"
- edges:
- - from: "analyzer"
- to: ["summarizer"]
- end: ["summarizer"]
-```
-
-```python
-# Run YAML workflow
-result = await (
- AriumBuilder()
- .from_yaml(yaml_str=workflow_yaml)
- .build_and_run(["Analyze this quarterly business report..."])
- )
-```
-
-### LLM-Powered Routers
-
-Define intelligent routing logic directly in YAML:
-
-```yaml
- routers:
- - name: "content_type_router"
- type: "smart" # Uses LLM for intelligent routing
- routing_options:
- technical_writer: "Technical content, documentation, tutorials"
- creative_writer: "Creative writing, storytelling, fiction"
- marketing_writer: "Marketing copy, sales content, campaigns"
- model:
- provider: "openai"
- name: "gpt-4o-mini"
-```
-
-### ReflectionRouter & PlanExecuteRouter
-
-**ReflectionRouter** for AβBβAβC feedback patterns:
-
-```yaml
- routers:
- - name: "reflection_router"
- type: "reflection"
- flow_pattern: [writer, critic, writer] # A β B β A pattern
- model:
- provider: "openai"
- name: "gpt-4o-mini"
-```
-
-**PlanExecuteRouter** for Cursor-style plan-and-execute workflows:
-
-```yaml
-routers:
- - name: "plan_router"
- type: "plan_execute"
- agents:
- planner: "Creates detailed execution plans"
- developer: "Implements features according to plan"
- tester: "Tests implementations and validates functionality"
- reviewer: "Reviews and approves completed work"
- settings:
- planner_agent: planner
- executor_agent: developer
- reviewer_agent: reviewer
-```
-
-## π OpenTelemetry Integration
-
-Built-in observability for production monitoring:
-
-```python
-from flo_ai import configure_telemetry, shutdown_telemetry
-
-# Configure at startup
-configure_telemetry(
- service_name="my_ai_app",
- service_version="1.0.0",
- console_export=True # For debugging
-)
-
-# Your application code here...
-
-# Shutdown to flush data
-shutdown_telemetry()
-```
-
-**π [Complete Telemetry Guide β](flo_ai/flo_ai/telemetry/README.md)**
-
-## π Examples & Documentation
-
-### Examples Directory
-
-Check out the `examples/` directory for comprehensive examples:
-
-- `agent_builder_usage.py` - Basic agent creation patterns
-- `yaml_agent_example.py` - YAML-based agent configuration
-- `output_formatter.py` - Structured output examples
-- `multi_tool_example.py` - Multi-tool agent examples
-- `document_processing_example.py` - Document processing with PDF and TXT files
+---
-### Documentation
-
-Visit our [website](https://www.rootflo.ai) to know more
+## π€ Contributing
-**Additional Resources:**
+We welcome contributions from the community! Whether it's bug reports, feature requests, or code contributions:
-- [@flo_tool Decorator Guide](TOOLS.md) - Complete guide to the `@flo_tool` decorator
-- [Examples Directory](flo_ai/examples/) - Ready-to-run code examples
-- [Contributing Guide](CONTRIBUTING.md) - How to contribute to Flo AI
+1. Fork the repository
+2. Create a feature branch (`git checkout -b feature/amazing-feature`)
+3. Commit your changes (`git commit -m 'Add amazing feature'`)
+4. Push to the branch (`git push origin feature/amazing-feature`)
+5. Open a Pull Request
-## π Why Flo AI?
+See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.
-### For Developers
+---
-- **Simple Setup**: Get started in minutes with minimal configuration
-- **Flexible**: Use YAML or code-based configuration
-- **Production Ready**: Built-in error handling and retry mechanisms
-- **Multi-LLM**: Switch between providers easily
-### For Teams
+## π Acknowledgments
-- **Maintainable**: YAML-first approach makes configurations versionable
-- **Testable**: Each component can be tested independently
-- **Scalable**: From simple agents to complex multi-tool systems
+Wavefront AI was built with inspiration from leading open-source projects in the AI infrastructure space. Special thanks to our early adopters and community contributors.
-### Use Cases
+---
-- π€ Customer Service Automation
-- π Data Analysis and Processing
-- π Content Generation and Summarization
-- π Research and Information Retrieval
-- π― Task-Specific AI Assistants
-- π§ Email Analysis and Classification
+## β Show Your Support
-## π€ Contributing
+If you find Wavefront AI useful, please consider:
-We love your input! Check out our [Contributing Guide](CONTRIBUTING.md) to get started. Ways to contribute:
+- Starring this repository β
+- Sharing with your network
+- Contributing to the project
+- Providing feedback and feature requests
-- π Report bugs
-- π‘ Propose new features
-- π Improve documentation
-- π§ Submit PRs
+---
-## π License
+**Ready to transform your enterprise AI infrastructure?**
-Flo AI is [MIT Licensed](LICENSE).
+Get in touch for production-grade support and SLA-driven deployments that ensure uptime, stability, and performance at scale.
----
+π§ sales@rootflo.ai
-
+**Join our discord at https://discord.gg/BPXsNwfuRU**
\ No newline at end of file
diff --git a/ROADMAP.md b/ROADMAP.md
index d9bc97b6..5ffbb6d1 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -1,57 +1,409 @@
-# Roadmap
+# Wavefront AI Roadmap
-This file provides an overview of the direction this project is heading. The roadmap is organized in steps that focus on a specific theme, for instance, core features, observability, telemetry, etc.
+This roadmap provides a comprehensive overview of the direction Wavefront AI is heading. It covers all major components of the platform: the Flo AI library, Wavefront Core middleware, Control Panel, CLI, and ecosystem tools.
-## Core features
+The roadmap is organized by component and priority, with clear timelines and status indicators. We welcome community feedback and contributions!
-Core features improve the library itself to cater wider range of functionalities
+---
-| Name | Description | Status | Release version |
-|------|-------------|--------|-----------------|
-|Resume work| Functionality that lets agents resume from where they stopped|Yet to start|0.0.7 |
-|To Yaml| Explore the ability to convert code build agents into Yaml| Yet to start| TBD |
-|Web server| First step towards creating a publishable service to which agents can be saved and re-used| Yet to start| 0.0.5 |
-|Web app| A webapp where agents can be accessed like chat bot/slack| TBD |
-|Model routing| Explore the possibility to use a model router within the agents, instead of specifying every agent models | TBD |
-|Parellel Router| A router to execute tasks or agents in parallel if the tasks are independent | Yet to start | TBD
+## π Table of Contents
-## Observability
+- [Release Timeline](#release-timeline)
+- [Flo AI Library](#flo-ai-library)
+- [Wavefront Core Middleware](#wavefront-core-middleware)
+- [Wavefront Control Panel](#wavefront-control-panel)
+- [Wavefront CLI](#wavefront-cli)
+- [Data & Integration Layer](#data--integration-layer)
+- [Developer Experience](#developer-experience)
+- [Enterprise Features](#enterprise-features)
+- [Observability & Monitoring](#observability--monitoring)
-These features improve logging and debugging abilities while building.
+---
-| Name | Description | Status | Release version |
-|------|-------------|--------|-----------------|
-|Recursion control| Expose parameters like recursion control to limit recursions and policy in case of recursion etc | Yet to start | TBD
-| Token count | Expose the total tokens used by an agent execution directly through session| Yet to start | TBD
+## ποΈ Release Timeline
-## Community
+| Quarter | Milestone | Key Deliverables |
+|---------|-----------|------------------|
+| **Nov 2025** | Public README.md | Publish readme and gather community feedback |
+| **Dec 2025** | Community Edition MVP | Open-source community edition with working MVP |
+| **Q1 2026** | Enterprise Edition | Advanced RBAC, additional data source integrations |
+| **Q1 2026** | Wavefront Cloud | One-click deployable Wavefront Cloud |
-This is the section where the community can contribute to the roadmap. The items added here will prioritized based on our plans from the rootflo side, but community members are welcome to pick up these features.
+---
-| Name | Description | Status |
-|------|-------------|--------|
+## π€ Flo AI Library
+The core agent building and orchestration framework.
-## Notes
-The roadmap items are estimates and might change based on rootflo priorities. We will keep this file updated if plans change.
+### Core Features
-The community is welcome to suggest changes to the roadmap, through a pull request, by adding features to the community contributions.
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Resume Work** | Functionality that lets agents resume from where they stopped, with state persistence | High | Yet to start | v1.1.0 |
+| **Code to YAML** | Convert code-built agents into YAML format for version control and sharing | Medium | Yet to start | v1.2.0 |
+| **Model Router** | Intelligent model routing within agents, allowing dynamic LLM selection based on task complexity | High | Yet to start | v1.2.0 |
+| **Parallel Router** | Execute independent tasks or agents in parallel for improved performance | High | Yet to start | TBD |
+| **Agent Versioning** | Version control for agent configurations and workflows | Medium | Yet to start | TBD |
+| **Agent Templates** | Pre-built agent templates for common use cases (customer support, data analysis, etc.) | Medium | Yet to start | TBD |
+| **Streaming Responses** | Real-time streaming of agent responses for better UX | High | Yet to start | In-Progress |
+| **Multi-modal Support** | Support for image, audio, and video inputs/outputs | Medium | Yet to start | In-Progress |
+| **Custom Memory Backends** | Support for Redis, PostgreSQL, and other backends for agent memory | Medium | Yet to start | TBD |
-## Released
+### Observability & Debugging
-| Name | Description | Status | Version|
-|------|-------------|--------|--------|
-| Full composability | Right now teams can only be combined with teams and agents with agents. We want to extend this to team + agent composibility | β
| 0.0.4 |
-| Error handling | Ability to handle errors autonomously | β
| 0.0.4|
-|LLM Extensibilty| Ability to different LLMs across different agents and teams| β
| 0.0.4|
-|Async Tools| Ability create tools easily within asyncio | β
| 0.0.4|
-|Observer| Observer framework for raising agent decision events and other important events | β
| 0.0.4|
-|Set up tests| Create a framework for unit-testing flo-ai and its internal functionalities| β
| 0.0.4 |
-|Linear Router|A router lets you build agents or teams that execute linearly or sequentially. The current router supervisor works in a hierarchical way where all the children report to one parent| β
| 0.0.3|
-|Reflection| Reflection lets you build a component that can make the AI retrospectively look at the current output and retry or work again on the task at hand| β
| 0.0.3|
-|Delegator| Delegator lets you build a component that can help delegate a flo to a particular agent, by some condition| β
| 0.0.3|
-|Logging Framework|Better logging framework which can be extended to parent application (with log level control)| β
|0.0.3|
-|Output formatter| Ability to templatize output format using pydantic| β
| 0.0.5 |
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Recursion Control** | Expose parameters to limit recursions and define policies for recursion handling | High | Yet to start | v1.2.0 |
+| **Token Count Tracking** | Expose total tokens used by agent execution directly through session | High | β
Available | v0.1.0 |
+| **Execution Time Metrics** | Detailed timing metrics for each agent and tool execution | Medium | β
Available | v0.1.0 |
+| **Debug Mode** | Enhanced debugging mode with step-by-step execution logs | Medium | Yet to start | TBD |
+| **Performance Profiling** | Identify bottlenecks in agent workflows | Medium | Yet to start | TBD |
+### Advanced Orchestration
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Conditional Workflows** | Advanced conditional logic in YAML workflows | Medium | β
Available | v0.1.0 |
+| **Loop & Iteration** | Support for loops and iterations in workflows | Medium | β
Available | v0.1.0 |
+| **Error Recovery Strategies** | Configurable error recovery strategies per agent | High | β
Available | v0.1.0 |
+| **Workflow Scheduling** | Schedule workflows to run at specific times or intervals | Low | β
Available | TBD |
+---
+
+## ποΈ Wavefront Core Middleware
+
+The core middleware service that provides APIs, authentication, authorization, and data connectivity.
+
+### Core Services
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **REST API** | Comprehensive REST API for agent management, workflow execution, and data access | High | β
Available | v0.1.0 |
+| **WebSocket Support** | Real-time communication for streaming agent responses | High | β
Available | v0.1.0 |
+| **Agent Registry** | Centralized registry for storing and managing agent definitions | High | β
Available | v0.1.0 |
+| **Workflow Engine** | Server-side workflow execution engine | High | β
Available | v0.1.0 |
+| **API Gateway** | Unified API gateway with rate limiting and request routing | Medium | β
Available | v0.1.0 |
+
+### Authentication & Authorization
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Google Auth Integration** | OAuth 2.0 integration with Google | High | β
Available | v0.1.0 |
+| **Microsoft AD/Entra** | Enterprise SSO with Microsoft Active Directory | High | β
Available | v0.1.0 |
+| **Okta Integration** | SSO integration with Okta | High | Yet to start | v0.2.0 |
+| **SAML 2.0 Support** | Standard SAML 2.0 authentication | High | Yet to start | v0.2.0 |
+| **LDAP Integration** | LDAP/Active Directory integration | Medium | Yet to start | v0.2.0 |
+| **Auth0 Integration** | Auth0 SSO support | Medium | Yet to start | v0.2.0 |
+| **Multi-Factor Authentication** | MFA support for enhanced security | Medium | Yet to start | v0.3.0 |
+| **API Key Management** | Secure API key generation and rotation | High | β
Available | v0.1.0 |
+| **OAuth 2.0 Client Credentials** | OAuth 2.0 client credentials flow for service-to-service auth | Medium | Yet to start | v0.2.0 |
+
+### RBAC & Permissions
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Agent-Level RBAC** | Fine-grained permissions for agent access and execution | High | Yet to start | v0.1.0 |
+| **Data Source RBAC** | Granular permissions for data source access | High | Yet to start | v0.1.0 |
+| **Role Management** | Create, update, and manage custom roles | High | β
Available | v0.1.0 |
+| **Permission Inheritance** | Hierarchical permission inheritance | Medium | Yet to start | v0.2.0 |
+| **Attribute-Based Access Control (ABAC)** | Advanced ABAC policies | Low | Yet to start | v0.3.0 |
+| **Audit Logging for Access** | Comprehensive audit logs for all access attempts | High | Yet to start | v0.1.0 |
+
+---
+
+## ποΈ Wavefront Control Panel
+
+Unified frontend for configuring agents, workflows, AI models, guardrails, and RBAC.
+
+### Core Features
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Agent Management UI** | YAML interface for creating, editing, and managing agents | High | β
Available | v0.1.0 |
+| **Workflow Designer** | YAML workflow builder integrated into control panel | High | β
Available | v0.1.0 |
+| **Data Source Configuration** | UI for configuring and managing data source connections | High | β
Available | v0.1.0 |
+| **LLM Provider Management** | Configure and manage LLM provider credentials and settings | High | β
Available | v0.1.0 |
+| **RBAC Configuration** | Visual interface for managing roles and permissions | High | Yet to start | v0.2.0 |
+| **Guardrail Configuration** | Configure AI guardrails and safety policies | High | Yet to start | v0.2.0 |
+| **User Management** | Manage users, groups, and their access | High | Yet to start | v0.2.0 |
+| **Dashboard & Analytics** | Overview dashboard with key metrics and analytics | Medium | Yet to start | TBD |
+| **Agent Testing Interface** | Built-in interface for testing agents before deployment | Medium | Yet to start | TBD |
+| **Workflow Monitoring** | Real-time monitoring of workflow executions | High | Yet to start | v0.1.0 |
+
+### Advanced Features
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **No-Code Agent Builder** | Visual, no-code interface for building agents | High | Yet to start | v0.3.0 |
+| **Template Marketplace** | Browse and use pre-built agent and workflow templates | Medium | Yet to start | v0.3.0 |
+| **Version Control UI** | Visual interface for agent versioning and rollback | Medium | Yet to start | v0.2.0 |
+| **Cost Analytics Dashboard** | Detailed cost tracking and analytics per agent/workflow | High | Yet to start | v0.2.0 |
+| **Performance Analytics** | Performance metrics and optimization recommendations | Medium | Yet to start | v0.3.0 |
+| **Collaboration Features** | Share agents/workflows, comments, and team collaboration | Low | Yet to start | v0.3.0 |
+
+---
+
+## π» Wavefront CLI
+
+Command-line interface for configuring and managing Wavefront AI.
+
+### Core Features
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Agent Management** | Create, update, delete, and list agents via CLI | High | Yet to start | v0.4.0 |
+| **Workflow Management** | Manage workflows from command line | High | Yet to start | v0.4.0 |
+| **Data Source Configuration** | Configure data sources via CLI | High | Yet to start | v0.4.0 |
+| **Authentication** | CLI authentication and session management | High | Yet to start | v0.4.0 |
+| **YAML Import/Export** | Import and export agent/workflow configurations | High | Yet to start | v0.4.0 |
+| **Local Development** | Local development server and testing tools | Medium | Yet to start | v0.4.0 |
+| **Deployment** | Deploy agents and workflows to Wavefront Cloud | Medium | Yet to start | v0.4.0 |
+| **Configuration Management** | Manage multiple environments (dev, staging, prod) | Medium | Yet to start | v0.4.0 |
+| **Bulk Operations** | Bulk import/export, update, and delete operations | Low | Yet to start | v0.4.0 |
+
+---
+
+## π Data & Integration Layer
+
+### Data Adapters
+
+| Adapter | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **BigQuery** | Full read/write support for Google BigQuery | High | β
Available | v0.1.0 |
+| **Amazon Redshift** | Production-ready Redshift integration | High | β
Available | v0.1.0 |
+| **PostgreSQL** | Optimized PostgreSQL adapter for large datasets | High | π In Progress | v0.1.0 |
+| **MySQL** | MySQL 5.7+ compatible adapter | Medium | Yet to start | TBD |
+| **MongoDB** | NoSQL database adapter for MongoDB | Medium | Yet to start | TBD |
+| **SQL Server** | Microsoft SQL Server adapter | Medium | Yet to start | TBD |
+| **Snowflake** | Snowflake data warehouse integration | High | Yet to start | TBD |
+| **Databricks** | Databricks Lakehouse integration | Medium | Yet to start | TBD |
+| **Elasticsearch** | Elasticsearch integration for search and analytics | Medium | Yet to start | TBD |
+| **Redis** | Redis adapter for caching and real-time data | Low | Yet to start | TBD |
+
+### Cloud Storage
+
+| Adapter | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **AWS S3** | S3 integration for file storage and retrieval | High | Yet to start | v0.2.0 |
+| **Google Cloud Storage** | GCS integration for file operations | High | Yet to start | v0.2.0 |
+| **Azure Blob Storage** | Azure Blob Storage integration | Medium | Yet to start | v0.2.0 |
+| **HDFS** | Hadoop Distributed File System support | Low | Yet to start | v0.3.0 |
+
+### API Adapters
+
+| Adapter | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Custom API Configuration** | Flexible HTTP endpoint support with custom authentication | High | π In Progress | v0.1.0 |
+| **Salesforce** | Native Salesforce API integration | High | π In Progress | v0.1.0 |
+| **SAP** | SAP ERP system integration | Medium | Yet to start | v0.2.0 |
+| **ServiceNow** | ServiceNow API integration | Medium | Yet to start | v0.2.0 |
+| **Jira** | Jira API integration for project management | Low | Yet to start | v0.3.0 |
+| **Slack** | Slack API integration for notifications and workflows | Medium | Yet to start | v0.2.0 |
+| **Microsoft 365** | Microsoft 365 API integration | Medium | Yet to start | v0.2.0 |
+| **GitHub/GitLab** | Version control system integrations | Low | Yet to start | v0.3.0 |
+
+### LLM Connectors
+
+| Model/Service | Description | Priority | Status | Target Release |
+|---------------|-------------|----------|--------|----------------|
+| **OpenAI** | GPT-3.5, GPT-4, GPT-4 Turbo support | High | β
Available | v1.0.0 |
+| **Anthropic** | Claude models (Sonnet, Opus, Haiku) | High | β
Available | v1.0.0 |
+| **vLLM (Open-Source)** | Self-hosted inference with vLLM | High | β
Available | v1.0.0 |
+| **Ollama** | Local model deployment with Ollama | High | β
Available | v1.0.0 |
+| **Google Vertex AI** | Google Cloud Vertex AI integration | High | β
Available | v1.0.0 |
+| **Google Gemini** | Direct Gemini API integration | High | β
Available | v1.0.0 |
+| **GroqAI** | Fast inference support with Groq | Medium | π In Progress | v1.1.0 |
+| **AWS Bedrock** | AWS Bedrock integration | High | π In Progress | v1.1.0 |
+| **Azure OpenAI** | Azure OpenAI Service integration | Medium | Yet to start | v1.2.0 |
+| **Cohere** | Cohere model integration | Medium | Yet to start | v1.2.0 |
+| **Mistral AI** | Mistral AI model support | Medium | Yet to start | v1.2.0 |
+| **Together AI** | Together AI inference platform | Low | Yet to start | v1.3.0 |
+| **Custom Model Endpoints** | Support for custom model endpoints | Medium | Yet to start | v1.2.0 |
+
+---
+
+## π¨ Developer Experience
+
+### Flo AI Studio Enhancements
+
+### Developer Tools
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **JavaScript/TypeScript SDK** | Frontend SDK for React and other frameworks | High | β
Available | v1.0.0 |
+| **API Documentation** | Interactive API documentation (Swagger/OpenAPI) | High | Yet to start | v0.1.0 |
+| **SDK Examples** | Comprehensive examples for all SDKs | Medium | Yet to start | v1.1.0 |
+
+---
+
+## π’ Enterprise Features
+
+### AI Guardrails & Safety
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Content Moderation** | Automatic content filtering and moderation | High | Yet to start | v0.2.0 |
+| **Toxicity Detection** | Detect and prevent toxic or harmful outputs | High | Yet to start | v0.2.0 |
+| **PII Detection** | Detect and redact personally identifiable information | High | Yet to start | v0.2.0 |
+| **Custom Guardrails** | Define custom guardrail rules and policies | High | Yet to start | v0.2.0 |
+| **Guardrail Monitoring** | Monitor guardrail violations and alerts | Medium | Yet to start | v0.3.0 |
+| **Compliance Reporting** | Generate compliance reports for audits | Medium | Yet to start | v0.3.0 |
+
+### Knowledge Bases & RAG
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **MCP Connectors** | Model Context Protocol connectors | High | Yet to start | v0.1.0 |
+| **Vector Database Integration** | Support for PostgresSQL, etc. | High | β
Available | v0.2.0 |
+| **Document Ingestion** | Automated document ingestion and processing | High | β
Available| v0.2.0 |
+| **RAG Pipeline** | Built-in RAG pipeline configuration | High | β
Available | v0.2.0 |
+| **Knowledge Base Management** | UI for managing knowledge bases | Medium | β
Available | v0.3.0 |
+
+### Voice & Conversational AI
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Voice-to-Voice Bots** | Voice-enabled conversational agents | Medium | β
Available | v0.1.0 |
+| **ASR Integration** | Automatic Speech Recognition integration | Medium | β
Available | v0.1.0 |
+| **TTS Integration** | Text-to-Speech integration | Medium | β
Available | v0.1.0 |
+| **Contact Center Integration** | Integration with contact center platforms | Low | β
Available | v0.1.0 |
+
+---
+
+## π Observability & Monitoring
+
+### Telemetry & Metrics
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **OpenTelemetry Integration** | Full OpenTelemetry support | High | β
Available | v1.0.0 |
+| **Prometheus Metrics** | Prometheus-compatible metrics | High | β
Available | v1.0.0 |
+| **Grafana Dashboards** | Pre-built Grafana dashboards | High | Yet to start | v0.1.0 |
+| **Application Metrics** | Application-level performance metrics | High | β
Available | v1.0.0 |
+| **AI Token Tracking** | Token usage tracking per agent | High | β
Available | v1.0.0 |
+
+### Logging & Audit
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Structured Logging** | Structured logging with JSON output | High | β
Available | v1.0.0 |
+| **AI Audit Logging** | Detailed decision trails for AI agents | High | π In Progress | v0.1.0 |
+| **Access Audit Logs** | Comprehensive access and permission audit logs | High | Yet to start | v0.1.0 |
+
+### Monitoring & Alerts
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Real-time Monitoring** | Real-time monitoring of agent executions | High | Yet to start | v0.1.0 |
+| **Alert System** | Configurable alerts for errors, performance, and costs | High | Yet to start | v0.2.0 |
+| **Health Checks** | Health check endpoints for all services | High | Yet to start | v0.1.0 |
+| **Performance Monitoring** | Detailed performance monitoring and profiling | Medium | Yet to start | v0.2.0 |
+| **SLA Monitoring** | Service level agreement monitoring | Low | Yet to start | v0.3.0 |
+
+---
+
+## π Community & Ecosystem
+
+### Documentation
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Getting Started Guide** | Comprehensive getting started documentation | High | π In Progress | v0.1.0 |
+| **API Documentation** | Complete API reference documentation | High | Yet to start | v0.1.0 |
+| **Tutorials** | Step-by-step tutorials for common use cases | High | Yet to start | v0.1.0 |
+| **Architecture Documentation** | Detailed architecture and design documentation | Medium | Yet to start | v0.2.0 |
+| **Best Practices Guide** | Best practices for building production agents | Medium | Yet to start | v0.2.0 |
+| **Video Tutorials** | Video tutorials and demos | Low | Yet to start | v0.3.0 |
+
+### Examples & Templates
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Example Gallery** | Comprehensive collection of example agents and workflows | High | π In Progress | v0.1.0 |
+| **Use Case Templates** | Pre-built templates for common use cases | High | Yet to start | v0.2.0 |
+| **Integration Examples** | Examples for integrating with popular services | Medium | Yet to start | v0.2.0 |
+| **Community Templates** | Platform for sharing community-created templates | Low | Yet to start | v0.3.0 |
+
+### Community Features
+
+| Feature | Description | Priority | Status | Target Release |
+|---------|-------------|----------|--------|----------------|
+| **Community Forum** | Discussion forum for community support | Medium | Yet to start | v0.2.0 |
+| **Template Marketplace** | Marketplace for sharing and discovering templates | Low | Yet to start | v0.3.0 |
+| **Contributor Guide** | Comprehensive guide for contributors | High | π In Progress | v0.1.0 |
+| **Community Showcase** | Showcase of community-built solutions | Low | Yet to start | v0.3.0 |
+
+---
+
+## β
Released Features
+
+### Flo AI Library
+
+| Feature | Description | Status | Version |
+|---------|-------------|--------|---------|
+| **Full Composability** | Teams can be combined with teams and agents with agents. Extended to team + agent composability | β
| v0.0.4 |
+| **Error Handling** | Ability to handle errors autonomously | β
| v0.0.4 |
+| **LLM Extensibility** | Ability to use different LLMs across different agents and teams | β
| v0.0.4 |
+| **Async Tools** | Ability to create tools easily within asyncio | β
| v0.0.4 |
+| **Observer Framework** | Observer framework for raising agent decision events and other important events | β
| v0.0.4 |
+| **Test Framework** | Framework for unit-testing flo-ai and its internal functionalities | β
| v0.0.4 |
+| **Linear Router** | Router that lets you build agents or teams that execute linearly or sequentially | β
| v0.0.3 |
+| **Reflection Router** | Component that can make the AI retrospectively look at the current output and retry or work again on the task | β
| v0.0.3 |
+| **Delegator Router** | Component that can help delegate a flo to a particular agent, by some condition | β
| v0.0.3 |
+| **Logging Framework** | Better logging framework which can be extended to parent application (with log level control) | β
| v0.0.3 |
+| **Output Formatter** | Ability to templatize output format using Pydantic | β
| v0.0.5 |
+| **YAML-Based Agents** | Define agents and workflows using YAML configuration | β
| v1.0.0 |
+| **LLM-Powered Routers** | Intelligent routing using Large Language Models | β
| v1.0.0 |
+| **Plan-Execute Router** | Cursor-style plan-and-execute workflows | β
| v1.0.0 |
+| **Document Processing** | Process PDF and TXT documents with AI agents | β
| v1.0.0 |
+| **Variables System** | Dynamic variable resolution in agent prompts | β
| v1.0.0 |
+| **Agent Builder Pattern** | Fluent interface for building agents | β
| v1.0.0 |
+| **Arium Workflow Engine** | Multi-agent workflow orchestration engine | β
| v1.0.0 |
+| **OpenTelemetry Integration** | Built-in observability with automatic instrumentation | β
| v1.0.0 |
+| **Flo AI Studio** | Visual workflow designer with React-based UI | β
| v1.0.0 |
+
+### Platform Components
+
+| Feature | Description | Status | Version |
+|---------|-------------|--------|---------|
+| **Frontend SDK** | React component library for building AI applications | β
| v1.0.0 |
+| **Low Code YAML Builder** | YAML-based agent and workflow builder | β
| v1.0.0 |
+
+---
+
+## π Notes
+
+- **Status Legend**:
+ - β
Available - Feature is implemented and available
+ - π In Progress - Feature is currently being developed
+ - Yet to start - Feature is planned but not yet started
+ - π Roadmap - Feature is on the roadmap with lower priority
+
+- **Priority Levels**:
+ - **High**: Critical for core functionality or major milestones
+ - **Medium**: Important but not blocking
+ - **Low**: Nice to have, can be deferred
+
+- **Version Numbers**: Version numbers are estimates and subject to change based on priorities and community feedback.
+
+- **Community Contributions**: The community is welcome to suggest changes to the roadmap through pull requests. Community-suggested features will be evaluated and prioritized based on alignment with project goals.
+
+- **Timeline Estimates**: All timelines are estimates and may change based on rootflo priorities, community feedback, and resource availability.
+
+---
+
+## π€ Contributing to the Roadmap
+
+We welcome community input on the roadmap! Here's how you can contribute:
+
+1. **Suggest New Features**: Open an issue or pull request to suggest new features
+2. **Prioritize Features**: Comment on existing roadmap items to indicate what's most important to you
+3. **Contribute Code**: Pick up any "Yet to start" item and submit a PR
+4. **Provide Feedback**: Share your thoughts on the roadmap direction
+
+See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed contribution guidelines.
+
+---
+
+**Last Updated**: November 2025
+**Next Review**: December 2025
diff --git a/documentation/index.mdx b/documentation/index.mdx
index 06d7dee4..9b1c8c2b 100644
--- a/documentation/index.mdx
+++ b/documentation/index.mdx
@@ -3,7 +3,9 @@ title: "Flo AI Documentation"
description: "Build production-ready AI agents with structured outputs, tool integration, and multi-LLM support"
---
-## Welcome to Flo AI π
+Wavefront documentation will be updated soon, along with code release
+
+## Welcome to Flo AI (Wavefront coming soon) π
Flo AI is a Python framework that makes building production-ready AI agents and teams as easy as writing YAML. Think "Kubernetes for AI Agents" - compose complex AI architectures using pre-built components while maintaining the flexibility to create your own.
diff --git a/flo_ai/README.md b/flo_ai/README.md
index f28f4ce1..486cd064 100644
--- a/flo_ai/README.md
+++ b/flo_ai/README.md
@@ -1,7 +1,3 @@
-
-
-
-
Flo AI π
@@ -601,4 +597,4 @@ Flo AI is [MIT Licensed](LICENSE).
Built with β€οΈ by the rootflo team
Community β’
Documentation
-
+
\ No newline at end of file
diff --git a/flo_ai_tools/README.md b/flo_ai_tools/README.md
deleted file mode 100644
index 58ecd25b..00000000
--- a/flo_ai_tools/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# tools
\ No newline at end of file
diff --git a/flo_ai_tools/flo_ai_tools/__init__.py b/flo_ai_tools/flo_ai_tools/__init__.py
deleted file mode 100644
index dcc873ae..00000000
--- a/flo_ai_tools/flo_ai_tools/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-from flo_ai_tools.redshift_tool import (
- RedshiftConnector as RedshiftConnector,
- RedshiftConfig as RedshiftConfig,
-)
diff --git a/flo_ai_tools/flo_ai_tools/redshift_tool.py b/flo_ai_tools/flo_ai_tools/redshift_tool.py
deleted file mode 100644
index 1927ecff..00000000
--- a/flo_ai_tools/flo_ai_tools/redshift_tool.py
+++ /dev/null
@@ -1,154 +0,0 @@
-import time
-import logging
-from dataclasses import dataclass
-from functools import wraps
-from contextlib import contextmanager
-import redshift_connector
-
-logger = logging.getLogger('RedshiftToolLogger')
-logger.setLevel(logging.INFO)
-
-
-@dataclass
-class RedshiftConfig:
- username: str
- password: str
- host: str
- port: str
- db_name: str
- read_only: bool = False
-
-
-def retry_on_connection_error(max_retries=3, delay=1, timeout=30):
- def decorator(func):
- @wraps(func)
- def wrapper(self: 'RedshiftConnector', *args, **kwargs):
- retries = 0
- last_exception = None
-
- while retries < max_retries:
- try:
- kwargs.pop('connection', None)
- with self.get_connection(timeout) as conn:
- return func(self, *args, **kwargs, connection=conn)
- except (
- redshift_connector.Error,
- redshift_connector.OperationalError,
- ) as e:
- last_exception = e
- retries += 1
- logger.warning(
- f'Database connection error: {str(e)}. '
- f'Attempt {retries} of {max_retries}'
- )
-
- if retries == max_retries:
- logger.error(
- f'Max retries reached. Last error: {str(last_exception)}'
- )
- raise last_exception
-
- time.sleep(delay * retries) # Exponential backoff
- return None
-
- return wrapper
-
- return decorator
-
-
-class RedshiftConnector:
- def __init__(self, redshift_config: RedshiftConfig):
- self.config = redshift_config
-
- @contextmanager
- def get_connection(self, timeout=300):
- connection = None
- try:
- connection: redshift_connector.Connection = redshift_connector.connect(
- host=self.config.host,
- port=int(self.config.port),
- database=self.config.db_name,
- user=self.config.username,
- password=self.config.password,
- timeout=timeout,
- ssl=True,
- tcp_keepalive=True,
- )
- redshift_connector.paramstyle = 'named'
-
- if self.config.read_only:
- logger.debug('Making read only connection to redshfit')
- cursor = connection.cursor()
- cursor.execute('SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY')
- cursor.close()
-
- yield connection
- except Exception as e:
- logger.error(f'Connection error: {str(e)}')
- raise e
- finally:
- self.__close_connection(connection=connection)
-
- def __close_connection(self, connection: redshift_connector.Connection):
- try:
- if connection:
- connection.close()
- except Exception as e:
- logger.error(f'Connection closing error: {str(e)}')
- raise e
-
- @retry_on_connection_error()
- def execute_query(
- self,
- query: str,
- parameters: dict = None,
- connection: redshift_connector.Connection = None,
- ):
- try:
- if self.config.read_only:
- query_upper = query.strip().upper()
- write_operations = (
- 'INSERT',
- 'UPDATE',
- 'DELETE',
- 'CREATE',
- 'DROP',
- 'ALTER',
- 'TRUNCATE',
- )
- if any(query_upper.startswith(op) for op in write_operations):
- raise ValueError(
- 'Write operations are not allowed in read-only mode'
- )
-
- logger.debug(f'Executing query: {query}')
- logger.debug(f'Parameters: {parameters}')
-
- cursor = connection.cursor()
-
- redshift_connector.paramstyle = 'named'
- if parameters:
- cursor.execute(query, parameters)
- else:
- cursor.execute(query)
-
- if query.strip().upper().startswith('INSERT'):
- logger.info(f'Insert completed. Rowcount: {cursor.rowcount}')
- return cursor.rowcount
-
- try:
- results = cursor.fetchall()
- column_names = [desc[0] for desc in cursor.description]
- return results, column_names
- except redshift_connector.ProgrammingError:
- return cursor.rowcount
- finally:
- cursor.close()
-
- except Exception as e:
- logger.error(
- f'Query execution failed: {str(e)}\n'
- f'Query: {query}\n'
- f'Parameters: {parameters}'
- )
- raise e
diff --git a/flo_ai_tools/pyproject.toml b/flo_ai_tools/pyproject.toml
deleted file mode 100644
index 9f2e3a9f..00000000
--- a/flo_ai_tools/pyproject.toml
+++ /dev/null
@@ -1,25 +0,0 @@
-[project]
-name = "flo_ai_tools"
-version = "0.0.1"
-description = "Some good tool implementations for flo-ai"
-authors = [{ name = "rootflo", email = "*@rootflo.ai" }]
-requires-python = ">=3.9,<4.0"
-readme = "README.md"
-license = "MIT"
-dependencies = ["redshift-connector>=2.1.5,<3"]
-
-[dependency-groups]
-dev = [
- "boto3==1.36.1",
- "botocore==1.36.1",
-]
-
-[tool.hatch.build.targets.sdist]
-include = ["flo_ai_tools"]
-
-[tool.hatch.build.targets.wheel]
-include = ["flo_ai_tools"]
-
-[build-system]
-requires = ["hatchling"]
-build-backend = "hatchling.build"
diff --git a/flo_ai_tools/uv.lock b/flo_ai_tools/uv.lock
deleted file mode 100644
index 5cd07ffc..00000000
--- a/flo_ai_tools/uv.lock
+++ /dev/null
@@ -1,461 +0,0 @@
-version = 1
-revision = 2
-requires-python = ">=3.9, <4.0"
-resolution-markers = [
- "python_full_version >= '3.10'",
- "python_full_version < '3.10'",
-]
-
-[[package]]
-name = "asn1crypto"
-version = "1.5.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/de/cf/d547feed25b5244fcb9392e288ff9fdc3280b10260362fc45d37a798a6ee/asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c", size = 121080, upload-time = "2022-03-15T14:46:52.889Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67", size = 105045, upload-time = "2022-03-15T14:46:51.055Z" },
-]
-
-[[package]]
-name = "beautifulsoup4"
-version = "4.14.2"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "soupsieve" },
- { name = "typing-extensions" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/77/e9/df2358efd7659577435e2177bfa69cba6c33216681af51a707193dec162a/beautifulsoup4-4.14.2.tar.gz", hash = "sha256:2a98ab9f944a11acee9cc848508ec28d9228abfd522ef0fad6a02a72e0ded69e", size = 625822, upload-time = "2025-09-29T10:05:42.613Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl", hash = "sha256:5ef6fa3a8cbece8488d66985560f97ed091e22bbc4e9c2338508a9d5de6d4515", size = 106392, upload-time = "2025-09-29T10:05:43.771Z" },
-]
-
-[[package]]
-name = "boto3"
-version = "1.36.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "botocore" },
- { name = "jmespath" },
- { name = "s3transfer" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/bf/04/0c6cea060653eee75f4348152dfc0aa0b241f7d1f99a530079ee44d61e4b/boto3-1.36.1.tar.gz", hash = "sha256:258ab77225a81d3cf3029c9afe9920cd9dec317689dfadec6f6f0a23130bb60a", size = 110959, upload-time = "2025-01-16T20:33:00.196Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/2b/ed/464e1df3901fbfedd5a0786e551240216f0c867440fa6156595178227b3f/boto3-1.36.1-py3-none-any.whl", hash = "sha256:eb21380d73fec6645439c0d802210f72a0cdb3295b02953f246ff53f512faa8f", size = 139163, upload-time = "2025-01-16T20:32:57.462Z" },
-]
-
-[[package]]
-name = "botocore"
-version = "1.36.1"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "jmespath" },
- { name = "python-dateutil" },
- { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
- { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/39/aa/556720b3ee9629b7c4366b5a0d9797a84e83a97f78435904cbb9bdc41939/botocore-1.36.1.tar.gz", hash = "sha256:f789a6f272b5b3d8f8756495019785e33868e5e00dd9662a3ee7959ac939bb12", size = 13498150, upload-time = "2025-01-16T20:32:35.989Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/be/bb/5431f12e2dadd881fd023fb57e7e3ab82f7b697c38dc837fc8d70cca51bd/botocore-1.36.1-py3-none-any.whl", hash = "sha256:dec513b4eb8a847d79bbefdcdd07040ed9d44c20b0001136f0890a03d595705a", size = 13297686, upload-time = "2025-01-16T20:32:31.584Z" },
-]
-
-[[package]]
-name = "certifi"
-version = "2025.10.5"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" },
-]
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.4"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" },
- { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" },
- { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" },
- { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" },
- { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" },
- { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" },
- { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" },
- { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" },
- { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" },
- { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" },
- { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" },
- { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" },
- { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" },
- { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" },
- { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" },
- { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" },
- { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" },
- { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" },
- { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" },
- { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" },
- { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" },
- { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" },
- { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" },
- { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" },
- { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" },
- { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" },
- { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" },
- { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" },
- { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" },
- { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" },
- { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" },
- { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" },
- { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
- { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
- { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
- { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
- { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
- { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
- { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
- { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
- { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
- { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
- { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
- { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
- { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
- { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
- { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
- { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
- { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
- { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
- { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
- { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
- { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
- { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
- { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
- { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
- { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
- { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
- { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
- { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
- { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
- { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
- { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
- { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
- { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
- { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
- { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
- { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
- { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
- { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
- { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
- { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
- { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
- { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
- { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
- { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
- { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
- { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
- { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
- { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
- { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609, upload-time = "2025-10-14T04:42:10.922Z" },
- { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029, upload-time = "2025-10-14T04:42:12.38Z" },
- { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580, upload-time = "2025-10-14T04:42:13.549Z" },
- { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340, upload-time = "2025-10-14T04:42:14.892Z" },
- { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619, upload-time = "2025-10-14T04:42:16.676Z" },
- { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980, upload-time = "2025-10-14T04:42:17.917Z" },
- { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174, upload-time = "2025-10-14T04:42:19.018Z" },
- { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666, upload-time = "2025-10-14T04:42:20.171Z" },
- { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550, upload-time = "2025-10-14T04:42:21.324Z" },
- { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721, upload-time = "2025-10-14T04:42:22.46Z" },
- { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127, upload-time = "2025-10-14T04:42:23.712Z" },
- { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175, upload-time = "2025-10-14T04:42:24.87Z" },
- { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375, upload-time = "2025-10-14T04:42:27.246Z" },
- { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692, upload-time = "2025-10-14T04:42:28.425Z" },
- { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192, upload-time = "2025-10-14T04:42:29.482Z" },
- { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220, upload-time = "2025-10-14T04:42:30.632Z" },
- { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
-]
-
-[[package]]
-name = "flo-ai-tools"
-version = "0.0.1"
-source = { editable = "." }
-dependencies = [
- { name = "redshift-connector" },
-]
-
-[package.dev-dependencies]
-dev = [
- { name = "boto3" },
- { name = "botocore" },
-]
-
-[package.metadata]
-requires-dist = [{ name = "redshift-connector", specifier = ">=2.1.5,<3" }]
-
-[package.metadata.requires-dev]
-dev = [
- { name = "boto3", specifier = "==1.36.1" },
- { name = "botocore", specifier = "==1.36.1" },
-]
-
-[[package]]
-name = "idna"
-version = "3.11"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
-]
-
-[[package]]
-name = "jmespath"
-version = "1.0.1"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" },
-]
-
-[[package]]
-name = "lxml"
-version = "5.4.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/76/3d/14e82fc7c8fb1b7761f7e748fd47e2ec8276d137b6acfe5a4bb73853e08f/lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", size = 3679479, upload-time = "2025-04-23T01:50:29.322Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/f5/1f/a3b6b74a451ceb84b471caa75c934d2430a4d84395d38ef201d539f38cd1/lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c", size = 8076838, upload-time = "2025-04-23T01:44:29.325Z" },
- { url = "https://files.pythonhosted.org/packages/36/af/a567a55b3e47135b4d1f05a1118c24529104c003f95851374b3748139dc1/lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7", size = 4381827, upload-time = "2025-04-23T01:44:33.345Z" },
- { url = "https://files.pythonhosted.org/packages/50/ba/4ee47d24c675932b3eb5b6de77d0f623c2db6dc466e7a1f199792c5e3e3a/lxml-5.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf", size = 5204098, upload-time = "2025-04-23T01:44:35.809Z" },
- { url = "https://files.pythonhosted.org/packages/f2/0f/b4db6dfebfefe3abafe360f42a3d471881687fd449a0b86b70f1f2683438/lxml-5.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28", size = 4930261, upload-time = "2025-04-23T01:44:38.271Z" },
- { url = "https://files.pythonhosted.org/packages/0b/1f/0bb1bae1ce056910f8db81c6aba80fec0e46c98d77c0f59298c70cd362a3/lxml-5.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609", size = 5529621, upload-time = "2025-04-23T01:44:40.921Z" },
- { url = "https://files.pythonhosted.org/packages/21/f5/e7b66a533fc4a1e7fa63dd22a1ab2ec4d10319b909211181e1ab3e539295/lxml-5.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4", size = 4983231, upload-time = "2025-04-23T01:44:43.871Z" },
- { url = "https://files.pythonhosted.org/packages/11/39/a38244b669c2d95a6a101a84d3c85ba921fea827e9e5483e93168bf1ccb2/lxml-5.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7", size = 5084279, upload-time = "2025-04-23T01:44:46.632Z" },
- { url = "https://files.pythonhosted.org/packages/db/64/48cac242347a09a07740d6cee7b7fd4663d5c1abd65f2e3c60420e231b27/lxml-5.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f", size = 4927405, upload-time = "2025-04-23T01:44:49.843Z" },
- { url = "https://files.pythonhosted.org/packages/98/89/97442835fbb01d80b72374f9594fe44f01817d203fa056e9906128a5d896/lxml-5.4.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997", size = 5550169, upload-time = "2025-04-23T01:44:52.791Z" },
- { url = "https://files.pythonhosted.org/packages/f1/97/164ca398ee654eb21f29c6b582685c6c6b9d62d5213abc9b8380278e9c0a/lxml-5.4.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c", size = 5062691, upload-time = "2025-04-23T01:44:56.108Z" },
- { url = "https://files.pythonhosted.org/packages/d0/bc/712b96823d7feb53482d2e4f59c090fb18ec7b0d0b476f353b3085893cda/lxml-5.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b", size = 5133503, upload-time = "2025-04-23T01:44:59.222Z" },
- { url = "https://files.pythonhosted.org/packages/d4/55/a62a39e8f9da2a8b6002603475e3c57c870cd9c95fd4b94d4d9ac9036055/lxml-5.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b", size = 4999346, upload-time = "2025-04-23T01:45:02.088Z" },
- { url = "https://files.pythonhosted.org/packages/ea/47/a393728ae001b92bb1a9e095e570bf71ec7f7fbae7688a4792222e56e5b9/lxml-5.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563", size = 5627139, upload-time = "2025-04-23T01:45:04.582Z" },
- { url = "https://files.pythonhosted.org/packages/5e/5f/9dcaaad037c3e642a7ea64b479aa082968de46dd67a8293c541742b6c9db/lxml-5.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5", size = 5465609, upload-time = "2025-04-23T01:45:07.649Z" },
- { url = "https://files.pythonhosted.org/packages/a7/0a/ebcae89edf27e61c45023005171d0ba95cb414ee41c045ae4caf1b8487fd/lxml-5.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776", size = 5192285, upload-time = "2025-04-23T01:45:10.456Z" },
- { url = "https://files.pythonhosted.org/packages/42/ad/cc8140ca99add7d85c92db8b2354638ed6d5cc0e917b21d36039cb15a238/lxml-5.4.0-cp310-cp310-win32.whl", hash = "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7", size = 3477507, upload-time = "2025-04-23T01:45:12.474Z" },
- { url = "https://files.pythonhosted.org/packages/e9/39/597ce090da1097d2aabd2f9ef42187a6c9c8546d67c419ce61b88b336c85/lxml-5.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250", size = 3805104, upload-time = "2025-04-23T01:45:15.104Z" },
- { url = "https://files.pythonhosted.org/packages/81/2d/67693cc8a605a12e5975380d7ff83020dcc759351b5a066e1cced04f797b/lxml-5.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9", size = 8083240, upload-time = "2025-04-23T01:45:18.566Z" },
- { url = "https://files.pythonhosted.org/packages/73/53/b5a05ab300a808b72e848efd152fe9c022c0181b0a70b8bca1199f1bed26/lxml-5.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7", size = 4387685, upload-time = "2025-04-23T01:45:21.387Z" },
- { url = "https://files.pythonhosted.org/packages/d8/cb/1a3879c5f512bdcd32995c301886fe082b2edd83c87d41b6d42d89b4ea4d/lxml-5.4.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa", size = 4991164, upload-time = "2025-04-23T01:45:23.849Z" },
- { url = "https://files.pythonhosted.org/packages/f9/94/bbc66e42559f9d04857071e3b3d0c9abd88579367fd2588a4042f641f57e/lxml-5.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df", size = 4746206, upload-time = "2025-04-23T01:45:26.361Z" },
- { url = "https://files.pythonhosted.org/packages/66/95/34b0679bee435da2d7cae895731700e519a8dfcab499c21662ebe671603e/lxml-5.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e", size = 5342144, upload-time = "2025-04-23T01:45:28.939Z" },
- { url = "https://files.pythonhosted.org/packages/e0/5d/abfcc6ab2fa0be72b2ba938abdae1f7cad4c632f8d552683ea295d55adfb/lxml-5.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44", size = 4825124, upload-time = "2025-04-23T01:45:31.361Z" },
- { url = "https://files.pythonhosted.org/packages/5a/78/6bd33186c8863b36e084f294fc0a5e5eefe77af95f0663ef33809cc1c8aa/lxml-5.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba", size = 4876520, upload-time = "2025-04-23T01:45:34.191Z" },
- { url = "https://files.pythonhosted.org/packages/3b/74/4d7ad4839bd0fc64e3d12da74fc9a193febb0fae0ba6ebd5149d4c23176a/lxml-5.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba", size = 4765016, upload-time = "2025-04-23T01:45:36.7Z" },
- { url = "https://files.pythonhosted.org/packages/24/0d/0a98ed1f2471911dadfc541003ac6dd6879fc87b15e1143743ca20f3e973/lxml-5.4.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c", size = 5362884, upload-time = "2025-04-23T01:45:39.291Z" },
- { url = "https://files.pythonhosted.org/packages/48/de/d4f7e4c39740a6610f0f6959052b547478107967362e8424e1163ec37ae8/lxml-5.4.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8", size = 4902690, upload-time = "2025-04-23T01:45:42.386Z" },
- { url = "https://files.pythonhosted.org/packages/07/8c/61763abd242af84f355ca4ef1ee096d3c1b7514819564cce70fd18c22e9a/lxml-5.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86", size = 4944418, upload-time = "2025-04-23T01:45:46.051Z" },
- { url = "https://files.pythonhosted.org/packages/f9/c5/6d7e3b63e7e282619193961a570c0a4c8a57fe820f07ca3fe2f6bd86608a/lxml-5.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056", size = 4827092, upload-time = "2025-04-23T01:45:48.943Z" },
- { url = "https://files.pythonhosted.org/packages/71/4a/e60a306df54680b103348545706a98a7514a42c8b4fbfdcaa608567bb065/lxml-5.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7", size = 5418231, upload-time = "2025-04-23T01:45:51.481Z" },
- { url = "https://files.pythonhosted.org/packages/27/f2/9754aacd6016c930875854f08ac4b192a47fe19565f776a64004aa167521/lxml-5.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd", size = 5261798, upload-time = "2025-04-23T01:45:54.146Z" },
- { url = "https://files.pythonhosted.org/packages/38/a2/0c49ec6941428b1bd4f280650d7b11a0f91ace9db7de32eb7aa23bcb39ff/lxml-5.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751", size = 4988195, upload-time = "2025-04-23T01:45:56.685Z" },
- { url = "https://files.pythonhosted.org/packages/7a/75/87a3963a08eafc46a86c1131c6e28a4de103ba30b5ae903114177352a3d7/lxml-5.4.0-cp311-cp311-win32.whl", hash = "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4", size = 3474243, upload-time = "2025-04-23T01:45:58.863Z" },
- { url = "https://files.pythonhosted.org/packages/fa/f9/1f0964c4f6c2be861c50db380c554fb8befbea98c6404744ce243a3c87ef/lxml-5.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539", size = 3815197, upload-time = "2025-04-23T01:46:01.096Z" },
- { url = "https://files.pythonhosted.org/packages/f8/4c/d101ace719ca6a4ec043eb516fcfcb1b396a9fccc4fcd9ef593df34ba0d5/lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4", size = 8127392, upload-time = "2025-04-23T01:46:04.09Z" },
- { url = "https://files.pythonhosted.org/packages/11/84/beddae0cec4dd9ddf46abf156f0af451c13019a0fa25d7445b655ba5ccb7/lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d", size = 4415103, upload-time = "2025-04-23T01:46:07.227Z" },
- { url = "https://files.pythonhosted.org/packages/d0/25/d0d93a4e763f0462cccd2b8a665bf1e4343dd788c76dcfefa289d46a38a9/lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779", size = 5024224, upload-time = "2025-04-23T01:46:10.237Z" },
- { url = "https://files.pythonhosted.org/packages/31/ce/1df18fb8f7946e7f3388af378b1f34fcf253b94b9feedb2cec5969da8012/lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e", size = 4769913, upload-time = "2025-04-23T01:46:12.757Z" },
- { url = "https://files.pythonhosted.org/packages/4e/62/f4a6c60ae7c40d43657f552f3045df05118636be1165b906d3423790447f/lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9", size = 5290441, upload-time = "2025-04-23T01:46:16.037Z" },
- { url = "https://files.pythonhosted.org/packages/9e/aa/04f00009e1e3a77838c7fc948f161b5d2d5de1136b2b81c712a263829ea4/lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5", size = 4820165, upload-time = "2025-04-23T01:46:19.137Z" },
- { url = "https://files.pythonhosted.org/packages/c9/1f/e0b2f61fa2404bf0f1fdf1898377e5bd1b74cc9b2cf2c6ba8509b8f27990/lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5", size = 4932580, upload-time = "2025-04-23T01:46:21.963Z" },
- { url = "https://files.pythonhosted.org/packages/24/a2/8263f351b4ffe0ed3e32ea7b7830f845c795349034f912f490180d88a877/lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4", size = 4759493, upload-time = "2025-04-23T01:46:24.316Z" },
- { url = "https://files.pythonhosted.org/packages/05/00/41db052f279995c0e35c79d0f0fc9f8122d5b5e9630139c592a0b58c71b4/lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e", size = 5324679, upload-time = "2025-04-23T01:46:27.097Z" },
- { url = "https://files.pythonhosted.org/packages/1d/be/ee99e6314cdef4587617d3b3b745f9356d9b7dd12a9663c5f3b5734b64ba/lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7", size = 4890691, upload-time = "2025-04-23T01:46:30.009Z" },
- { url = "https://files.pythonhosted.org/packages/ad/36/239820114bf1d71f38f12208b9c58dec033cbcf80101cde006b9bde5cffd/lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079", size = 4955075, upload-time = "2025-04-23T01:46:32.33Z" },
- { url = "https://files.pythonhosted.org/packages/d4/e1/1b795cc0b174efc9e13dbd078a9ff79a58728a033142bc6d70a1ee8fc34d/lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20", size = 4838680, upload-time = "2025-04-23T01:46:34.852Z" },
- { url = "https://files.pythonhosted.org/packages/72/48/3c198455ca108cec5ae3662ae8acd7fd99476812fd712bb17f1b39a0b589/lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8", size = 5391253, upload-time = "2025-04-23T01:46:37.608Z" },
- { url = "https://files.pythonhosted.org/packages/d6/10/5bf51858971c51ec96cfc13e800a9951f3fd501686f4c18d7d84fe2d6352/lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f", size = 5261651, upload-time = "2025-04-23T01:46:40.183Z" },
- { url = "https://files.pythonhosted.org/packages/2b/11/06710dd809205377da380546f91d2ac94bad9ff735a72b64ec029f706c85/lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc", size = 5024315, upload-time = "2025-04-23T01:46:43.333Z" },
- { url = "https://files.pythonhosted.org/packages/f5/b0/15b6217834b5e3a59ebf7f53125e08e318030e8cc0d7310355e6edac98ef/lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f", size = 3486149, upload-time = "2025-04-23T01:46:45.684Z" },
- { url = "https://files.pythonhosted.org/packages/91/1e/05ddcb57ad2f3069101611bd5f5084157d90861a2ef460bf42f45cced944/lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2", size = 3817095, upload-time = "2025-04-23T01:46:48.521Z" },
- { url = "https://files.pythonhosted.org/packages/87/cb/2ba1e9dd953415f58548506fa5549a7f373ae55e80c61c9041b7fd09a38a/lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", size = 8110086, upload-time = "2025-04-23T01:46:52.218Z" },
- { url = "https://files.pythonhosted.org/packages/b5/3e/6602a4dca3ae344e8609914d6ab22e52ce42e3e1638c10967568c5c1450d/lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", size = 4404613, upload-time = "2025-04-23T01:46:55.281Z" },
- { url = "https://files.pythonhosted.org/packages/4c/72/bf00988477d3bb452bef9436e45aeea82bb40cdfb4684b83c967c53909c7/lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", size = 5012008, upload-time = "2025-04-23T01:46:57.817Z" },
- { url = "https://files.pythonhosted.org/packages/92/1f/93e42d93e9e7a44b2d3354c462cd784dbaaf350f7976b5d7c3f85d68d1b1/lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", size = 4760915, upload-time = "2025-04-23T01:47:00.745Z" },
- { url = "https://files.pythonhosted.org/packages/45/0b/363009390d0b461cf9976a499e83b68f792e4c32ecef092f3f9ef9c4ba54/lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", size = 5283890, upload-time = "2025-04-23T01:47:04.702Z" },
- { url = "https://files.pythonhosted.org/packages/19/dc/6056c332f9378ab476c88e301e6549a0454dbee8f0ae16847414f0eccb74/lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", size = 4812644, upload-time = "2025-04-23T01:47:07.833Z" },
- { url = "https://files.pythonhosted.org/packages/ee/8a/f8c66bbb23ecb9048a46a5ef9b495fd23f7543df642dabeebcb2eeb66592/lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", size = 4921817, upload-time = "2025-04-23T01:47:10.317Z" },
- { url = "https://files.pythonhosted.org/packages/04/57/2e537083c3f381f83d05d9b176f0d838a9e8961f7ed8ddce3f0217179ce3/lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", size = 4753916, upload-time = "2025-04-23T01:47:12.823Z" },
- { url = "https://files.pythonhosted.org/packages/d8/80/ea8c4072109a350848f1157ce83ccd9439601274035cd045ac31f47f3417/lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", size = 5289274, upload-time = "2025-04-23T01:47:15.916Z" },
- { url = "https://files.pythonhosted.org/packages/b3/47/c4be287c48cdc304483457878a3f22999098b9a95f455e3c4bda7ec7fc72/lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", size = 4874757, upload-time = "2025-04-23T01:47:19.793Z" },
- { url = "https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", size = 4947028, upload-time = "2025-04-23T01:47:22.401Z" },
- { url = "https://files.pythonhosted.org/packages/cb/f9/c33fc8daa373ef8a7daddb53175289024512b6619bc9de36d77dca3df44b/lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", size = 4834487, upload-time = "2025-04-23T01:47:25.513Z" },
- { url = "https://files.pythonhosted.org/packages/8d/30/fc92bb595bcb878311e01b418b57d13900f84c2b94f6eca9e5073ea756e6/lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", size = 5381688, upload-time = "2025-04-23T01:47:28.454Z" },
- { url = "https://files.pythonhosted.org/packages/43/d1/3ba7bd978ce28bba8e3da2c2e9d5ae3f8f521ad3f0ca6ea4788d086ba00d/lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", size = 5242043, upload-time = "2025-04-23T01:47:31.208Z" },
- { url = "https://files.pythonhosted.org/packages/ee/cd/95fa2201041a610c4d08ddaf31d43b98ecc4b1d74b1e7245b1abdab443cb/lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", size = 5021569, upload-time = "2025-04-23T01:47:33.805Z" },
- { url = "https://files.pythonhosted.org/packages/2d/a6/31da006fead660b9512d08d23d31e93ad3477dd47cc42e3285f143443176/lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", size = 3485270, upload-time = "2025-04-23T01:47:36.133Z" },
- { url = "https://files.pythonhosted.org/packages/fc/14/c115516c62a7d2499781d2d3d7215218c0731b2c940753bf9f9b7b73924d/lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", size = 3814606, upload-time = "2025-04-23T01:47:39.028Z" },
- { url = "https://files.pythonhosted.org/packages/1e/04/acd238222ea25683e43ac7113facc380b3aaf77c53e7d88c4f544cef02ca/lxml-5.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e", size = 8082189, upload-time = "2025-04-23T01:48:51.829Z" },
- { url = "https://files.pythonhosted.org/packages/d6/4e/cc7fe9ccb9999cc648492ce970b63c657606aefc7d0fba46b17aa2ba93fb/lxml-5.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40", size = 4384950, upload-time = "2025-04-23T01:48:54.464Z" },
- { url = "https://files.pythonhosted.org/packages/56/bf/acd219c489346d0243a30769b9d446b71e5608581db49a18c8d91a669e19/lxml-5.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729", size = 5209823, upload-time = "2025-04-23T01:48:57.192Z" },
- { url = "https://files.pythonhosted.org/packages/57/51/ec31cd33175c09aa7b93d101f56eed43d89e15504455d884d021df7166a7/lxml-5.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87", size = 4931808, upload-time = "2025-04-23T01:48:59.811Z" },
- { url = "https://files.pythonhosted.org/packages/e5/68/865d229f191514da1777125598d028dc88a5ea300d68c30e1f120bfd01bd/lxml-5.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd", size = 5086067, upload-time = "2025-04-23T01:49:02.887Z" },
- { url = "https://files.pythonhosted.org/packages/82/01/4c958c5848b4e263cd9e83dff6b49f975a5a0854feb1070dfe0bdcdf70a0/lxml-5.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433", size = 4929026, upload-time = "2025-04-23T01:49:05.624Z" },
- { url = "https://files.pythonhosted.org/packages/55/31/5327d8af74d7f35e645b40ae6658761e1fee59ebecaa6a8d295e495c2ca9/lxml-5.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140", size = 5134245, upload-time = "2025-04-23T01:49:08.918Z" },
- { url = "https://files.pythonhosted.org/packages/6f/c9/204eba2400beb0016dacc2c5335ecb1e37f397796683ffdb7f471e86bddb/lxml-5.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5", size = 5001020, upload-time = "2025-04-23T01:49:11.643Z" },
- { url = "https://files.pythonhosted.org/packages/07/53/979165f50a853dab1cf3b9e53105032d55f85c5993f94afc4d9a61a22877/lxml-5.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142", size = 5192346, upload-time = "2025-04-23T01:49:14.868Z" },
- { url = "https://files.pythonhosted.org/packages/17/2b/f37b5ae28949143f863ba3066b30eede6107fc9a503bd0d01677d4e2a1e0/lxml-5.4.0-cp39-cp39-win32.whl", hash = "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6", size = 3478275, upload-time = "2025-04-23T01:49:17.249Z" },
- { url = "https://files.pythonhosted.org/packages/9a/d5/b795a183680126147665a8eeda8e802c180f2f7661aa9a550bba5bcdae63/lxml-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1", size = 3806275, upload-time = "2025-04-23T01:49:19.635Z" },
- { url = "https://files.pythonhosted.org/packages/c6/b0/e4d1cbb8c078bc4ae44de9c6a79fec4e2b4151b1b4d50af71d799e76b177/lxml-5.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55", size = 3892319, upload-time = "2025-04-23T01:49:22.069Z" },
- { url = "https://files.pythonhosted.org/packages/5b/aa/e2bdefba40d815059bcb60b371a36fbfcce970a935370e1b367ba1cc8f74/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740", size = 4211614, upload-time = "2025-04-23T01:49:24.599Z" },
- { url = "https://files.pythonhosted.org/packages/3c/5f/91ff89d1e092e7cfdd8453a939436ac116db0a665e7f4be0cd8e65c7dc5a/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5", size = 4306273, upload-time = "2025-04-23T01:49:27.355Z" },
- { url = "https://files.pythonhosted.org/packages/be/7c/8c3f15df2ca534589717bfd19d1e3482167801caedfa4d90a575facf68a6/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37", size = 4208552, upload-time = "2025-04-23T01:49:29.949Z" },
- { url = "https://files.pythonhosted.org/packages/7d/d8/9567afb1665f64d73fc54eb904e418d1138d7f011ed00647121b4dd60b38/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571", size = 4331091, upload-time = "2025-04-23T01:49:32.842Z" },
- { url = "https://files.pythonhosted.org/packages/f1/ab/fdbbd91d8d82bf1a723ba88ec3e3d76c022b53c391b0c13cad441cdb8f9e/lxml-5.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4", size = 3487862, upload-time = "2025-04-23T01:49:36.296Z" },
- { url = "https://files.pythonhosted.org/packages/ad/fb/d19b67e4bb63adc20574ba3476cf763b3514df1a37551084b890254e4b15/lxml-5.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530", size = 3891034, upload-time = "2025-04-23T01:50:12.71Z" },
- { url = "https://files.pythonhosted.org/packages/c9/5d/6e1033ee0cdb2f9bc93164f9df14e42cb5bbf1bbed3bf67f687de2763104/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6", size = 4207420, upload-time = "2025-04-23T01:50:15.281Z" },
- { url = "https://files.pythonhosted.org/packages/f3/4b/23ac79efc32d913259d66672c5f93daac7750a3d97cdc1c1a9a5d1c1b46c/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877", size = 4305106, upload-time = "2025-04-23T01:50:17.823Z" },
- { url = "https://files.pythonhosted.org/packages/a4/7a/fe558bee63a62f7a75a52111c0a94556c1c1bdcf558cd7d52861de558759/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8", size = 4205587, upload-time = "2025-04-23T01:50:20.899Z" },
- { url = "https://files.pythonhosted.org/packages/ed/5b/3207e6bd8d67c952acfec6bac9d1fa0ee353202e7c40b335ebe00879ab7d/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d", size = 4329077, upload-time = "2025-04-23T01:50:23.996Z" },
- { url = "https://files.pythonhosted.org/packages/a1/25/d381abcfd00102d3304aa191caab62f6e3bcbac93ee248771db6be153dfd/lxml-5.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987", size = 3486416, upload-time = "2025-04-23T01:50:26.388Z" },
-]
-
-[[package]]
-name = "packaging"
-version = "25.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
-]
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "six" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
-]
-
-[[package]]
-name = "pytz"
-version = "2025.2"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" },
-]
-
-[[package]]
-name = "redshift-connector"
-version = "2.1.9"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "beautifulsoup4" },
- { name = "boto3" },
- { name = "botocore" },
- { name = "lxml" },
- { name = "packaging" },
- { name = "pytz" },
- { name = "requests" },
- { name = "scramp" },
- { name = "setuptools" },
-]
-wheels = [
- { url = "https://files.pythonhosted.org/packages/77/11/e300e84d1842a7438e7146e3c7f0694bc7bdc1b7f24b6db3c1d482782652/redshift_connector-2.1.9-py3-none-any.whl", hash = "sha256:8e1d1c1063eef9b3b6b60c6206171f60642c1bae6d0457e0de9508d244725107", size = 138980, upload-time = "2025-10-16T02:44:15.234Z" },
-]
-
-[[package]]
-name = "requests"
-version = "2.32.5"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "certifi" },
- { name = "charset-normalizer" },
- { name = "idna" },
- { name = "urllib3", version = "1.26.20", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
- { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
-]
-
-[[package]]
-name = "s3transfer"
-version = "0.11.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "botocore" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/39/24/1390172471d569e281fcfd29b92f2f73774e95972c965d14b6c802ff2352/s3transfer-0.11.3.tar.gz", hash = "sha256:edae4977e3a122445660c7c114bba949f9d191bae3b34a096f18a1c8c354527a", size = 148042, upload-time = "2025-02-26T20:44:57.459Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/e4/81/48c41b554a54d75d4407740abb60e3a102ae416284df04d1dbdcbe3dbf24/s3transfer-0.11.3-py3-none-any.whl", hash = "sha256:ca855bdeb885174b5ffa95b9913622459d4ad8e331fc98eb01e6d5eb6a30655d", size = 84246, upload-time = "2025-02-26T20:44:55.509Z" },
-]
-
-[[package]]
-name = "scramp"
-version = "1.4.6"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "asn1crypto" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/58/77/6db18bab446c12cfbee22ca8f65d5b187966bd8f900aeb65db9e60d4be3d/scramp-1.4.6.tar.gz", hash = "sha256:fe055ebbebf4397b9cb323fcc4b299f219cd1b03fd673ca40c97db04ac7d107e", size = 16306, upload-time = "2025-07-05T14:44:03.977Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/69/bf/54b5d40bea1c1805175ead2d496c267f05eec87561687dd73ab76869d8d9/scramp-1.4.6-py3-none-any.whl", hash = "sha256:a0cf9d2b4624b69bac5432dd69fecfc55a542384fe73c3a23ed9b138cda484e1", size = 12812, upload-time = "2025-07-05T14:44:02.345Z" },
-]
-
-[[package]]
-name = "setuptools"
-version = "80.9.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
-]
-
-[[package]]
-name = "six"
-version = "1.17.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
-]
-
-[[package]]
-name = "soupsieve"
-version = "2.8"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472, upload-time = "2025-08-27T15:39:51.78Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679, upload-time = "2025-08-27T15:39:50.179Z" },
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.15.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
-]
-
-[[package]]
-name = "urllib3"
-version = "1.26.20"
-source = { registry = "https://pypi.org/simple" }
-resolution-markers = [
- "python_full_version < '3.10'",
-]
-sdist = { url = "https://files.pythonhosted.org/packages/e4/e8/6ff5e6bc22095cfc59b6ea711b687e2b7ed4bdb373f7eeec370a97d7392f/urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32", size = 307380, upload-time = "2024-08-29T15:43:11.37Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/33/cf/8435d5a7159e2a9c83a95896ed596f68cf798005fe107cc655b5c5c14704/urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", size = 144225, upload-time = "2024-08-29T15:43:08.921Z" },
-]
-
-[[package]]
-name = "urllib3"
-version = "2.5.0"
-source = { registry = "https://pypi.org/simple" }
-resolution-markers = [
- "python_full_version >= '3.10'",
-]
-sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
-]
diff --git a/images/flo-studio-preview.png b/images/flo-studio-preview.png
deleted file mode 100644
index 0a43992d..00000000
Binary files a/images/flo-studio-preview.png and /dev/null differ
diff --git a/images/rflo-icon.svg b/images/rflo-icon.svg
new file mode 100644
index 00000000..19dd1eb9
--- /dev/null
+++ b/images/rflo-icon.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/images/wavefront-arc.png b/images/wavefront-arc.png
new file mode 100644
index 00000000..4550a93b
Binary files /dev/null and b/images/wavefront-arc.png differ
diff --git a/images/wavefront-home.png b/images/wavefront-home.png
new file mode 100644
index 00000000..5434ab34
Binary files /dev/null and b/images/wavefront-home.png differ
diff --git a/images/wavefront-icon.png b/images/wavefront-icon.png
new file mode 100644
index 00000000..9d3ac1fc
Binary files /dev/null and b/images/wavefront-icon.png differ
diff --git a/studio/README.md b/studio/README.md
deleted file mode 100644
index 69ee426c..00000000
--- a/studio/README.md
+++ /dev/null
@@ -1,354 +0,0 @@
-# Flo AI Studio
-
-A powerful visual designer for creating YAML-based AI agent workflows. Build complex multi-agent workflows with an intuitive drag-and-drop interface, configure agents with comprehensive forms, set up routing logic, and export everything as production-ready YAML.
-
-## π Overview
-
-Flo AI Studio is a React-based visual editor that makes it easy to design and configure AI workflows for the Flo AI framework. It provides a user-friendly interface for creating complex agent orchestrations without writing code.
-
-## β¨ Features
-
-- **π¨ Visual Workflow Design**: Drag-and-drop interface using React Flow
-- **π€ Agent Management**: Create and edit agents with comprehensive configuration forms
-- **π§ Tool Integration**: Add and configure tools for your agents
-- **π Router Configuration**: Define custom routing logic between workflow nodes
-- **π YAML Export**: Generate production-ready YAML configurations
-- **π Template System**: Quick agent templates for common use cases
-- **βοΈ Configuration Management**: Manage available tools, LLMs, and routers
-- **πΎ State Management**: Robust state management with Zustand
-- **π― TypeScript**: Fully typed for better development experience
-
-## π Quick Start
-
-### Installation
-
-```bash
-# Navigate to flo_studio directory
-cd flo_studio
-
-# Install dependencies
-pnpm install
-
-# Start development server
-pnpm dev
-```
-
-### Building for Production
-
-```bash
-# Build the application
-pnpm build
-
-# Preview the build
-pnpm preview
-```
-
-## ποΈ Architecture
-
-### Project Structure
-
-```
-flo_studio/
-βββ src/
-β βββ components/ # React components
-β β βββ editors/ # Modal editors (Agent, Edge, Config)
-β β βββ flow/ # React Flow components
-β β βββ sidebar/ # Sidebar components
-β β βββ toolbar/ # Toolbar components
-β β βββ ui/ # Reusable UI components
-β βββ store/ # Zustand store
-β βββ types/ # TypeScript definitions
-β βββ utils/ # Utility functions
-β βββ lib/ # Shared utilities
-βββ public/ # Static assets
-βββ dist/ # Build output
-```
-
-### Key Technologies
-
-- **React 18** - Modern React with hooks and concurrent features
-- **TypeScript** - Type safety and better developer experience
-- **React Flow** - Graph visualization and interaction
-- **Zustand** - Lightweight state management
-- **Tailwind CSS** - Utility-first CSS framework
-- **Radix UI** - Accessible component primitives
-- **React Hook Form** - Form handling with validation
-- **js-yaml** - YAML parsing and generation
-- **Vite** - Fast build tool and dev server
-
-## π― Usage Guide
-
-### Creating Your First Workflow
-
-1. **Start the Application**
- ```bash
- pnpm dev
- ```
-
-2. **Create an Agent**
- - Click the "Agent" button in the toolbar
- - Fill in the agent configuration form:
- - Name and role
- - Job description
- - LLM model selection
- - Tools (optional)
- - Output parser (optional)
-
-3. **Build the Workflow**
- - Drag nodes from the sidebar onto the canvas
- - Connect nodes by dragging from output handles to input handles
- - Configure edge routers by clicking on connections
-
-4. **Export Configuration**
- - Click "Export" in the toolbar
- - Review the generated YAML
- - Download or copy the configuration
-
-### Agent Configuration
-
-Agents can be configured with:
-
-- **Basic Information**: Name, role, job description
-- **Model Settings**: Provider (OpenAI, Anthropic, etc.), model name, temperature
-- **Tools**: Select from available tools or add custom ones
-- **Output Parser**: Define structured output schemas
-- **Reasoning Pattern**: DIRECT, COT (Chain of Thought), or REACT
-
-### Workflow Features
-
-- **Visual Connections**: Drag to connect agents and tools
-- **Router Functions**: Configure conditional routing between nodes
-- **Start/End Nodes**: Automatically detected based on connections
-- **Validation**: Real-time validation of workflow structure
-
-## π§ Configuration
-
-### Available LLMs
-
-The studio comes pre-configured with popular LLM providers:
-
-- **OpenAI**: GPT-4o, GPT-4o-mini
-- **Anthropic**: Claude-3.5-Sonnet, Claude-3.5-Haiku
-- **Google**: Gemini-2.5-Flash, Gemini-2.5-Pro
-- **Ollama**: Llama2, Llama3 (local models)
-
-### Available Tools
-
-Default tools include:
-
-- **calculator** - Mathematical calculations
-- **web_search** - Web search functionality
-- **file_reader** - File reading and analysis
-- **email_sender** - Email sending capabilities
-- **text_processor** - Text processing and analysis
-- **image_analyzer** - Image analysis and processing
-
-### Router Functions
-
-Pre-configured router functions:
-
-- **default_router** - Simple pass-through routing
-- **content_router** - Routes based on content analysis
-- **classification_router** - Routes based on classification results
-- **sentiment_router** - Routes based on sentiment analysis
-
-## π YAML Export Format
-
-The studio generates YAML compatible with the Flo AI framework:
-
-```yaml
-metadata:
- name: "My Workflow"
- version: "1.0.0"
- description: "Generated with Flo AI Studio"
- tags: ["flo-ai", "studio-generated"]
-
-arium:
- agents:
- - name: "content_analyzer"
- role: "Content Analyst"
- job: "Analyze content and extract insights"
- model:
- provider: "openai"
- name: "gpt-4o-mini"
- settings:
- temperature: 0.3
- reasoning_pattern: "COT"
-
- workflow:
- start: "content_analyzer"
- edges:
- - from: "content_analyzer"
- to: ["summarizer"]
- end: ["summarizer"]
-```
-
-## π Integration with Flo AI
-
-Use the exported YAML with the Flo AI framework:
-
-```python
-from flo_ai.arium.builder import AriumBuilder
-
-# Load your exported workflow
-builder = AriumBuilder.from_yaml(yaml_file="my-workflow.yaml")
-
-# Run the workflow
-result = await builder.build_and_run(["Your input here"])
-```
-
-## π οΈ Development
-
-### Adding New Components
-
-1. **Create Component**
- ```typescript
- // src/components/MyComponent.tsx
- import React from 'react';
-
- export const MyComponent: React.FC = () => {
- return
My Component
;
- };
- ```
-
-2. **Add to Store** (if needed)
- ```typescript
- // src/store/designerStore.ts
- interface DesignerState {
- // Add new state properties
- myNewFeature: boolean;
- setMyNewFeature: (value: boolean) => void;
- }
- ```
-
-### Adding New Tool Templates
-
-Edit the store configuration:
-
-```typescript
-// src/store/designerStore.ts
-const defaultConfig: DesignerConfig = {
- availableTools: [
- // Add new tools
- { name: 'my_tool', description: 'My custom tool' },
- ],
- // ...
-};
-```
-
-### Customizing Themes
-
-Update CSS variables in `src/index.css`:
-
-```css
-:root {
- --primary: 222.2 47.4% 11.2%;
- --primary-foreground: 210 40% 98%;
- /* Add custom colors */
-}
-```
-
-## π Troubleshooting
-
-### Common Issues
-
-1. **Build Errors**
- - Ensure all dependencies are installed: `pnpm install`
- - Clear node_modules and reinstall if needed
-
-2. **TypeScript Errors**
- - Check type definitions in `src/types/`
- - Ensure proper imports and exports
-
-3. **React Flow Issues**
- - Verify React Flow version compatibility
- - Check node and edge data structures
-
-### Performance Optimization
-
-- Use React.memo for heavy components
-- Implement virtual scrolling for large workflows
-- Optimize store subscriptions with selectors
-
-## π Deployment
-
-### Building for Production
-
-```bash
-# Build the application
-pnpm build
-
-# The dist/ folder contains the built application
-```
-
-### Deployment Options
-
-- **Static Hosting**: Deploy `dist/` to Netlify, Vercel, or GitHub Pages
-- **Docker**: Create a Docker container with nginx
-- **CDN**: Upload to S3 + CloudFront or similar
-
-### Environment Variables
-
-Create `.env` files for different environments:
-
-```bash
-# .env.development
-VITE_API_URL=http://localhost:3000
-
-# .env.production
-VITE_API_URL=https://api.myapp.com
-```
-
-## π Roadmap
-
-### Phase 1 (Current)
-- β
Basic visual editor
-- β
Agent configuration
-- β
YAML export
-- β
TypeScript support
-
-### Phase 2 (Planned)
-- [ ] YAML import functionality
-- [ ] Workflow validation
-- [ ] Advanced routing configuration
-- [ ] Template library
-
-### Phase 3 (Future)
-- [ ] Real-time collaboration
-- [ ] Workflow simulation
-- [ ] Plugin system
-- [ ] Cloud deployment
-
-## π€ Contributing
-
-1. Fork the repository
-2. Create a feature branch: `git checkout -b feature/my-feature`
-3. Make changes and add tests
-4. Commit: `git commit -am 'Add my feature'`
-5. Push: `git push origin feature/my-feature`
-6. Create a Pull Request
-
-### Development Guidelines
-
-- Use TypeScript for all new code
-- Follow the existing component structure
-- Add proper error handling
-- Write meaningful commit messages
-- Update documentation as needed
-
-## π License
-
-This project is part of the Flo AI framework and follows the same licensing terms.
-
-## π Acknowledgments
-
-- Built for the [Flo AI framework](../flo_ai/)
-- Powered by React Flow for graph visualization
-- UI components from Radix UI
-- Icons from Lucide React
-
----
-
-**Happy Building! π**
-
-For more information about the Flo AI framework, check out the [main documentation](../flo_ai/README.md).
diff --git a/studio/index.html b/studio/index.html
deleted file mode 100644
index 55ddfbf6..00000000
--- a/studio/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
- Flo AI Studio - Visual Workflow Designer
-
-
-
-
-
-
-
diff --git a/studio/package.json b/studio/package.json
deleted file mode 100644
index c72e4a1a..00000000
--- a/studio/package.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "name": "flo-ai-studio",
- "version": "1.0.0",
- "description": "Visual designer for Flo AI workflows",
- "private": true,
- "scripts": {
- "dev": "vite",
- "build": "tsc && vite build",
- "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
- "preview": "vite preview"
- },
- "dependencies": {
- "@hookform/resolvers": "^3.3.2",
- "@radix-ui/react-dialog": "^1.0.5",
- "@radix-ui/react-dropdown-menu": "^2.0.6",
- "@radix-ui/react-form": "^0.0.3",
- "@radix-ui/react-label": "^2.0.2",
- "@radix-ui/react-select": "^2.0.0",
- "@radix-ui/react-separator": "^1.0.3",
- "@radix-ui/react-slot": "^1.0.2",
- "@radix-ui/react-switch": "^1.0.3",
- "@radix-ui/react-tabs": "^1.0.4",
- "@radix-ui/react-tooltip": "^1.0.7",
- "class-variance-authority": "^0.7.0",
- "clsx": "^2.0.0",
- "js-yaml": "^4.1.0",
- "lucide-react": "^0.294.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-hook-form": "^7.48.2",
- "reactflow": "^11.10.4",
- "tailwind-merge": "^2.0.0",
- "tailwindcss-animate": "^1.0.7",
- "zod": "^3.22.4",
- "zustand": "^4.4.7"
- },
- "devDependencies": {
- "@types/js-yaml": "^4.0.9",
- "@types/node": "^20.10.4",
- "@types/react": "^18.2.43",
- "@types/react-dom": "^18.2.17",
- "@typescript-eslint/eslint-plugin": "^6.14.0",
- "@typescript-eslint/parser": "^6.14.0",
- "@vitejs/plugin-react": "^4.2.1",
- "autoprefixer": "^10.4.16",
- "eslint": "^8.55.0",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-refresh": "^0.4.5",
- "postcss": "^8.4.32",
- "tailwindcss": "^3.3.6",
- "typescript": "^5.2.2",
- "vite": "^5.0.8"
- }
-}
diff --git a/studio/pnpm-lock.yaml b/studio/pnpm-lock.yaml
deleted file mode 100644
index 4387fe39..00000000
--- a/studio/pnpm-lock.yaml
+++ /dev/null
@@ -1,4317 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- '@hookform/resolvers':
- specifier: ^3.3.2
- version: 3.10.0(react-hook-form@7.62.0(react@18.3.1))
- '@radix-ui/react-dialog':
- specifier: ^1.0.5
- version: 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-dropdown-menu':
- specifier: ^2.0.6
- version: 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-form':
- specifier: ^0.0.3
- version: 0.0.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-label':
- specifier: ^2.0.2
- version: 2.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-select':
- specifier: ^2.0.0
- version: 2.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-separator':
- specifier: ^1.0.3
- version: 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot':
- specifier: ^1.0.2
- version: 1.2.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-switch':
- specifier: ^1.0.3
- version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-tabs':
- specifier: ^1.0.4
- version: 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-tooltip':
- specifier: ^1.0.7
- version: 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- class-variance-authority:
- specifier: ^0.7.0
- version: 0.7.1
- clsx:
- specifier: ^2.0.0
- version: 2.1.1
- js-yaml:
- specifier: ^4.1.0
- version: 4.1.0
- lucide-react:
- specifier: ^0.294.0
- version: 0.294.0(react@18.3.1)
- react:
- specifier: ^18.2.0
- version: 18.3.1
- react-dom:
- specifier: ^18.2.0
- version: 18.3.1(react@18.3.1)
- react-hook-form:
- specifier: ^7.48.2
- version: 7.62.0(react@18.3.1)
- reactflow:
- specifier: ^11.10.4
- version: 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- tailwind-merge:
- specifier: ^2.0.0
- version: 2.6.0
- tailwindcss-animate:
- specifier: ^1.0.7
- version: 1.0.7(tailwindcss@3.4.17)
- zod:
- specifier: ^3.22.4
- version: 3.25.76
- zustand:
- specifier: ^4.4.7
- version: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- devDependencies:
- '@types/js-yaml':
- specifier: ^4.0.9
- version: 4.0.9
- '@types/node':
- specifier: ^20.10.4
- version: 20.19.11
- '@types/react':
- specifier: ^18.2.43
- version: 18.3.23
- '@types/react-dom':
- specifier: ^18.2.17
- version: 18.3.7(@types/react@18.3.23)
- '@typescript-eslint/eslint-plugin':
- specifier: ^6.14.0
- version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)
- '@typescript-eslint/parser':
- specifier: ^6.14.0
- version: 6.21.0(eslint@8.57.1)(typescript@5.9.2)
- '@vitejs/plugin-react':
- specifier: ^4.2.1
- version: 4.7.0(vite@5.4.19(@types/node@20.19.11))
- autoprefixer:
- specifier: ^10.4.16
- version: 10.4.21(postcss@8.5.6)
- eslint:
- specifier: ^8.55.0
- version: 8.57.1
- eslint-plugin-react-hooks:
- specifier: ^4.6.0
- version: 4.6.2(eslint@8.57.1)
- eslint-plugin-react-refresh:
- specifier: ^0.4.5
- version: 0.4.20(eslint@8.57.1)
- postcss:
- specifier: ^8.4.32
- version: 8.5.6
- tailwindcss:
- specifier: ^3.3.6
- version: 3.4.17
- typescript:
- specifier: ^5.2.2
- version: 5.9.2
- vite:
- specifier: ^5.0.8
- version: 5.4.19(@types/node@20.19.11)
-
-packages:
-
- '@alloc/quick-lru@5.2.0':
- resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
- engines: {node: '>=10'}
-
- '@ampproject/remapping@2.3.0':
- resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
- engines: {node: '>=6.0.0'}
-
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.28.0':
- resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.28.3':
- resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.28.3':
- resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-compilation-targets@7.27.2':
- resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-globals@7.28.0':
- resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.27.1':
- resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.28.3':
- resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-plugin-utils@7.27.1':
- resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-string-parser@7.27.1':
- resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-option@7.27.1':
- resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.28.3':
- resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.28.3':
- resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/plugin-transform-react-jsx-self@7.27.1':
- resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-transform-react-jsx-source@7.27.1':
- resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/runtime@7.28.3':
- resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.28.3':
- resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/types@7.28.2':
- resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
- engines: {node: '>=6.9.0'}
-
- '@esbuild/aix-ppc64@0.21.5':
- resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [aix]
-
- '@esbuild/android-arm64@0.21.5':
- resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm@0.21.5':
- resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-x64@0.21.5':
- resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/darwin-arm64@0.21.5':
- resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.21.5':
- resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/freebsd-arm64@0.21.5':
- resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.21.5':
- resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/linux-arm64@0.21.5':
- resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm@0.21.5':
- resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
- engines: {node: '>=12'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-ia32@0.21.5':
- resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-loong64@0.21.5':
- resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
- engines: {node: '>=12'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.21.5':
- resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
- engines: {node: '>=12'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.21.5':
- resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
- engines: {node: '>=12'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.21.5':
- resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
- engines: {node: '>=12'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-s390x@0.21.5':
- resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
- engines: {node: '>=12'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-x64@0.21.5':
- resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/netbsd-x64@0.21.5':
- resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/openbsd-x64@0.21.5':
- resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/sunos-x64@0.21.5':
- resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/win32-arm64@0.21.5':
- resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
- engines: {node: '>=12'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-ia32@0.21.5':
- resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
- engines: {node: '>=12'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-x64@0.21.5':
- resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
- engines: {node: '>=12'}
- cpu: [x64]
- os: [win32]
-
- '@eslint-community/eslint-utils@4.7.0':
- resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
-
- '@eslint-community/regexpp@4.12.1':
- resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
- '@eslint/eslintrc@2.1.4':
- resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@eslint/js@8.57.1':
- resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- '@floating-ui/core@1.7.3':
- resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
-
- '@floating-ui/dom@1.7.3':
- resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==}
-
- '@floating-ui/react-dom@2.1.5':
- resolution: {integrity: sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q==}
- peerDependencies:
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
-
- '@floating-ui/utils@0.2.10':
- resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
-
- '@hookform/resolvers@3.10.0':
- resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==}
- peerDependencies:
- react-hook-form: ^7.0.0
-
- '@humanwhocodes/config-array@0.13.0':
- resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==}
- engines: {node: '>=10.10.0'}
- deprecated: Use @eslint/config-array instead
-
- '@humanwhocodes/module-importer@1.0.1':
- resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
- engines: {node: '>=12.22'}
-
- '@humanwhocodes/object-schema@2.0.3':
- resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
- deprecated: Use @eslint/object-schema instead
-
- '@isaacs/cliui@8.0.2':
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
-
- '@jridgewell/gen-mapping@0.3.13':
- resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
-
- '@jridgewell/resolve-uri@3.1.2':
- resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/sourcemap-codec@1.5.5':
- resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
-
- '@jridgewell/trace-mapping@0.3.30':
- resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==}
-
- '@nodelib/fs.scandir@2.1.5':
- resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
- engines: {node: '>= 8'}
-
- '@nodelib/fs.stat@2.0.5':
- resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
- engines: {node: '>= 8'}
-
- '@nodelib/fs.walk@1.2.8':
- resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
- engines: {node: '>= 8'}
-
- '@pkgjs/parseargs@0.11.0':
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
-
- '@radix-ui/number@1.1.1':
- resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
-
- '@radix-ui/primitive@1.0.1':
- resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
-
- '@radix-ui/primitive@1.1.3':
- resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
-
- '@radix-ui/react-arrow@1.1.7':
- resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
- 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
-
- '@radix-ui/react-collection@1.1.7':
- resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
- 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
-
- '@radix-ui/react-compose-refs@1.0.1':
- resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-compose-refs@1.1.2':
- resolution: {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
-
- '@radix-ui/react-context@1.0.1':
- resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-context@1.1.2':
- resolution: {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
-
- '@radix-ui/react-dialog@1.1.15':
- resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
- 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
-
- '@radix-ui/react-direction@1.1.1':
- resolution: {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
-
- '@radix-ui/react-dismissable-layer@1.1.11':
- resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
- 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
-
- '@radix-ui/react-dropdown-menu@2.1.16':
- resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==}
- 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
-
- '@radix-ui/react-focus-guards@1.1.3':
- resolution: {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
-
- '@radix-ui/react-focus-scope@1.1.7':
- resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
- 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
-
- '@radix-ui/react-form@0.0.3':
- resolution: {integrity: sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-id@1.0.1':
- resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-id@1.1.1':
- resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-label@2.0.2':
- resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-label@2.1.7':
- resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==}
- 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
-
- '@radix-ui/react-menu@2.1.16':
- resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==}
- 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
-
- '@radix-ui/react-popper@1.2.8':
- resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
- 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
-
- '@radix-ui/react-portal@1.1.9':
- resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
- 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
-
- '@radix-ui/react-presence@1.1.5':
- resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
- 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
-
- '@radix-ui/react-primitive@1.0.3':
- resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0
- react-dom: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-primitive@2.1.3':
- resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
- 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
-
- '@radix-ui/react-roving-focus@1.1.11':
- resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
- 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
-
- '@radix-ui/react-select@2.2.6':
- resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==}
- 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
-
- '@radix-ui/react-separator@1.1.7':
- resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==}
- 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
-
- '@radix-ui/react-slot@1.0.2':
- resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-slot@1.2.3':
- resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-switch@1.2.6':
- resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==}
- 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
-
- '@radix-ui/react-tabs@1.1.13':
- resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
- 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
-
- '@radix-ui/react-tooltip@1.2.8':
- resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==}
- 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
-
- '@radix-ui/react-use-callback-ref@1.1.1':
- resolution: {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
-
- '@radix-ui/react-use-controllable-state@1.2.2':
- resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-effect-event@0.0.2':
- resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-escape-keydown@1.1.1':
- resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-layout-effect@1.0.1':
- resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-layout-effect@1.1.1':
- resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-previous@1.1.1':
- resolution: {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
-
- '@radix-ui/react-use-rect@1.1.1':
- resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-size@1.1.1':
- resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-visually-hidden@1.2.3':
- resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==}
- 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
-
- '@radix-ui/rect@1.1.1':
- resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
-
- '@reactflow/background@11.3.14':
- resolution: {integrity: sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- '@reactflow/controls@11.2.14':
- resolution: {integrity: sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- '@reactflow/core@11.11.4':
- resolution: {integrity: sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- '@reactflow/minimap@11.7.14':
- resolution: {integrity: sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- '@reactflow/node-resizer@2.2.14':
- resolution: {integrity: sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- '@reactflow/node-toolbar@1.3.14':
- resolution: {integrity: sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- '@rolldown/pluginutils@1.0.0-beta.27':
- resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
-
- '@rollup/rollup-android-arm-eabi@4.46.2':
- resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm64@4.46.2':
- resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-darwin-arm64@4.46.2':
- resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-x64@4.46.2':
- resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.46.2':
- resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.46.2':
- resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==}
- cpu: [x64]
- os: [freebsd]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.46.2':
- resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==}
- cpu: [arm]
- os: [linux]
-
- '@rollup/rollup-linux-arm-musleabihf@4.46.2':
- resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==}
- cpu: [arm]
- os: [linux]
-
- '@rollup/rollup-linux-arm64-gnu@4.46.2':
- resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==}
- cpu: [arm64]
- os: [linux]
-
- '@rollup/rollup-linux-arm64-musl@4.46.2':
- resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==}
- cpu: [arm64]
- os: [linux]
-
- '@rollup/rollup-linux-loongarch64-gnu@4.46.2':
- resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==}
- cpu: [loong64]
- os: [linux]
-
- '@rollup/rollup-linux-ppc64-gnu@4.46.2':
- resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==}
- cpu: [ppc64]
- os: [linux]
-
- '@rollup/rollup-linux-riscv64-gnu@4.46.2':
- resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==}
- cpu: [riscv64]
- os: [linux]
-
- '@rollup/rollup-linux-riscv64-musl@4.46.2':
- resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==}
- cpu: [riscv64]
- os: [linux]
-
- '@rollup/rollup-linux-s390x-gnu@4.46.2':
- resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==}
- cpu: [s390x]
- os: [linux]
-
- '@rollup/rollup-linux-x64-gnu@4.46.2':
- resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==}
- cpu: [x64]
- os: [linux]
-
- '@rollup/rollup-linux-x64-musl@4.46.2':
- resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==}
- cpu: [x64]
- os: [linux]
-
- '@rollup/rollup-win32-arm64-msvc@4.46.2':
- resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.46.2':
- resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.46.2':
- resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==}
- cpu: [x64]
- os: [win32]
-
- '@types/babel__core@7.20.5':
- resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
-
- '@types/babel__generator@7.27.0':
- resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
-
- '@types/babel__template@7.4.4':
- resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
-
- '@types/babel__traverse@7.28.0':
- resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
-
- '@types/d3-array@3.2.1':
- resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
-
- '@types/d3-axis@3.0.6':
- resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
-
- '@types/d3-brush@3.0.6':
- resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
-
- '@types/d3-chord@3.0.6':
- resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
-
- '@types/d3-color@3.1.3':
- resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
-
- '@types/d3-contour@3.0.6':
- resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
-
- '@types/d3-delaunay@6.0.4':
- resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
-
- '@types/d3-dispatch@3.0.7':
- resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
-
- '@types/d3-drag@3.0.7':
- resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
-
- '@types/d3-dsv@3.0.7':
- resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
-
- '@types/d3-ease@3.0.2':
- resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
-
- '@types/d3-fetch@3.0.7':
- resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
-
- '@types/d3-force@3.0.10':
- resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
-
- '@types/d3-format@3.0.4':
- resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
-
- '@types/d3-geo@3.1.0':
- resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==}
-
- '@types/d3-hierarchy@3.1.7':
- resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
-
- '@types/d3-interpolate@3.0.4':
- resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
-
- '@types/d3-path@3.1.1':
- resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
-
- '@types/d3-polygon@3.0.2':
- resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
-
- '@types/d3-quadtree@3.0.6':
- resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
-
- '@types/d3-random@3.0.3':
- resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==}
-
- '@types/d3-scale-chromatic@3.1.0':
- resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
-
- '@types/d3-scale@4.0.9':
- resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
-
- '@types/d3-selection@3.0.11':
- resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
-
- '@types/d3-shape@3.1.7':
- resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
-
- '@types/d3-time-format@4.0.3':
- resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
-
- '@types/d3-time@3.0.4':
- resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
-
- '@types/d3-timer@3.0.2':
- resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
-
- '@types/d3-transition@3.0.9':
- resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
-
- '@types/d3-zoom@3.0.8':
- resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
-
- '@types/d3@7.4.3':
- resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
-
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
-
- '@types/geojson@7946.0.16':
- resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
-
- '@types/js-yaml@4.0.9':
- resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
-
- '@types/json-schema@7.0.15':
- resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-
- '@types/node@20.19.11':
- resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==}
-
- '@types/prop-types@15.7.15':
- resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
-
- '@types/react-dom@18.3.7':
- resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
- peerDependencies:
- '@types/react': ^18.0.0
-
- '@types/react@18.3.23':
- resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==}
-
- '@types/semver@7.7.0':
- resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
-
- '@typescript-eslint/eslint-plugin@6.21.0':
- resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/parser@6.21.0':
- resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/scope-manager@6.21.0':
- resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
- engines: {node: ^16.0.0 || >=18.0.0}
-
- '@typescript-eslint/type-utils@6.21.0':
- resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/types@6.21.0':
- resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
- engines: {node: ^16.0.0 || >=18.0.0}
-
- '@typescript-eslint/typescript-estree@6.21.0':
- resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@typescript-eslint/utils@6.21.0':
- resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
- engines: {node: ^16.0.0 || >=18.0.0}
- peerDependencies:
- eslint: ^7.0.0 || ^8.0.0
-
- '@typescript-eslint/visitor-keys@6.21.0':
- resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
- engines: {node: ^16.0.0 || >=18.0.0}
-
- '@ungap/structured-clone@1.3.0':
- resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
-
- '@vitejs/plugin-react@4.7.0':
- resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==}
- engines: {node: ^14.18.0 || >=16.0.0}
- peerDependencies:
- vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
-
- acorn-jsx@5.3.2:
- resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
- peerDependencies:
- acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- acorn@8.15.0:
- resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
- engines: {node: '>=0.4.0'}
- hasBin: true
-
- ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.1.0:
- resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
- engines: {node: '>=12'}
-
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
-
- ansi-styles@6.2.1:
- resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
- engines: {node: '>=12'}
-
- any-promise@1.3.0:
- resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
-
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
- arg@5.0.2:
- resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
-
- argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-
- aria-hidden@1.2.6:
- resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
- engines: {node: '>=10'}
-
- array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
-
- autoprefixer@10.4.21:
- resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==}
- engines: {node: ^10 || ^12 || >=14}
- hasBin: true
- peerDependencies:
- postcss: ^8.1.0
-
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- binary-extensions@2.3.0:
- resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
- engines: {node: '>=8'}
-
- brace-expansion@1.1.12:
- resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
-
- brace-expansion@2.0.2:
- resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
-
- braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
- engines: {node: '>=8'}
-
- browserslist@4.25.2:
- resolution: {integrity: sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
-
- camelcase-css@2.0.1:
- resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
- engines: {node: '>= 6'}
-
- caniuse-lite@1.0.30001735:
- resolution: {integrity: sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==}
-
- chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
-
- chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
-
- class-variance-authority@0.7.1:
- resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
-
- classcat@5.0.5:
- resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==}
-
- clsx@2.1.1:
- resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
- engines: {node: '>=6'}
-
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
- commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
-
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
-
- cssesc@3.0.0:
- resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
- engines: {node: '>=4'}
- hasBin: true
-
- csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-
- d3-color@3.1.0:
- resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
- engines: {node: '>=12'}
-
- d3-dispatch@3.0.1:
- resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
- engines: {node: '>=12'}
-
- d3-drag@3.0.0:
- resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
- engines: {node: '>=12'}
-
- d3-ease@3.0.1:
- resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
- engines: {node: '>=12'}
-
- d3-interpolate@3.0.1:
- resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
- engines: {node: '>=12'}
-
- d3-selection@3.0.0:
- resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
- engines: {node: '>=12'}
-
- d3-timer@3.0.1:
- resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
- engines: {node: '>=12'}
-
- d3-transition@3.0.1:
- resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
- engines: {node: '>=12'}
- peerDependencies:
- d3-selection: 2 - 3
-
- d3-zoom@3.0.0:
- resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
- engines: {node: '>=12'}
-
- debug@4.4.1:
- resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- deep-is@0.1.4:
- resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-
- detect-node-es@1.1.0:
- resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
-
- didyoumean@1.2.2:
- resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
-
- dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
-
- dlv@1.1.3:
- resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
-
- doctrine@3.0.0:
- resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
- engines: {node: '>=6.0.0'}
-
- eastasianwidth@0.2.0:
- resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-
- electron-to-chromium@1.5.202:
- resolution: {integrity: sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg==}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-
- esbuild@0.21.5:
- resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
- engines: {node: '>=12'}
- hasBin: true
-
- escalade@3.2.0:
- resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
- engines: {node: '>=6'}
-
- escape-string-regexp@4.0.0:
- resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
- engines: {node: '>=10'}
-
- eslint-plugin-react-hooks@4.6.2:
- resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==}
- engines: {node: '>=10'}
- peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
-
- eslint-plugin-react-refresh@0.4.20:
- resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==}
- peerDependencies:
- eslint: '>=8.40'
-
- eslint-scope@7.2.2:
- resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- eslint-visitor-keys@3.4.3:
- resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- eslint@8.57.1:
- resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
- hasBin: true
-
- espree@9.6.1:
- resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- esquery@1.6.0:
- resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
- engines: {node: '>=0.10'}
-
- esrecurse@4.3.0:
- resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
- engines: {node: '>=4.0'}
-
- estraverse@5.3.0:
- resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
- engines: {node: '>=4.0'}
-
- esutils@2.0.3:
- resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
- engines: {node: '>=0.10.0'}
-
- fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-
- fast-glob@3.3.3:
- resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
- engines: {node: '>=8.6.0'}
-
- fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
- fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-
- fastq@1.19.1:
- resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
-
- file-entry-cache@6.0.1:
- resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
- engines: {node: ^10.12.0 || >=12.0.0}
-
- fill-range@7.1.1:
- resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
- engines: {node: '>=8'}
-
- find-up@5.0.0:
- resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
- engines: {node: '>=10'}
-
- flat-cache@3.2.0:
- resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
- engines: {node: ^10.12.0 || >=12.0.0}
-
- flatted@3.3.3:
- resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
-
- foreground-child@3.3.1:
- resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
- engines: {node: '>=14'}
-
- fraction.js@4.3.7:
- resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
-
- fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
- fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
-
- function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
- get-nonce@1.0.1:
- resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
- engines: {node: '>=6'}
-
- glob-parent@5.1.2:
- resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
- engines: {node: '>= 6'}
-
- glob-parent@6.0.2:
- resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
- engines: {node: '>=10.13.0'}
-
- glob@10.4.5:
- resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
- hasBin: true
-
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- globals@13.24.0:
- resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
- engines: {node: '>=8'}
-
- globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
-
- graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
-
- has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
-
- hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
- engines: {node: '>= 0.4'}
-
- ignore@5.3.2:
- resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
- engines: {node: '>= 4'}
-
- import-fresh@3.3.1:
- resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
- engines: {node: '>=6'}
-
- imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
-
- inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
-
- is-core-module@2.16.1:
- resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
- engines: {node: '>= 0.4'}
-
- is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
-
- is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
- is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- jackspeak@3.4.3:
- resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
-
- jiti@1.21.7:
- resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
- hasBin: true
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
- hasBin: true
-
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
- hasBin: true
-
- json-buffer@3.0.1:
- resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
-
- json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
- json-stable-stringify-without-jsonify@1.0.1:
- resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
-
- keyv@4.5.4:
- resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
-
- levn@0.4.1:
- resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
- engines: {node: '>= 0.8.0'}
-
- lilconfig@3.1.3:
- resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
- engines: {node: '>=14'}
-
- lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
-
- locate-path@6.0.0:
- resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
- engines: {node: '>=10'}
-
- lodash.merge@4.6.2:
- resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-
- loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
-
- lru-cache@10.4.3:
- resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
-
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-
- lucide-react@0.294.0:
- resolution: {integrity: sha512-V7o0/VECSGbLHn3/1O67FUgBwWB+hmzshrgDVRJQhMh8uj5D3HBuIvhuAmQTtlupILSplwIZg5FTc4tTKMA2SA==}
- peerDependencies:
- react: ^16.5.1 || ^17.0.0 || ^18.0.0
-
- merge2@1.4.1:
- resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
- engines: {node: '>= 8'}
-
- micromatch@4.0.8:
- resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
- engines: {node: '>=8.6'}
-
- minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-
- minimatch@9.0.3:
- resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minipass@7.1.2:
- resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
- mz@2.7.0:
- resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
-
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
- natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-
- node-releases@2.0.19:
- resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
-
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
- normalize-range@0.1.2:
- resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
- engines: {node: '>=0.10.0'}
-
- object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
-
- object-hash@3.0.0:
- resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
- engines: {node: '>= 6'}
-
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
- optionator@0.9.4:
- resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
- engines: {node: '>= 0.8.0'}
-
- p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
-
- p-locate@5.0.0:
- resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
- engines: {node: '>=10'}
-
- package-json-from-dist@1.0.1:
- resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
-
- parent-module@1.0.1:
- resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
- engines: {node: '>=6'}
-
- path-exists@4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
-
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
-
- path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-
- path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
-
- path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
-
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
- picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
-
- pify@2.3.0:
- resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
- engines: {node: '>=0.10.0'}
-
- pirates@4.0.7:
- resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
- engines: {node: '>= 6'}
-
- postcss-import@15.1.0:
- resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- postcss: ^8.0.0
-
- postcss-js@4.0.1:
- resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
- engines: {node: ^12 || ^14 || >= 16}
- peerDependencies:
- postcss: ^8.4.21
-
- postcss-load-config@4.0.2:
- resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
- engines: {node: '>= 14'}
- peerDependencies:
- postcss: '>=8.0.9'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- postcss:
- optional: true
- ts-node:
- optional: true
-
- postcss-nested@6.2.0:
- resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
- engines: {node: '>=12.0'}
- peerDependencies:
- postcss: ^8.2.14
-
- postcss-selector-parser@6.1.2:
- resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
- engines: {node: '>=4'}
-
- postcss-value-parser@4.2.0:
- resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-
- postcss@8.5.6:
- resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
- engines: {node: ^10 || ^12 || >=14}
-
- prelude-ls@1.2.1:
- resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
- engines: {node: '>= 0.8.0'}
-
- punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
- engines: {node: '>=6'}
-
- queue-microtask@1.2.3:
- resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-
- react-dom@18.3.1:
- resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
- peerDependencies:
- react: ^18.3.1
-
- react-hook-form@7.62.0:
- resolution: {integrity: sha512-7KWFejc98xqG/F4bAxpL41NB3o1nnvQO1RWZT3TqRZYL8RryQETGfEdVnJN2fy1crCiBLLjkRBVK05j24FxJGA==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^16.8.0 || ^17 || ^18 || ^19
-
- react-refresh@0.17.0:
- resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
- engines: {node: '>=0.10.0'}
-
- react-remove-scroll-bar@2.3.8:
- resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-remove-scroll@2.7.1:
- resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==}
- 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
-
- react-style-singleton@2.2.3:
- resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
- 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
-
- react@18.3.1:
- resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
- engines: {node: '>=0.10.0'}
-
- reactflow@11.11.4:
- resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==}
- peerDependencies:
- react: '>=17'
- react-dom: '>=17'
-
- read-cache@1.0.0:
- resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
-
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
-
- resolve-from@4.0.0:
- resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
- engines: {node: '>=4'}
-
- resolve@1.22.10:
- resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
- engines: {node: '>= 0.4'}
- hasBin: true
-
- reusify@1.1.0:
- resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
- engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-
- rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- deprecated: Rimraf versions prior to v4 are no longer supported
- hasBin: true
-
- rollup@4.46.2:
- resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
-
- run-parallel@1.2.0:
- resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-
- scheduler@0.23.2:
- resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
-
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.7.2:
- resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
- engines: {node: '>=10'}
- hasBin: true
-
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
-
- slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
-
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
- engines: {node: '>=0.10.0'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- string-width@5.1.2:
- resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
- engines: {node: '>=12'}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- strip-ansi@7.1.0:
- resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
- engines: {node: '>=12'}
-
- strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
-
- sucrase@3.35.0:
- resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
- engines: {node: '>=16 || 14 >=14.17'}
- hasBin: true
-
- supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
-
- supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
-
- tailwind-merge@2.6.0:
- resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
-
- tailwindcss-animate@1.0.7:
- resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
-
- tailwindcss@3.4.17:
- resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
- engines: {node: '>=14.0.0'}
- hasBin: true
-
- text-table@0.2.0:
- resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
-
- thenify-all@1.6.0:
- resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
- engines: {node: '>=0.8'}
-
- thenify@3.3.1:
- resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
-
- to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
-
- ts-api-utils@1.4.3:
- resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
- engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
-
- ts-interface-checker@0.1.13:
- resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
-
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- type-check@0.4.0:
- resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
- engines: {node: '>= 0.8.0'}
-
- type-fest@0.20.2:
- resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
- engines: {node: '>=10'}
-
- typescript@5.9.2:
- resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
- update-browserslist-db@1.1.3:
- resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
- uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
-
- use-callback-ref@1.3.3:
- resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
- 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
-
- use-sidecar@1.1.3:
- resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
- 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
-
- use-sync-external-store@1.5.0:
- resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
-
- util-deprecate@1.0.2:
- resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
- vite@5.4.19:
- resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==}
- engines: {node: ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@types/node': ^18.0.0 || >=20.0.0
- less: '*'
- lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
- terser: ^5.4.0
- peerDependenciesMeta:
- '@types/node':
- optional: true
- less:
- optional: true
- lightningcss:
- optional: true
- sass:
- optional: true
- sass-embedded:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- terser:
- optional: true
-
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
-
- word-wrap@1.2.5:
- resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
- engines: {node: '>=0.10.0'}
-
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- wrap-ansi@8.1.0:
- resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
- engines: {node: '>=12'}
-
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
- yaml@2.8.1:
- resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
- engines: {node: '>= 14.6'}
- hasBin: true
-
- yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
-
- zod@3.25.76:
- resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
-
- zustand@4.5.7:
- resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
- engines: {node: '>=12.7.0'}
- peerDependencies:
- '@types/react': '>=16.8'
- immer: '>=9.0.6'
- react: '>=16.8'
- peerDependenciesMeta:
- '@types/react':
- optional: true
- immer:
- optional: true
- react:
- optional: true
-
-snapshots:
-
- '@alloc/quick-lru@5.2.0': {}
-
- '@ampproject/remapping@2.3.0':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.30
-
- '@babel/code-frame@7.27.1':
- dependencies:
- '@babel/helper-validator-identifier': 7.27.1
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
- '@babel/compat-data@7.28.0': {}
-
- '@babel/core@7.28.3':
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.3
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3)
- '@babel/helpers': 7.28.3
- '@babel/parser': 7.28.3
- '@babel/template': 7.27.2
- '@babel/traverse': 7.28.3
- '@babel/types': 7.28.2
- convert-source-map: 2.0.0
- debug: 4.4.1
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/generator@7.28.3':
- dependencies:
- '@babel/parser': 7.28.3
- '@babel/types': 7.28.2
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.30
- jsesc: 3.1.0
-
- '@babel/helper-compilation-targets@7.27.2':
- dependencies:
- '@babel/compat-data': 7.28.0
- '@babel/helper-validator-option': 7.27.1
- browserslist: 4.25.2
- lru-cache: 5.1.1
- semver: 6.3.1
-
- '@babel/helper-globals@7.28.0': {}
-
- '@babel/helper-module-imports@7.27.1':
- dependencies:
- '@babel/traverse': 7.28.3
- '@babel/types': 7.28.2
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)':
- dependencies:
- '@babel/core': 7.28.3
- '@babel/helper-module-imports': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
- '@babel/traverse': 7.28.3
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-plugin-utils@7.27.1': {}
-
- '@babel/helper-string-parser@7.27.1': {}
-
- '@babel/helper-validator-identifier@7.27.1': {}
-
- '@babel/helper-validator-option@7.27.1': {}
-
- '@babel/helpers@7.28.3':
- dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.28.2
-
- '@babel/parser@7.28.3':
- dependencies:
- '@babel/types': 7.28.2
-
- '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.3)':
- dependencies:
- '@babel/core': 7.28.3
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.3)':
- dependencies:
- '@babel/core': 7.28.3
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/runtime@7.28.3': {}
-
- '@babel/template@7.27.2':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/parser': 7.28.3
- '@babel/types': 7.28.2
-
- '@babel/traverse@7.28.3':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.3
- '@babel/helper-globals': 7.28.0
- '@babel/parser': 7.28.3
- '@babel/template': 7.27.2
- '@babel/types': 7.28.2
- debug: 4.4.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/types@7.28.2':
- dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
-
- '@esbuild/aix-ppc64@0.21.5':
- optional: true
-
- '@esbuild/android-arm64@0.21.5':
- optional: true
-
- '@esbuild/android-arm@0.21.5':
- optional: true
-
- '@esbuild/android-x64@0.21.5':
- optional: true
-
- '@esbuild/darwin-arm64@0.21.5':
- optional: true
-
- '@esbuild/darwin-x64@0.21.5':
- optional: true
-
- '@esbuild/freebsd-arm64@0.21.5':
- optional: true
-
- '@esbuild/freebsd-x64@0.21.5':
- optional: true
-
- '@esbuild/linux-arm64@0.21.5':
- optional: true
-
- '@esbuild/linux-arm@0.21.5':
- optional: true
-
- '@esbuild/linux-ia32@0.21.5':
- optional: true
-
- '@esbuild/linux-loong64@0.21.5':
- optional: true
-
- '@esbuild/linux-mips64el@0.21.5':
- optional: true
-
- '@esbuild/linux-ppc64@0.21.5':
- optional: true
-
- '@esbuild/linux-riscv64@0.21.5':
- optional: true
-
- '@esbuild/linux-s390x@0.21.5':
- optional: true
-
- '@esbuild/linux-x64@0.21.5':
- optional: true
-
- '@esbuild/netbsd-x64@0.21.5':
- optional: true
-
- '@esbuild/openbsd-x64@0.21.5':
- optional: true
-
- '@esbuild/sunos-x64@0.21.5':
- optional: true
-
- '@esbuild/win32-arm64@0.21.5':
- optional: true
-
- '@esbuild/win32-ia32@0.21.5':
- optional: true
-
- '@esbuild/win32-x64@0.21.5':
- optional: true
-
- '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)':
- dependencies:
- eslint: 8.57.1
- eslint-visitor-keys: 3.4.3
-
- '@eslint-community/regexpp@4.12.1': {}
-
- '@eslint/eslintrc@2.1.4':
- dependencies:
- ajv: 6.12.6
- debug: 4.4.1
- espree: 9.6.1
- globals: 13.24.0
- ignore: 5.3.2
- import-fresh: 3.3.1
- js-yaml: 4.1.0
- minimatch: 3.1.2
- strip-json-comments: 3.1.1
- transitivePeerDependencies:
- - supports-color
-
- '@eslint/js@8.57.1': {}
-
- '@floating-ui/core@1.7.3':
- dependencies:
- '@floating-ui/utils': 0.2.10
-
- '@floating-ui/dom@1.7.3':
- dependencies:
- '@floating-ui/core': 1.7.3
- '@floating-ui/utils': 0.2.10
-
- '@floating-ui/react-dom@2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@floating-ui/dom': 1.7.3
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
- '@floating-ui/utils@0.2.10': {}
-
- '@hookform/resolvers@3.10.0(react-hook-form@7.62.0(react@18.3.1))':
- dependencies:
- react-hook-form: 7.62.0(react@18.3.1)
-
- '@humanwhocodes/config-array@0.13.0':
- dependencies:
- '@humanwhocodes/object-schema': 2.0.3
- debug: 4.4.1
- minimatch: 3.1.2
- transitivePeerDependencies:
- - supports-color
-
- '@humanwhocodes/module-importer@1.0.1': {}
-
- '@humanwhocodes/object-schema@2.0.3': {}
-
- '@isaacs/cliui@8.0.2':
- dependencies:
- string-width: 5.1.2
- string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.0
- strip-ansi-cjs: strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: wrap-ansi@7.0.0
-
- '@jridgewell/gen-mapping@0.3.13':
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
- '@jridgewell/trace-mapping': 0.3.30
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.5.5': {}
-
- '@jridgewell/trace-mapping@0.3.30':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.5
-
- '@nodelib/fs.scandir@2.1.5':
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- run-parallel: 1.2.0
-
- '@nodelib/fs.stat@2.0.5': {}
-
- '@nodelib/fs.walk@1.2.8':
- dependencies:
- '@nodelib/fs.scandir': 2.1.5
- fastq: 1.19.1
-
- '@pkgjs/parseargs@0.11.0':
- optional: true
-
- '@radix-ui/number@1.1.1': {}
-
- '@radix-ui/primitive@1.0.1':
- dependencies:
- '@babel/runtime': 7.28.3
-
- '@radix-ui/primitive@1.1.3': {}
-
- '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-context@1.0.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-context@1.1.2(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- aria-hidden: 1.2.6
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.7.1(@types/react@18.3.23)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-direction@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-form@0.0.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- '@radix-ui/primitive': 1.0.1
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.0.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-id': 1.0.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-label': 2.0.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-id@1.0.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-id@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-label@2.0.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-label@2.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- aria-hidden: 1.2.6
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.7.1(@types/react@18.3.23)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@floating-ui/react-dom': 2.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/rect': 1.1.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- '@radix-ui/react-slot': 1.0.2(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-select@2.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- aria-hidden: 1.2.6
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.7.1(@types/react@18.3.23)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-separator@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-slot@1.0.2(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-slot@1.2.3(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-switch@1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-tabs@1.1.13(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.23)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.28.3
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-previous@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/rect': 1.1.1
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-use-size@1.1.1(@types/react@18.3.23)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- '@types/react-dom': 18.3.7(@types/react@18.3.23)
-
- '@radix-ui/rect@1.1.1': {}
-
- '@reactflow/background@11.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- classcat: 5.0.5
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- '@reactflow/controls@11.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- classcat: 5.0.5
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- '@reactflow/core@11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@types/d3': 7.4.3
- '@types/d3-drag': 3.0.7
- '@types/d3-selection': 3.0.11
- '@types/d3-zoom': 3.0.8
- classcat: 5.0.5
- d3-drag: 3.0.0
- d3-selection: 3.0.0
- d3-zoom: 3.0.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- '@reactflow/minimap@11.7.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@types/d3-selection': 3.0.11
- '@types/d3-zoom': 3.0.8
- classcat: 5.0.5
- d3-selection: 3.0.0
- d3-zoom: 3.0.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- '@reactflow/node-resizer@2.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- classcat: 5.0.5
- d3-drag: 3.0.0
- d3-selection: 3.0.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- '@reactflow/node-toolbar@1.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- classcat: 5.0.5
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- zustand: 4.5.7(@types/react@18.3.23)(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- '@rolldown/pluginutils@1.0.0-beta.27': {}
-
- '@rollup/rollup-android-arm-eabi@4.46.2':
- optional: true
-
- '@rollup/rollup-android-arm64@4.46.2':
- optional: true
-
- '@rollup/rollup-darwin-arm64@4.46.2':
- optional: true
-
- '@rollup/rollup-darwin-x64@4.46.2':
- optional: true
-
- '@rollup/rollup-freebsd-arm64@4.46.2':
- optional: true
-
- '@rollup/rollup-freebsd-x64@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-arm-gnueabihf@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-arm-musleabihf@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-arm64-gnu@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-arm64-musl@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-loongarch64-gnu@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-ppc64-gnu@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-riscv64-gnu@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-riscv64-musl@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-s390x-gnu@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-x64-gnu@4.46.2':
- optional: true
-
- '@rollup/rollup-linux-x64-musl@4.46.2':
- optional: true
-
- '@rollup/rollup-win32-arm64-msvc@4.46.2':
- optional: true
-
- '@rollup/rollup-win32-ia32-msvc@4.46.2':
- optional: true
-
- '@rollup/rollup-win32-x64-msvc@4.46.2':
- optional: true
-
- '@types/babel__core@7.20.5':
- dependencies:
- '@babel/parser': 7.28.3
- '@babel/types': 7.28.2
- '@types/babel__generator': 7.27.0
- '@types/babel__template': 7.4.4
- '@types/babel__traverse': 7.28.0
-
- '@types/babel__generator@7.27.0':
- dependencies:
- '@babel/types': 7.28.2
-
- '@types/babel__template@7.4.4':
- dependencies:
- '@babel/parser': 7.28.3
- '@babel/types': 7.28.2
-
- '@types/babel__traverse@7.28.0':
- dependencies:
- '@babel/types': 7.28.2
-
- '@types/d3-array@3.2.1': {}
-
- '@types/d3-axis@3.0.6':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-brush@3.0.6':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-chord@3.0.6': {}
-
- '@types/d3-color@3.1.3': {}
-
- '@types/d3-contour@3.0.6':
- dependencies:
- '@types/d3-array': 3.2.1
- '@types/geojson': 7946.0.16
-
- '@types/d3-delaunay@6.0.4': {}
-
- '@types/d3-dispatch@3.0.7': {}
-
- '@types/d3-drag@3.0.7':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-dsv@3.0.7': {}
-
- '@types/d3-ease@3.0.2': {}
-
- '@types/d3-fetch@3.0.7':
- dependencies:
- '@types/d3-dsv': 3.0.7
-
- '@types/d3-force@3.0.10': {}
-
- '@types/d3-format@3.0.4': {}
-
- '@types/d3-geo@3.1.0':
- dependencies:
- '@types/geojson': 7946.0.16
-
- '@types/d3-hierarchy@3.1.7': {}
-
- '@types/d3-interpolate@3.0.4':
- dependencies:
- '@types/d3-color': 3.1.3
-
- '@types/d3-path@3.1.1': {}
-
- '@types/d3-polygon@3.0.2': {}
-
- '@types/d3-quadtree@3.0.6': {}
-
- '@types/d3-random@3.0.3': {}
-
- '@types/d3-scale-chromatic@3.1.0': {}
-
- '@types/d3-scale@4.0.9':
- dependencies:
- '@types/d3-time': 3.0.4
-
- '@types/d3-selection@3.0.11': {}
-
- '@types/d3-shape@3.1.7':
- dependencies:
- '@types/d3-path': 3.1.1
-
- '@types/d3-time-format@4.0.3': {}
-
- '@types/d3-time@3.0.4': {}
-
- '@types/d3-timer@3.0.2': {}
-
- '@types/d3-transition@3.0.9':
- dependencies:
- '@types/d3-selection': 3.0.11
-
- '@types/d3-zoom@3.0.8':
- dependencies:
- '@types/d3-interpolate': 3.0.4
- '@types/d3-selection': 3.0.11
-
- '@types/d3@7.4.3':
- dependencies:
- '@types/d3-array': 3.2.1
- '@types/d3-axis': 3.0.6
- '@types/d3-brush': 3.0.6
- '@types/d3-chord': 3.0.6
- '@types/d3-color': 3.1.3
- '@types/d3-contour': 3.0.6
- '@types/d3-delaunay': 6.0.4
- '@types/d3-dispatch': 3.0.7
- '@types/d3-drag': 3.0.7
- '@types/d3-dsv': 3.0.7
- '@types/d3-ease': 3.0.2
- '@types/d3-fetch': 3.0.7
- '@types/d3-force': 3.0.10
- '@types/d3-format': 3.0.4
- '@types/d3-geo': 3.1.0
- '@types/d3-hierarchy': 3.1.7
- '@types/d3-interpolate': 3.0.4
- '@types/d3-path': 3.1.1
- '@types/d3-polygon': 3.0.2
- '@types/d3-quadtree': 3.0.6
- '@types/d3-random': 3.0.3
- '@types/d3-scale': 4.0.9
- '@types/d3-scale-chromatic': 3.1.0
- '@types/d3-selection': 3.0.11
- '@types/d3-shape': 3.1.7
- '@types/d3-time': 3.0.4
- '@types/d3-time-format': 4.0.3
- '@types/d3-timer': 3.0.2
- '@types/d3-transition': 3.0.9
- '@types/d3-zoom': 3.0.8
-
- '@types/estree@1.0.8': {}
-
- '@types/geojson@7946.0.16': {}
-
- '@types/js-yaml@4.0.9': {}
-
- '@types/json-schema@7.0.15': {}
-
- '@types/node@20.19.11':
- dependencies:
- undici-types: 6.21.0
-
- '@types/prop-types@15.7.15': {}
-
- '@types/react-dom@18.3.7(@types/react@18.3.23)':
- dependencies:
- '@types/react': 18.3.23
-
- '@types/react@18.3.23':
- dependencies:
- '@types/prop-types': 15.7.15
- csstype: 3.1.3
-
- '@types/semver@7.7.0': {}
-
- '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)':
- dependencies:
- '@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
- '@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
- '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
- '@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1
- eslint: 8.57.1
- graphemer: 1.4.0
- ignore: 5.3.2
- natural-compare: 1.4.0
- semver: 7.7.2
- ts-api-utils: 1.4.3(typescript@5.9.2)
- optionalDependencies:
- typescript: 5.9.2
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2)':
- dependencies:
- '@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2)
- '@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1
- eslint: 8.57.1
- optionalDependencies:
- typescript: 5.9.2
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/scope-manager@6.21.0':
- dependencies:
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/visitor-keys': 6.21.0
-
- '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)':
- dependencies:
- '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2)
- '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2)
- debug: 4.4.1
- eslint: 8.57.1
- ts-api-utils: 1.4.3(typescript@5.9.2)
- optionalDependencies:
- typescript: 5.9.2
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/types@6.21.0': {}
-
- '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)':
- dependencies:
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/visitor-keys': 6.21.0
- debug: 4.4.1
- globby: 11.1.0
- is-glob: 4.0.3
- minimatch: 9.0.3
- semver: 7.7.2
- ts-api-utils: 1.4.3(typescript@5.9.2)
- optionalDependencies:
- typescript: 5.9.2
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)':
- dependencies:
- '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
- '@types/json-schema': 7.0.15
- '@types/semver': 7.7.0
- '@typescript-eslint/scope-manager': 6.21.0
- '@typescript-eslint/types': 6.21.0
- '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2)
- eslint: 8.57.1
- semver: 7.7.2
- transitivePeerDependencies:
- - supports-color
- - typescript
-
- '@typescript-eslint/visitor-keys@6.21.0':
- dependencies:
- '@typescript-eslint/types': 6.21.0
- eslint-visitor-keys: 3.4.3
-
- '@ungap/structured-clone@1.3.0': {}
-
- '@vitejs/plugin-react@4.7.0(vite@5.4.19(@types/node@20.19.11))':
- dependencies:
- '@babel/core': 7.28.3
- '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.3)
- '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.3)
- '@rolldown/pluginutils': 1.0.0-beta.27
- '@types/babel__core': 7.20.5
- react-refresh: 0.17.0
- vite: 5.4.19(@types/node@20.19.11)
- transitivePeerDependencies:
- - supports-color
-
- acorn-jsx@5.3.2(acorn@8.15.0):
- dependencies:
- acorn: 8.15.0
-
- acorn@8.15.0: {}
-
- ajv@6.12.6:
- dependencies:
- fast-deep-equal: 3.1.3
- fast-json-stable-stringify: 2.1.0
- json-schema-traverse: 0.4.1
- uri-js: 4.4.1
-
- ansi-regex@5.0.1: {}
-
- ansi-regex@6.1.0: {}
-
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
-
- ansi-styles@6.2.1: {}
-
- any-promise@1.3.0: {}
-
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
- arg@5.0.2: {}
-
- argparse@2.0.1: {}
-
- aria-hidden@1.2.6:
- dependencies:
- tslib: 2.8.1
-
- array-union@2.1.0: {}
-
- autoprefixer@10.4.21(postcss@8.5.6):
- dependencies:
- browserslist: 4.25.2
- caniuse-lite: 1.0.30001735
- fraction.js: 4.3.7
- normalize-range: 0.1.2
- picocolors: 1.1.1
- postcss: 8.5.6
- postcss-value-parser: 4.2.0
-
- balanced-match@1.0.2: {}
-
- binary-extensions@2.3.0: {}
-
- brace-expansion@1.1.12:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
- brace-expansion@2.0.2:
- dependencies:
- balanced-match: 1.0.2
-
- braces@3.0.3:
- dependencies:
- fill-range: 7.1.1
-
- browserslist@4.25.2:
- dependencies:
- caniuse-lite: 1.0.30001735
- electron-to-chromium: 1.5.202
- node-releases: 2.0.19
- update-browserslist-db: 1.1.3(browserslist@4.25.2)
-
- callsites@3.1.0: {}
-
- camelcase-css@2.0.1: {}
-
- caniuse-lite@1.0.30001735: {}
-
- chalk@4.1.2:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- chokidar@3.6.0:
- dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
-
- class-variance-authority@0.7.1:
- dependencies:
- clsx: 2.1.1
-
- classcat@5.0.5: {}
-
- clsx@2.1.1: {}
-
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
- commander@4.1.1: {}
-
- concat-map@0.0.1: {}
-
- convert-source-map@2.0.0: {}
-
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
- cssesc@3.0.0: {}
-
- csstype@3.1.3: {}
-
- d3-color@3.1.0: {}
-
- d3-dispatch@3.0.1: {}
-
- d3-drag@3.0.0:
- dependencies:
- d3-dispatch: 3.0.1
- d3-selection: 3.0.0
-
- d3-ease@3.0.1: {}
-
- d3-interpolate@3.0.1:
- dependencies:
- d3-color: 3.1.0
-
- d3-selection@3.0.0: {}
-
- d3-timer@3.0.1: {}
-
- d3-transition@3.0.1(d3-selection@3.0.0):
- dependencies:
- d3-color: 3.1.0
- d3-dispatch: 3.0.1
- d3-ease: 3.0.1
- d3-interpolate: 3.0.1
- d3-selection: 3.0.0
- d3-timer: 3.0.1
-
- d3-zoom@3.0.0:
- dependencies:
- d3-dispatch: 3.0.1
- d3-drag: 3.0.0
- d3-interpolate: 3.0.1
- d3-selection: 3.0.0
- d3-transition: 3.0.1(d3-selection@3.0.0)
-
- debug@4.4.1:
- dependencies:
- ms: 2.1.3
-
- deep-is@0.1.4: {}
-
- detect-node-es@1.1.0: {}
-
- didyoumean@1.2.2: {}
-
- dir-glob@3.0.1:
- dependencies:
- path-type: 4.0.0
-
- dlv@1.1.3: {}
-
- doctrine@3.0.0:
- dependencies:
- esutils: 2.0.3
-
- eastasianwidth@0.2.0: {}
-
- electron-to-chromium@1.5.202: {}
-
- emoji-regex@8.0.0: {}
-
- emoji-regex@9.2.2: {}
-
- esbuild@0.21.5:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.21.5
- '@esbuild/android-arm': 0.21.5
- '@esbuild/android-arm64': 0.21.5
- '@esbuild/android-x64': 0.21.5
- '@esbuild/darwin-arm64': 0.21.5
- '@esbuild/darwin-x64': 0.21.5
- '@esbuild/freebsd-arm64': 0.21.5
- '@esbuild/freebsd-x64': 0.21.5
- '@esbuild/linux-arm': 0.21.5
- '@esbuild/linux-arm64': 0.21.5
- '@esbuild/linux-ia32': 0.21.5
- '@esbuild/linux-loong64': 0.21.5
- '@esbuild/linux-mips64el': 0.21.5
- '@esbuild/linux-ppc64': 0.21.5
- '@esbuild/linux-riscv64': 0.21.5
- '@esbuild/linux-s390x': 0.21.5
- '@esbuild/linux-x64': 0.21.5
- '@esbuild/netbsd-x64': 0.21.5
- '@esbuild/openbsd-x64': 0.21.5
- '@esbuild/sunos-x64': 0.21.5
- '@esbuild/win32-arm64': 0.21.5
- '@esbuild/win32-ia32': 0.21.5
- '@esbuild/win32-x64': 0.21.5
-
- escalade@3.2.0: {}
-
- escape-string-regexp@4.0.0: {}
-
- eslint-plugin-react-hooks@4.6.2(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
-
- eslint-plugin-react-refresh@0.4.20(eslint@8.57.1):
- dependencies:
- eslint: 8.57.1
-
- eslint-scope@7.2.2:
- dependencies:
- esrecurse: 4.3.0
- estraverse: 5.3.0
-
- eslint-visitor-keys@3.4.3: {}
-
- eslint@8.57.1:
- dependencies:
- '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1)
- '@eslint-community/regexpp': 4.12.1
- '@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.57.1
- '@humanwhocodes/config-array': 0.13.0
- '@humanwhocodes/module-importer': 1.0.1
- '@nodelib/fs.walk': 1.2.8
- '@ungap/structured-clone': 1.3.0
- ajv: 6.12.6
- chalk: 4.1.2
- cross-spawn: 7.0.6
- debug: 4.4.1
- doctrine: 3.0.0
- escape-string-regexp: 4.0.0
- eslint-scope: 7.2.2
- eslint-visitor-keys: 3.4.3
- espree: 9.6.1
- esquery: 1.6.0
- esutils: 2.0.3
- fast-deep-equal: 3.1.3
- file-entry-cache: 6.0.1
- find-up: 5.0.0
- glob-parent: 6.0.2
- globals: 13.24.0
- graphemer: 1.4.0
- ignore: 5.3.2
- imurmurhash: 0.1.4
- is-glob: 4.0.3
- is-path-inside: 3.0.3
- js-yaml: 4.1.0
- json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
- lodash.merge: 4.6.2
- minimatch: 3.1.2
- natural-compare: 1.4.0
- optionator: 0.9.4
- strip-ansi: 6.0.1
- text-table: 0.2.0
- transitivePeerDependencies:
- - supports-color
-
- espree@9.6.1:
- dependencies:
- acorn: 8.15.0
- acorn-jsx: 5.3.2(acorn@8.15.0)
- eslint-visitor-keys: 3.4.3
-
- esquery@1.6.0:
- dependencies:
- estraverse: 5.3.0
-
- esrecurse@4.3.0:
- dependencies:
- estraverse: 5.3.0
-
- estraverse@5.3.0: {}
-
- esutils@2.0.3: {}
-
- fast-deep-equal@3.1.3: {}
-
- fast-glob@3.3.3:
- dependencies:
- '@nodelib/fs.stat': 2.0.5
- '@nodelib/fs.walk': 1.2.8
- glob-parent: 5.1.2
- merge2: 1.4.1
- micromatch: 4.0.8
-
- fast-json-stable-stringify@2.1.0: {}
-
- fast-levenshtein@2.0.6: {}
-
- fastq@1.19.1:
- dependencies:
- reusify: 1.1.0
-
- file-entry-cache@6.0.1:
- dependencies:
- flat-cache: 3.2.0
-
- fill-range@7.1.1:
- dependencies:
- to-regex-range: 5.0.1
-
- find-up@5.0.0:
- dependencies:
- locate-path: 6.0.0
- path-exists: 4.0.0
-
- flat-cache@3.2.0:
- dependencies:
- flatted: 3.3.3
- keyv: 4.5.4
- rimraf: 3.0.2
-
- flatted@3.3.3: {}
-
- foreground-child@3.3.1:
- dependencies:
- cross-spawn: 7.0.6
- signal-exit: 4.1.0
-
- fraction.js@4.3.7: {}
-
- fs.realpath@1.0.0: {}
-
- fsevents@2.3.3:
- optional: true
-
- function-bind@1.1.2: {}
-
- gensync@1.0.0-beta.2: {}
-
- get-nonce@1.0.1: {}
-
- glob-parent@5.1.2:
- dependencies:
- is-glob: 4.0.3
-
- glob-parent@6.0.2:
- dependencies:
- is-glob: 4.0.3
-
- glob@10.4.5:
- dependencies:
- foreground-child: 3.3.1
- jackspeak: 3.4.3
- minimatch: 9.0.5
- minipass: 7.1.2
- package-json-from-dist: 1.0.1
- path-scurry: 1.11.1
-
- glob@7.2.3:
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- globals@13.24.0:
- dependencies:
- type-fest: 0.20.2
-
- globby@11.1.0:
- dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.3
- ignore: 5.3.2
- merge2: 1.4.1
- slash: 3.0.0
-
- graphemer@1.4.0: {}
-
- has-flag@4.0.0: {}
-
- hasown@2.0.2:
- dependencies:
- function-bind: 1.1.2
-
- ignore@5.3.2: {}
-
- import-fresh@3.3.1:
- dependencies:
- parent-module: 1.0.1
- resolve-from: 4.0.0
-
- imurmurhash@0.1.4: {}
-
- inflight@1.0.6:
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
-
- inherits@2.0.4: {}
-
- is-binary-path@2.1.0:
- dependencies:
- binary-extensions: 2.3.0
-
- is-core-module@2.16.1:
- dependencies:
- hasown: 2.0.2
-
- is-extglob@2.1.1: {}
-
- is-fullwidth-code-point@3.0.0: {}
-
- is-glob@4.0.3:
- dependencies:
- is-extglob: 2.1.1
-
- is-number@7.0.0: {}
-
- is-path-inside@3.0.3: {}
-
- isexe@2.0.0: {}
-
- jackspeak@3.4.3:
- dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
-
- jiti@1.21.7: {}
-
- js-tokens@4.0.0: {}
-
- js-yaml@4.1.0:
- dependencies:
- argparse: 2.0.1
-
- jsesc@3.1.0: {}
-
- json-buffer@3.0.1: {}
-
- json-schema-traverse@0.4.1: {}
-
- json-stable-stringify-without-jsonify@1.0.1: {}
-
- json5@2.2.3: {}
-
- keyv@4.5.4:
- dependencies:
- json-buffer: 3.0.1
-
- levn@0.4.1:
- dependencies:
- prelude-ls: 1.2.1
- type-check: 0.4.0
-
- lilconfig@3.1.3: {}
-
- lines-and-columns@1.2.4: {}
-
- locate-path@6.0.0:
- dependencies:
- p-locate: 5.0.0
-
- lodash.merge@4.6.2: {}
-
- loose-envify@1.4.0:
- dependencies:
- js-tokens: 4.0.0
-
- lru-cache@10.4.3: {}
-
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
-
- lucide-react@0.294.0(react@18.3.1):
- dependencies:
- react: 18.3.1
-
- merge2@1.4.1: {}
-
- micromatch@4.0.8:
- dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
-
- minimatch@3.1.2:
- dependencies:
- brace-expansion: 1.1.12
-
- minimatch@9.0.3:
- dependencies:
- brace-expansion: 2.0.2
-
- minimatch@9.0.5:
- dependencies:
- brace-expansion: 2.0.2
-
- minipass@7.1.2: {}
-
- ms@2.1.3: {}
-
- mz@2.7.0:
- dependencies:
- any-promise: 1.3.0
- object-assign: 4.1.1
- thenify-all: 1.6.0
-
- nanoid@3.3.11: {}
-
- natural-compare@1.4.0: {}
-
- node-releases@2.0.19: {}
-
- normalize-path@3.0.0: {}
-
- normalize-range@0.1.2: {}
-
- object-assign@4.1.1: {}
-
- object-hash@3.0.0: {}
-
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
-
- optionator@0.9.4:
- dependencies:
- deep-is: 0.1.4
- fast-levenshtein: 2.0.6
- levn: 0.4.1
- prelude-ls: 1.2.1
- type-check: 0.4.0
- word-wrap: 1.2.5
-
- p-limit@3.1.0:
- dependencies:
- yocto-queue: 0.1.0
-
- p-locate@5.0.0:
- dependencies:
- p-limit: 3.1.0
-
- package-json-from-dist@1.0.1: {}
-
- parent-module@1.0.1:
- dependencies:
- callsites: 3.1.0
-
- path-exists@4.0.0: {}
-
- path-is-absolute@1.0.1: {}
-
- path-key@3.1.1: {}
-
- path-parse@1.0.7: {}
-
- path-scurry@1.11.1:
- dependencies:
- lru-cache: 10.4.3
- minipass: 7.1.2
-
- path-type@4.0.0: {}
-
- picocolors@1.1.1: {}
-
- picomatch@2.3.1: {}
-
- pify@2.3.0: {}
-
- pirates@4.0.7: {}
-
- postcss-import@15.1.0(postcss@8.5.6):
- dependencies:
- postcss: 8.5.6
- postcss-value-parser: 4.2.0
- read-cache: 1.0.0
- resolve: 1.22.10
-
- postcss-js@4.0.1(postcss@8.5.6):
- dependencies:
- camelcase-css: 2.0.1
- postcss: 8.5.6
-
- postcss-load-config@4.0.2(postcss@8.5.6):
- dependencies:
- lilconfig: 3.1.3
- yaml: 2.8.1
- optionalDependencies:
- postcss: 8.5.6
-
- postcss-nested@6.2.0(postcss@8.5.6):
- dependencies:
- postcss: 8.5.6
- postcss-selector-parser: 6.1.2
-
- postcss-selector-parser@6.1.2:
- dependencies:
- cssesc: 3.0.0
- util-deprecate: 1.0.2
-
- postcss-value-parser@4.2.0: {}
-
- postcss@8.5.6:
- dependencies:
- nanoid: 3.3.11
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- prelude-ls@1.2.1: {}
-
- punycode@2.3.1: {}
-
- queue-microtask@1.2.3: {}
-
- react-dom@18.3.1(react@18.3.1):
- dependencies:
- loose-envify: 1.4.0
- react: 18.3.1
- scheduler: 0.23.2
-
- react-hook-form@7.62.0(react@18.3.1):
- dependencies:
- react: 18.3.1
-
- react-refresh@0.17.0: {}
-
- react-remove-scroll-bar@2.3.8(@types/react@18.3.23)(react@18.3.1):
- dependencies:
- react: 18.3.1
- react-style-singleton: 2.2.3(@types/react@18.3.23)(react@18.3.1)
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- react-remove-scroll@2.7.1(@types/react@18.3.23)(react@18.3.1):
- dependencies:
- react: 18.3.1
- react-remove-scroll-bar: 2.3.8(@types/react@18.3.23)(react@18.3.1)
- react-style-singleton: 2.2.3(@types/react@18.3.23)(react@18.3.1)
- tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@18.3.23)(react@18.3.1)
- use-sidecar: 1.1.3(@types/react@18.3.23)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
-
- react-style-singleton@2.2.3(@types/react@18.3.23)(react@18.3.1):
- dependencies:
- get-nonce: 1.0.1
- react: 18.3.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- react@18.3.1:
- dependencies:
- loose-envify: 1.4.0
-
- reactflow@11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
- dependencies:
- '@reactflow/background': 11.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@reactflow/controls': 11.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@reactflow/core': 11.11.4(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@reactflow/minimap': 11.7.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@reactflow/node-resizer': 2.2.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@reactflow/node-toolbar': 1.3.14(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - immer
-
- read-cache@1.0.0:
- dependencies:
- pify: 2.3.0
-
- readdirp@3.6.0:
- dependencies:
- picomatch: 2.3.1
-
- resolve-from@4.0.0: {}
-
- resolve@1.22.10:
- dependencies:
- is-core-module: 2.16.1
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
- reusify@1.1.0: {}
-
- rimraf@3.0.2:
- dependencies:
- glob: 7.2.3
-
- rollup@4.46.2:
- dependencies:
- '@types/estree': 1.0.8
- optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.46.2
- '@rollup/rollup-android-arm64': 4.46.2
- '@rollup/rollup-darwin-arm64': 4.46.2
- '@rollup/rollup-darwin-x64': 4.46.2
- '@rollup/rollup-freebsd-arm64': 4.46.2
- '@rollup/rollup-freebsd-x64': 4.46.2
- '@rollup/rollup-linux-arm-gnueabihf': 4.46.2
- '@rollup/rollup-linux-arm-musleabihf': 4.46.2
- '@rollup/rollup-linux-arm64-gnu': 4.46.2
- '@rollup/rollup-linux-arm64-musl': 4.46.2
- '@rollup/rollup-linux-loongarch64-gnu': 4.46.2
- '@rollup/rollup-linux-ppc64-gnu': 4.46.2
- '@rollup/rollup-linux-riscv64-gnu': 4.46.2
- '@rollup/rollup-linux-riscv64-musl': 4.46.2
- '@rollup/rollup-linux-s390x-gnu': 4.46.2
- '@rollup/rollup-linux-x64-gnu': 4.46.2
- '@rollup/rollup-linux-x64-musl': 4.46.2
- '@rollup/rollup-win32-arm64-msvc': 4.46.2
- '@rollup/rollup-win32-ia32-msvc': 4.46.2
- '@rollup/rollup-win32-x64-msvc': 4.46.2
- fsevents: 2.3.3
-
- run-parallel@1.2.0:
- dependencies:
- queue-microtask: 1.2.3
-
- scheduler@0.23.2:
- dependencies:
- loose-envify: 1.4.0
-
- semver@6.3.1: {}
-
- semver@7.7.2: {}
-
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- signal-exit@4.1.0: {}
-
- slash@3.0.0: {}
-
- source-map-js@1.2.1: {}
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
- string-width@5.1.2:
- dependencies:
- eastasianwidth: 0.2.0
- emoji-regex: 9.2.2
- strip-ansi: 7.1.0
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- strip-ansi@7.1.0:
- dependencies:
- ansi-regex: 6.1.0
-
- strip-json-comments@3.1.1: {}
-
- sucrase@3.35.0:
- dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- commander: 4.1.1
- glob: 10.4.5
- lines-and-columns: 1.2.4
- mz: 2.7.0
- pirates: 4.0.7
- ts-interface-checker: 0.1.13
-
- supports-color@7.2.0:
- dependencies:
- has-flag: 4.0.0
-
- supports-preserve-symlinks-flag@1.0.0: {}
-
- tailwind-merge@2.6.0: {}
-
- tailwindcss-animate@1.0.7(tailwindcss@3.4.17):
- dependencies:
- tailwindcss: 3.4.17
-
- tailwindcss@3.4.17:
- dependencies:
- '@alloc/quick-lru': 5.2.0
- arg: 5.0.2
- chokidar: 3.6.0
- didyoumean: 1.2.2
- dlv: 1.1.3
- fast-glob: 3.3.3
- glob-parent: 6.0.2
- is-glob: 4.0.3
- jiti: 1.21.7
- lilconfig: 3.1.3
- micromatch: 4.0.8
- normalize-path: 3.0.0
- object-hash: 3.0.0
- picocolors: 1.1.1
- postcss: 8.5.6
- postcss-import: 15.1.0(postcss@8.5.6)
- postcss-js: 4.0.1(postcss@8.5.6)
- postcss-load-config: 4.0.2(postcss@8.5.6)
- postcss-nested: 6.2.0(postcss@8.5.6)
- postcss-selector-parser: 6.1.2
- resolve: 1.22.10
- sucrase: 3.35.0
- transitivePeerDependencies:
- - ts-node
-
- text-table@0.2.0: {}
-
- thenify-all@1.6.0:
- dependencies:
- thenify: 3.3.1
-
- thenify@3.3.1:
- dependencies:
- any-promise: 1.3.0
-
- to-regex-range@5.0.1:
- dependencies:
- is-number: 7.0.0
-
- ts-api-utils@1.4.3(typescript@5.9.2):
- dependencies:
- typescript: 5.9.2
-
- ts-interface-checker@0.1.13: {}
-
- tslib@2.8.1: {}
-
- type-check@0.4.0:
- dependencies:
- prelude-ls: 1.2.1
-
- type-fest@0.20.2: {}
-
- typescript@5.9.2: {}
-
- undici-types@6.21.0: {}
-
- update-browserslist-db@1.1.3(browserslist@4.25.2):
- dependencies:
- browserslist: 4.25.2
- escalade: 3.2.0
- picocolors: 1.1.1
-
- uri-js@4.4.1:
- dependencies:
- punycode: 2.3.1
-
- use-callback-ref@1.3.3(@types/react@18.3.23)(react@18.3.1):
- dependencies:
- react: 18.3.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- use-sidecar@1.1.3(@types/react@18.3.23)(react@18.3.1):
- dependencies:
- detect-node-es: 1.1.0
- react: 18.3.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.23
-
- use-sync-external-store@1.5.0(react@18.3.1):
- dependencies:
- react: 18.3.1
-
- util-deprecate@1.0.2: {}
-
- vite@5.4.19(@types/node@20.19.11):
- dependencies:
- esbuild: 0.21.5
- postcss: 8.5.6
- rollup: 4.46.2
- optionalDependencies:
- '@types/node': 20.19.11
- fsevents: 2.3.3
-
- which@2.0.2:
- dependencies:
- isexe: 2.0.0
-
- word-wrap@1.2.5: {}
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@8.1.0:
- dependencies:
- ansi-styles: 6.2.1
- string-width: 5.1.2
- strip-ansi: 7.1.0
-
- wrappy@1.0.2: {}
-
- yallist@3.1.1: {}
-
- yaml@2.8.1: {}
-
- yocto-queue@0.1.0: {}
-
- zod@3.25.76: {}
-
- zustand@4.5.7(@types/react@18.3.23)(react@18.3.1):
- dependencies:
- use-sync-external-store: 1.5.0(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.23
- react: 18.3.1
diff --git a/studio/postcss.config.js b/studio/postcss.config.js
deleted file mode 100644
index 2e7af2b7..00000000
--- a/studio/postcss.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default {
- plugins: {
- tailwindcss: {},
- autoprefixer: {},
- },
-}
diff --git a/studio/src/App.css b/studio/src/App.css
deleted file mode 100644
index 3baff915..00000000
--- a/studio/src/App.css
+++ /dev/null
@@ -1,157 +0,0 @@
-@import 'tailwindcss/base';
-@import 'tailwindcss/components';
-@import 'tailwindcss/utilities';
-
-/* React Flow Customizations */
-.react-flow__node {
- font-family: inherit;
-}
-
-.react-flow__edge {
- stroke-width: 2px;
-}
-
-.react-flow__edge.selected {
- stroke: #3b82f6;
- stroke-width: 3px;
-}
-
-.react-flow__edge-path {
- stroke-width: inherit;
-}
-
-.react-flow__connection-line {
- stroke: #3b82f6;
- stroke-width: 3px;
- stroke-dasharray: 5, 5;
- animation: dash 1s linear infinite;
-}
-
-@keyframes dash {
- to {
- stroke-dashoffset: -10;
- }
-}
-
-/* Edge arrows */
-.react-flow__edge .react-flow__edge-path {
- stroke-width: inherit;
-}
-
-.react-flow__edge-path {
- stroke-linecap: round;
-}
-
-.react-flow__handle {
- width: 12px;
- height: 12px;
- border: 2px solid white;
- border-radius: 50%;
- transition: all 0.2s ease;
-}
-
-.react-flow__handle:hover {
- transform: scale(1.2);
- box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.2);
-}
-
-.react-flow__handle-connecting {
- background: #3b82f6;
- transform: scale(1.3);
- box-shadow: 0 0 0 6px rgba(59, 130, 246, 0.3);
-}
-
-.react-flow__handle-valid {
- background: #10b981;
- transform: scale(1.2);
- box-shadow: 0 0 0 4px rgba(16, 185, 129, 0.3);
-}
-
-/* Custom Edge Label Styles */
-.edge-label {
- background: white;
- border: 1px solid #e5e7eb;
- border-radius: 6px;
- box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
- font-size: 12px;
- padding: 4px 8px;
-}
-
-.edge-label.selected {
- border-color: #3b82f6;
- background: #eff6ff;
-}
-
-/* Focus styles for better accessibility */
-.react-flow__node:focus,
-.react-flow__node:focus-visible {
- outline: 2px solid #3b82f6;
- outline-offset: 2px;
-}
-
-/* Animation for node hover */
-.react-flow__node {
- transition: transform 0.1s ease, box-shadow 0.1s ease;
-}
-
-.react-flow__node:hover {
- transform: scale(1.02);
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
-}
-
-/* Utility Classes */
-.line-clamp-2 {
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-.line-clamp-3 {
- display: -webkit-box;
- -webkit-line-clamp: 3;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-/* YAML Preview Drawer Styles */
-.yaml-drawer {
- transition: width 0.3s ease-in-out;
-}
-
-.yaml-drawer-content {
- transition: opacity 0.3s ease-in-out;
-}
-
-/* Floating YAML Widget */
-.yaml-widget {
- transition: all 0.2s ease-in-out;
- animation: float 3s ease-in-out infinite;
-}
-
-.yaml-widget:hover {
- transform: translateY(-50%) scale(1.05);
-}
-
-@keyframes float {
- 0%, 100% { transform: translateY(-50%) translateX(0); }
- 50% { transform: translateY(-50%) translateX(-2px); }
-}
-
-/* Custom Scrollbar for YAML content */
-.yaml-content::-webkit-scrollbar {
- width: 8px;
-}
-
-.yaml-content::-webkit-scrollbar-track {
- background: #374151;
-}
-
-.yaml-content::-webkit-scrollbar-thumb {
- background: #6b7280;
- border-radius: 4px;
-}
-
-.yaml-content::-webkit-scrollbar-thumb:hover {
- background: #9ca3af;
-}
diff --git a/studio/src/App.tsx b/studio/src/App.tsx
deleted file mode 100644
index a362ad4f..00000000
--- a/studio/src/App.tsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import React, { useState } from 'react';
-import { ReactFlowProvider } from 'reactflow';
-import { useDesignerStore } from '@/store/designerStore';
-import { Button } from '@/components/ui/button';
-import { Plus, Settings, Route, Upload, CheckCircle } from 'lucide-react';
-import FlowCanvas from '@/components/flow/FlowCanvas';
-import Sidebar from '@/components/sidebar/Sidebar';
-import AgentEditor from '@/components/editors/AgentEditor';
-import RouterEditor from '@/components/editors/RouterEditor';
-import EdgeEditor from '@/components/editors/EdgeEditor';
-import YamlPreviewDrawer from '@/components/drawer/YamlPreviewDrawer';
-import ImportDialog from '@/components/dialogs/ImportDialog';
-import ValidationPanel from '@/components/panels/ValidationPanel';
-import './App.css';
-
-// Simplified Config Editor Modal
-const ConfigEditorModal: React.FC<{ isOpen: boolean; onClose: () => void }> = ({ isOpen, onClose }) => {
- if (!isOpen) return null;
-
- return (
-
-
-
Configuration
-
- Configuration editor coming soon! For now, tools and LLMs are pre-configured.
-
-
Close
-
-
- );
-};
-
-const ToolbarComponent: React.FC<{
- showValidation: boolean;
- setShowValidation: (show: boolean) => void;
-}> = ({ showValidation, setShowValidation }) => {
- const { openAgentEditor, openRouterEditor } = useDesignerStore();
- const [isConfigOpen, setIsConfigOpen] = useState(false);
- const [isImportOpen, setIsImportOpen] = useState(false);
-
- return (
- <>
-
-
-
Flo AI Studio
-
Visual Workflow Designer
-
-
-
openAgentEditor()}>
-
- Agent
-
-
openRouterEditor()}>
-
- Router
-
-
setIsImportOpen(true)}>
-
- Import
-
-
setShowValidation(!showValidation)}
- className={showValidation ? "bg-green-50 border-green-200" : ""}
- >
-
- Validate
-
-
setIsConfigOpen(true)}>
-
- Config
-
-
-
-
- setIsConfigOpen(false)} />
- setIsImportOpen(false)} />
- >
- );
-};
-
-function App() {
- const [showValidation, setShowValidation] = useState(true);
-
- return (
-
-
-
-
-
-
-
-
-
- {showValidation &&
}
-
-
- {/* Modals */}
-
-
-
-
- {/* YAML Preview Drawer */}
-
-
- );
-}
-
-export default App;
\ No newline at end of file
diff --git a/studio/src/components/dialogs/ImportDialog.tsx b/studio/src/components/dialogs/ImportDialog.tsx
deleted file mode 100644
index 320f4e24..00000000
--- a/studio/src/components/dialogs/ImportDialog.tsx
+++ /dev/null
@@ -1,203 +0,0 @@
-import React, { useState, useRef } from 'react';
-import {
- Dialog,
- DialogContent,
- DialogHeader,
- DialogTitle,
- DialogFooter,
-} from '@/components/ui/dialog';
-import { Button } from '@/components/ui/button';
-import { Textarea } from '@/components/ui/textarea';
-import { Label } from '@/components/ui/label';
-import { Upload, FileText, AlertCircle, CheckCircle } from 'lucide-react';
-import { useDesignerStore } from '@/store/designerStore';
-import { validateAriumYAML, readFileAsText } from '@/utils/yamlImport';
-
-interface ImportDialogProps {
- isOpen: boolean;
- onClose: () => void;
-}
-
-const ImportDialog: React.FC = ({ isOpen, onClose }) => {
- const { importFromYAML } = useDesignerStore();
- const [yamlContent, setYamlContent] = useState('');
- const [validationResult, setValidationResult] = useState<{ isValid: boolean; error?: string } | null>(null);
- const [isImporting, setIsImporting] = useState(false);
- const [importError, setImportError] = useState(null);
- const fileInputRef = useRef(null);
-
- const handleFileUpload = async (event: React.ChangeEvent) => {
- const file = event.target.files?.[0];
- if (!file) return;
-
- try {
- const content = await readFileAsText(file);
- setYamlContent(content);
- setImportError(null);
-
- // Validate the content
- const validation = validateAriumYAML(content);
- setValidationResult(validation);
- } catch (error) {
- setImportError(`Failed to read file: ${error instanceof Error ? error.message : 'Unknown error'}`);
- }
- };
-
- const handleYamlChange = (content: string) => {
- setYamlContent(content);
- setImportError(null);
-
- if (content.trim()) {
- const validation = validateAriumYAML(content);
- setValidationResult(validation);
- } else {
- setValidationResult(null);
- }
- };
-
- const handleImport = async () => {
- if (!yamlContent.trim()) {
- setImportError('Please provide YAML content to import');
- return;
- }
-
- setIsImporting(true);
- setImportError(null);
-
- try {
- await importFromYAML(yamlContent);
- onClose();
- resetDialog();
- } catch (error) {
- setImportError(`Import failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
- } finally {
- setIsImporting(false);
- }
- };
-
- const resetDialog = () => {
- setYamlContent('');
- setValidationResult(null);
- setImportError(null);
- if (fileInputRef.current) {
- fileInputRef.current.value = '';
- }
- };
-
- const handleClose = () => {
- resetDialog();
- onClose();
- };
-
- return (
-
-
-
-
-
- Import Workflow from YAML
-
-
-
-
- {/* File Upload */}
-
-
Upload YAML File
-
- fileInputRef.current?.click()}
- className="flex items-center gap-2"
- >
-
- Choose File
-
- or paste YAML content below
-
-
-
-
- {/* YAML Content */}
-
- YAML Content
-
-
- {/* Validation Result */}
- {validationResult && (
-
-
- {validationResult.isValid ? (
-
- ) : (
-
- )}
-
- {validationResult.isValid ? 'YAML is valid!' : 'YAML validation failed'}
-
-
- {validationResult.error && (
-
{validationResult.error}
- )}
-
- )}
-
- {/* Import Error */}
- {importError && (
-
- )}
-
- {/* Instructions */}
-
-
Import Instructions
-
- β’ Upload a YAML file exported from Flo AI Studio or created manually
- β’ The YAML must include an "arium" section with agents and workflow definition
- β’ Importing will replace your current workflow - export first if needed
- β’ Router configurations and tool references will be preserved
-
-
-
-
-
-
- Cancel
-
-
- {isImporting ? 'Importing...' : 'Import Workflow'}
-
-
-
-
- );
-};
-
-export default ImportDialog;
diff --git a/studio/src/components/drawer/YamlPreviewDrawer.tsx b/studio/src/components/drawer/YamlPreviewDrawer.tsx
deleted file mode 100644
index 0f8dc251..00000000
--- a/studio/src/components/drawer/YamlPreviewDrawer.tsx
+++ /dev/null
@@ -1,155 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { ChevronLeft, ChevronRight, Download, Copy, Eye, EyeOff } from 'lucide-react';
-import { Button } from '@/components/ui/button';
-import { useDesignerStore } from '@/store/designerStore';
-import { generateAriumYAML, downloadYAML } from '@/utils/yamlExport';
-
-const YamlPreviewDrawer: React.FC = () => {
- const [isExpanded, setIsExpanded] = useState(false);
- const [yamlContent, setYamlContent] = useState('');
- const [copied, setCopied] = useState(false);
-
- const { nodes, edges, workflowName, workflowDescription, workflowVersion, startNodeId, endNodeIds } = useDesignerStore();
-
- // Update YAML content when workflow changes
- useEffect(() => {
- if (nodes.length > 0) {
- try {
- const yaml = generateAriumYAML({
- nodes,
- edges,
- workflowName,
- workflowDescription,
- workflowVersion,
- startNodeId,
- endNodeIds,
- });
- setYamlContent(yaml);
- } catch (error) {
- setYamlContent(`# Error generating YAML preview:\n# ${error}`);
- }
- } else {
- setYamlContent('# Create agents and connect them to see YAML preview\n# Drag agents from the sidebar to get started');
- }
- }, [nodes, edges, workflowName, workflowDescription, workflowVersion, startNodeId, endNodeIds]);
-
- const handleExport = () => {
- if (nodes.length > 0) {
- const yaml = generateAriumYAML({
- nodes,
- edges,
- workflowName,
- workflowDescription,
- workflowVersion,
- startNodeId,
- endNodeIds,
- });
- downloadYAML(yaml, `${workflowName.replace(/\s+/g, '-').toLowerCase()}.yaml`);
- }
- };
-
- const handleCopy = async () => {
- try {
- await navigator.clipboard.writeText(yamlContent);
- setCopied(true);
- setTimeout(() => setCopied(false), 2000);
- } catch (error) {
- console.error('Failed to copy YAML:', error);
- }
- };
-
- const toggleDrawer = () => {
- setIsExpanded(!isExpanded);
- };
-
- return (
- <>
- {/* Floating Toggle Widget */}
- {!isExpanded && (
-
-
-
- YAML
-
-
- )}
-
- {/* Expanded Drawer */}
- {isExpanded && (
-
- {/* Close Button */}
-
-
-
-
- {/* Drawer Content */}
-
- {/* Header */}
-
-
-
-
YAML Preview
-
-
-
-
-
-
- {/* Actions */}
-
-
-
-
- Export YAML
-
-
-
- {copied && β }
-
-
-
-
- {/* YAML Content */}
-
-
- {/* Footer */}
-
-
- {nodes.length} agent{nodes.length !== 1 ? 's' : ''} β’ {edges.length} connection{edges.length !== 1 ? 's' : ''}
-
-
-
-
- )}
- >
- );
-};
-
-export default YamlPreviewDrawer;
diff --git a/studio/src/components/editors/AgentEditor.tsx b/studio/src/components/editors/AgentEditor.tsx
deleted file mode 100644
index 41f55c5f..00000000
--- a/studio/src/components/editors/AgentEditor.tsx
+++ /dev/null
@@ -1,358 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import {
- Dialog,
- DialogContent,
- DialogHeader,
- DialogTitle,
- DialogFooter,
-} from '@/components/ui/dialog';
-import { Button } from '@/components/ui/button';
-import { Input } from '@/components/ui/input';
-import { Label } from '@/components/ui/label';
-import { Textarea } from '@/components/ui/textarea';
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from '@/components/ui/select';
-import { Play, Square, Flag } from 'lucide-react';
-import { useDesignerStore } from '@/store/designerStore';
-import { Agent } from '@/types/agent';
-import { cn } from '@/lib/utils';
-
-const AgentEditor: React.FC = () => {
- const {
- isAgentEditorOpen,
- closeAgentEditor,
- selectedNode,
- updateAgent,
- addAgent,
- config,
- startNodeId,
- endNodeIds,
- setStartNode,
- toggleEndNode,
- } = useDesignerStore();
-
- const [formData, setFormData] = useState({
- name: '',
- role: '',
- job: '',
- provider: 'openai' as const,
- modelName: 'gpt-4o-mini',
- temperature: 0.7,
- maxRetries: 3,
- reasoningPattern: 'DIRECT' as const,
- tools: [] as string[],
- });
-
- const [isNewAgent, setIsNewAgent] = useState(false);
-
- useEffect(() => {
- if (selectedNode && selectedNode.type === 'agent') {
- const agentData = selectedNode.data as any;
- const agent = agentData.agent;
- setIsNewAgent(false);
-
- setFormData({
- name: agent.name || '',
- role: agent.role || '',
- job: agent.job || '',
- provider: agent.model.provider || 'openai',
- modelName: agent.model.name || 'gpt-4o-mini',
- temperature: agent.settings?.temperature || 0.7,
- maxRetries: agent.settings?.max_retries || 3,
- reasoningPattern: agent.settings?.reasoning_pattern || 'DIRECT',
- tools: agent.tools || [],
- });
- } else if (isAgentEditorOpen) {
- setIsNewAgent(true);
- setFormData({
- name: '',
- role: '',
- job: '',
- provider: 'openai',
- modelName: 'gpt-4o-mini',
- temperature: 0.7,
- maxRetries: 3,
- reasoningPattern: 'DIRECT',
- tools: [],
- });
- }
- }, [selectedNode, isAgentEditorOpen]);
-
- const handleSubmit = (e: React.FormEvent) => {
- e.preventDefault();
-
- const agent: Agent = {
- id: isNewAgent ? `agent_${Date.now()}` : selectedNode!.id,
- name: formData.name,
- role: formData.role || undefined,
- job: formData.job,
- model: {
- provider: formData.provider,
- name: formData.modelName,
- },
- settings: {
- temperature: formData.temperature,
- max_retries: formData.maxRetries,
- reasoning_pattern: formData.reasoningPattern,
- },
- tools: formData.tools.length > 0 ? formData.tools : undefined,
- };
-
- if (isNewAgent) {
- addAgent(agent, { x: 100, y: 100 });
- } else {
- updateAgent(agent.id, agent);
- }
-
- closeAgentEditor();
- };
-
- const availableModels = config.availableLLMs.filter(
- (llm) => llm.provider === formData.provider
- );
-
- const handleToolToggle = (toolName: string) => {
- setFormData(prev => ({
- ...prev,
- tools: prev.tools.includes(toolName)
- ? prev.tools.filter(t => t !== toolName)
- : [...prev.tools, toolName]
- }));
- };
-
- const currentNodeId = selectedNode?.id;
- const isCurrentStart = currentNodeId === startNodeId;
- const isCurrentEnd = currentNodeId ? endNodeIds.includes(currentNodeId) : false;
-
- const handleSetStart = () => {
- if (currentNodeId && !isNewAgent) {
- setStartNode(currentNodeId);
- }
- };
-
- const handleToggleEnd = () => {
- if (currentNodeId && !isNewAgent) {
- toggleEndNode(currentNodeId);
- }
- };
-
- return (
-
-
-
-
- {isNewAgent ? 'Create New Agent' : 'Edit Agent'}
-
-
-
-
-
-
- );
-};
-
-export default AgentEditor;
diff --git a/studio/src/components/editors/EdgeEditor.tsx b/studio/src/components/editors/EdgeEditor.tsx
deleted file mode 100644
index 4b821a7d..00000000
--- a/studio/src/components/editors/EdgeEditor.tsx
+++ /dev/null
@@ -1,186 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import {
- Dialog,
- DialogContent,
- DialogHeader,
- DialogTitle,
- DialogFooter,
-} from '@/components/ui/dialog';
-import { Button } from '@/components/ui/button';
-import { Label } from '@/components/ui/label';
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from '@/components/ui/select';
-import { Textarea } from '@/components/ui/textarea';
-import { useDesignerStore } from '@/store/designerStore';
-
-const EdgeEditor: React.FC = () => {
- const {
- isEdgeEditorOpen,
- closeEdgeEditor,
- selectedEdge,
- updateEdge,
- config,
- } = useDesignerStore();
-
- const [formData, setFormData] = useState({
- router: 'none',
- label: '',
- description: '',
- animated: false,
- style: 'default' as 'default' | 'step' | 'smoothstep' | 'straight',
- });
-
- useEffect(() => {
- if (selectedEdge) {
- setFormData({
- router: selectedEdge.data?.router || 'none',
- label: selectedEdge.data?.label || '',
- description: selectedEdge.data?.description || '',
- animated: selectedEdge.animated || false,
- style: (selectedEdge.type as 'default' | 'step' | 'smoothstep' | 'straight') || 'default',
- });
- }
- }, [selectedEdge]);
-
- const handleSubmit = (e: React.FormEvent) => {
- e.preventDefault();
-
- if (selectedEdge) {
- updateEdge(selectedEdge.id, {
- ...selectedEdge,
- data: {
- ...selectedEdge.data,
- router: formData.router === 'none' ? undefined : formData.router,
- label: formData.router === 'none' ? (formData.label || undefined) : formData.router,
- description: formData.description || undefined,
- },
- animated: formData.animated,
- type: formData.style === 'default' ? 'custom' : formData.style,
- });
- }
- closeEdgeEditor();
- };
-
- const selectedRouterConfig = formData.router !== 'none'
- ? config.availableRouters.find((router) => router.name === formData.router)
- : null;
-
- return (
-
-
-
- Configure Edge Router
-
-
-
-
- Router Function
- setFormData(prev => ({ ...prev, router: value }))}
- >
-
-
-
-
- No router (direct connection)
- {config.availableRouters.map((router) => (
-
- {router.name}
-
- ))}
-
-
-
-
- {selectedRouterConfig && (
-
-
- Router Description
-
-
- {selectedRouterConfig.description}
-
- {selectedRouterConfig.code && (
-
-
Implementation:
-
- {selectedRouterConfig.code}
-
-
- )}
-
- )}
-
- {formData.router === 'none' && (
-
- Connection Label (Optional)
- setFormData(prev => ({ ...prev, label: e.target.value }))}
- placeholder="e.g., 'Next', 'Success', 'Error'"
- className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm"
- />
-
- )}
-
-
-
- Connection Style
- setFormData(prev => ({ ...prev, style: value as any }))}
- >
-
-
-
-
- Default (Bezier)
- Step
- Smooth Step
- Straight
-
-
-
-
-
- setFormData(prev => ({ ...prev, animated: e.target.checked }))}
- className="rounded"
- />
- Animated connection
-
-
-
-
- Connection Notes (Optional)
- setFormData(prev => ({ ...prev, description: e.target.value }))}
- placeholder="Add notes about this connection..."
- rows={3}
- />
-
-
-
-
- Cancel
-
- Update Connection
-
-
-
-
- );
-};
-
-export default EdgeEditor;
diff --git a/studio/src/components/editors/RouterEditor.tsx b/studio/src/components/editors/RouterEditor.tsx
deleted file mode 100644
index 39e05a20..00000000
--- a/studio/src/components/editors/RouterEditor.tsx
+++ /dev/null
@@ -1,567 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import {
- Dialog,
- DialogContent,
- DialogHeader,
- DialogTitle,
- DialogFooter,
-} from '@/components/ui/dialog';
-import { Button } from '@/components/ui/button';
-import { Input } from '@/components/ui/input';
-import { Label } from '@/components/ui/label';
-import { Textarea } from '@/components/ui/textarea';
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from '@/components/ui/select';
-import { useDesignerStore } from '@/store/designerStore';
-import { Router } from '@/types/agent';
-
-const RouterEditor: React.FC = () => {
- const {
- isRouterEditorOpen,
- closeRouterEditor,
- selectedNode,
- updateRouter,
- addRouter,
- config,
- } = useDesignerStore();
-
- const [formData, setFormData] = useState({
- name: '',
- description: '',
- type: 'smart' as 'smart' | 'task_classifier' | 'conversation_analysis' | 'reflection' | 'plan_execute' | 'custom',
- provider: 'openai' as 'openai' | 'anthropic' | 'gemini' | 'ollama',
- modelName: 'gpt-4o-mini',
- temperature: 0.3,
- fallbackStrategy: 'first' as 'first' | 'last' | 'random',
- routingOptions: {} as Record,
- taskCategories: {} as Record,
- flowPattern: [] as string[],
- allowEarlyExit: false,
- });
-
- const [routingOptionKey, setRoutingOptionKey] = useState('');
- const [routingOptionValue, setRoutingOptionValue] = useState('');
- const [taskCategoryKey, setTaskCategoryKey] = useState('');
- const [taskCategoryDesc, setTaskCategoryDesc] = useState('');
- const [taskKeywords, setTaskKeywords] = useState('');
- const [taskExamples, setTaskExamples] = useState('');
- const [flowAgent, setFlowAgent] = useState('');
- const [isNewRouter, setIsNewRouter] = useState(false);
-
- useEffect(() => {
- if (selectedNode && selectedNode.type === 'router') {
- const routerData = selectedNode.data as any;
- const router = routerData.router;
- setIsNewRouter(false);
-
- setFormData({
- name: router.name || '',
- description: router.description || '',
- type: router.type || 'smart',
- provider: router.model?.provider || 'openai',
- modelName: router.model?.name || 'gpt-4o-mini',
- temperature: router.settings?.temperature || 0.3,
- fallbackStrategy: router.settings?.fallback_strategy || 'first',
- routingOptions: router.routing_options || {},
- taskCategories: router.task_categories || {},
- flowPattern: router.flow_pattern || [],
- allowEarlyExit: router.settings?.allow_early_exit || false,
- });
-
- // Clear the input fields when editing
- setRoutingOptionKey('');
- setRoutingOptionValue('');
- } else if (isRouterEditorOpen) {
- setIsNewRouter(true);
- setFormData({
- name: '',
- description: '',
- type: 'smart',
- provider: 'openai',
- modelName: 'gpt-4o-mini',
- temperature: 0.3,
- fallbackStrategy: 'first',
- routingOptions: {},
- taskCategories: {},
- flowPattern: [],
- allowEarlyExit: false,
- });
- }
- }, [selectedNode, isRouterEditorOpen]);
-
- const handleSubmit = (e: React.FormEvent) => {
- e.preventDefault();
-
- const router: Router = {
- id: isNewRouter ? `router_${Date.now()}` : selectedNode!.id,
- name: formData.name,
- description: formData.description,
- type: formData.type,
- model: formData.type !== 'custom' ? {
- provider: formData.provider,
- name: formData.modelName,
- } : undefined,
- settings: formData.type !== 'custom' ? {
- temperature: formData.temperature,
- fallback_strategy: formData.fallbackStrategy,
- ...(formData.type === 'reflection' && { allow_early_exit: formData.allowEarlyExit }),
- } : undefined,
- routing_options: (formData.type === 'smart' || formData.type === 'conversation_analysis')
- ? formData.routingOptions : undefined,
- task_categories: formData.type === 'task_classifier'
- ? formData.taskCategories : undefined,
- flow_pattern: formData.type === 'reflection'
- ? formData.flowPattern : undefined,
- };
-
- if (isNewRouter) {
- addRouter(router, { x: 100, y: 100 });
- } else {
- updateRouter(router.id!, router);
- }
-
- closeRouterEditor();
- };
-
- const addRoutingOption = () => {
- const trimmedKey = routingOptionKey.trim();
- const trimmedValue = routingOptionValue.trim();
-
- if (trimmedKey && trimmedValue) {
- // Check if key already exists
- if (formData.routingOptions[trimmedKey]) {
- alert(`Routing option "${trimmedKey}" already exists. Please use a different name.`);
- return;
- }
-
- setFormData(prev => ({
- ...prev,
- routingOptions: {
- ...prev.routingOptions,
- [trimmedKey]: trimmedValue,
- },
- }));
- setRoutingOptionKey('');
- setRoutingOptionValue('');
- }
- };
-
- const removeRoutingOption = (key: string) => {
- setFormData(prev => {
- const newOptions = { ...prev.routingOptions };
- delete newOptions[key];
- return { ...prev, routingOptions: newOptions };
- });
- };
-
- const addTaskCategory = () => {
- if (taskCategoryKey && taskCategoryDesc) {
- setFormData(prev => ({
- ...prev,
- taskCategories: {
- ...prev.taskCategories,
- [taskCategoryKey]: {
- description: taskCategoryDesc,
- keywords: taskKeywords.split(',').map(k => k.trim()).filter(k => k),
- examples: taskExamples.split(',').map(e => e.trim()).filter(e => e),
- },
- },
- }));
- setTaskCategoryKey('');
- setTaskCategoryDesc('');
- setTaskKeywords('');
- setTaskExamples('');
- }
- };
-
- const removeTaskCategory = (key: string) => {
- setFormData(prev => {
- const newCategories = { ...prev.taskCategories };
- delete newCategories[key];
- return { ...prev, taskCategories: newCategories };
- });
- };
-
- const addFlowAgent = () => {
- if (flowAgent) {
- setFormData(prev => ({
- ...prev,
- flowPattern: [...prev.flowPattern, flowAgent],
- }));
- setFlowAgent('');
- }
- };
-
- const removeFlowAgent = (index: number) => {
- setFormData(prev => ({
- ...prev,
- flowPattern: prev.flowPattern.filter((_, i) => i !== index),
- }));
- };
-
- const availableModels = config.availableLLMs.filter(
- (llm) => llm.provider === formData.provider
- );
-
- return (
-
-
-
-
- {isNewRouter ? 'Create New Router' : 'Edit Router'}
-
-
-
-
-
-
- Router Name *
- setFormData(prev => ({ ...prev, name: e.target.value }))}
- placeholder="e.g., Content Router"
- required
- />
-
-
- Router Type
- setFormData(prev => ({ ...prev, type: value as any }))}
- >
-
-
-
-
- Smart Router
- Task Classifier
- Conversation Analysis
- Reflection Router
- Plan Execute Router
- Custom Router
-
-
-
-
-
-
- Description *
- setFormData(prev => ({ ...prev, description: e.target.value }))}
- placeholder="Describe how this router works..."
- rows={3}
- required
- />
-
-
- {formData.type !== 'custom' && (
- <>
-
-
- LLM Provider
- {
- setFormData(prev => ({
- ...prev,
- provider: value as any,
- modelName: config.availableLLMs.find(llm => llm.provider === value)?.name || ''
- }));
- }}
- >
-
-
-
-
- OpenAI
- Anthropic
- Google Gemini
- Ollama
-
-
-
-
- Model
- setFormData(prev => ({ ...prev, modelName: value }))}
- >
-
-
-
-
- {availableModels.map((model) => (
-
- {model.name}
-
- ))}
-
-
-
-
-
-
-
- Temperature
- setFormData(prev => ({ ...prev, temperature: parseFloat(e.target.value) }))}
- />
-
-
- Fallback Strategy
- setFormData(prev => ({ ...prev, fallbackStrategy: value as any }))}
- >
-
-
-
-
- First Option
- Last Option
- Random Option
-
-
-
-
- >
- )}
-
- {/* Smart Router and Conversation Analysis Configuration */}
- {(formData.type === 'smart' || formData.type === 'conversation_analysis') && (
-
-
Routing Options
-
-
- setRoutingOptionKey(e.target.value)}
- onKeyDown={(e) => {
- if (e.key === 'Enter' && routingOptionKey.trim() && routingOptionValue.trim()) {
- e.preventDefault();
- addRoutingOption();
- }
- }}
- className="col-span-4"
- />
- setRoutingOptionValue(e.target.value)}
- onKeyDown={(e) => {
- if (e.key === 'Enter' && routingOptionKey.trim() && routingOptionValue.trim()) {
- e.preventDefault();
- addRoutingOption();
- }
- }}
- className="col-span-6"
- />
-
- Add
-
-
-
- {/* Helpful instructions */}
-
- Add routing targets and descriptions. Example: "technical_agent" β "Handle technical questions and documentation"
-
-
-
- {Object.keys(formData.routingOptions).length === 0 ? (
-
- No routing options added yet. Add agents or tools that this router should route to.
-
- ) : (
- Object.entries(formData.routingOptions).map(([key, value]) => (
-
-
- {key}: {value}
-
-
removeRoutingOption(key)}
- className="text-red-600 hover:text-red-800"
- >
- Γ
-
-
- ))
- )}
-
-
-
- )}
-
- {/* Task Classifier Configuration */}
- {formData.type === 'task_classifier' && (
-
-
Task Categories
-
-
-
-
- {Object.entries(formData.taskCategories).map(([key, category]) => (
-
-
- {key}
- removeTaskCategory(key)}
- className="text-red-600 hover:text-red-800"
- >
- Γ
-
-
-
{category.description}
-
- Keywords: {category.keywords.join(', ')}
-
-
- ))}
-
-
-
- )}
-
- {/* Reflection Router Configuration */}
- {formData.type === 'reflection' && (
-
-
Flow Pattern
-
-
- setFlowAgent(e.target.value)}
- className="flex-1"
- />
-
- Add
-
-
-
-
-
Pattern: {formData.flowPattern.join(' β ') || 'No pattern defined'}
-
- {formData.flowPattern.map((agent, index) => (
-
- {agent}
- removeFlowAgent(index)}
- className="ml-1 text-blue-600 hover:text-blue-800"
- >
- Γ
-
-
- ))}
-
-
-
-
- setFormData(prev => ({ ...prev, allowEarlyExit: e.target.checked }))}
- className="rounded"
- />
- Allow early exit from pattern
-
-
-
- )}
-
- {/* Plan Execute Router Configuration */}
- {formData.type === 'plan_execute' && (
-
-
Plan Execute Configuration
-
-
Plan Execute Router
-
- This router implements Cursor-style plan-and-execute workflows. It automatically coordinates
- between planning, execution, and review phases.
-
-
- β’ Planner: Creates detailed execution plans
- β’ Executor: Executes individual steps
- β’ Reviewer: Reviews and validates completed work
-
-
-
- )}
-
-
-
- Cancel
-
-
- {isNewRouter ? 'Create Router' : 'Update Router'}
-
-
-
-
-
- );
-};
-
-export default RouterEditor;
diff --git a/studio/src/components/flow/AgentNode.tsx b/studio/src/components/flow/AgentNode.tsx
deleted file mode 100644
index 230debce..00000000
--- a/studio/src/components/flow/AgentNode.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-import React from 'react';
-import { Handle, Position, NodeProps } from 'reactflow';
-import { Bot, Settings, Play, Square } from 'lucide-react';
-import { AgentNodeData } from '@/types/reactflow';
-import { useDesignerStore } from '@/store/designerStore';
-import { cn } from '@/lib/utils';
-
-const AgentNode: React.FC> = ({ data, selected, id }) => {
- const {
- openAgentEditor,
- deleteNode,
- startNodeId,
- endNodeIds
- } = useDesignerStore();
- const { agent } = data;
-
- const isStart = startNodeId === id;
- const isEnd = endNodeIds.includes(id);
-
- const handleEdit = () => {
- openAgentEditor({
- id,
- type: 'agent',
- position: { x: 0, y: 0 },
- data,
- });
- };
-
- const handleDelete = () => {
- deleteNode(id);
- };
-
- return (
-
- {/* Input Handle (Left) */}
-
-
- {/* Header */}
-
-
-
-
- {agent.name}
-
-
-
- {isStart && (
-
-
- Start
-
- )}
- {isEnd && (
-
-
- End
-
- )}
-
-
-
- {/* Content */}
-
- {agent.role && (
-
- Role: {agent.role}
-
- )}
-
-
- LLM: {agent.model.provider}/{agent.model.name}
-
-
- {agent.tools && agent.tools.length > 0 && (
-
- Tools: {agent.tools.slice(0, 2).join(', ')}
- {agent.tools.length > 2 && '...'}
-
- )}
-
-
- {agent.job}
-
-
-
- {/* Actions */}
-
-
-
- Edit
-
-
- Γ
-
-
-
- {/* Output Handle (Right) */}
-
-
- );
-};
-
-export default AgentNode;
diff --git a/studio/src/components/flow/CurvedEdge.tsx b/studio/src/components/flow/CurvedEdge.tsx
deleted file mode 100644
index ae0202f4..00000000
--- a/studio/src/components/flow/CurvedEdge.tsx
+++ /dev/null
@@ -1,72 +0,0 @@
-import React from 'react';
-import {
- BaseEdge,
- EdgeProps,
- getBezierPath,
-} from 'reactflow';
-import { CustomEdgeData } from '@/types/reactflow';
-
-const CurvedEdge: React.FC> = ({
- id,
- sourceX,
- sourceY,
- targetX,
- targetY,
- sourcePosition,
- targetPosition,
- data,
- selected,
-}) => {
- const [edgePath, labelX, labelY] = getBezierPath({
- sourceX,
- sourceY,
- sourcePosition,
- targetX,
- targetY,
- targetPosition,
- curvature: 0.25,
- });
-
- // Generate unique marker ID for this edge
- const markerId = `arrow-curved-${id}`;
-
- const edgeColor = selected ? '#3b82f6' : '#94a3b8';
-
- return (
- <>
- {/* Arrow marker definition */}
-
-
-
-
-
-
-
-
- >
- );
-};
-
-export default CurvedEdge;
diff --git a/studio/src/components/flow/CustomEdge.tsx b/studio/src/components/flow/CustomEdge.tsx
deleted file mode 100644
index 74c938ef..00000000
--- a/studio/src/components/flow/CustomEdge.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-import React from 'react';
-import {
- BaseEdge,
- EdgeLabelRenderer,
- EdgeProps,
- getBezierPath,
-} from 'reactflow';
-
-
-import { CustomEdgeData } from '@/types/reactflow';
-
-const CustomEdge: React.FC> = ({
- id,
- sourceX,
- sourceY,
- targetX,
- targetY,
- sourcePosition,
- targetPosition,
- data,
- selected,
-}) => {
- const [edgePath, labelX, labelY] = getBezierPath({
- sourceX,
- sourceY,
- sourcePosition,
- targetX,
- targetY,
- targetPosition,
- });
-
- // Generate unique marker ID for this edge
- const markerId = `arrow-${id}`;
-
-
-
- return (
- <>
- {/* Arrow marker definition */}
-
-
-
-
-
-
-
- {data?.router && (
-
-
-
-
- {data.router}
-
-
-
-
- )}
- >
- );
-};
-
-export default CustomEdge;
diff --git a/studio/src/components/flow/FlowCanvas.tsx b/studio/src/components/flow/FlowCanvas.tsx
deleted file mode 100644
index eddeddae..00000000
--- a/studio/src/components/flow/FlowCanvas.tsx
+++ /dev/null
@@ -1,126 +0,0 @@
-import React, { useCallback, useMemo } from 'react';
-import ReactFlow, {
- Controls,
- Background,
- useNodesState,
- useEdgesState,
- addEdge,
- Connection,
- NodeTypes,
- EdgeTypes,
-} from 'reactflow';
-import 'reactflow/dist/style.css';
-
-import { useDesignerStore } from '@/store/designerStore';
-import AgentNode from './AgentNode';
-import ToolNode from './ToolNode';
-import RouterNode from './RouterNode';
-import CustomEdge from './CustomEdge';
-import { FileText } from 'lucide-react';
-
-const nodeTypes: NodeTypes = {
- agent: AgentNode,
- tool: ToolNode,
- router: RouterNode,
-};
-
-const edgeTypes: EdgeTypes = {
- custom: CustomEdge,
-};
-
-const FlowCanvas: React.FC = () => {
- const {
- nodes,
- edges,
- onNodesChange,
- onEdgesChange,
- onConnect,
- setSelectedNode,
- setSelectedEdge,
- } = useDesignerStore();
-
- const [localNodes, setLocalNodes, onLocalNodesChange] = useNodesState(nodes);
- const [localEdges, setLocalEdges, onLocalEdgesChange] = useEdgesState(edges);
-
- // Sync store state with local state
- React.useEffect(() => {
- setLocalNodes(nodes);
- }, [nodes, setLocalNodes]);
-
- React.useEffect(() => {
- setLocalEdges(edges.map(edge => ({ ...edge, type: 'custom' })));
- }, [edges, setLocalEdges]);
-
- const handleNodesChange = useCallback((changes: any) => {
- onLocalNodesChange(changes);
- onNodesChange(changes);
- }, [onLocalNodesChange, onNodesChange]);
-
- const handleEdgesChange = useCallback((changes: any) => {
- onLocalEdgesChange(changes);
- onEdgesChange(changes);
- }, [onLocalEdgesChange, onEdgesChange]);
-
- const handleConnect = useCallback((connection: Connection) => {
- const newEdge = { ...connection, type: 'custom', data: {} };
- setLocalEdges((eds) => addEdge(newEdge, eds));
- onConnect(connection);
- }, [setLocalEdges, onConnect]);
-
- const handleNodeClick = useCallback((event: React.MouseEvent, node: any) => {
- setSelectedNode(node);
- }, [setSelectedNode]);
-
- const handleEdgeClick = useCallback((event: React.MouseEvent, edge: any) => {
- setSelectedEdge(edge);
- }, [setSelectedEdge]);
-
- const handlePaneClick = useCallback(() => {
- setSelectedNode(undefined);
- setSelectedEdge(undefined);
- }, [setSelectedNode, setSelectedEdge]);
-
- const proOptions = useMemo(() => ({ hideAttribution: true }), []);
-
- // Show empty state if no nodes
- if (localNodes.length === 0) {
- return (
-
-
-
-
Start Building Your Workflow
-
- Create agents, connect them with tools, and build powerful AI workflows.
- Click "Agent" in the toolbar to get started.
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
- );
-};
-
-export default FlowCanvas;
diff --git a/studio/src/components/flow/RouterNode.tsx b/studio/src/components/flow/RouterNode.tsx
deleted file mode 100644
index 5d1e7e92..00000000
--- a/studio/src/components/flow/RouterNode.tsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import React from 'react';
-import { Handle, Position, NodeProps } from 'reactflow';
-import { Route, Settings, Zap, GitBranch, RotateCcw, Workflow } from 'lucide-react';
-import { RouterNodeData } from '@/types/reactflow';
-import { useDesignerStore } from '@/store/designerStore';
-import { cn } from '@/lib/utils';
-
-const RouterNode: React.FC> = ({ data, selected, id }) => {
- const { openRouterEditor, deleteNode } = useDesignerStore();
- const { router, isEnd } = data;
-
- const handleEdit = () => {
- openRouterEditor({
- id,
- type: 'router',
- position: { x: 0, y: 0 },
- data,
- });
- };
-
- const handleDelete = () => {
- deleteNode(id);
- };
-
- const getRouterIcon = () => {
- switch (router.type) {
- case 'smart':
- return ;
- case 'task_classifier':
- return ;
- case 'conversation_analysis':
- return ;
- case 'reflection':
- return ;
- case 'plan_execute':
- return ;
- default:
- return ;
- }
- };
-
- const getRouterTypeLabel = () => {
- switch (router.type) {
- case 'smart':
- return 'Smart Router';
- case 'task_classifier':
- return 'Task Classifier';
- case 'conversation_analysis':
- return 'Conversation Router';
- case 'reflection':
- return 'Reflection Router';
- case 'plan_execute':
- return 'Plan Execute Router';
- default:
- return 'Custom Router';
- }
- };
-
- return (
-
- {/* Input Handle (Left) */}
-
-
- {/* Header */}
-
-
- {getRouterIcon()}
-
- {router.name}
-
-
-
-
- {/* Content */}
-
-
- Type: {getRouterTypeLabel()}
-
-
- {router.model && (
-
- LLM: {router.model.provider}/{router.model.name}
-
- )}
-
- {router.routing_options && Object.keys(router.routing_options).length > 0 && (
-
- Routes to: {Object.keys(router.routing_options).slice(0, 2).join(', ')}
- {Object.keys(router.routing_options).length > 2 && '...'}
-
- )}
-
-
- {router.description}
-
-
-
- {/* Actions */}
-
-
-
- Edit
-
-
- Γ
-
-
-
- {/* Output Handle (Right) */}
-
-
- );
-};
-
-export default RouterNode;
diff --git a/studio/src/components/flow/SmoothEdge.tsx b/studio/src/components/flow/SmoothEdge.tsx
deleted file mode 100644
index e4ebeb21..00000000
--- a/studio/src/components/flow/SmoothEdge.tsx
+++ /dev/null
@@ -1,107 +0,0 @@
-import React from 'react';
-import {
- BaseEdge,
- EdgeLabelRenderer,
- EdgeProps,
- getSmoothStepPath,
-} from 'reactflow';
-import { Route } from 'lucide-react';
-
-import { CustomEdgeData } from '@/types/reactflow';
-
-const SmoothEdge: React.FC> = ({
- id,
- sourceX,
- sourceY,
- targetX,
- targetY,
- sourcePosition,
- targetPosition,
- data,
- selected,
-}) => {
- const [edgePath, labelX, labelY] = getSmoothStepPath({
- sourceX,
- sourceY,
- sourcePosition,
- targetX,
- targetY,
- targetPosition,
- borderRadius: 20,
- offset: 20,
- });
-
- // Generate unique marker ID for this edge
- const markerId = `arrow-smooth-${id}`;
-
-
-
- // Determine edge color based on router type
- const getEdgeColor = () => {
- if (!data?.router) return selected ? '#3b82f6' : '#64748b';
-
- if (data.router.includes('reflection')) return selected ? '#9333ea' : '#a855f7';
- if (data.router.includes('plan_execute')) return selected ? '#ea580c' : '#f97316';
- return selected ? '#059669' : '#10b981';
- };
-
- const edgeColor = getEdgeColor();
-
- return (
- <>
- {/* Arrow marker definition */}
-
-
-
-
-
-
-
-
- {/* Only show label when there's a router */}
- {data?.router && (
-
-
-
-
-
- {data.router.replace(/_/g, ' ')}
-
-
-
-
- )}
- >
- );
-};
-
-export default SmoothEdge;
diff --git a/studio/src/components/flow/ToolNode.tsx b/studio/src/components/flow/ToolNode.tsx
deleted file mode 100644
index d9ad8dcb..00000000
--- a/studio/src/components/flow/ToolNode.tsx
+++ /dev/null
@@ -1,73 +0,0 @@
-import React from 'react';
-import { Handle, Position, NodeProps } from 'reactflow';
-import { Wrench, Square } from 'lucide-react';
-import { ToolNodeData } from '@/types/reactflow';
-import { useDesignerStore } from '@/store/designerStore';
-import { cn } from '@/lib/utils';
-
-const ToolNode: React.FC> = ({ data, selected, id }) => {
- const { deleteNode } = useDesignerStore();
- const { tool, isEnd } = data;
-
- const handleDelete = () => {
- deleteNode(id);
- };
-
- return (
-
- {/* Input Handle (Left) */}
-
-
- {/* Header */}
-
-
-
-
- {tool.name}
-
-
-
- {isEnd && }
-
-
-
- {/* Content */}
-
-
- {tool.description}
-
-
-
- {/* Actions */}
-
-
- Γ
-
-
-
- {/* Output Handle (Right) */}
-
-
- );
-};
-
-export default ToolNode;
diff --git a/studio/src/components/panels/ValidationPanel.tsx b/studio/src/components/panels/ValidationPanel.tsx
deleted file mode 100644
index 78f6a71a..00000000
--- a/studio/src/components/panels/ValidationPanel.tsx
+++ /dev/null
@@ -1,205 +0,0 @@
-import React, { useState, useEffect } from 'react';
-import { AlertCircle, AlertTriangle, Info, CheckCircle, ChevronDown, ChevronRight } from 'lucide-react';
-import { useDesignerStore } from '@/store/designerStore';
-import { validateWorkflow, ValidationResult, ValidationIssue, getValidationSummary } from '@/utils/workflowValidation';
-import { cn } from '@/lib/utils';
-
-const ValidationPanel: React.FC = () => {
- const { nodes, edges, setSelectedNode, setSelectedEdge, startNodeId, endNodeIds } = useDesignerStore();
- const [validationResult, setValidationResult] = useState(null);
- const [expandedSections, setExpandedSections] = useState>(new Set(['errors']));
-
- useEffect(() => {
- if (nodes.length > 0 || edges.length > 0) {
- const result = validateWorkflow(nodes, edges, startNodeId, endNodeIds);
- setValidationResult(result);
- } else {
- setValidationResult(null);
- }
- }, [nodes, edges, startNodeId, endNodeIds]);
-
- const toggleSection = (section: string) => {
- const newExpanded = new Set(expandedSections);
- if (newExpanded.has(section)) {
- newExpanded.delete(section);
- } else {
- newExpanded.add(section);
- }
- setExpandedSections(newExpanded);
- };
-
- const handleIssueClick = (issue: ValidationIssue) => {
- if (issue.nodeId) {
- const node = nodes.find(n => n.id === issue.nodeId);
- if (node) {
- setSelectedNode(node);
- }
- } else if (issue.edgeId) {
- const edge = edges.find(e => e.id === issue.edgeId);
- if (edge) {
- setSelectedEdge(edge);
- }
- }
- };
-
- const getIssueIcon = (type: ValidationIssue['type']) => {
- switch (type) {
- case 'error':
- return ;
- case 'warning':
- return ;
- case 'info':
- return ;
- default:
- return ;
- }
- };
-
- const IssueSection: React.FC<{
- title: string;
- issues: ValidationIssue[];
- sectionKey: string;
- }> = ({ title, issues, sectionKey }) => {
- const isExpanded = expandedSections.has(sectionKey);
-
- if (issues.length === 0) return null;
-
- return (
-
-
toggleSection(sectionKey)}
- className="w-full flex items-center justify-between p-3 hover:bg-gray-50 transition-colors"
- >
-
- {isExpanded ? (
-
- ) : (
-
- )}
-
- {title} ({issues.length})
-
-
-
-
- {isExpanded && (
-
- {issues.map((issue) => (
-
handleIssueClick(issue)}
- className={cn(
- "mx-3 p-2 rounded cursor-pointer transition-colors",
- "hover:bg-gray-100 border-l-2",
- issue.type === 'error' && "border-red-300 bg-red-50",
- issue.type === 'warning' && "border-yellow-300 bg-yellow-50",
- issue.type === 'info' && "border-blue-300 bg-blue-50"
- )}
- >
-
- {getIssueIcon(issue.type)}
-
-
{issue.message}
- {(issue.nodeId || issue.edgeId) && (
-
- {issue.nodeId ? `Node: ${issue.nodeId}` : `Edge: ${issue.edgeId}`}
-
- )}
-
-
-
- ))}
-
- )}
-
- );
- };
-
- if (!validationResult) {
- return (
-
-
-
-
Create agents to see validation results
-
-
- );
- }
-
- const { issues, warnings, suggestions, isValid } = validationResult;
-
- return (
-
- {/* Header */}
-
0 ? "bg-red-50" : "bg-yellow-50")
- )}>
-
- {isValid ? (
-
- ) : (
-
- )}
-
Workflow Validation
-
-
0 ? "text-red-700" : "text-yellow-700")
- )}>
- {getValidationSummary(validationResult)}
-
-
-
- {/* Validation Results */}
-
-
-
-
-
- {/* Validation Categories Summary */}
- {(issues.length > 0 || warnings.length > 0 || suggestions.length > 0) && (
-
-
Issue Categories
-
- {['structure', 'configuration', 'connectivity', 'best_practice'].map(category => {
- const categoryIssues = [
- ...issues.filter(i => i.category === category),
- ...warnings.filter(w => w.category === category),
- ...suggestions.filter(s => s.category === category),
- ];
-
- if (categoryIssues.length === 0) return null;
-
- return (
-
-
- {category.replace('_', ' ')}
-
-
- {categoryIssues.length}
-
-
- );
- })}
-
-
- )}
-
-
- );
-};
-
-export default ValidationPanel;
diff --git a/studio/src/components/sidebar/Sidebar.tsx b/studio/src/components/sidebar/Sidebar.tsx
deleted file mode 100644
index c7e98f11..00000000
--- a/studio/src/components/sidebar/Sidebar.tsx
+++ /dev/null
@@ -1,565 +0,0 @@
-import React, { useState } from 'react';
-import { Button } from '@/components/ui/button';
-import { Input } from '@/components/ui/input';
-import { Bot, Wrench, Search, Plus, Route } from 'lucide-react';
-import { useDesignerStore } from '@/store/designerStore';
-import { Agent, Tool, Router } from '@/types/agent';
-
-const Sidebar: React.FC = () => {
- const {
- config,
- addAgent,
- addTool,
- addRouter,
- openAgentEditor,
- openRouterEditor,
- onConnect,
- setStartNode,
- addEndNode
- } = useDesignerStore();
- const [searchTerm, setSearchTerm] = useState('');
-
- const filteredTools = config.availableTools.filter((tool) =>
- tool.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
- tool.description.toLowerCase().includes(searchTerm.toLowerCase())
- );
-
- const handleAddAgent = () => {
- openAgentEditor();
- };
-
- const handleAddRouter = () => {
- openRouterEditor();
- };
-
- const handleAddTool = (tool: Tool) => {
- const position = {
- x: Math.random() * 400 + 100,
- y: Math.random() * 400 + 100,
- };
- addTool(tool, position);
- };
-
- const createQuickAgent = (template: string) => {
- const templates = {
- analyzer: {
- name: 'Content Analyzer',
- role: 'Content Analyst',
- job: 'Analyze content and extract key insights, themes, and important information.',
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- },
- summarizer: {
- name: 'Summarizer',
- role: 'Summary Generator',
- job: 'Create concise, actionable summaries from analysis and content.',
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- },
- classifier: {
- name: 'Classifier',
- role: 'Content Classifier',
- job: 'Classify content into predefined categories and route accordingly.',
- model: { provider: 'anthropic' as const, name: 'claude-3-5-sonnet-20240620' },
- },
- researcher: {
- name: 'Researcher',
- role: 'Research Specialist',
- job: 'Research topics and gather comprehensive information using available tools.',
- model: { provider: 'openai' as const, name: 'gpt-4o' },
- tools: ['web_search'],
- },
- planner: {
- name: 'Planner Agent',
- role: 'Task Planner',
- job: 'You are an expert project planner who breaks down complex tasks into detailed, sequential steps. Create comprehensive execution plans with clear dependencies and assigned agents. When given a task, analyze it thoroughly and create a structured plan that can be executed step by step. Focus on logical sequencing, resource allocation, and clear deliverables for each step.',
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.3, reasoning_pattern: 'COT' as const },
- },
- executor: {
- name: 'Executor Agent',
- role: 'Task Executor',
- job: 'You are a task executor who implements plans step by step. Execute development tasks, research activities, or any assigned work with precision and attention to detail. Report on progress, identify blockers, and ensure each step is completed thoroughly before moving to the next. Focus on delivering high-quality results that meet the specified requirements.',
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.5, reasoning_pattern: 'DIRECT' as const },
- },
- critic: {
- name: 'Critic Agent',
- role: 'Quality Critic',
- job: 'You are a constructive critic who reviews work and provides actionable feedback. Analyze outputs for accuracy, completeness, clarity, and areas for improvement. Provide specific, detailed feedback that helps improve the quality of work. Focus on: logical consistency, thoroughness, clarity of communication, and alignment with requirements. Be constructive and specific in your criticism.',
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.3, reasoning_pattern: 'COT' as const },
- },
- finalizer: {
- name: 'Finalizer Agent',
- role: 'Quality Finalizer',
- job: 'You are the final agent responsible for polishing and finalizing work. Take refined outputs and ensure they meet high quality standards. Format professionally, add final touches, ensure consistency, and prepare the final deliverable. Focus on presentation, completeness, and professional polish while maintaining the core substance of the work.',
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.5, reasoning_pattern: 'DIRECT' as const },
- },
- };
-
- const template_config = templates[template as keyof typeof templates];
- if (template_config) {
- const agent: Agent = {
- id: `agent_${Date.now()}`,
- ...template_config,
- };
-
- const position = {
- x: Math.random() * 400 + 100,
- y: Math.random() * 400 + 100,
- };
-
- addAgent(agent, position);
- }
- };
-
- const createQuickRouter = (template: string) => {
- const routerTemplates = {
- smart: {
- name: 'Smart Router',
- description: 'Intelligent routing based on content analysis using LLM',
- type: 'smart' as const,
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.3, fallback_strategy: 'first' as const },
- routing_options: {
- 'technical_agent': 'Handle technical questions and documentation',
- 'business_agent': 'Handle business questions and strategy',
- 'general_agent': 'Handle general questions and conversations',
- },
- },
- classifier: {
- name: 'Task Classifier',
- description: 'Classify tasks based on keywords and examples',
- type: 'task_classifier' as const,
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.2, fallback_strategy: 'first' as const },
- },
- conversation: {
- name: 'Conversation Router',
- description: 'Route based on conversation flow analysis',
- type: 'conversation_analysis' as const,
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.1, fallback_strategy: 'first' as const, analysis_depth: 3 },
- routing_logic: {
- 'planner': 'Route here when planning is needed',
- 'executor': 'Route here when execution is needed',
- 'reviewer': 'Route here when review is needed',
- },
- },
- reflection: {
- name: 'Reflection Router',
- description: 'AβBβA pattern for reflection workflows',
- type: 'reflection' as const,
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.2, fallback_strategy: 'first' as const, allow_early_exit: false },
- flow_pattern: ['main_agent', 'critic', 'main_agent'],
- },
- plan_execute: {
- name: 'Plan Execute Router',
- description: 'Cursor-style plan-and-execute workflows',
- type: 'plan_execute' as const,
- model: { provider: 'openai' as const, name: 'gpt-4o-mini' },
- settings: { temperature: 0.1, fallback_strategy: 'first' as const },
- },
- };
-
- const template_config = routerTemplates[template as keyof typeof routerTemplates];
- if (template_config) {
- const router: Router = {
- id: `router_${Date.now()}`,
- ...template_config,
- };
-
- const position = {
- x: Math.random() * 400 + 100,
- y: Math.random() * 400 + 100,
- };
-
- addRouter(router, position);
- }
- };
-
- const createPlanExecuteWorkflow = () => {
- const timestamp = Date.now();
-
- // Create planner agent
- const planner: Agent = {
- id: `planner_${timestamp}`,
- name: 'Planner',
- role: 'Task Planner',
- job: 'You are an expert project planner who breaks down complex tasks into detailed, sequential steps. Create comprehensive execution plans with clear dependencies and assigned agents. When given a task, analyze it thoroughly and create a structured plan that can be executed step by step.',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.3, reasoning_pattern: 'COT' },
- };
-
- // Create executor agent
- const executor: Agent = {
- id: `executor_${timestamp}`,
- name: 'Executor',
- role: 'Task Executor',
- job: 'You are a task executor who implements plans step by step. Execute development tasks, research activities, or any assigned work with precision and attention to detail. Report on progress and ensure each step is completed thoroughly.',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.5, reasoning_pattern: 'DIRECT' },
- };
-
- // Create reviewer agent
- const reviewer: Agent = {
- id: `reviewer_${timestamp}`,
- name: 'Reviewer',
- role: 'Quality Reviewer',
- job: 'You are a quality reviewer who validates completed work. Review implementations for correctness, completeness, and quality. Provide final approval or request improvements. Ensure all requirements are met.',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.2, reasoning_pattern: 'COT' },
- };
-
- // Create plan-execute router
- const planExecuteRouter: Router = {
- id: `plan_execute_router_${timestamp}`,
- name: 'Plan Execute Router',
- description: 'Coordinates plan-and-execute workflow pattern',
- type: 'plan_execute',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.2, fallback_strategy: 'first' },
- };
-
- // Add agents and router to the workflow
- addAgent(planner, { x: 100, y: 100 });
- addAgent(executor, { x: 400, y: 100 });
- addAgent(reviewer, { x: 700, y: 100 });
- addRouter(planExecuteRouter, { x: 400, y: 250 });
-
- // Create edges for plan-execute pattern (agents connect through router)
- setTimeout(() => {
- // Agents connect through the router - router coordinates the workflow
-
- // Planner β Router
- onConnect({
- source: `planner_${timestamp}`,
- target: `plan_execute_router_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Router β Executor
- onConnect({
- source: `plan_execute_router_${timestamp}`,
- target: `executor_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Router β Reviewer
- onConnect({
- source: `plan_execute_router_${timestamp}`,
- target: `reviewer_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Executor β Router (for coordination)
- onConnect({
- source: `executor_${timestamp}`,
- target: `plan_execute_router_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Set initial start and end nodes for plan-execute workflow
- setStartNode(`planner_${timestamp}`);
- addEndNode(`reviewer_${timestamp}`);
-
- // The router connections will be converted to proper YAML workflow edges
- // with router fields by the YAML export logic
- }, 100);
- };
-
- const createReflectionWorkflow = () => {
- const timestamp = Date.now();
-
- // Create main agent
- const mainAgent: Agent = {
- id: `main_agent_${timestamp}`,
- name: 'Main Agent',
- role: 'Main Agent',
- job: 'You are the main agent responsible for analyzing tasks and creating initial solutions. When you receive input, analyze it thoroughly and provide an initial response. If you receive feedback from the critic, incorporate it to improve your work.',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.7, reasoning_pattern: 'COT' },
- };
-
- // Create critic agent
- const critic: Agent = {
- id: `critic_${timestamp}`,
- name: 'Critic',
- role: 'Quality Critic',
- job: 'You are a constructive critic who reviews work and provides actionable feedback. Analyze outputs for accuracy, completeness, clarity, and areas for improvement. Provide specific, detailed feedback that helps improve the quality of work.',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.3, reasoning_pattern: 'COT' },
- };
-
- // Create finalizer agent
- const finalizer: Agent = {
- id: `finalizer_${timestamp}`,
- name: 'Finalizer',
- role: 'Quality Finalizer',
- job: 'You are the final agent responsible for polishing and finalizing work. Take refined outputs and ensure they meet high quality standards. Format professionally and prepare the final deliverable.',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.5, reasoning_pattern: 'DIRECT' },
- };
-
- // Create reflection router
- const reflectionRouter: Router = {
- id: `reflection_router_${timestamp}`,
- name: 'Reflection Router',
- description: 'Coordinates AβBβAβC reflection workflow pattern',
- type: 'reflection',
- model: { provider: 'openai', name: 'gpt-4o-mini' },
- settings: { temperature: 0.2, fallback_strategy: 'first', allow_early_exit: false },
- flow_pattern: ['main_agent', 'critic', 'main_agent', 'finalizer'],
- };
-
- // Add agents and router to the workflow
- addAgent(mainAgent, { x: 100, y: 100 });
- addAgent(critic, { x: 400, y: 100 });
- addAgent(finalizer, { x: 700, y: 100 });
- addRouter(reflectionRouter, { x: 400, y: 250 });
-
- // Create edges for reflection pattern (agents connect through router)
- setTimeout(() => {
- // Agents connect through the router - router is the coordination hub
-
- // Main Agent β Router
- onConnect({
- source: `main_agent_${timestamp}`,
- target: `reflection_router_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Router β Critic
- onConnect({
- source: `reflection_router_${timestamp}`,
- target: `critic_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Router β Finalizer
- onConnect({
- source: `reflection_router_${timestamp}`,
- target: `finalizer_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Critic β Router (for reflection back)
- onConnect({
- source: `critic_${timestamp}`,
- target: `reflection_router_${timestamp}`,
- sourceHandle: null,
- targetHandle: null,
- });
-
- // Set initial start and end nodes for reflection workflow
- setStartNode(`main_agent_${timestamp}`);
- addEndNode(`finalizer_${timestamp}`);
-
- // The router connections will be converted to proper YAML workflow edges
- // with router fields by the YAML export logic
- }, 100);
- };
-
- return (
-
-
- {/* Quick Start */}
-
-
Quick Start
-
- Welcome to Flo AI Studio! Create agents and connect them to build powerful AI workflows.
-
-
-
-
- Agent
-
-
-
- Router
-
-
-
-
- {/* Quick Templates */}
-
-
Agent Templates
-
- {/* Core Agents */}
-
-
Core Agents
-
- {[
- { key: 'analyzer', name: 'Content Analyzer', desc: 'Analyze and extract insights' },
- { key: 'summarizer', name: 'Summarizer', desc: 'Create concise summaries' },
- { key: 'classifier', name: 'Classifier', desc: 'Classify and route content' },
- { key: 'researcher', name: 'Researcher', desc: 'Research with tools' },
- ].map((template) => (
-
createQuickAgent(template.key)}
- >
-
-
- {template.name}
-
-
{template.desc}
-
- ))}
-
-
-
- {/* Advanced Pattern Agents */}
-
-
Advanced Pattern Agents
-
- {[
- { key: 'planner', name: 'Planner Agent', desc: 'Break down tasks into execution plans' },
- { key: 'executor', name: 'Executor Agent', desc: 'Execute plans step by step' },
- { key: 'critic', name: 'Critic Agent', desc: 'Provide constructive feedback' },
- { key: 'finalizer', name: 'Finalizer Agent', desc: 'Polish and finalize outputs' },
- ].map((template) => (
-
createQuickAgent(template.key)}
- >
-
-
- {template.name}
-
-
{template.desc}
-
- ))}
-
-
-
-
- {/* Router Templates */}
-
-
Router Templates
-
- {[
- { key: 'smart', name: 'Smart Router', desc: 'LLM-powered intelligent routing based on content' },
- { key: 'classifier', name: 'Task Classifier', desc: 'Route based on task categories and keywords' },
- { key: 'conversation', name: 'Conversation Router', desc: 'Route based on conversation context analysis' },
- { key: 'reflection', name: 'Reflection Router', desc: 'AβBβAβC reflection patterns (needs main+critic agents)' },
- { key: 'plan_execute', name: 'Plan Execute Router', desc: 'Plan-and-execute workflows (needs planner+executor agents)' },
- ].map((template) => (
-
createQuickRouter(template.key)}
- >
-
-
- {template.name}
-
-
{template.desc}
-
- ))}
-
-
-
- {/* Available Tools */}
-
-
Available Tools
-
-
- setSearchTerm(e.target.value)}
- className="pl-10"
- />
-
-
-
- {filteredTools.map((tool) => (
-
handleAddTool(tool)}
- >
-
-
- {tool.name}
-
-
{tool.description}
-
- ))}
-
-
- {filteredTools.length === 0 && (
-
- )}
-
-
- {/* Quick Workflow Templates */}
-
-
Quick Workflows
-
-
createPlanExecuteWorkflow()}
- className="w-full p-3 border border-green-200 rounded-lg bg-green-50 hover:bg-green-100 transition-colors text-left"
- >
-
-
-
Plan-Execute Workflow
-
- Creates planner + executor + reviewer agents with plan-execute router
-
-
-
createReflectionWorkflow()}
- className="w-full p-3 border border-indigo-200 rounded-lg bg-indigo-50 hover:bg-indigo-100 transition-colors text-left"
- >
-
-
-
Reflection Workflow
-
- Creates main + critic + finalizer agents with reflection router
-
-
-
-
- {/* Getting Started */}
-
-
Getting Started
-
- 1. Try quick workflows above for advanced patterns
- 2. Or create agents using templates below
- 3. Connect agents by dragging from output to input
- 4. Add routers for intelligent routing
- 5. Export as YAML when ready
-
-
- π‘ Smart Routing: Reflection & Plan-Execute routers automatically track execution context to prevent infinite loops and manage complex flow patterns intelligently.
-
-
-
-
- );
-};
-
-export default Sidebar;
diff --git a/studio/src/components/ui/button.tsx b/studio/src/components/ui/button.tsx
deleted file mode 100644
index 208363eb..00000000
--- a/studio/src/components/ui/button.tsx
+++ /dev/null
@@ -1,52 +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 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
- secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-10 px-4 py-2",
- sm: "h-9 rounded-md px-3",
- lg: "h-11 rounded-md px-8",
- icon: "h-10 w-10",
- },
- },
- 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/studio/src/components/ui/dialog.tsx b/studio/src/components/ui/dialog.tsx
deleted file mode 100644
index 230cd304..00000000
--- a/studio/src/components/ui/dialog.tsx
+++ /dev/null
@@ -1,119 +0,0 @@
-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,
- DialogClose,
- DialogTrigger,
- DialogContent,
- DialogHeader,
- DialogFooter,
- DialogTitle,
- DialogDescription,
-}
diff --git a/studio/src/components/ui/input.tsx b/studio/src/components/ui/input.tsx
deleted file mode 100644
index 953ebf7e..00000000
--- a/studio/src/components/ui/input.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import * as React from "react"
-import { cn } from "@/lib/utils"
-
-export interface InputProps
- extends React.InputHTMLAttributes {}
-
-const Input = React.forwardRef(
- ({ className, type, ...props }, ref) => {
- return (
-
- )
- }
-)
-Input.displayName = "Input"
-
-export { Input }
diff --git a/studio/src/components/ui/label.tsx b/studio/src/components/ui/label.tsx
deleted file mode 100644
index e0d8e049..00000000
--- a/studio/src/components/ui/label.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-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/studio/src/components/ui/select.tsx b/studio/src/components/ui/select.tsx
deleted file mode 100644
index 98c432b5..00000000
--- a/studio/src/components/ui/select.tsx
+++ /dev/null
@@ -1,155 +0,0 @@
-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/studio/src/components/ui/textarea.tsx b/studio/src/components/ui/textarea.tsx
deleted file mode 100644
index c61fd6ef..00000000
--- a/studio/src/components/ui/textarea.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import * as React from "react"
-import { cn } from "@/lib/utils"
-
-export interface TextareaProps
- extends React.TextareaHTMLAttributes {}
-
-const Textarea = React.forwardRef(
- ({ className, ...props }, ref) => {
- return (
-
- )
- }
-)
-Textarea.displayName = "Textarea"
-
-export { Textarea }
diff --git a/studio/src/index.css b/studio/src/index.css
deleted file mode 100644
index 936de776..00000000
--- a/studio/src/index.css
+++ /dev/null
@@ -1,37 +0,0 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-@layer base {
- :root {
- --background: 0 0% 100%;
- --foreground: 222.2 84% 4.9%;
- --card: 0 0% 100%;
- --card-foreground: 222.2 84% 4.9%;
- --popover: 0 0% 100%;
- --popover-foreground: 222.2 84% 4.9%;
- --primary: 222.2 47.4% 11.2%;
- --primary-foreground: 210 40% 98%;
- --secondary: 210 40% 96%;
- --secondary-foreground: 222.2 84% 4.9%;
- --muted: 210 40% 96%;
- --muted-foreground: 215.4 16.3% 46.9%;
- --accent: 210 40% 96%;
- --accent-foreground: 222.2 84% 4.9%;
- --destructive: 0 84.2% 60.2%;
- --destructive-foreground: 210 40% 98%;
- --border: 214.3 31.8% 91.4%;
- --input: 214.3 31.8% 91.4%;
- --ring: 222.2 84% 4.9%;
- --radius: 0.5rem;
- }
-}
-
-@layer base {
- * {
- @apply border-border;
- }
- body {
- @apply bg-background text-foreground;
- }
-}
diff --git a/studio/src/lib/utils.ts b/studio/src/lib/utils.ts
deleted file mode 100644
index d084ccad..00000000
--- a/studio/src/lib/utils.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { type ClassValue, clsx } from "clsx"
-import { twMerge } from "tailwind-merge"
-
-export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs))
-}
diff --git a/studio/src/main.tsx b/studio/src/main.tsx
deleted file mode 100644
index 3d7150da..00000000
--- a/studio/src/main.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import ReactDOM from 'react-dom/client'
-import App from './App.tsx'
-import './index.css'
-
-ReactDOM.createRoot(document.getElementById('root')!).render(
-
-
- ,
-)
diff --git a/studio/src/store/designerStore.ts b/studio/src/store/designerStore.ts
deleted file mode 100644
index 6435a600..00000000
--- a/studio/src/store/designerStore.ts
+++ /dev/null
@@ -1,398 +0,0 @@
-import { create } from 'zustand';
-import { addEdge, Connection, applyNodeChanges, applyEdgeChanges, NodeChange, EdgeChange } from 'reactflow';
-import { Agent, Tool, Router, DesignerConfig } from '@/types/agent';
-import { CustomNode, CustomEdge, AgentNodeData, ToolNodeData, RouterNodeData } from '@/types/reactflow';
-
-interface DesignerState {
- // Configuration
- config: DesignerConfig;
-
- // Flow state
- nodes: CustomNode[];
- edges: CustomEdge[];
-
- // UI state
- selectedNode?: CustomNode;
- selectedEdge?: CustomEdge;
- isAgentEditorOpen: boolean;
- isEdgeEditorOpen: boolean;
- isConfigEditorOpen: boolean;
- isRouterEditorOpen: boolean;
-
- // Workflow metadata
- workflowName: string;
- workflowDescription: string;
- workflowVersion: string;
-
- // Start/End node management
- startNodeId?: string;
- endNodeIds: string[];
-
- // Actions
- setConfig: (config: DesignerConfig) => void;
-
- // Node actions
- addAgent: (agent: Agent, position: { x: number; y: number }) => void;
- addTool: (tool: Tool, position: { x: number; y: number }) => void;
- addRouter: (router: Router, position: { x: number; y: number }) => void;
- updateAgent: (agentId: string, updates: Partial) => void;
- updateRouter: (routerId: string, updates: Partial) => void;
- deleteNode: (nodeId: string) => void;
- setSelectedNode: (node?: CustomNode) => void;
-
- // Edge actions
- onConnect: (connection: Connection) => void;
- updateEdge: (edgeId: string, updates: Partial) => void;
- deleteEdge: (edgeId: string) => void;
- setSelectedEdge: (edge?: CustomEdge) => void;
-
- // Flow actions
- onNodesChange: (changes: NodeChange[]) => void;
- onEdgesChange: (changes: EdgeChange[]) => void;
-
- // UI actions
- openAgentEditor: (node?: CustomNode) => void;
- closeAgentEditor: () => void;
- openRouterEditor: (node?: CustomNode) => void;
- closeRouterEditor: () => void;
- openEdgeEditor: (edge: CustomEdge) => void;
- closeEdgeEditor: () => void;
- openConfigEditor: () => void;
- closeConfigEditor: () => void;
-
- // Workflow metadata actions
- setWorkflowMetadata: (metadata: { name: string; description: string; version: string }) => void;
-
- // Start/End node actions
- setStartNode: (nodeId: string) => void;
- addEndNode: (nodeId: string) => void;
- removeEndNode: (nodeId: string) => void;
- toggleEndNode: (nodeId: string) => void;
-
- // Utility actions
- clearWorkflow: () => void;
- loadWorkflow: (workflow: any) => void;
- importFromYAML: (yamlContent: string) => Promise;
-}
-
-const defaultConfig: DesignerConfig = {
- availableTools: [
- { name: 'calculator', description: 'Perform mathematical calculations' },
- { name: 'web_search', description: 'Search the web for information' },
- { name: 'file_reader', description: 'Read and analyze files' },
- { name: 'email_sender', description: 'Send emails' },
- { name: 'text_processor', description: 'Process and analyze text content' },
- { name: 'image_analyzer', description: 'Analyze and process images' },
- ],
- availableLLMs: [
- { provider: 'openai', name: 'gpt-4o' },
- { provider: 'openai', name: 'gpt-4o-mini' },
- { provider: 'anthropic', name: 'claude-3-5-sonnet-20240620' },
- { provider: 'anthropic', name: 'claude-3-5-haiku-20241022' },
- { provider: 'gemini', name: 'gemini-2.5-flash' },
- { provider: 'gemini', name: 'gemini-2.5-pro' },
- { provider: 'ollama', name: 'llama2' },
- { provider: 'ollama', name: 'llama3' },
- ],
- availableRouters: [
- {
- name: 'default_router',
- description: 'Default router that passes to the next node',
- code: `def route(memory: BaseMemory) -> str:
- # Always route to the first available target
- return target_nodes[0]`
- },
- {
- name: 'content_router',
- description: 'Routes based on content analysis',
- code: `def route(memory: BaseMemory) -> str:
- content = str(memory.get()[-1]).lower()
- if 'technical' in content:
- return 'tech_specialist'
- elif 'business' in content:
- return 'business_specialist'
- return 'general_handler'`
- },
- {
- name: 'classification_router',
- description: 'Routes based on classification results',
- code: `def route(memory: BaseMemory) -> str:
- last_message = memory.get()[-1]
- if 'urgent' in str(last_message).lower():
- return 'priority_handler'
- elif 'routine' in str(last_message).lower():
- return 'standard_handler'
- return 'default_handler'`
- },
- {
- name: 'sentiment_router',
- description: 'Routes based on sentiment analysis',
- code: `def route(memory: BaseMemory) -> str:
- content = str(memory.get()[-1]).lower()
- positive_words = ['good', 'great', 'excellent', 'happy']
- negative_words = ['bad', 'terrible', 'angry', 'frustrated']
-
- if any(word in content for word in negative_words):
- return 'escalation_agent'
- elif any(word in content for word in positive_words):
- return 'satisfaction_agent'
- return 'neutral_agent'`
- },
- ],
-};
-
-export const useDesignerStore = create((set) => ({
- // Initial state
- config: defaultConfig,
- nodes: [],
- edges: [],
- selectedNode: undefined,
- selectedEdge: undefined,
- isAgentEditorOpen: false,
- isEdgeEditorOpen: false,
- isConfigEditorOpen: false,
- isRouterEditorOpen: false,
- workflowName: 'New Workflow',
- workflowDescription: '',
- workflowVersion: '1.0.0',
- startNodeId: undefined,
- endNodeIds: [],
-
- // Configuration actions
- setConfig: (config) => set({ config }),
-
- // Node actions
- addAgent: (agent, position) => {
- const newNode: CustomNode = {
- id: agent.id,
- type: 'agent',
- position,
- data: { agent } as AgentNodeData,
- };
- set((state) => ({
- nodes: [...state.nodes, newNode],
- }));
- },
-
- addTool: (tool, position) => {
- const newNode: CustomNode = {
- id: `tool_${tool.name}_${Date.now()}`,
- type: 'tool',
- position,
- data: { tool } as ToolNodeData,
- };
- set((state) => ({
- nodes: [...state.nodes, newNode],
- }));
- },
-
- addRouter: (router, position) => {
- const newNode: CustomNode = {
- id: router.id || `router_${router.name}_${Date.now()}`,
- type: 'router',
- position,
- data: { router } as RouterNodeData,
- };
- set((state) => ({
- nodes: [...state.nodes, newNode],
- }));
- },
-
- updateAgent: (agentId, updates) => {
- set((state) => ({
- nodes: state.nodes.map((node) => {
- if (node.id === agentId && node.type === 'agent') {
- const agentData = node.data as AgentNodeData;
- return {
- ...node,
- data: {
- ...agentData,
- agent: { ...agentData.agent, ...updates },
- },
- };
- }
- return node;
- }),
- }));
- },
-
- updateRouter: (routerId, updates) => {
- set((state) => ({
- nodes: state.nodes.map((node) => {
- if (node.id === routerId && node.type === 'router') {
- const routerData = node.data as RouterNodeData;
- return {
- ...node,
- data: {
- ...routerData,
- router: { ...routerData.router, ...updates },
- },
- };
- }
- return node;
- }),
- }));
- },
-
- deleteNode: (nodeId) => {
- set((state) => ({
- nodes: state.nodes.filter((node) => node.id !== nodeId),
- edges: state.edges.filter((edge) => edge.source !== nodeId && edge.target !== nodeId),
- selectedNode: state.selectedNode?.id === nodeId ? undefined : state.selectedNode,
- }));
- },
-
- setSelectedNode: (node) => set({ selectedNode: node }),
-
- // Edge actions
- onConnect: (connection) => {
- const newEdge: CustomEdge = {
- ...connection,
- id: `edge_${connection.source}_${connection.target}_${Date.now()}`,
- data: {},
- } as CustomEdge;
-
- set((state) => ({
- edges: addEdge(newEdge, state.edges),
- }));
- },
-
- updateEdge: (edgeId, updates) => {
- set((state) => ({
- edges: state.edges.map((edge) =>
- edge.id === edgeId ? { ...edge, ...updates } : edge
- ),
- }));
- },
-
- deleteEdge: (edgeId) => {
- set((state) => ({
- edges: state.edges.filter((edge) => edge.id !== edgeId),
- selectedEdge: state.selectedEdge?.id === edgeId ? undefined : state.selectedEdge,
- }));
- },
-
- setSelectedEdge: (edge) => set({ selectedEdge: edge }),
-
- // Flow actions
- onNodesChange: (changes) => {
- set((state) => ({
- nodes: applyNodeChanges(changes, state.nodes),
- }));
- },
-
- onEdgesChange: (changes) => {
- set((state) => ({
- edges: applyEdgeChanges(changes, state.edges),
- }));
- },
-
- // UI actions
- openAgentEditor: (node) => {
- set({
- isAgentEditorOpen: true,
- selectedNode: node,
- });
- },
-
- closeAgentEditor: () => set({ isAgentEditorOpen: false }),
-
- openRouterEditor: (node) => {
- set({
- isRouterEditorOpen: true,
- selectedNode: node,
- });
- },
-
- closeRouterEditor: () => set({ isRouterEditorOpen: false }),
-
- openEdgeEditor: (edge) => {
- set({
- isEdgeEditorOpen: true,
- selectedEdge: edge,
- });
- },
-
- closeEdgeEditor: () => set({ isEdgeEditorOpen: false }),
-
- openConfigEditor: () => set({ isConfigEditorOpen: true }),
-
- closeConfigEditor: () => set({ isConfigEditorOpen: false }),
-
- // Workflow metadata actions
- setWorkflowMetadata: (metadata) => {
- set({
- workflowName: metadata.name,
- workflowDescription: metadata.description,
- workflowVersion: metadata.version,
- });
- },
-
- // Start/End node actions
- setStartNode: (nodeId) => {
- set({ startNodeId: nodeId });
- },
-
- addEndNode: (nodeId) => {
- set((state) => ({
- endNodeIds: [...state.endNodeIds.filter(id => id !== nodeId), nodeId],
- }));
- },
-
- removeEndNode: (nodeId) => {
- set((state) => ({
- endNodeIds: state.endNodeIds.filter(id => id !== nodeId),
- }));
- },
-
- toggleEndNode: (nodeId) => {
- set((state) => {
- const isCurrentlyEnd = state.endNodeIds.includes(nodeId);
- return {
- endNodeIds: isCurrentlyEnd
- ? state.endNodeIds.filter(id => id !== nodeId)
- : [...state.endNodeIds, nodeId],
- };
- });
- },
-
- // Utility actions
- clearWorkflow: () => {
- set({
- nodes: [],
- edges: [],
- selectedNode: undefined,
- selectedEdge: undefined,
- workflowName: 'New Workflow',
- workflowDescription: '',
- workflowVersion: '1.0.0',
- startNodeId: undefined,
- endNodeIds: [],
- });
- },
-
- loadWorkflow: (workflow) => {
- // TODO: Implement workflow loading from YAML
- console.log('Loading workflow:', workflow);
- },
-
- importFromYAML: async (yamlContent) => {
- try {
- const { parseAriumYAML } = await import('@/utils/yamlImport');
- const result = parseAriumYAML(yamlContent);
-
- set({
- nodes: result.nodes,
- edges: result.edges,
- workflowName: result.workflowName,
- workflowDescription: result.workflowDescription,
- workflowVersion: result.workflowVersion,
- selectedNode: undefined,
- selectedEdge: undefined,
- });
- } catch (error) {
- console.error('Failed to import YAML:', error);
- throw error;
- }
- },
-}));
diff --git a/studio/src/types/agent.ts b/studio/src/types/agent.ts
deleted file mode 100644
index 9502b2d7..00000000
--- a/studio/src/types/agent.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-export interface LLMConfig {
- provider: 'openai' | 'anthropic' | 'gemini' | 'ollama';
- name: string;
- base_url?: string;
-}
-
-export interface AgentSettings {
- temperature?: number;
- max_retries?: number;
- reasoning_pattern?: 'DIRECT' | 'REACT' | 'COT';
-}
-
-export interface ParserField {
- name: string;
- type: 'str' | 'literal' | 'array' | 'object';
- description?: string;
- required?: boolean;
- values?: Array<{
- value: string;
- description: string;
- examples?: string[];
- }>;
- items?: {
- type: string;
- };
-}
-
-export interface Parser {
- name: string;
- version?: string;
- description?: string;
- fields: ParserField[];
-}
-
-export interface Agent {
- id: string;
- name: string;
- role?: string;
- job: string;
- model: LLMConfig;
- settings?: AgentSettings;
- tools?: string[];
- parser?: Parser;
- position?: { x: number; y: number };
-}
-
-export interface Tool {
- name: string;
- description: string;
- parameters?: Record;
-}
-
-export interface Router {
- id?: string;
- name: string;
- description: string;
- type?: 'smart' | 'task_classifier' | 'conversation_analysis' | 'reflection' | 'plan_execute' | 'custom';
- code?: string;
- routing_options?: Record;
- model?: LLMConfig;
- settings?: {
- temperature?: number;
- fallback_strategy?: 'first' | 'last' | 'random';
- analysis_depth?: number;
- allow_early_exit?: boolean;
- };
- task_categories?: Record;
- routing_logic?: Record;
- flow_pattern?: string[];
-}
-
-export interface WorkflowEdge {
- id: string;
- from: string;
- to: string[];
- router?: string;
-}
-
-export interface AriumWorkflow {
- metadata: {
- name: string;
- version?: string;
- description?: string;
- tags?: string[];
- };
- arium: {
- agents: Agent[];
- tools?: Tool[];
- workflow: {
- start: string;
- edges: Array<{
- from: string;
- to: string[];
- router?: string;
- }>;
- end: string[];
- };
- };
-}
-
-export interface DesignerConfig {
- availableTools: Tool[];
- availableLLMs: LLMConfig[];
- availableRouters: Router[];
-}
diff --git a/studio/src/types/reactflow.ts b/studio/src/types/reactflow.ts
deleted file mode 100644
index d912c67c..00000000
--- a/studio/src/types/reactflow.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Node, Edge } from 'reactflow';
-import { Agent, Tool, Router } from './agent';
-
-export interface AgentNodeData {
- agent: Agent;
- isStart?: boolean;
- isEnd?: boolean;
-}
-
-export interface ToolNodeData {
- tool: Tool;
- isEnd?: boolean;
-}
-
-export interface RouterNodeData {
- router: Router;
- isEnd?: boolean;
-}
-
-export type CustomNode = Node;
-
-export interface CustomEdgeData {
- router?: string;
- label?: string;
- description?: string;
-}
-
-export type CustomEdge = Edge;
-
-export type NodeType = 'agent' | 'tool' | 'router';
-
-export interface FlowState {
- nodes: CustomNode[];
- edges: CustomEdge[];
- selectedNode?: CustomNode;
- selectedEdge?: CustomEdge;
-}
diff --git a/studio/src/utils/workflowValidation.ts b/studio/src/utils/workflowValidation.ts
deleted file mode 100644
index 5682d91a..00000000
--- a/studio/src/utils/workflowValidation.ts
+++ /dev/null
@@ -1,428 +0,0 @@
-import { CustomNode, CustomEdge } from '@/types/reactflow';
-
-export interface ValidationIssue {
- id: string;
- type: 'error' | 'warning' | 'info';
- message: string;
- nodeId?: string;
- edgeId?: string;
- category: 'structure' | 'configuration' | 'connectivity' | 'best_practice';
-}
-
-export interface ValidationResult {
- isValid: boolean;
- issues: ValidationIssue[];
- warnings: ValidationIssue[];
- suggestions: ValidationIssue[];
-}
-
-export function validateWorkflow(nodes: CustomNode[], edges: CustomEdge[], startNodeId?: string, endNodeIds?: string[]): ValidationResult {
- const issues: ValidationIssue[] = [];
- const warnings: ValidationIssue[] = [];
- const suggestions: ValidationIssue[] = [];
-
- // Check if workflow has any nodes
- if (nodes.length === 0) {
- issues.push({
- id: 'no_nodes',
- type: 'error',
- message: 'Workflow must contain at least one agent',
- category: 'structure',
- });
- return { isValid: false, issues, warnings, suggestions };
- }
-
- // Validate individual nodes
- for (const node of nodes) {
- if (node.type === 'agent') {
- const agent = (node.data as any).agent;
-
- // Check required fields
- if (!agent.name) {
- issues.push({
- id: `agent_no_name_${node.id}`,
- type: 'error',
- message: 'Agent must have a name',
- nodeId: node.id,
- category: 'configuration',
- });
- }
-
- if (!agent.job) {
- issues.push({
- id: `agent_no_job_${node.id}`,
- type: 'error',
- message: 'Agent must have a job description',
- nodeId: node.id,
- category: 'configuration',
- });
- }
-
- if (!agent.model || !agent.model.provider || !agent.model.name) {
- issues.push({
- id: `agent_no_model_${node.id}`,
- type: 'error',
- message: 'Agent must have a valid LLM model configuration',
- nodeId: node.id,
- category: 'configuration',
- });
- }
-
- // Suggestions for best practices
- if (agent.job && agent.job.length < 20) {
- suggestions.push({
- id: `agent_short_job_${node.id}`,
- type: 'info',
- message: 'Consider providing a more detailed job description for better agent performance',
- nodeId: node.id,
- category: 'best_practice',
- });
- }
-
- if (agent.settings?.temperature && (agent.settings.temperature < 0 || agent.settings.temperature > 2)) {
- warnings.push({
- id: `agent_temperature_range_${node.id}`,
- type: 'warning',
- message: 'Temperature should be between 0 and 2 for optimal results',
- nodeId: node.id,
- category: 'configuration',
- });
- }
- } else if (node.type === 'router') {
- const router = (node.data as any).router;
-
- if (!router.name) {
- issues.push({
- id: `router_no_name_${node.id}`,
- type: 'error',
- message: 'Router must have a name',
- nodeId: node.id,
- category: 'configuration',
- });
- }
-
- if (!router.description) {
- warnings.push({
- id: `router_no_description_${node.id}`,
- type: 'warning',
- message: 'Router should have a description explaining its routing logic',
- nodeId: node.id,
- category: 'configuration',
- });
- }
-
- // Validate router-specific configurations
- if (router.type === 'reflection') {
- if (!router.flow_pattern || router.flow_pattern.length < 3) {
- issues.push({
- id: `reflection_no_pattern_${node.id}`,
- type: 'error',
- message: 'Reflection router must have a flow pattern with at least 3 agents (mainβcriticβmainβfinalizer)',
- nodeId: node.id,
- category: 'configuration',
- });
- }
-
- // Check if the workflow has the necessary agents for reflection pattern
- const hasMainAgent = nodes.some(n => n.type === 'agent' && (n.data as any).agent.name.toLowerCase().includes('main'));
- const hasCriticAgent = nodes.some(n => n.type === 'agent' && (n.data as any).agent.name.toLowerCase().includes('critic'));
-
- if (!hasMainAgent || !hasCriticAgent) {
- warnings.push({
- id: `reflection_missing_agents_${node.id}`,
- type: 'warning',
- message: 'Reflection router works best with "Main Agent" and "Critic Agent" types. Use the quick workflow templates.',
- nodeId: node.id,
- category: 'best_practice',
- });
- }
- }
-
- if (router.type === 'plan_execute') {
- // Check if the workflow has the necessary agents for plan-execute pattern
- const hasPlannerAgent = nodes.some(n => n.type === 'agent' && (n.data as any).agent.name.toLowerCase().includes('planner'));
- const hasExecutorAgent = nodes.some(n => n.type === 'agent' && (n.data as any).agent.name.toLowerCase().includes('executor'));
-
- if (!hasPlannerAgent || !hasExecutorAgent) {
- warnings.push({
- id: `plan_execute_missing_agents_${node.id}`,
- type: 'warning',
- message: 'Plan-execute router works best with "Planner Agent" and "Executor Agent" types. Use the quick workflow templates.',
- nodeId: node.id,
- category: 'best_practice',
- });
- }
- }
-
- if (router.type === 'task_classifier' && (!router.task_categories || Object.keys(router.task_categories).length === 0)) {
- issues.push({
- id: `classifier_no_categories_${node.id}`,
- type: 'error',
- message: 'Task classifier router must have at least one task category',
- nodeId: node.id,
- category: 'configuration',
- });
- }
- }
- }
-
- // Validate start/end node configuration
- if (startNodeId) {
- const startNode = nodes.find(n => n.id === startNodeId);
- if (!startNode) {
- issues.push({
- id: 'invalid_start_node',
- type: 'error',
- message: 'Start node no longer exists in the workflow',
- category: 'structure',
- });
- } else if (startNode.type === 'router') {
- issues.push({
- id: 'router_start_node',
- type: 'error',
- message: 'Start node cannot be a router - must be an agent or tool',
- nodeId: startNodeId,
- category: 'structure',
- });
- }
- } else {
- warnings.push({
- id: 'no_start_node_set',
- type: 'warning',
- message: 'No start node defined. Click "Set Start" on an agent to define the workflow entry point.',
- category: 'structure',
- });
- }
-
- if (endNodeIds && endNodeIds.length > 0) {
- endNodeIds.forEach((endNodeId) => {
- const endNode = nodes.find(n => n.id === endNodeId);
- if (!endNode) {
- issues.push({
- id: `invalid_end_node_${endNodeId}`,
- type: 'error',
- message: 'End node no longer exists in the workflow',
- category: 'structure',
- });
- } else if (endNode.type === 'router') {
- issues.push({
- id: `router_end_node_${endNodeId}`,
- type: 'error',
- message: 'End node cannot be a router - must be an agent or tool',
- nodeId: endNodeId,
- category: 'structure',
- });
- }
- });
- } else {
- suggestions.push({
- id: 'no_end_nodes_set',
- type: 'info',
- message: 'No end nodes defined. Click "Set End" on agents to define workflow completion points.',
- category: 'structure',
- });
- }
-
- // Validate workflow structure
- const { startNodes, endNodes, isolatedNodes } = analyzeWorkflowStructure(nodes, edges);
-
- // Check for start nodes
- if (startNodes.length === 0 && nodes.length > 0) {
- warnings.push({
- id: 'no_start_nodes',
- type: 'warning',
- message: 'Workflow has no clear starting point (nodes with no incoming connections)',
- category: 'structure',
- });
- }
-
- if (startNodes.length > 1) {
- suggestions.push({
- id: 'multiple_start_nodes',
- type: 'info',
- message: `Workflow has ${startNodes.length} potential starting points. Consider using a single entry point.`,
- category: 'structure',
- });
- }
-
- // Check for end nodes
- if (endNodes.length === 0 && nodes.length > 0) {
- warnings.push({
- id: 'no_end_nodes',
- type: 'warning',
- message: 'Workflow has no clear ending points (nodes with no outgoing connections)',
- category: 'structure',
- });
- }
-
- // Check for isolated nodes
- for (const nodeId of isolatedNodes) {
- warnings.push({
- id: `isolated_node_${nodeId}`,
- type: 'warning',
- message: 'This node is not connected to the workflow',
- nodeId,
- category: 'connectivity',
- });
- }
-
- // Validate edge configurations
- for (const edge of edges) {
- const sourceNode = nodes.find(n => n.id === edge.source);
- const targetNode = nodes.find(n => n.id === edge.target);
-
- if (!sourceNode || !targetNode) {
- issues.push({
- id: `invalid_edge_${edge.id}`,
- type: 'error',
- message: 'Edge connects to non-existent nodes',
- edgeId: edge.id,
- category: 'connectivity',
- });
- continue;
- }
-
- // Check if edge has a router configuration when connecting to multiple targets
- const outgoingEdges = edges.filter(e => e.source === edge.source);
- if (outgoingEdges.length > 1 && !edge.data?.router) {
- suggestions.push({
- id: `multiple_outputs_no_router_${edge.id}`,
- type: 'info',
- message: 'Consider adding a router for nodes with multiple output connections',
- edgeId: edge.id,
- category: 'best_practice',
- });
- }
- }
-
- // Check for potential cycles
- const cycles = detectCycles(nodes, edges);
- for (const cycle of cycles) {
- if (cycle.length > 0) {
- warnings.push({
- id: `cycle_detected_${cycle.join('_')}`,
- type: 'warning',
- message: `Potential infinite loop detected involving nodes: ${cycle.join(' β ')}`,
- category: 'structure',
- });
- }
- }
-
- const isValid = issues.length === 0;
- return { isValid, issues, warnings, suggestions };
-}
-
-function analyzeWorkflowStructure(nodes: CustomNode[], edges: CustomEdge[]) {
- const nodeConnections = new Map();
-
- // Initialize connections map
- nodes.forEach(node => {
- nodeConnections.set(node.id, { incoming: [], outgoing: [] });
- });
-
- // Build connections
- edges.forEach(edge => {
- const sourceConnections = nodeConnections.get(edge.source);
- const targetConnections = nodeConnections.get(edge.target);
-
- if (sourceConnections) {
- sourceConnections.outgoing.push(edge.target);
- }
- if (targetConnections) {
- targetConnections.incoming.push(edge.source);
- }
- });
-
- // Find start nodes (no incoming connections)
- const startNodes = nodes
- .filter(node => {
- const connections = nodeConnections.get(node.id);
- return connections && connections.incoming.length === 0;
- })
- .map(node => node.id);
-
- // Find end nodes (no outgoing connections)
- const endNodes = nodes
- .filter(node => {
- const connections = nodeConnections.get(node.id);
- return connections && connections.outgoing.length === 0;
- })
- .map(node => node.id);
-
- // Find isolated nodes (no connections at all)
- const isolatedNodes = nodes
- .filter(node => {
- const connections = nodeConnections.get(node.id);
- return connections && connections.incoming.length === 0 && connections.outgoing.length === 0;
- })
- .map(node => node.id);
-
- return { startNodes, endNodes, isolatedNodes };
-}
-
-function detectCycles(nodes: CustomNode[], edges: CustomEdge[]): string[][] {
- const cycles: string[][] = [];
- const visited = new Set();
- const recursionStack = new Set();
- const nodeMap = new Map();
-
- // Build adjacency list
- nodes.forEach(node => nodeMap.set(node.id, []));
- edges.forEach(edge => {
- const targets = nodeMap.get(edge.source) || [];
- targets.push(edge.target);
- nodeMap.set(edge.source, targets);
- });
-
- function dfs(nodeId: string, path: string[]): boolean {
- visited.add(nodeId);
- recursionStack.add(nodeId);
- path.push(nodeId);
-
- const neighbors = nodeMap.get(nodeId) || [];
- for (const neighbor of neighbors) {
- if (!visited.has(neighbor)) {
- if (dfs(neighbor, [...path])) {
- return true;
- }
- } else if (recursionStack.has(neighbor)) {
- // Found a cycle
- const cycleStart = path.indexOf(neighbor);
- if (cycleStart !== -1) {
- cycles.push(path.slice(cycleStart));
- }
- return true;
- }
- }
-
- recursionStack.delete(nodeId);
- return false;
- }
-
- // Check for cycles starting from each unvisited node
- for (const node of nodes) {
- if (!visited.has(node.id)) {
- dfs(node.id, []);
- }
- }
-
- return cycles;
-}
-
-export function getValidationSummary(result: ValidationResult): string {
- const { issues, warnings, suggestions } = result;
-
- if (issues.length === 0 && warnings.length === 0) {
- return `β
Workflow is valid! ${suggestions.length > 0 ? `${suggestions.length} suggestions available.` : ''}`;
- }
-
- const parts = [];
- if (issues.length > 0) {
- parts.push(`${issues.length} error${issues.length === 1 ? '' : 's'}`);
- }
- if (warnings.length > 0) {
- parts.push(`${warnings.length} warning${warnings.length === 1 ? '' : 's'}`);
- }
-
- return `β οΈ ${parts.join(', ')} found in workflow`;
-}
diff --git a/studio/src/utils/yamlExport.ts b/studio/src/utils/yamlExport.ts
deleted file mode 100644
index 5a04d8cb..00000000
--- a/studio/src/utils/yamlExport.ts
+++ /dev/null
@@ -1,369 +0,0 @@
-import { dump } from 'js-yaml';
-import { Agent } from '@/types/agent';
-import { CustomNode, CustomEdge } from '@/types/reactflow';
-
-export interface ExportData {
- nodes: CustomNode[];
- edges: CustomEdge[];
- workflowName: string;
- workflowDescription: string;
- workflowVersion: string;
- startNodeId?: string;
- endNodeIds: string[];
-}
-
-// Utility function to convert names to snake_case
-function toSnakeCase(str: string): string {
- return str
- .trim()
- .toLowerCase()
- .replace(/\s+/g, '_') // Replace spaces with underscores
- .replace(/[^a-z0-9_]/g, '') // Remove special characters except underscores
- .replace(/_+/g, '_') // Replace multiple underscores with single
- .replace(/^_|_$/g, ''); // Remove leading/trailing underscores
-}
-
-export function generateAriumYAML(data: ExportData): string {
- const { nodes, edges, workflowName, workflowDescription, workflowVersion, startNodeId, endNodeIds } = data;
-
- // Create mapping from node IDs to snake_case names
- const nodeIdToName = new Map();
-
- // Extract agents, tools, and routers
- const agents: Agent[] = [];
- const tools: string[] = [];
- const routers: any[] = [];
-
- nodes.forEach((node) => {
- if (node.type === 'agent') {
- const agentData = node.data as any;
- const agent = agentData.agent;
- const snakeCaseName = toSnakeCase(agent.name);
- nodeIdToName.set(node.id, snakeCaseName);
- agents.push({
- ...agent,
- name: snakeCaseName, // Use snake_case name for YAML
- });
- } else if (node.type === 'tool') {
- const toolData = node.data as any;
- const toolName = toSnakeCase(toolData.tool.name);
- nodeIdToName.set(node.id, toolName);
- tools.push(toolName);
- } else if (node.type === 'router') {
- const routerData = node.data as any;
- const router = routerData.router;
- const snakeCaseName = toSnakeCase(router.name);
- nodeIdToName.set(node.id, snakeCaseName);
- routers.push({
- ...router,
- name: snakeCaseName, // Use snake_case name for YAML
- });
- }
- });
-
- // Determine start and end nodes (use user-defined or auto-detect)
- let finalStartNodeId = startNodeId;
- let finalEndNodeIds = [...endNodeIds];
-
- // If no user-defined start/end nodes, auto-detect from connections
- if (!finalStartNodeId || finalEndNodeIds.length === 0) {
- const nodeConnections = new Map();
-
- // Initialize connections map
- nodes.forEach((node) => {
- nodeConnections.set(node.id, { incoming: [], outgoing: [] });
- });
-
- // Build connections
- edges.forEach((edge) => {
- const sourceConnections = nodeConnections.get(edge.source);
- const targetConnections = nodeConnections.get(edge.target);
-
- if (sourceConnections) {
- sourceConnections.outgoing.push(edge.target);
- }
- if (targetConnections) {
- targetConnections.incoming.push(edge.source);
- }
- });
-
- // Auto-detect start node if not set
- if (!finalStartNodeId) {
- const startNodes = nodes.filter((node) => {
- const connections = nodeConnections.get(node.id);
- return connections && connections.incoming.length === 0 && node.type !== 'router';
- });
- finalStartNodeId = startNodes[0]?.id;
- }
-
- // Auto-detect end nodes if none set
- if (finalEndNodeIds.length === 0) {
- const endNodes = nodes.filter((node) => {
- const connections = nodeConnections.get(node.id);
- return connections && connections.outgoing.length === 0 && node.type !== 'router';
- });
- finalEndNodeIds = endNodes.map(node => node.id);
- }
- }
-
- // Build workflow edges using snake_case names
- const workflowEdges: Array<{
- from: string;
- to: string[];
- router?: string;
- }> = [];
-
- // Group edges by source
- const edgesBySource = new Map();
- edges.forEach((edge) => {
- if (!edgesBySource.has(edge.source)) {
- edgesBySource.set(edge.source, []);
- }
- edgesBySource.get(edge.source)!.push(edge);
- });
-
- // Create workflow edges using names instead of IDs
- edgesBySource.forEach((sourceEdges, sourceId) => {
- const sourceName = nodeIdToName.get(sourceId);
- if (!sourceName) return; // Skip if source node not found
-
- const sourceNode = nodes.find(n => n.id === sourceId);
-
- // Handle agent nodes that connect to routers
- if (sourceNode?.type === 'agent') {
- // Check if this agent connects to a router
- const routerTargets = sourceEdges
- .map(edge => edge.target)
- .map(targetId => nodes.find(n => n.id === targetId))
- .filter(node => node?.type === 'router');
-
- if (routerTargets.length > 0) {
- // This agent connects through a router
- const routerNode = routerTargets[0];
- const routerName = nodeIdToName.get(routerNode!.id);
-
- // Find what the router connects to
- const routerEdges = edgesBySource.get(routerNode!.id) || [];
- const routerTargetNames = routerEdges
- .map(edge => nodeIdToName.get(edge.target))
- .filter(name => name !== undefined) as string[];
-
- // Create workflow edge with router
- if (routerTargetNames.length > 0) {
- workflowEdges.push({
- from: sourceName,
- to: routerTargetNames,
- router: routerName,
- });
- }
- } else {
- // Direct agent-to-agent connections
- const targets = sourceEdges.map((edge) => edge.target);
- const targetNames = targets
- .map(targetId => nodeIdToName.get(targetId))
- .filter(name => name !== undefined) as string[];
-
- // Skip router nodes as targets
- const agentTargetNames = targetNames.filter(name => {
- const targetNode = nodes.find(n => nodeIdToName.get(n.id) === name);
- return targetNode?.type !== 'router';
- });
-
- if (agentTargetNames.length > 0) {
- const workflowEdge: any = {
- from: sourceName,
- to: agentTargetNames,
- };
-
- // Check if edges have router data
- const routerNames = sourceEdges
- .map(edge => edge.data?.router)
- .filter(router => router !== undefined);
-
- if (routerNames.length > 0) {
- workflowEdge.router = routerNames[0];
- }
-
- workflowEdges.push(workflowEdge);
- }
- }
- }
- });
-
- // Note: workflowEdges already filters out router-only edges in the main logic above
-
- // Convert agents to YAML format
- const yamlAgents = agents.map((agent) => {
- const yamlAgent: any = {
- name: agent.name,
- role: agent.role,
- job: agent.job,
- model: {
- provider: agent.model.provider,
- name: agent.model.name,
- },
- };
-
- // Add base_url if present
- if (agent.model.base_url) {
- yamlAgent.model.base_url = agent.model.base_url;
- }
-
- // Add settings if present
- if (agent.settings) {
- yamlAgent.settings = {};
- if (agent.settings.temperature !== undefined) {
- yamlAgent.settings.temperature = agent.settings.temperature;
- }
- if (agent.settings.max_retries !== undefined) {
- yamlAgent.settings.max_retries = agent.settings.max_retries;
- }
- if (agent.settings.reasoning_pattern !== undefined) {
- yamlAgent.settings.reasoning_pattern = agent.settings.reasoning_pattern;
- }
- }
-
- // Add tools if present
- if (agent.tools && agent.tools.length > 0) {
- yamlAgent.tools = agent.tools;
- }
-
- // Add parser if present
- if (agent.parser && agent.parser.fields && agent.parser.fields.length > 0) {
- yamlAgent.parser = {
- name: agent.parser.name,
- version: agent.parser.version || '1.0.0',
- description: agent.parser.description,
- fields: agent.parser.fields.map((field) => ({
- name: field.name,
- type: field.type,
- description: field.description,
- required: field.required,
- values: field.values,
- items: field.items,
- })),
- };
- }
-
- return yamlAgent;
- });
-
- // Convert routers to YAML format
- const yamlRouters = routers.map((router) => {
- const yamlRouter: any = {
- name: router.name,
- type: router.type || 'smart',
- };
-
- if (router.routing_options && Object.keys(router.routing_options).length > 0) {
- // Convert routing option keys to snake_case
- yamlRouter.routing_options = {};
- Object.entries(router.routing_options).forEach(([key, value]) => {
- const snakeCaseKey = toSnakeCase(key);
- yamlRouter.routing_options[snakeCaseKey] = value;
- });
- }
-
- if (router.task_categories && Object.keys(router.task_categories).length > 0) {
- yamlRouter.task_categories = router.task_categories;
- }
-
- if (router.flow_pattern && router.flow_pattern.length > 0) {
- yamlRouter.flow_pattern = router.flow_pattern;
- }
-
- if (router.model) {
- yamlRouter.model = {
- provider: router.model.provider,
- name: router.model.name,
- };
- }
-
- if (router.settings) {
- yamlRouter.settings = {};
- if (router.settings.temperature !== undefined) {
- yamlRouter.settings.temperature = router.settings.temperature;
- }
- if (router.settings.fallback_strategy !== undefined) {
- yamlRouter.settings.fallback_strategy = router.settings.fallback_strategy;
- }
- if (router.settings.analysis_depth !== undefined) {
- yamlRouter.settings.analysis_depth = router.settings.analysis_depth;
- }
- if (router.settings.allow_early_exit !== undefined) {
- yamlRouter.settings.allow_early_exit = router.settings.allow_early_exit;
- }
- }
-
- return yamlRouter;
- });
-
- // Build the final YAML structure
- const yamlStructure: any = {
- metadata: {
- name: workflowName || 'Flo AI Workflow',
- version: workflowVersion || '1.0.0',
- description: workflowDescription || 'Generated with Flo AI Studio',
- tags: ['flo-ai', 'studio-generated'],
- },
- arium: {
- agents: yamlAgents,
- tools: tools.length > 0 ? tools.map(name => ({ name })) : undefined,
- routers: yamlRouters.length > 0 ? yamlRouters : undefined,
- workflow: {
- start: finalStartNodeId ? (nodeIdToName.get(finalStartNodeId) || finalStartNodeId) : (agents[0]?.name || ''),
- edges: workflowEdges.filter(edge => edge.to.length > 0),
- end: finalEndNodeIds.map((nodeId) => nodeIdToName.get(nodeId) || nodeId).filter(name => name),
- },
- },
- };
-
- // Remove undefined fields
- const cleanYamlStructure = JSON.parse(JSON.stringify(yamlStructure, (_, value) => {
- return value === undefined ? null : value;
- }));
-
- // Remove null values
- function removeNulls(obj: any): any {
- if (Array.isArray(obj)) {
- return obj.map(removeNulls).filter(item => item !== null);
- } else if (obj !== null && typeof obj === 'object') {
- const cleaned: any = {};
- for (const [key, value] of Object.entries(obj)) {
- const cleanValue = removeNulls(value);
- if (cleanValue !== null && cleanValue !== undefined) {
- cleaned[key] = cleanValue;
- }
- }
- return cleaned;
- }
- return obj;
- }
-
- const finalStructure = removeNulls(cleanYamlStructure);
-
- return dump(finalStructure, {
- indent: 2,
- lineWidth: 100,
- noRefs: true,
- sortKeys: false,
- });
-}
-
-export function downloadYAML(content: string, filename: string = 'flo-ai-workflow.yaml'): void {
- const blob = new Blob([content], { type: 'text/yaml;charset=utf-8' });
- const url = URL.createObjectURL(blob);
-
- const link = document.createElement('a');
- link.href = url;
- link.download = filename;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
-
- URL.revokeObjectURL(url);
-}
-
-export function copyToClipboard(content: string): Promise {
- return navigator.clipboard.writeText(content);
-}
diff --git a/studio/src/utils/yamlImport.ts b/studio/src/utils/yamlImport.ts
deleted file mode 100644
index 8019f041..00000000
--- a/studio/src/utils/yamlImport.ts
+++ /dev/null
@@ -1,193 +0,0 @@
-import { load } from 'js-yaml';
-import { Agent, Router, AriumWorkflow } from '@/types/agent';
-import { CustomNode, CustomEdge } from '@/types/reactflow';
-
-export interface ImportResult {
- nodes: CustomNode[];
- edges: CustomEdge[];
- workflowName: string;
- workflowDescription: string;
- workflowVersion: string;
-}
-
-export function parseAriumYAML(yamlContent: string): ImportResult {
- try {
- const workflow = load(yamlContent) as AriumWorkflow;
-
- if (!workflow || !workflow.arium) {
- throw new Error('Invalid Arium workflow format');
- }
-
- const nodes: CustomNode[] = [];
- const edges: CustomEdge[] = [];
-
- // Create agent nodes
- if (workflow.arium.agents) {
- workflow.arium.agents.forEach((agent, index) => {
- const agentNode: CustomNode = {
- id: agent.name,
- type: 'agent',
- position: {
- x: 100 + (index % 3) * 300,
- y: 100 + Math.floor(index / 3) * 200
- },
- data: {
- agent: {
- id: agent.name,
- name: agent.name,
- role: agent.role,
- job: agent.job,
- model: agent.model,
- settings: agent.settings,
- tools: agent.tools,
- parser: agent.parser,
- } as Agent,
- },
- };
- nodes.push(agentNode);
- });
- }
-
- // Create router nodes if routers are defined
- if (workflow.arium.routers) {
- workflow.arium.routers.forEach((router: any, index: number) => {
- const routerNode: CustomNode = {
- id: router.name,
- type: 'router',
- position: {
- x: 150 + (index % 3) * 300,
- y: 300 + Math.floor(index / 3) * 200
- },
- data: {
- router: {
- id: router.name,
- name: router.name,
- description: router.description || '',
- type: router.type || 'smart',
- model: router.model,
- settings: router.settings,
- routing_options: router.routing_options,
- task_categories: router.task_categories,
- flow_pattern: router.flow_pattern,
- } as Router,
- },
- };
- nodes.push(routerNode);
- });
- }
-
- // Create tool nodes if tools are defined
- if (workflow.arium.tools) {
- workflow.arium.tools.forEach((tool, index) => {
- const toolNode: CustomNode = {
- id: `tool_${tool.name}`,
- type: 'tool',
- position: {
- x: 200 + (index % 3) * 300,
- y: 450 + Math.floor(index / 3) * 200
- },
- data: {
- tool: {
- name: tool.name,
- description: tool.description || '',
- },
- },
- };
- nodes.push(toolNode);
- });
- }
-
- // Create edges from workflow definition
- if (workflow.arium.workflow && workflow.arium.workflow.edges) {
- workflow.arium.workflow.edges.forEach((edge, index) => {
- edge.to.forEach((target, targetIndex) => {
- const edgeId = `edge_${edge.from}_${target}_${index}_${targetIndex}`;
- const workflowEdge: CustomEdge = {
- id: edgeId,
- source: edge.from,
- target: target,
- type: 'custom',
- data: {
- router: edge.router,
- },
- };
- edges.push(workflowEdge);
- });
- });
- }
-
- return {
- nodes,
- edges,
- workflowName: workflow.metadata?.name || 'Imported Workflow',
- workflowDescription: workflow.metadata?.description || '',
- workflowVersion: workflow.metadata?.version || '1.0.0',
- };
- } catch (error) {
- console.error('Error parsing YAML:', error);
- throw new Error(`Failed to parse YAML: ${error instanceof Error ? error.message : 'Unknown error'}`);
- }
-}
-
-export function validateAriumYAML(yamlContent: string): { isValid: boolean; error?: string } {
- try {
- const workflow = load(yamlContent) as any;
-
- if (!workflow) {
- return { isValid: false, error: 'Empty or invalid YAML content' };
- }
-
- if (!workflow.arium) {
- return { isValid: false, error: 'Missing "arium" section in YAML' };
- }
-
- if (!workflow.arium.agents || !Array.isArray(workflow.arium.agents)) {
- return { isValid: false, error: 'Missing or invalid "agents" array in arium section' };
- }
-
- // Validate each agent has required fields
- for (const agent of workflow.arium.agents) {
- if (!agent.name) {
- return { isValid: false, error: 'Agent missing required "name" field' };
- }
- if (!agent.job) {
- return { isValid: false, error: `Agent "${agent.name}" missing required "job" field` };
- }
- if (!agent.model || !agent.model.provider || !agent.model.name) {
- return { isValid: false, error: `Agent "${agent.name}" missing required model configuration` };
- }
- }
-
- // Validate workflow structure if present
- if (workflow.arium.workflow) {
- if (!workflow.arium.workflow.start) {
- return { isValid: false, error: 'Workflow missing "start" node' };
- }
- if (!workflow.arium.workflow.end || !Array.isArray(workflow.arium.workflow.end)) {
- return { isValid: false, error: 'Workflow missing "end" nodes array' };
- }
- }
-
- return { isValid: true };
- } catch (error) {
- return {
- isValid: false,
- error: `YAML parsing error: ${error instanceof Error ? error.message : 'Unknown error'}`
- };
- }
-}
-
-export function readFileAsText(file: File): Promise {
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onload = (event) => {
- if (event.target?.result) {
- resolve(event.target.result as string);
- } else {
- reject(new Error('Failed to read file'));
- }
- };
- reader.onerror = () => reject(new Error('File reading error'));
- reader.readAsText(file);
- });
-}
diff --git a/studio/tailwind.config.js b/studio/tailwind.config.js
deleted file mode 100644
index 62ed56ec..00000000
--- a/studio/tailwind.config.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/** @type {import('tailwindcss').Config} */
-module.exports = {
- darkMode: ["class"],
- content: [
- './pages/**/*.{ts,tsx}',
- './components/**/*.{ts,tsx}',
- './app/**/*.{ts,tsx}',
- './src/**/*.{ts,tsx}',
- ],
- prefix: "",
- theme: {
- container: {
- center: true,
- padding: "2rem",
- screens: {
- "2xl": "1400px",
- },
- },
- extend: {
- colors: {
- border: "hsl(var(--border))",
- input: "hsl(var(--input))",
- ring: "hsl(var(--ring))",
- background: "hsl(var(--background))",
- foreground: "hsl(var(--foreground))",
- primary: {
- DEFAULT: "hsl(var(--primary))",
- foreground: "hsl(var(--primary-foreground))",
- },
- secondary: {
- DEFAULT: "hsl(var(--secondary))",
- foreground: "hsl(var(--secondary-foreground))",
- },
- destructive: {
- DEFAULT: "hsl(var(--destructive))",
- foreground: "hsl(var(--destructive-foreground))",
- },
- muted: {
- DEFAULT: "hsl(var(--muted))",
- foreground: "hsl(var(--muted-foreground))",
- },
- accent: {
- DEFAULT: "hsl(var(--accent))",
- foreground: "hsl(var(--accent-foreground))",
- },
- popover: {
- DEFAULT: "hsl(var(--popover))",
- foreground: "hsl(var(--popover-foreground))",
- },
- card: {
- DEFAULT: "hsl(var(--card))",
- foreground: "hsl(var(--card-foreground))",
- },
- },
- borderRadius: {
- lg: "var(--radius)",
- md: "calc(var(--radius) - 2px)",
- sm: "calc(var(--radius) - 4px)",
- },
- keyframes: {
- "accordion-down": {
- from: { height: "0" },
- to: { height: "var(--radix-accordion-content-height)" },
- },
- "accordion-up": {
- from: { height: "var(--radix-accordion-content-height)" },
- to: { height: "0" },
- },
- },
- animation: {
- "accordion-down": "accordion-down 0.2s ease-out",
- "accordion-up": "accordion-up 0.2s ease-out",
- },
- },
- },
- plugins: [require("tailwindcss-animate")],
-}
diff --git a/studio/tsconfig.json b/studio/tsconfig.json
deleted file mode 100644
index f91e3013..00000000
--- a/studio/tsconfig.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2020",
- "useDefineForClassFields": true,
- "lib": ["ES2020", "DOM", "DOM.Iterable"],
- "module": "ESNext",
- "skipLibCheck": true,
-
- /* Bundler mode */
- "moduleResolution": "bundler",
- "allowImportingTsExtensions": true,
- "resolveJsonModule": true,
- "isolatedModules": true,
- "noEmit": true,
- "jsx": "react-jsx",
-
- /* Linting */
- "strict": true,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "noFallthroughCasesInSwitch": true,
-
- /* Path mapping */
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
- },
- "include": ["src"],
- "references": [{ "path": "./tsconfig.node.json" }]
-}
diff --git a/studio/tsconfig.node.json b/studio/tsconfig.node.json
deleted file mode 100644
index 42872c59..00000000
--- a/studio/tsconfig.node.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "compilerOptions": {
- "composite": true,
- "skipLibCheck": true,
- "module": "ESNext",
- "moduleResolution": "bundler",
- "allowSyntheticDefaultImports": true
- },
- "include": ["vite.config.ts"]
-}
diff --git a/studio/vite.config.ts b/studio/vite.config.ts
deleted file mode 100644
index 13e485de..00000000
--- a/studio/vite.config.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
-import path from 'path'
-
-// https://vitejs.dev/config/
-export default defineConfig({
- plugins: [react()],
- resolve: {
- alias: {
- "@": path.resolve(__dirname, "./src"),
- },
- },
-})
diff --git a/wavefront/README.md b/wavefront/README.md
new file mode 100644
index 00000000..22476f36
--- /dev/null
+++ b/wavefront/README.md
@@ -0,0 +1 @@
+# To be updated
\ No newline at end of file