Refactor UnifiedCoordinator to follow Single Responsibility Principle
- Create dedicated service classes for separated concerns: * AgentService: Agent management and health monitoring * WorkflowService: Workflow parsing and execution tracking * PerformanceService: Metrics and load balancing * BackgroundService: Background processes and cleanup * TaskService: Database persistence (already existed) - Refactor UnifiedCoordinator into UnifiedCoordinatorRefactored * Clean separation of responsibilities * Improved maintainability and testability * Dependency injection pattern for services * Clear service boundaries and interfaces - Maintain backward compatibility through re-exports - Update main.py to use refactored coordinator 🚀 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -2,833 +2,16 @@
|
|||||||
Unified Hive Coordinator
|
Unified Hive Coordinator
|
||||||
Combines the functionality of HiveCoordinator and DistributedCoordinator into a single,
|
Combines the functionality of HiveCoordinator and DistributedCoordinator into a single,
|
||||||
cohesive orchestration system for the Hive platform.
|
cohesive orchestration system for the Hive platform.
|
||||||
|
|
||||||
|
DEPRECATED: This module is being refactored. Use unified_coordinator_refactored.py for new implementations.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
# Re-export from refactored implementation
|
||||||
import aiohttp
|
from .unified_coordinator_refactored import (
|
||||||
import json
|
UnifiedCoordinatorRefactored as UnifiedCoordinator,
|
||||||
import time
|
Agent,
|
||||||
import hashlib
|
Task,
|
||||||
import logging
|
AgentType,
|
||||||
from dataclasses import dataclass, field
|
TaskStatus,
|
||||||
from typing import Dict, List, Optional, Any, Set
|
TaskPriority
|
||||||
from enum import Enum
|
)
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
|
||||||
from sqlalchemy.orm import Session
|
|
||||||
import redis.asyncio as redis
|
|
||||||
from prometheus_client import Counter, Histogram, Gauge
|
|
||||||
|
|
||||||
from ..models.agent import Agent as ORMAgent
|
|
||||||
from ..core.database import SessionLocal
|
|
||||||
from ..cli_agents.cli_agent_manager import get_cli_agent_manager
|
|
||||||
from ..services.task_service import TaskService
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
# Performance Metrics
|
|
||||||
TASK_COUNTER = Counter('hive_tasks_total', 'Total tasks processed', ['task_type', 'agent'])
|
|
||||||
TASK_DURATION = Histogram('hive_task_duration_seconds', 'Task execution time', ['task_type', 'agent'])
|
|
||||||
ACTIVE_TASKS = Gauge('hive_active_tasks', 'Currently active tasks', ['agent'])
|
|
||||||
AGENT_UTILIZATION = Gauge('hive_agent_utilization', 'Agent utilization percentage', ['agent'])
|
|
||||||
|
|
||||||
class AgentType(Enum):
|
|
||||||
"""Unified agent types supporting both original and distributed workflows"""
|
|
||||||
# Original agent types
|
|
||||||
KERNEL_DEV = "kernel_dev"
|
|
||||||
PYTORCH_DEV = "pytorch_dev"
|
|
||||||
PROFILER = "profiler"
|
|
||||||
DOCS_WRITER = "docs_writer"
|
|
||||||
TESTER = "tester"
|
|
||||||
CLI_GEMINI = "cli_gemini"
|
|
||||||
GENERAL_AI = "general_ai"
|
|
||||||
REASONING = "reasoning"
|
|
||||||
|
|
||||||
# Distributed workflow types
|
|
||||||
CODE_GENERATION = "code_generation"
|
|
||||||
CODE_REVIEW = "code_review"
|
|
||||||
TESTING = "testing"
|
|
||||||
COMPILATION = "compilation"
|
|
||||||
OPTIMIZATION = "optimization"
|
|
||||||
DOCUMENTATION = "documentation"
|
|
||||||
DEPLOYMENT = "deployment"
|
|
||||||
|
|
||||||
class TaskStatus(Enum):
|
|
||||||
"""Task status tracking"""
|
|
||||||
PENDING = "pending"
|
|
||||||
IN_PROGRESS = "in_progress"
|
|
||||||
COMPLETED = "completed"
|
|
||||||
FAILED = "failed"
|
|
||||||
|
|
||||||
class TaskPriority(Enum):
|
|
||||||
"""Task priority levels"""
|
|
||||||
CRITICAL = 1
|
|
||||||
HIGH = 2
|
|
||||||
NORMAL = 3
|
|
||||||
LOW = 4
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Agent:
|
|
||||||
"""Unified agent representation supporting both Ollama and CLI agents"""
|
|
||||||
id: str
|
|
||||||
endpoint: str
|
|
||||||
model: str
|
|
||||||
specialty: AgentType
|
|
||||||
max_concurrent: int = 2
|
|
||||||
current_tasks: int = 0
|
|
||||||
agent_type: str = "ollama" # "ollama" or "cli"
|
|
||||||
cli_config: Optional[Dict[str, Any]] = None
|
|
||||||
|
|
||||||
# Enhanced fields for distributed workflows
|
|
||||||
gpu_type: str = "unknown"
|
|
||||||
capabilities: Set[str] = field(default_factory=set)
|
|
||||||
performance_history: List[float] = field(default_factory=list)
|
|
||||||
specializations: List[AgentType] = field(default_factory=list)
|
|
||||||
last_heartbeat: float = field(default_factory=time.time)
|
|
||||||
|
|
||||||
def __post_init__(self):
|
|
||||||
if self.specializations:
|
|
||||||
self.capabilities.update([spec.value for spec in self.specializations])
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class Task:
|
|
||||||
"""Unified task representation"""
|
|
||||||
id: str
|
|
||||||
type: AgentType
|
|
||||||
priority: int = 3
|
|
||||||
status: TaskStatus = TaskStatus.PENDING
|
|
||||||
context: Dict[str, Any] = field(default_factory=dict)
|
|
||||||
payload: Dict[str, Any] = field(default_factory=dict)
|
|
||||||
assigned_agent: Optional[str] = None
|
|
||||||
result: Optional[Dict] = None
|
|
||||||
created_at: float = field(default_factory=time.time)
|
|
||||||
completed_at: Optional[float] = None
|
|
||||||
|
|
||||||
# Workflow support
|
|
||||||
workflow_id: Optional[str] = None
|
|
||||||
dependencies: List[str] = field(default_factory=list)
|
|
||||||
|
|
||||||
def cache_key(self) -> str:
|
|
||||||
"""Generate cache key for task result"""
|
|
||||||
payload_hash = hashlib.md5(json.dumps(self.payload, sort_keys=True).encode()).hexdigest()
|
|
||||||
return f"task_result:{self.type.value}:{payload_hash}"
|
|
||||||
|
|
||||||
class UnifiedCoordinator:
|
|
||||||
"""
|
|
||||||
Unified coordinator that combines HiveCoordinator and DistributedCoordinator functionality.
|
|
||||||
Provides both simple task orchestration and advanced distributed workflow management.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, redis_url: str = "redis://localhost:6379"):
|
|
||||||
# Core state
|
|
||||||
self.agents: Dict[str, Agent] = {}
|
|
||||||
self.tasks: Dict[str, Task] = {} # In-memory cache for active tasks
|
|
||||||
self.task_queue: List[Task] = []
|
|
||||||
self.is_initialized = False
|
|
||||||
|
|
||||||
# Database persistence
|
|
||||||
self.task_service = TaskService()
|
|
||||||
|
|
||||||
# CLI agent support
|
|
||||||
self.cli_agent_manager = None
|
|
||||||
|
|
||||||
# Distributed workflow support
|
|
||||||
self.redis_url = redis_url
|
|
||||||
self.redis_client: Optional[redis.Redis] = None
|
|
||||||
self.executor = ThreadPoolExecutor(max_workers=4)
|
|
||||||
self.running = False
|
|
||||||
self.workflow_tasks: Dict[str, List[Task]] = {}
|
|
||||||
|
|
||||||
# Performance tracking
|
|
||||||
self.load_balancer = AdaptiveLoadBalancer()
|
|
||||||
|
|
||||||
# Async tasks
|
|
||||||
self._background_tasks: Set[asyncio.Task] = set()
|
|
||||||
|
|
||||||
async def initialize(self):
|
|
||||||
"""Initialize the unified coordinator with all subsystems"""
|
|
||||||
if self.is_initialized:
|
|
||||||
return
|
|
||||||
|
|
||||||
logger.info("🚀 Initializing Unified Hive Coordinator...")
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Initialize CLI agent manager
|
|
||||||
self.cli_agent_manager = get_cli_agent_manager()
|
|
||||||
|
|
||||||
# Initialize Redis connection for distributed features
|
|
||||||
try:
|
|
||||||
self.redis_client = redis.from_url(self.redis_url)
|
|
||||||
await self.redis_client.ping()
|
|
||||||
logger.info("✅ Redis connection established")
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"⚠️ Redis unavailable, distributed features disabled: {e}")
|
|
||||||
self.redis_client = None
|
|
||||||
|
|
||||||
# Load agents from database
|
|
||||||
await self._load_database_agents()
|
|
||||||
|
|
||||||
# Load existing tasks from database
|
|
||||||
await self._load_database_tasks()
|
|
||||||
|
|
||||||
# Initialize cluster agents
|
|
||||||
self._initialize_cluster_agents()
|
|
||||||
|
|
||||||
# Test initial connectivity
|
|
||||||
await self._test_initial_connectivity()
|
|
||||||
|
|
||||||
self.is_initialized = True
|
|
||||||
logger.info("✅ Unified Hive Coordinator initialized successfully")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to initialize coordinator: {e}")
|
|
||||||
raise
|
|
||||||
|
|
||||||
async def start(self):
|
|
||||||
"""Start the coordinator background processes"""
|
|
||||||
if not self.is_initialized:
|
|
||||||
await self.initialize()
|
|
||||||
|
|
||||||
self.running = True
|
|
||||||
|
|
||||||
# Start background tasks
|
|
||||||
self._background_tasks.add(asyncio.create_task(self._task_processor()))
|
|
||||||
if self.redis_client:
|
|
||||||
self._background_tasks.add(asyncio.create_task(self._health_monitor()))
|
|
||||||
self._background_tasks.add(asyncio.create_task(self._performance_optimizer()))
|
|
||||||
|
|
||||||
logger.info("🚀 Unified Coordinator background processes started")
|
|
||||||
|
|
||||||
async def shutdown(self):
|
|
||||||
"""Shutdown the coordinator gracefully"""
|
|
||||||
logger.info("🛑 Shutting down Unified Hive Coordinator...")
|
|
||||||
|
|
||||||
self.running = False
|
|
||||||
|
|
||||||
# Cancel background tasks
|
|
||||||
for task in self._background_tasks:
|
|
||||||
task.cancel()
|
|
||||||
|
|
||||||
# Wait for tasks to complete
|
|
||||||
if self._background_tasks:
|
|
||||||
await asyncio.gather(*self._background_tasks, return_exceptions=True)
|
|
||||||
|
|
||||||
# Close Redis connection
|
|
||||||
if self.redis_client:
|
|
||||||
await self.redis_client.close()
|
|
||||||
|
|
||||||
# Shutdown executor
|
|
||||||
self.executor.shutdown(wait=True)
|
|
||||||
|
|
||||||
logger.info("✅ Unified Coordinator shutdown complete")
|
|
||||||
|
|
||||||
# =========================================================================
|
|
||||||
# AGENT MANAGEMENT
|
|
||||||
# =========================================================================
|
|
||||||
|
|
||||||
def add_agent(self, agent: Agent):
|
|
||||||
"""Add an agent to the coordinator"""
|
|
||||||
self.agents[agent.id] = agent
|
|
||||||
logger.info(f"✅ Added agent: {agent.id} ({agent.specialty.value})")
|
|
||||||
|
|
||||||
async def _load_database_agents(self):
|
|
||||||
"""Load agents from database"""
|
|
||||||
try:
|
|
||||||
db = SessionLocal()
|
|
||||||
orm_agents = db.query(ORMAgent).all()
|
|
||||||
|
|
||||||
for orm_agent in orm_agents:
|
|
||||||
specialty = AgentType(orm_agent.specialty) if orm_agent.specialty else AgentType.GENERAL_AI
|
|
||||||
agent = Agent(
|
|
||||||
id=orm_agent.id,
|
|
||||||
endpoint=orm_agent.endpoint,
|
|
||||||
model=orm_agent.model or "unknown",
|
|
||||||
specialty=specialty,
|
|
||||||
max_concurrent=orm_agent.max_concurrent,
|
|
||||||
current_tasks=orm_agent.current_tasks,
|
|
||||||
agent_type=orm_agent.agent_type,
|
|
||||||
cli_config=orm_agent.cli_config
|
|
||||||
)
|
|
||||||
self.add_agent(agent)
|
|
||||||
|
|
||||||
db.close()
|
|
||||||
logger.info(f"📊 Loaded {len(orm_agents)} agents from database")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to load agents from database: {e}")
|
|
||||||
|
|
||||||
async def _load_database_tasks(self):
|
|
||||||
"""Load pending and in-progress tasks from database"""
|
|
||||||
try:
|
|
||||||
# Load pending tasks
|
|
||||||
pending_orm_tasks = self.task_service.get_tasks(status='pending', limit=100)
|
|
||||||
for orm_task in pending_orm_tasks:
|
|
||||||
coordinator_task = self.task_service.coordinator_task_from_orm(orm_task)
|
|
||||||
self.tasks[coordinator_task.id] = coordinator_task
|
|
||||||
self.task_queue.append(coordinator_task)
|
|
||||||
|
|
||||||
# Load in-progress tasks
|
|
||||||
in_progress_orm_tasks = self.task_service.get_tasks(status='in_progress', limit=100)
|
|
||||||
for orm_task in in_progress_orm_tasks:
|
|
||||||
coordinator_task = self.task_service.coordinator_task_from_orm(orm_task)
|
|
||||||
self.tasks[coordinator_task.id] = coordinator_task
|
|
||||||
# In-progress tasks are not added to task_queue as they're already being processed
|
|
||||||
|
|
||||||
# Sort task queue by priority
|
|
||||||
self.task_queue.sort(key=lambda t: t.priority)
|
|
||||||
|
|
||||||
logger.info(f"📊 Loaded {len(pending_orm_tasks)} pending and {len(in_progress_orm_tasks)} in-progress tasks from database")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to load tasks from database: {e}")
|
|
||||||
|
|
||||||
def _initialize_cluster_agents(self):
|
|
||||||
"""Initialize predefined cluster agents"""
|
|
||||||
# This maintains compatibility with the original HiveCoordinator
|
|
||||||
cluster_agents = [
|
|
||||||
Agent(
|
|
||||||
id="walnut-codellama",
|
|
||||||
endpoint="http://walnut.local:11434",
|
|
||||||
model="codellama:34b",
|
|
||||||
specialty=AgentType.KERNEL_DEV
|
|
||||||
),
|
|
||||||
Agent(
|
|
||||||
id="oak-gemma",
|
|
||||||
endpoint="http://oak.local:11434",
|
|
||||||
model="gemma2:27b",
|
|
||||||
specialty=AgentType.PYTORCH_DEV
|
|
||||||
),
|
|
||||||
Agent(
|
|
||||||
id="ironwood-llama",
|
|
||||||
endpoint="http://ironwood.local:11434",
|
|
||||||
model="llama3.1:70b",
|
|
||||||
specialty=AgentType.GENERAL_AI
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
for agent in cluster_agents:
|
|
||||||
if agent.id not in self.agents:
|
|
||||||
self.add_agent(agent)
|
|
||||||
|
|
||||||
# =========================================================================
|
|
||||||
# TASK MANAGEMENT
|
|
||||||
# =========================================================================
|
|
||||||
|
|
||||||
def create_task(self, task_type: AgentType, context: Dict, priority: int = 3) -> Task:
|
|
||||||
"""Create a new task"""
|
|
||||||
task_id = f"task_{int(time.time())}_{len(self.tasks)}"
|
|
||||||
task = Task(
|
|
||||||
id=task_id,
|
|
||||||
type=task_type,
|
|
||||||
context=context,
|
|
||||||
priority=priority,
|
|
||||||
payload=context # For compatibility
|
|
||||||
)
|
|
||||||
|
|
||||||
# Persist to database
|
|
||||||
try:
|
|
||||||
self.task_service.create_task(task)
|
|
||||||
logger.info(f"💾 Task {task_id} persisted to database")
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to persist task {task_id} to database: {e}")
|
|
||||||
|
|
||||||
# Add to in-memory structures
|
|
||||||
self.tasks[task_id] = task
|
|
||||||
self.task_queue.append(task)
|
|
||||||
|
|
||||||
# Sort queue by priority
|
|
||||||
self.task_queue.sort(key=lambda t: t.priority)
|
|
||||||
|
|
||||||
logger.info(f"📝 Created task: {task_id} ({task_type.value}, priority: {priority})")
|
|
||||||
return task
|
|
||||||
|
|
||||||
async def submit_workflow(self, workflow: Dict[str, Any]) -> str:
|
|
||||||
"""Submit a workflow for execution (distributed coordinator compatibility)"""
|
|
||||||
workflow_id = f"workflow_{int(time.time())}"
|
|
||||||
tasks = self._parse_workflow_to_tasks(workflow, workflow_id)
|
|
||||||
|
|
||||||
self.workflow_tasks[workflow_id] = tasks
|
|
||||||
for task in tasks:
|
|
||||||
self.tasks[task.id] = task
|
|
||||||
|
|
||||||
await self._schedule_workflow_tasks(tasks)
|
|
||||||
|
|
||||||
logger.info(f"🔄 Submitted workflow: {workflow_id} with {len(tasks)} tasks")
|
|
||||||
return workflow_id
|
|
||||||
|
|
||||||
def _parse_workflow_to_tasks(self, workflow: Dict[str, Any], workflow_id: str) -> List[Task]:
|
|
||||||
"""Parse workflow definition into tasks"""
|
|
||||||
tasks = []
|
|
||||||
base_tasks = workflow.get('tasks', [])
|
|
||||||
|
|
||||||
for i, task_def in enumerate(base_tasks):
|
|
||||||
task_id = f"{workflow_id}_task_{i}"
|
|
||||||
task_type = AgentType(task_def.get('type', 'general_ai'))
|
|
||||||
|
|
||||||
task = Task(
|
|
||||||
id=task_id,
|
|
||||||
type=task_type,
|
|
||||||
workflow_id=workflow_id,
|
|
||||||
context=task_def.get('context', {}),
|
|
||||||
payload=task_def.get('payload', {}),
|
|
||||||
dependencies=task_def.get('dependencies', []),
|
|
||||||
priority=task_def.get('priority', 3)
|
|
||||||
)
|
|
||||||
tasks.append(task)
|
|
||||||
|
|
||||||
return tasks
|
|
||||||
|
|
||||||
async def _schedule_workflow_tasks(self, tasks: List[Task]):
|
|
||||||
"""Schedule workflow tasks respecting dependencies"""
|
|
||||||
for task in tasks:
|
|
||||||
if not task.dependencies:
|
|
||||||
self.task_queue.append(task)
|
|
||||||
# Tasks with dependencies will be scheduled when dependencies complete
|
|
||||||
|
|
||||||
def get_available_agent(self, task_type: AgentType) -> Optional[Agent]:
|
|
||||||
"""Find an available agent for the task type"""
|
|
||||||
available_agents = [
|
|
||||||
agent for agent in self.agents.values()
|
|
||||||
if (agent.specialty == task_type or task_type in agent.specializations)
|
|
||||||
and agent.current_tasks < agent.max_concurrent
|
|
||||||
]
|
|
||||||
|
|
||||||
if not available_agents:
|
|
||||||
# Fallback to general AI agents
|
|
||||||
available_agents = [
|
|
||||||
agent for agent in self.agents.values()
|
|
||||||
if agent.specialty == AgentType.GENERAL_AI
|
|
||||||
and agent.current_tasks < agent.max_concurrent
|
|
||||||
]
|
|
||||||
|
|
||||||
if available_agents:
|
|
||||||
# Use load balancer for optimal selection
|
|
||||||
return min(available_agents, key=lambda a: self.load_balancer.get_weight(a.id))
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
# =========================================================================
|
|
||||||
# TASK EXECUTION
|
|
||||||
# =========================================================================
|
|
||||||
|
|
||||||
async def _task_processor(self):
|
|
||||||
"""Background task processor"""
|
|
||||||
while self.running:
|
|
||||||
try:
|
|
||||||
if self.task_queue:
|
|
||||||
# Process pending tasks
|
|
||||||
await self.process_queue()
|
|
||||||
|
|
||||||
# Check for workflow tasks whose dependencies are satisfied
|
|
||||||
await self._check_workflow_dependencies()
|
|
||||||
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Error in task processor: {e}")
|
|
||||||
await asyncio.sleep(5)
|
|
||||||
|
|
||||||
async def process_queue(self):
|
|
||||||
"""Process the task queue"""
|
|
||||||
if not self.task_queue:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Process up to 5 tasks concurrently
|
|
||||||
batch_size = min(5, len(self.task_queue))
|
|
||||||
current_batch = self.task_queue[:batch_size]
|
|
||||||
|
|
||||||
tasks_to_execute = []
|
|
||||||
for task in current_batch:
|
|
||||||
agent = self.get_available_agent(task.type)
|
|
||||||
if agent:
|
|
||||||
tasks_to_execute.append((task, agent))
|
|
||||||
self.task_queue.remove(task)
|
|
||||||
|
|
||||||
if tasks_to_execute:
|
|
||||||
await asyncio.gather(*[
|
|
||||||
self._execute_task_with_agent(task, agent)
|
|
||||||
for task, agent in tasks_to_execute
|
|
||||||
], return_exceptions=True)
|
|
||||||
|
|
||||||
async def _execute_task_with_agent(self, task: Task, agent: Agent):
|
|
||||||
"""Execute a task with a specific agent"""
|
|
||||||
try:
|
|
||||||
task.status = TaskStatus.IN_PROGRESS
|
|
||||||
task.assigned_agent = agent.id
|
|
||||||
agent.current_tasks += 1
|
|
||||||
|
|
||||||
# Persist status change to database
|
|
||||||
try:
|
|
||||||
self.task_service.update_task(task.id, task)
|
|
||||||
logger.debug(f"💾 Updated task {task.id} status to IN_PROGRESS in database")
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to update task {task.id} status in database: {e}")
|
|
||||||
|
|
||||||
ACTIVE_TASKS.labels(agent=agent.id).inc()
|
|
||||||
start_time = time.time()
|
|
||||||
|
|
||||||
# Execute based on agent type
|
|
||||||
if agent.agent_type == "cli":
|
|
||||||
result = await self._execute_cli_task(task, agent)
|
|
||||||
else:
|
|
||||||
result = await self._execute_ollama_task(task, agent)
|
|
||||||
|
|
||||||
# Record metrics
|
|
||||||
execution_time = time.time() - start_time
|
|
||||||
TASK_COUNTER.labels(task_type=task.type.value, agent=agent.id).inc()
|
|
||||||
TASK_DURATION.labels(task_type=task.type.value, agent=agent.id).observe(execution_time)
|
|
||||||
|
|
||||||
# Update task
|
|
||||||
task.result = result
|
|
||||||
task.status = TaskStatus.COMPLETED
|
|
||||||
task.completed_at = time.time()
|
|
||||||
|
|
||||||
# Persist completion to database
|
|
||||||
try:
|
|
||||||
self.task_service.update_task(task.id, task)
|
|
||||||
logger.debug(f"💾 Updated task {task.id} status to COMPLETED in database")
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to update completed task {task.id} in database: {e}")
|
|
||||||
|
|
||||||
# Update agent
|
|
||||||
agent.current_tasks -= 1
|
|
||||||
self.load_balancer.update_weight(agent.id, execution_time)
|
|
||||||
|
|
||||||
ACTIVE_TASKS.labels(agent=agent.id).dec()
|
|
||||||
|
|
||||||
# Handle workflow completion
|
|
||||||
if task.workflow_id:
|
|
||||||
await self._handle_workflow_task_completion(task)
|
|
||||||
|
|
||||||
logger.info(f"✅ Task {task.id} completed by {agent.id}")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
task.status = TaskStatus.FAILED
|
|
||||||
task.result = {"error": str(e)}
|
|
||||||
|
|
||||||
# Persist failure to database
|
|
||||||
try:
|
|
||||||
self.task_service.update_task(task.id, task)
|
|
||||||
logger.debug(f"💾 Updated task {task.id} status to FAILED in database")
|
|
||||||
except Exception as db_e:
|
|
||||||
logger.error(f"❌ Failed to update failed task {task.id} in database: {db_e}")
|
|
||||||
|
|
||||||
agent.current_tasks -= 1
|
|
||||||
ACTIVE_TASKS.labels(agent=agent.id).dec()
|
|
||||||
logger.error(f"❌ Task {task.id} failed: {e}")
|
|
||||||
|
|
||||||
async def _execute_cli_task(self, task: Task, agent: Agent) -> Dict:
|
|
||||||
"""Execute task on CLI agent"""
|
|
||||||
if not self.cli_agent_manager:
|
|
||||||
raise Exception("CLI agent manager not initialized")
|
|
||||||
|
|
||||||
prompt = self._build_task_prompt(task)
|
|
||||||
return await self.cli_agent_manager.execute_task(agent.id, prompt, task.context)
|
|
||||||
|
|
||||||
async def _execute_ollama_task(self, task: Task, agent: Agent) -> Dict:
|
|
||||||
"""Execute task on Ollama agent"""
|
|
||||||
prompt = self._build_task_prompt(task)
|
|
||||||
|
|
||||||
async with aiohttp.ClientSession() as session:
|
|
||||||
payload = {
|
|
||||||
"model": agent.model,
|
|
||||||
"prompt": prompt,
|
|
||||||
"stream": False
|
|
||||||
}
|
|
||||||
|
|
||||||
async with session.post(f"{agent.endpoint}/api/generate", json=payload) as response:
|
|
||||||
if response.status == 200:
|
|
||||||
result = await response.json()
|
|
||||||
return {"output": result.get("response", ""), "model": agent.model}
|
|
||||||
else:
|
|
||||||
raise Exception(f"HTTP {response.status}: {await response.text()}")
|
|
||||||
|
|
||||||
def _build_task_prompt(self, task: Task) -> str:
|
|
||||||
"""Build prompt for task execution"""
|
|
||||||
context_str = json.dumps(task.context, indent=2) if task.context else "No context provided"
|
|
||||||
|
|
||||||
return f"""
|
|
||||||
Task Type: {task.type.value}
|
|
||||||
Priority: {task.priority}
|
|
||||||
Context: {context_str}
|
|
||||||
|
|
||||||
Please complete this task based on the provided context and requirements.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# =========================================================================
|
|
||||||
# WORKFLOW MANAGEMENT
|
|
||||||
# =========================================================================
|
|
||||||
|
|
||||||
async def _check_workflow_dependencies(self):
|
|
||||||
"""Check and schedule workflow tasks whose dependencies are satisfied"""
|
|
||||||
for workflow_id, workflow_tasks in self.workflow_tasks.items():
|
|
||||||
for task in workflow_tasks:
|
|
||||||
if (task.status == TaskStatus.PENDING and
|
|
||||||
task not in self.task_queue and
|
|
||||||
await self._dependencies_satisfied(task)):
|
|
||||||
self.task_queue.append(task)
|
|
||||||
|
|
||||||
async def _dependencies_satisfied(self, task: Task) -> bool:
|
|
||||||
"""Check if task dependencies are satisfied"""
|
|
||||||
for dep_id in task.dependencies:
|
|
||||||
dep_task = self.tasks.get(dep_id)
|
|
||||||
if not dep_task or dep_task.status != TaskStatus.COMPLETED:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
async def _handle_workflow_task_completion(self, task: Task):
|
|
||||||
"""Handle completion of a workflow task"""
|
|
||||||
if not task.workflow_id:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Check if workflow is complete
|
|
||||||
workflow_tasks = self.workflow_tasks.get(task.workflow_id, [])
|
|
||||||
completed_tasks = [t for t in workflow_tasks if t.status == TaskStatus.COMPLETED]
|
|
||||||
|
|
||||||
if len(completed_tasks) == len(workflow_tasks):
|
|
||||||
logger.info(f"🎉 Workflow {task.workflow_id} completed")
|
|
||||||
# Could emit event or update database here
|
|
||||||
|
|
||||||
async def get_workflow_status(self, workflow_id: str) -> Dict[str, Any]:
|
|
||||||
"""Get workflow execution status"""
|
|
||||||
workflow_tasks = self.workflow_tasks.get(workflow_id, [])
|
|
||||||
|
|
||||||
if not workflow_tasks:
|
|
||||||
return {"error": "Workflow not found"}
|
|
||||||
|
|
||||||
status_counts = {}
|
|
||||||
for status in TaskStatus:
|
|
||||||
status_counts[status.value] = len([t for t in workflow_tasks if t.status == status])
|
|
||||||
|
|
||||||
return {
|
|
||||||
"workflow_id": workflow_id,
|
|
||||||
"total_tasks": len(workflow_tasks),
|
|
||||||
"status_breakdown": status_counts,
|
|
||||||
"completed": status_counts.get("completed", 0) == len(workflow_tasks)
|
|
||||||
}
|
|
||||||
|
|
||||||
# =========================================================================
|
|
||||||
# MONITORING & HEALTH
|
|
||||||
# =========================================================================
|
|
||||||
|
|
||||||
async def _test_initial_connectivity(self):
|
|
||||||
"""Test connectivity to all agents"""
|
|
||||||
logger.info("🔍 Testing agent connectivity...")
|
|
||||||
|
|
||||||
for agent in self.agents.values():
|
|
||||||
try:
|
|
||||||
if agent.agent_type == "cli":
|
|
||||||
# Test CLI agent
|
|
||||||
if self.cli_agent_manager:
|
|
||||||
await self.cli_agent_manager.test_agent(agent.id)
|
|
||||||
else:
|
|
||||||
# Test Ollama agent
|
|
||||||
async with aiohttp.ClientSession() as session:
|
|
||||||
async with session.get(f"{agent.endpoint}/api/tags", timeout=aiohttp.ClientTimeout(total=5)) as response:
|
|
||||||
if response.status == 200:
|
|
||||||
logger.info(f"✅ Agent {agent.id} is responsive")
|
|
||||||
else:
|
|
||||||
logger.warning(f"⚠️ Agent {agent.id} returned HTTP {response.status}")
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"⚠️ Agent {agent.id} is not responsive: {e}")
|
|
||||||
|
|
||||||
async def _health_monitor(self):
|
|
||||||
"""Background health monitoring"""
|
|
||||||
while self.running:
|
|
||||||
try:
|
|
||||||
for agent in self.agents.values():
|
|
||||||
await self._check_agent_health(agent)
|
|
||||||
await asyncio.sleep(30) # Check every 30 seconds
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Health monitor error: {e}")
|
|
||||||
await asyncio.sleep(60)
|
|
||||||
|
|
||||||
async def _check_agent_health(self, agent: Agent):
|
|
||||||
"""Check individual agent health"""
|
|
||||||
try:
|
|
||||||
if agent.agent_type == "cli":
|
|
||||||
# CLI agent health check
|
|
||||||
if self.cli_agent_manager:
|
|
||||||
is_healthy = await self.cli_agent_manager.test_agent(agent.id)
|
|
||||||
else:
|
|
||||||
# Ollama agent health check
|
|
||||||
async with aiohttp.ClientSession() as session:
|
|
||||||
async with session.get(f"{agent.endpoint}/api/tags", timeout=aiohttp.ClientTimeout(total=10)) as response:
|
|
||||||
is_healthy = response.status == 200
|
|
||||||
|
|
||||||
if is_healthy:
|
|
||||||
agent.last_heartbeat = time.time()
|
|
||||||
else:
|
|
||||||
logger.warning(f"⚠️ Agent {agent.id} health check failed")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"⚠️ Agent {agent.id} health check error: {e}")
|
|
||||||
|
|
||||||
async def _performance_optimizer(self):
|
|
||||||
"""Background performance optimization"""
|
|
||||||
while self.running:
|
|
||||||
try:
|
|
||||||
await self._optimize_agent_parameters()
|
|
||||||
await self._cleanup_completed_tasks()
|
|
||||||
await asyncio.sleep(300) # Optimize every 5 minutes
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Performance optimizer error: {e}")
|
|
||||||
await asyncio.sleep(600)
|
|
||||||
|
|
||||||
async def _optimize_agent_parameters(self):
|
|
||||||
"""Optimize agent parameters based on performance"""
|
|
||||||
for agent in self.agents.values():
|
|
||||||
if agent.performance_history:
|
|
||||||
avg_time = sum(agent.performance_history) / len(agent.performance_history)
|
|
||||||
utilization = agent.current_tasks / agent.max_concurrent if agent.max_concurrent > 0 else 0
|
|
||||||
AGENT_UTILIZATION.labels(agent=agent.id).set(utilization)
|
|
||||||
|
|
||||||
async def _cleanup_completed_tasks(self):
|
|
||||||
"""Clean up old completed tasks"""
|
|
||||||
try:
|
|
||||||
# Clean up in-memory tasks (keep only active ones)
|
|
||||||
cutoff_time = time.time() - 3600 # 1 hour ago
|
|
||||||
|
|
||||||
completed_tasks = [
|
|
||||||
task_id for task_id, task in self.tasks.items()
|
|
||||||
if task.status == TaskStatus.COMPLETED and (task.completed_at or 0) < cutoff_time
|
|
||||||
]
|
|
||||||
|
|
||||||
for task_id in completed_tasks:
|
|
||||||
del self.tasks[task_id]
|
|
||||||
|
|
||||||
# Clean up database tasks (older ones)
|
|
||||||
try:
|
|
||||||
db_cleaned_count = self.task_service.cleanup_completed_tasks(max_age_hours=24)
|
|
||||||
if db_cleaned_count > 0:
|
|
||||||
logger.info(f"🧹 Cleaned up {db_cleaned_count} old tasks from database")
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to cleanup database tasks: {e}")
|
|
||||||
|
|
||||||
if completed_tasks:
|
|
||||||
logger.info(f"🧹 Cleaned up {len(completed_tasks)} old completed tasks from memory")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to cleanup completed tasks: {e}")
|
|
||||||
|
|
||||||
# =========================================================================
|
|
||||||
# STATUS & METRICS
|
|
||||||
# =========================================================================
|
|
||||||
|
|
||||||
def get_task_status(self, task_id: str) -> Optional[Task]:
|
|
||||||
"""Get status of a specific task"""
|
|
||||||
# First check in-memory cache
|
|
||||||
task = self.tasks.get(task_id)
|
|
||||||
if task:
|
|
||||||
return task
|
|
||||||
|
|
||||||
# If not in memory, check database
|
|
||||||
try:
|
|
||||||
orm_task = self.task_service.get_task(task_id)
|
|
||||||
if orm_task:
|
|
||||||
return self.task_service.coordinator_task_from_orm(orm_task)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to get task {task_id} from database: {e}")
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_completed_tasks(self, limit: int = 50) -> List[Task]:
|
|
||||||
"""Get all completed tasks"""
|
|
||||||
# Get from in-memory cache first
|
|
||||||
memory_completed = [task for task in self.tasks.values() if task.status == TaskStatus.COMPLETED]
|
|
||||||
|
|
||||||
# Get additional from database if needed
|
|
||||||
try:
|
|
||||||
if len(memory_completed) < limit:
|
|
||||||
db_completed = self.task_service.get_tasks(status='completed', limit=limit)
|
|
||||||
db_tasks = [self.task_service.coordinator_task_from_orm(orm_task) for orm_task in db_completed]
|
|
||||||
|
|
||||||
# Combine and deduplicate
|
|
||||||
all_tasks = {task.id: task for task in memory_completed + db_tasks}
|
|
||||||
return list(all_tasks.values())[:limit]
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to get completed tasks from database: {e}")
|
|
||||||
|
|
||||||
return memory_completed[:limit]
|
|
||||||
|
|
||||||
async def get_health_status(self):
|
|
||||||
"""Get coordinator health status"""
|
|
||||||
agent_status = {}
|
|
||||||
for agent_id, agent in self.agents.items():
|
|
||||||
agent_status[agent_id] = {
|
|
||||||
"type": agent.agent_type,
|
|
||||||
"model": agent.model,
|
|
||||||
"specialty": agent.specialty.value,
|
|
||||||
"current_tasks": agent.current_tasks,
|
|
||||||
"max_concurrent": agent.max_concurrent,
|
|
||||||
"last_heartbeat": agent.last_heartbeat
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get comprehensive task statistics from database
|
|
||||||
try:
|
|
||||||
db_stats = self.task_service.get_task_statistics()
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"❌ Failed to get task statistics from database: {e}")
|
|
||||||
db_stats = {}
|
|
||||||
|
|
||||||
return {
|
|
||||||
"status": "operational" if self.is_initialized else "initializing",
|
|
||||||
"agents": agent_status,
|
|
||||||
"total_agents": len(self.agents),
|
|
||||||
"active_tasks": len([t for t in self.tasks.values() if t.status == TaskStatus.IN_PROGRESS]),
|
|
||||||
"pending_tasks": len(self.task_queue),
|
|
||||||
"completed_tasks": len([t for t in self.tasks.values() if t.status == TaskStatus.COMPLETED]),
|
|
||||||
"database_statistics": db_stats
|
|
||||||
}
|
|
||||||
|
|
||||||
async def get_comprehensive_status(self):
|
|
||||||
"""Get comprehensive system status"""
|
|
||||||
health = await self.get_health_status()
|
|
||||||
|
|
||||||
return {
|
|
||||||
**health,
|
|
||||||
"coordinator_type": "unified",
|
|
||||||
"features": {
|
|
||||||
"simple_tasks": True,
|
|
||||||
"workflows": True,
|
|
||||||
"cli_agents": self.cli_agent_manager is not None,
|
|
||||||
"distributed_caching": self.redis_client is not None,
|
|
||||||
"performance_monitoring": True
|
|
||||||
},
|
|
||||||
"uptime": time.time() - (self.is_initialized and time.time() or 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
async def get_prometheus_metrics(self):
|
|
||||||
"""Get Prometheus metrics"""
|
|
||||||
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
|
|
||||||
return generate_latest()
|
|
||||||
|
|
||||||
def generate_progress_report(self) -> Dict:
|
|
||||||
"""Generate progress report"""
|
|
||||||
total_tasks = len(self.tasks)
|
|
||||||
completed_tasks = len([t for t in self.tasks.values() if t.status == TaskStatus.COMPLETED])
|
|
||||||
failed_tasks = len([t for t in self.tasks.values() if t.status == TaskStatus.FAILED])
|
|
||||||
|
|
||||||
return {
|
|
||||||
"total_tasks": total_tasks,
|
|
||||||
"completed_tasks": completed_tasks,
|
|
||||||
"failed_tasks": failed_tasks,
|
|
||||||
"success_rate": completed_tasks / total_tasks if total_tasks > 0 else 0,
|
|
||||||
"active_agents": len([a for a in self.agents.values() if a.current_tasks > 0]),
|
|
||||||
"queue_length": len(self.task_queue)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class AdaptiveLoadBalancer:
|
|
||||||
"""Simple adaptive load balancer for agent selection"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.weights: Dict[str, float] = {}
|
|
||||||
|
|
||||||
def update_weight(self, agent_id: str, performance_metric: float):
|
|
||||||
"""Update agent weight based on performance (lower is better)"""
|
|
||||||
# Inverse relationship: better performance = lower weight
|
|
||||||
self.weights[agent_id] = performance_metric
|
|
||||||
|
|
||||||
def get_weight(self, agent_id: str) -> float:
|
|
||||||
"""Get agent weight (lower = more preferred)"""
|
|
||||||
return self.weights.get(agent_id, 1.0)
|
|
||||||
468
backend/app/core/unified_coordinator_refactored.py
Normal file
468
backend/app/core/unified_coordinator_refactored.py
Normal file
@@ -0,0 +1,468 @@
|
|||||||
|
"""
|
||||||
|
Refactored Unified Hive Coordinator
|
||||||
|
|
||||||
|
Clean architecture with separated concerns using dedicated service classes.
|
||||||
|
Each service handles a specific responsibility for maintainability and testability.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import aiohttp
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import hashlib
|
||||||
|
import logging
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from typing import Dict, List, Optional, Any, Set
|
||||||
|
from enum import Enum
|
||||||
|
import redis.asyncio as redis
|
||||||
|
|
||||||
|
from ..services.agent_service import AgentService, Agent, AgentType
|
||||||
|
from ..services.task_service import TaskService
|
||||||
|
from ..services.workflow_service import WorkflowService, Task, TaskStatus
|
||||||
|
from ..services.performance_service import PerformanceService
|
||||||
|
from ..services.background_service import BackgroundService
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class TaskPriority(Enum):
|
||||||
|
"""Task priority levels"""
|
||||||
|
CRITICAL = 1
|
||||||
|
HIGH = 2
|
||||||
|
NORMAL = 3
|
||||||
|
LOW = 4
|
||||||
|
|
||||||
|
|
||||||
|
class UnifiedCoordinatorRefactored:
|
||||||
|
"""
|
||||||
|
Refactored unified coordinator with separated concerns.
|
||||||
|
|
||||||
|
This coordinator orchestrates between specialized services:
|
||||||
|
- AgentService: Agent management and health monitoring
|
||||||
|
- TaskService: Database persistence and CRUD operations
|
||||||
|
- WorkflowService: Workflow parsing and execution tracking
|
||||||
|
- PerformanceService: Metrics and load balancing
|
||||||
|
- BackgroundService: Background processes and cleanup
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, redis_url: str = "redis://localhost:6379"):
|
||||||
|
# Core state - only minimal coordination state
|
||||||
|
self.tasks: Dict[str, Task] = {} # In-memory cache for active tasks
|
||||||
|
self.task_queue: List[Task] = []
|
||||||
|
self.is_initialized = False
|
||||||
|
self.running = False
|
||||||
|
|
||||||
|
# Redis for distributed features
|
||||||
|
self.redis_url = redis_url
|
||||||
|
self.redis_client: Optional[redis.Redis] = None
|
||||||
|
|
||||||
|
# Specialized services
|
||||||
|
self.agent_service = AgentService()
|
||||||
|
self.task_service = TaskService()
|
||||||
|
self.workflow_service = WorkflowService()
|
||||||
|
self.performance_service = PerformanceService()
|
||||||
|
self.background_service = BackgroundService()
|
||||||
|
|
||||||
|
async def initialize(self):
|
||||||
|
"""Initialize the unified coordinator with all subsystems"""
|
||||||
|
if self.is_initialized:
|
||||||
|
return
|
||||||
|
|
||||||
|
logger.info("🚀 Initializing Refactored Unified Hive Coordinator...")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Initialize Redis connection for distributed features
|
||||||
|
try:
|
||||||
|
self.redis_client = redis.from_url(self.redis_url)
|
||||||
|
await self.redis_client.ping()
|
||||||
|
logger.info("✅ Redis connection established")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"⚠️ Redis unavailable, distributed features disabled: {e}")
|
||||||
|
self.redis_client = None
|
||||||
|
|
||||||
|
# Initialize all services
|
||||||
|
await self.agent_service.initialize()
|
||||||
|
self.task_service.initialize()
|
||||||
|
self.workflow_service.initialize()
|
||||||
|
self.performance_service.initialize()
|
||||||
|
|
||||||
|
# Initialize background service with dependencies
|
||||||
|
self.background_service.initialize(
|
||||||
|
self.agent_service,
|
||||||
|
self.task_service,
|
||||||
|
self.workflow_service,
|
||||||
|
self.performance_service
|
||||||
|
)
|
||||||
|
|
||||||
|
# Load existing tasks from database
|
||||||
|
await self._load_database_tasks()
|
||||||
|
|
||||||
|
self.is_initialized = True
|
||||||
|
logger.info("✅ Refactored Unified Hive Coordinator initialized successfully")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to initialize coordinator: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
async def start(self):
|
||||||
|
"""Start the coordinator background processes"""
|
||||||
|
if not self.is_initialized:
|
||||||
|
await self.initialize()
|
||||||
|
|
||||||
|
self.running = True
|
||||||
|
|
||||||
|
# Start background service
|
||||||
|
await self.background_service.start()
|
||||||
|
|
||||||
|
# Start main task processor
|
||||||
|
asyncio.create_task(self._task_processor())
|
||||||
|
|
||||||
|
logger.info("🚀 Refactored Unified Coordinator background processes started")
|
||||||
|
|
||||||
|
async def shutdown(self):
|
||||||
|
"""Shutdown the coordinator gracefully"""
|
||||||
|
logger.info("🛑 Shutting down Refactored Unified Hive Coordinator...")
|
||||||
|
|
||||||
|
self.running = False
|
||||||
|
|
||||||
|
# Shutdown background service
|
||||||
|
await self.background_service.shutdown()
|
||||||
|
|
||||||
|
# Close Redis connection
|
||||||
|
if self.redis_client:
|
||||||
|
await self.redis_client.close()
|
||||||
|
|
||||||
|
logger.info("✅ Refactored Unified Coordinator shutdown complete")
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# TASK COORDINATION (Main Responsibility)
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
def create_task(self, task_type: AgentType, context: Dict, priority: int = 3) -> Task:
|
||||||
|
"""Create a new task"""
|
||||||
|
task_id = f"task_{int(time.time())}_{len(self.tasks)}"
|
||||||
|
task = Task(
|
||||||
|
id=task_id,
|
||||||
|
type=task_type,
|
||||||
|
context=context,
|
||||||
|
priority=priority,
|
||||||
|
payload=context # For compatibility
|
||||||
|
)
|
||||||
|
|
||||||
|
# Persist to database
|
||||||
|
try:
|
||||||
|
self.task_service.create_task(task)
|
||||||
|
logger.info(f"💾 Task {task_id} persisted to database")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to persist task {task_id} to database: {e}")
|
||||||
|
|
||||||
|
# Add to in-memory structures
|
||||||
|
self.tasks[task_id] = task
|
||||||
|
self.task_queue.append(task)
|
||||||
|
|
||||||
|
# Sort queue by priority
|
||||||
|
self.task_queue.sort(key=lambda t: t.priority)
|
||||||
|
|
||||||
|
logger.info(f"📝 Created task: {task_id} ({task_type.value}, priority: {priority})")
|
||||||
|
return task
|
||||||
|
|
||||||
|
async def _task_processor(self):
|
||||||
|
"""Background task processor"""
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
if self.task_queue:
|
||||||
|
# Process pending tasks
|
||||||
|
await self.process_queue()
|
||||||
|
|
||||||
|
# Check for workflow tasks whose dependencies are satisfied
|
||||||
|
await self._check_workflow_dependencies()
|
||||||
|
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Error in task processor: {e}")
|
||||||
|
await asyncio.sleep(5)
|
||||||
|
|
||||||
|
async def process_queue(self):
|
||||||
|
"""Process the task queue"""
|
||||||
|
if not self.task_queue:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Process up to 5 tasks concurrently
|
||||||
|
batch_size = min(5, len(self.task_queue))
|
||||||
|
current_batch = self.task_queue[:batch_size]
|
||||||
|
|
||||||
|
tasks_to_execute = []
|
||||||
|
for task in current_batch:
|
||||||
|
agent = self.agent_service.get_optimal_agent(
|
||||||
|
task.type,
|
||||||
|
self.performance_service.get_load_balancer()
|
||||||
|
)
|
||||||
|
if agent:
|
||||||
|
tasks_to_execute.append((task, agent))
|
||||||
|
self.task_queue.remove(task)
|
||||||
|
|
||||||
|
if tasks_to_execute:
|
||||||
|
await asyncio.gather(*[
|
||||||
|
self._execute_task_with_agent(task, agent)
|
||||||
|
for task, agent in tasks_to_execute
|
||||||
|
], return_exceptions=True)
|
||||||
|
|
||||||
|
async def _execute_task_with_agent(self, task: Task, agent):
|
||||||
|
"""Execute a task with a specific agent"""
|
||||||
|
try:
|
||||||
|
task.status = TaskStatus.IN_PROGRESS
|
||||||
|
task.assigned_agent = agent.id
|
||||||
|
|
||||||
|
# Update agent and metrics
|
||||||
|
self.agent_service.increment_agent_tasks(agent.id)
|
||||||
|
self.performance_service.record_task_start(agent.id)
|
||||||
|
|
||||||
|
# Persist status change to database
|
||||||
|
try:
|
||||||
|
self.task_service.update_task(task.id, task)
|
||||||
|
logger.debug(f"💾 Updated task {task.id} status to IN_PROGRESS in database")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to update task {task.id} status in database: {e}")
|
||||||
|
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
# Execute based on agent type
|
||||||
|
if agent.agent_type == "cli":
|
||||||
|
result = await self._execute_cli_task(task, agent)
|
||||||
|
else:
|
||||||
|
result = await self._execute_ollama_task(task, agent)
|
||||||
|
|
||||||
|
# Record metrics
|
||||||
|
execution_time = time.time() - start_time
|
||||||
|
self.performance_service.record_task_completion(agent.id, task.type.value, execution_time)
|
||||||
|
|
||||||
|
# Update task
|
||||||
|
task.result = result
|
||||||
|
task.status = TaskStatus.COMPLETED
|
||||||
|
task.completed_at = time.time()
|
||||||
|
|
||||||
|
# Persist completion to database
|
||||||
|
try:
|
||||||
|
self.task_service.update_task(task.id, task)
|
||||||
|
logger.debug(f"💾 Updated task {task.id} status to COMPLETED in database")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to update completed task {task.id} in database: {e}")
|
||||||
|
|
||||||
|
# Update agent
|
||||||
|
self.agent_service.decrement_agent_tasks(agent.id)
|
||||||
|
|
||||||
|
# Handle workflow completion
|
||||||
|
if task.workflow_id:
|
||||||
|
self.workflow_service.handle_task_completion(task)
|
||||||
|
|
||||||
|
logger.info(f"✅ Task {task.id} completed by {agent.id}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
task.status = TaskStatus.FAILED
|
||||||
|
task.result = {"error": str(e)}
|
||||||
|
|
||||||
|
# Persist failure to database
|
||||||
|
try:
|
||||||
|
self.task_service.update_task(task.id, task)
|
||||||
|
logger.debug(f"💾 Updated task {task.id} status to FAILED in database")
|
||||||
|
except Exception as db_e:
|
||||||
|
logger.error(f"❌ Failed to update failed task {task.id} in database: {db_e}")
|
||||||
|
|
||||||
|
self.agent_service.decrement_agent_tasks(agent.id)
|
||||||
|
self.performance_service.record_task_failure(agent.id)
|
||||||
|
logger.error(f"❌ Task {task.id} failed: {e}")
|
||||||
|
|
||||||
|
async def _execute_cli_task(self, task: Task, agent) -> Dict:
|
||||||
|
"""Execute task on CLI agent"""
|
||||||
|
if not self.agent_service.cli_agent_manager:
|
||||||
|
raise Exception("CLI agent manager not initialized")
|
||||||
|
|
||||||
|
prompt = self._build_task_prompt(task)
|
||||||
|
return await self.agent_service.cli_agent_manager.execute_task(agent.id, prompt, task.context)
|
||||||
|
|
||||||
|
async def _execute_ollama_task(self, task: Task, agent) -> Dict:
|
||||||
|
"""Execute task on Ollama agent"""
|
||||||
|
prompt = self._build_task_prompt(task)
|
||||||
|
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
payload = {
|
||||||
|
"model": agent.model,
|
||||||
|
"prompt": prompt,
|
||||||
|
"stream": False
|
||||||
|
}
|
||||||
|
|
||||||
|
async with session.post(f"{agent.endpoint}/api/generate", json=payload) as response:
|
||||||
|
if response.status == 200:
|
||||||
|
result = await response.json()
|
||||||
|
return {"output": result.get("response", ""), "model": agent.model}
|
||||||
|
else:
|
||||||
|
raise Exception(f"HTTP {response.status}: {await response.text()}")
|
||||||
|
|
||||||
|
def _build_task_prompt(self, task: Task) -> str:
|
||||||
|
"""Build prompt for task execution"""
|
||||||
|
context_str = json.dumps(task.context, indent=2) if task.context else "No context provided"
|
||||||
|
|
||||||
|
return f"""
|
||||||
|
Task Type: {task.type.value}
|
||||||
|
Priority: {task.priority}
|
||||||
|
Context: {context_str}
|
||||||
|
|
||||||
|
Please complete this task based on the provided context and requirements.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# WORKFLOW DELEGATION
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
async def submit_workflow(self, workflow: Dict[str, Any]) -> str:
|
||||||
|
"""Submit a workflow for execution"""
|
||||||
|
return await self.workflow_service.submit_workflow(workflow)
|
||||||
|
|
||||||
|
async def _check_workflow_dependencies(self):
|
||||||
|
"""Check and schedule workflow tasks whose dependencies are satisfied"""
|
||||||
|
ready_tasks = self.workflow_service.get_ready_workflow_tasks(self.tasks)
|
||||||
|
for task in ready_tasks:
|
||||||
|
if task not in self.task_queue:
|
||||||
|
self.tasks[task.id] = task
|
||||||
|
self.task_queue.append(task)
|
||||||
|
|
||||||
|
def get_workflow_status(self, workflow_id: str) -> Dict[str, Any]:
|
||||||
|
"""Get workflow execution status"""
|
||||||
|
return self.workflow_service.get_workflow_status(workflow_id)
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# SERVICE DELEGATION
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
async def _load_database_tasks(self):
|
||||||
|
"""Load pending and in-progress tasks from database"""
|
||||||
|
try:
|
||||||
|
# Load pending tasks
|
||||||
|
pending_orm_tasks = self.task_service.get_tasks(status='pending', limit=100)
|
||||||
|
for orm_task in pending_orm_tasks:
|
||||||
|
coordinator_task = self.task_service.coordinator_task_from_orm(orm_task)
|
||||||
|
self.tasks[coordinator_task.id] = coordinator_task
|
||||||
|
self.task_queue.append(coordinator_task)
|
||||||
|
|
||||||
|
# Load in-progress tasks
|
||||||
|
in_progress_orm_tasks = self.task_service.get_tasks(status='in_progress', limit=100)
|
||||||
|
for orm_task in in_progress_orm_tasks:
|
||||||
|
coordinator_task = self.task_service.coordinator_task_from_orm(orm_task)
|
||||||
|
self.tasks[coordinator_task.id] = coordinator_task
|
||||||
|
# In-progress tasks are not added to task_queue as they're already being processed
|
||||||
|
|
||||||
|
# Sort task queue by priority
|
||||||
|
self.task_queue.sort(key=lambda t: t.priority)
|
||||||
|
|
||||||
|
logger.info(f"📊 Loaded {len(pending_orm_tasks)} pending and {len(in_progress_orm_tasks)} in-progress tasks from database")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to load tasks from database: {e}")
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# STATUS & HEALTH (Delegation to Services)
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
def get_task_status(self, task_id: str) -> Optional[Task]:
|
||||||
|
"""Get status of a specific task"""
|
||||||
|
# First check in-memory cache
|
||||||
|
task = self.tasks.get(task_id)
|
||||||
|
if task:
|
||||||
|
return task
|
||||||
|
|
||||||
|
# If not in memory, check database
|
||||||
|
try:
|
||||||
|
orm_task = self.task_service.get_task(task_id)
|
||||||
|
if orm_task:
|
||||||
|
return self.task_service.coordinator_task_from_orm(orm_task)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to get task {task_id} from database: {e}")
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_completed_tasks(self, limit: int = 50) -> List[Task]:
|
||||||
|
"""Get all completed tasks"""
|
||||||
|
# Get from in-memory cache first
|
||||||
|
memory_completed = [task for task in self.tasks.values() if task.status == TaskStatus.COMPLETED]
|
||||||
|
|
||||||
|
# Get additional from database if needed
|
||||||
|
try:
|
||||||
|
if len(memory_completed) < limit:
|
||||||
|
db_completed = self.task_service.get_tasks(status='completed', limit=limit)
|
||||||
|
db_tasks = [self.task_service.coordinator_task_from_orm(orm_task) for orm_task in db_completed]
|
||||||
|
|
||||||
|
# Combine and deduplicate
|
||||||
|
all_tasks = {task.id: task for task in memory_completed + db_tasks}
|
||||||
|
return list(all_tasks.values())[:limit]
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to get completed tasks from database: {e}")
|
||||||
|
|
||||||
|
return memory_completed[:limit]
|
||||||
|
|
||||||
|
async def get_health_status(self):
|
||||||
|
"""Get coordinator health status"""
|
||||||
|
agent_status = self.agent_service.get_agent_status()
|
||||||
|
|
||||||
|
# Get comprehensive task statistics from database
|
||||||
|
try:
|
||||||
|
db_stats = self.task_service.get_task_statistics()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to get task statistics from database: {e}")
|
||||||
|
db_stats = {}
|
||||||
|
|
||||||
|
return {
|
||||||
|
"status": "operational" if self.is_initialized else "initializing",
|
||||||
|
"agents": agent_status,
|
||||||
|
"total_agents": len(self.agent_service.get_all_agents()),
|
||||||
|
"active_tasks": len([t for t in self.tasks.values() if t.status == TaskStatus.IN_PROGRESS]),
|
||||||
|
"pending_tasks": len(self.task_queue),
|
||||||
|
"completed_tasks": len([t for t in self.tasks.values() if t.status == TaskStatus.COMPLETED]),
|
||||||
|
"database_statistics": db_stats,
|
||||||
|
"background_service": self.background_service.get_status()
|
||||||
|
}
|
||||||
|
|
||||||
|
async def get_comprehensive_status(self):
|
||||||
|
"""Get comprehensive system status"""
|
||||||
|
health = await self.get_health_status()
|
||||||
|
|
||||||
|
return {
|
||||||
|
**health,
|
||||||
|
"coordinator_type": "unified_refactored",
|
||||||
|
"features": {
|
||||||
|
"simple_tasks": True,
|
||||||
|
"workflows": True,
|
||||||
|
"cli_agents": self.agent_service.cli_agent_manager is not None,
|
||||||
|
"distributed_caching": self.redis_client is not None,
|
||||||
|
"performance_monitoring": True,
|
||||||
|
"separated_concerns": True
|
||||||
|
},
|
||||||
|
"uptime": time.time() - (self.is_initialized and time.time() or 0),
|
||||||
|
"performance_metrics": self.performance_service.get_performance_metrics()
|
||||||
|
}
|
||||||
|
|
||||||
|
async def get_prometheus_metrics(self):
|
||||||
|
"""Get Prometheus metrics"""
|
||||||
|
return await self.performance_service.get_prometheus_metrics()
|
||||||
|
|
||||||
|
def generate_progress_report(self) -> Dict:
|
||||||
|
"""Generate progress report"""
|
||||||
|
return self.performance_service.generate_performance_report(
|
||||||
|
self.agent_service.get_all_agents(),
|
||||||
|
self.tasks
|
||||||
|
)
|
||||||
|
|
||||||
|
# =========================================================================
|
||||||
|
# AGENT MANAGEMENT (Delegation)
|
||||||
|
# =========================================================================
|
||||||
|
|
||||||
|
def add_agent(self, agent: Agent):
|
||||||
|
"""Add an agent to the coordinator"""
|
||||||
|
self.agent_service.add_agent(agent)
|
||||||
|
|
||||||
|
def get_available_agent(self, task_type: AgentType):
|
||||||
|
"""Find an available agent for the task type"""
|
||||||
|
return self.agent_service.get_optimal_agent(
|
||||||
|
task_type,
|
||||||
|
self.performance_service.get_load_balancer()
|
||||||
|
)
|
||||||
@@ -9,7 +9,7 @@ from datetime import datetime
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import socketio
|
import socketio
|
||||||
|
|
||||||
from .core.unified_coordinator import UnifiedCoordinator
|
from .core.unified_coordinator_refactored import UnifiedCoordinatorRefactored as UnifiedCoordinator
|
||||||
from .core.database import engine, get_db, init_database_with_retry, test_database_connection
|
from .core.database import engine, get_db, init_database_with_retry, test_database_connection
|
||||||
from .api import agents, workflows, executions, monitoring, projects, tasks, cluster, distributed_workflows, cli_agents, auth
|
from .api import agents, workflows, executions, monitoring, projects, tasks, cluster, distributed_workflows, cli_agents, auth
|
||||||
from .models.user import Base
|
from .models.user import Base
|
||||||
|
|||||||
300
backend/app/services/agent_service.py
Normal file
300
backend/app/services/agent_service.py
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
"""
|
||||||
|
Agent Management Service
|
||||||
|
|
||||||
|
Handles agent registration, health monitoring, and connectivity management.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import aiohttp
|
||||||
|
import time
|
||||||
|
import logging
|
||||||
|
from typing import Dict, List, Optional, Set, Any
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
from ..models.agent import Agent as ORMAgent
|
||||||
|
from ..core.database import SessionLocal
|
||||||
|
from ..cli_agents.cli_agent_manager import get_cli_agent_manager
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class AgentType(Enum):
|
||||||
|
"""Unified agent types supporting both original and distributed workflows"""
|
||||||
|
# Original agent types
|
||||||
|
KERNEL_DEV = "kernel_dev"
|
||||||
|
PYTORCH_DEV = "pytorch_dev"
|
||||||
|
PROFILER = "profiler"
|
||||||
|
DOCS_WRITER = "docs_writer"
|
||||||
|
TESTER = "tester"
|
||||||
|
CLI_GEMINI = "cli_gemini"
|
||||||
|
GENERAL_AI = "general_ai"
|
||||||
|
REASONING = "reasoning"
|
||||||
|
|
||||||
|
# Distributed workflow types
|
||||||
|
CODE_GENERATION = "code_generation"
|
||||||
|
CODE_REVIEW = "code_review"
|
||||||
|
TESTING = "testing"
|
||||||
|
COMPILATION = "compilation"
|
||||||
|
OPTIMIZATION = "optimization"
|
||||||
|
DOCUMENTATION = "documentation"
|
||||||
|
DEPLOYMENT = "deployment"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Agent:
|
||||||
|
"""Unified agent representation supporting both Ollama and CLI agents"""
|
||||||
|
id: str
|
||||||
|
endpoint: str
|
||||||
|
model: str
|
||||||
|
specialty: AgentType
|
||||||
|
max_concurrent: int = 2
|
||||||
|
current_tasks: int = 0
|
||||||
|
agent_type: str = "ollama" # "ollama" or "cli"
|
||||||
|
cli_config: Optional[Dict[str, Any]] = None
|
||||||
|
|
||||||
|
# Enhanced fields for distributed workflows
|
||||||
|
gpu_type: str = "unknown"
|
||||||
|
capabilities: Set[str] = field(default_factory=set)
|
||||||
|
performance_history: List[float] = field(default_factory=list)
|
||||||
|
specializations: List[AgentType] = field(default_factory=list)
|
||||||
|
last_heartbeat: float = field(default_factory=time.time)
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.specializations:
|
||||||
|
self.capabilities.update([spec.value for spec in self.specializations])
|
||||||
|
|
||||||
|
|
||||||
|
class AgentService:
|
||||||
|
"""Service for managing agents in the Hive cluster"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.agents: Dict[str, Agent] = {}
|
||||||
|
self.cli_agent_manager = None
|
||||||
|
self._initialized = False
|
||||||
|
|
||||||
|
async def initialize(self):
|
||||||
|
"""Initialize the agent service"""
|
||||||
|
if self._initialized:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Initialize CLI agent manager
|
||||||
|
self.cli_agent_manager = get_cli_agent_manager()
|
||||||
|
|
||||||
|
# Load agents from database
|
||||||
|
await self._load_database_agents()
|
||||||
|
|
||||||
|
# Initialize predefined cluster agents
|
||||||
|
self._initialize_cluster_agents()
|
||||||
|
|
||||||
|
# Test initial connectivity
|
||||||
|
await self._test_initial_connectivity()
|
||||||
|
|
||||||
|
self._initialized = True
|
||||||
|
logger.info("✅ Agent Service initialized successfully")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to initialize agent service: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
def add_agent(self, agent: Agent):
|
||||||
|
"""Add an agent to the service"""
|
||||||
|
self.agents[agent.id] = agent
|
||||||
|
logger.info(f"✅ Added agent: {agent.id} ({agent.specialty.value})")
|
||||||
|
|
||||||
|
def get_agent(self, agent_id: str) -> Optional[Agent]:
|
||||||
|
"""Get agent by ID"""
|
||||||
|
return self.agents.get(agent_id)
|
||||||
|
|
||||||
|
def get_all_agents(self) -> Dict[str, Agent]:
|
||||||
|
"""Get all agents"""
|
||||||
|
return self.agents.copy()
|
||||||
|
|
||||||
|
def get_agents_by_specialty(self, specialty: AgentType) -> List[Agent]:
|
||||||
|
"""Get agents by specialty"""
|
||||||
|
return [
|
||||||
|
agent for agent in self.agents.values()
|
||||||
|
if agent.specialty == specialty or specialty in agent.specializations
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_available_agents(self, specialty: Optional[AgentType] = None) -> List[Agent]:
|
||||||
|
"""Get available agents, optionally filtered by specialty"""
|
||||||
|
available = [
|
||||||
|
agent for agent in self.agents.values()
|
||||||
|
if agent.current_tasks < agent.max_concurrent
|
||||||
|
]
|
||||||
|
|
||||||
|
if specialty:
|
||||||
|
available = [
|
||||||
|
agent for agent in available
|
||||||
|
if agent.specialty == specialty or specialty in agent.specializations
|
||||||
|
]
|
||||||
|
|
||||||
|
return available
|
||||||
|
|
||||||
|
def get_optimal_agent(self, specialty: AgentType, load_balancer=None) -> Optional[Agent]:
|
||||||
|
"""Get the optimal agent for a task type"""
|
||||||
|
available_agents = [
|
||||||
|
agent for agent in self.agents.values()
|
||||||
|
if (agent.specialty == specialty or specialty in agent.specializations)
|
||||||
|
and agent.current_tasks < agent.max_concurrent
|
||||||
|
]
|
||||||
|
|
||||||
|
if not available_agents:
|
||||||
|
# Fallback to general AI agents
|
||||||
|
available_agents = [
|
||||||
|
agent for agent in self.agents.values()
|
||||||
|
if agent.specialty == AgentType.GENERAL_AI
|
||||||
|
and agent.current_tasks < agent.max_concurrent
|
||||||
|
]
|
||||||
|
|
||||||
|
if available_agents:
|
||||||
|
if load_balancer:
|
||||||
|
return min(available_agents, key=lambda a: load_balancer.get_weight(a.id))
|
||||||
|
else:
|
||||||
|
# Simple round-robin based on current tasks
|
||||||
|
return min(available_agents, key=lambda a: a.current_tasks)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def increment_agent_tasks(self, agent_id: str):
|
||||||
|
"""Increment current task count for an agent"""
|
||||||
|
if agent_id in self.agents:
|
||||||
|
self.agents[agent_id].current_tasks += 1
|
||||||
|
|
||||||
|
def decrement_agent_tasks(self, agent_id: str):
|
||||||
|
"""Decrement current task count for an agent"""
|
||||||
|
if agent_id in self.agents:
|
||||||
|
self.agents[agent_id].current_tasks = max(0, self.agents[agent_id].current_tasks - 1)
|
||||||
|
|
||||||
|
def update_agent_heartbeat(self, agent_id: str):
|
||||||
|
"""Update agent heartbeat timestamp"""
|
||||||
|
if agent_id in self.agents:
|
||||||
|
self.agents[agent_id].last_heartbeat = time.time()
|
||||||
|
|
||||||
|
async def _load_database_agents(self):
|
||||||
|
"""Load agents from database"""
|
||||||
|
try:
|
||||||
|
db = SessionLocal()
|
||||||
|
orm_agents = db.query(ORMAgent).all()
|
||||||
|
|
||||||
|
for orm_agent in orm_agents:
|
||||||
|
specialty = AgentType(orm_agent.specialty) if orm_agent.specialty else AgentType.GENERAL_AI
|
||||||
|
agent = Agent(
|
||||||
|
id=orm_agent.id,
|
||||||
|
endpoint=orm_agent.endpoint,
|
||||||
|
model=orm_agent.model or "unknown",
|
||||||
|
specialty=specialty,
|
||||||
|
max_concurrent=orm_agent.max_concurrent,
|
||||||
|
current_tasks=orm_agent.current_tasks,
|
||||||
|
agent_type=orm_agent.agent_type,
|
||||||
|
cli_config=orm_agent.cli_config
|
||||||
|
)
|
||||||
|
self.add_agent(agent)
|
||||||
|
|
||||||
|
db.close()
|
||||||
|
logger.info(f"📊 Loaded {len(orm_agents)} agents from database")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to load agents from database: {e}")
|
||||||
|
|
||||||
|
def _initialize_cluster_agents(self):
|
||||||
|
"""Initialize predefined cluster agents"""
|
||||||
|
cluster_agents = [
|
||||||
|
Agent(
|
||||||
|
id="walnut-codellama",
|
||||||
|
endpoint="http://walnut.local:11434",
|
||||||
|
model="codellama:34b",
|
||||||
|
specialty=AgentType.KERNEL_DEV
|
||||||
|
),
|
||||||
|
Agent(
|
||||||
|
id="oak-gemma",
|
||||||
|
endpoint="http://oak.local:11434",
|
||||||
|
model="gemma2:27b",
|
||||||
|
specialty=AgentType.PYTORCH_DEV
|
||||||
|
),
|
||||||
|
Agent(
|
||||||
|
id="ironwood-llama",
|
||||||
|
endpoint="http://ironwood.local:11434",
|
||||||
|
model="llama3.1:70b",
|
||||||
|
specialty=AgentType.GENERAL_AI
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
for agent in cluster_agents:
|
||||||
|
if agent.id not in self.agents:
|
||||||
|
self.add_agent(agent)
|
||||||
|
|
||||||
|
async def _test_initial_connectivity(self):
|
||||||
|
"""Test connectivity to all agents"""
|
||||||
|
logger.info("🔍 Testing agent connectivity...")
|
||||||
|
|
||||||
|
for agent in self.agents.values():
|
||||||
|
try:
|
||||||
|
if agent.agent_type == "cli":
|
||||||
|
# Test CLI agent
|
||||||
|
if self.cli_agent_manager:
|
||||||
|
await self.cli_agent_manager.test_agent(agent.id)
|
||||||
|
else:
|
||||||
|
# Test Ollama agent
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.get(
|
||||||
|
f"{agent.endpoint}/api/tags",
|
||||||
|
timeout=aiohttp.ClientTimeout(total=5)
|
||||||
|
) as response:
|
||||||
|
if response.status == 200:
|
||||||
|
logger.info(f"✅ Agent {agent.id} is responsive")
|
||||||
|
else:
|
||||||
|
logger.warning(f"⚠️ Agent {agent.id} returned HTTP {response.status}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"⚠️ Agent {agent.id} is not responsive: {e}")
|
||||||
|
|
||||||
|
async def check_agent_health(self, agent: Agent) -> bool:
|
||||||
|
"""Check individual agent health"""
|
||||||
|
try:
|
||||||
|
if agent.agent_type == "cli":
|
||||||
|
# CLI agent health check
|
||||||
|
if self.cli_agent_manager:
|
||||||
|
return await self.cli_agent_manager.test_agent(agent.id)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
# Ollama agent health check
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.get(
|
||||||
|
f"{agent.endpoint}/api/tags",
|
||||||
|
timeout=aiohttp.ClientTimeout(total=10)
|
||||||
|
) as response:
|
||||||
|
return response.status == 200
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"⚠️ Agent {agent.id} health check error: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
async def health_monitor_cycle(self):
|
||||||
|
"""Single cycle of health monitoring for all agents"""
|
||||||
|
try:
|
||||||
|
for agent in self.agents.values():
|
||||||
|
is_healthy = await self.check_agent_health(agent)
|
||||||
|
if is_healthy:
|
||||||
|
agent.last_heartbeat = time.time()
|
||||||
|
else:
|
||||||
|
logger.warning(f"⚠️ Agent {agent.id} health check failed")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Health monitor cycle error: {e}")
|
||||||
|
|
||||||
|
def get_agent_status(self) -> Dict[str, Dict]:
|
||||||
|
"""Get status of all agents"""
|
||||||
|
agent_status = {}
|
||||||
|
for agent_id, agent in self.agents.items():
|
||||||
|
agent_status[agent_id] = {
|
||||||
|
"type": agent.agent_type,
|
||||||
|
"model": agent.model,
|
||||||
|
"specialty": agent.specialty.value,
|
||||||
|
"current_tasks": agent.current_tasks,
|
||||||
|
"max_concurrent": agent.max_concurrent,
|
||||||
|
"last_heartbeat": agent.last_heartbeat,
|
||||||
|
"utilization": agent.current_tasks / agent.max_concurrent if agent.max_concurrent > 0 else 0
|
||||||
|
}
|
||||||
|
return agent_status
|
||||||
163
backend/app/services/background_service.py
Normal file
163
backend/app/services/background_service.py
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
"""
|
||||||
|
Background Processing Service
|
||||||
|
|
||||||
|
Handles background tasks, cleanup, monitoring, and maintenance operations.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
from typing import Set, Optional, Callable
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class BackgroundService:
|
||||||
|
"""Service for managing background tasks and processes"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.running = False
|
||||||
|
self.executor = ThreadPoolExecutor(max_workers=4)
|
||||||
|
self._background_tasks: Set[asyncio.Task] = set()
|
||||||
|
self._initialized = False
|
||||||
|
|
||||||
|
# Service references (injected)
|
||||||
|
self.agent_service = None
|
||||||
|
self.task_service = None
|
||||||
|
self.workflow_service = None
|
||||||
|
self.performance_service = None
|
||||||
|
|
||||||
|
def initialize(self, agent_service, task_service, workflow_service, performance_service):
|
||||||
|
"""Initialize the background service with dependencies"""
|
||||||
|
if self._initialized:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.agent_service = agent_service
|
||||||
|
self.task_service = task_service
|
||||||
|
self.workflow_service = workflow_service
|
||||||
|
self.performance_service = performance_service
|
||||||
|
|
||||||
|
self._initialized = True
|
||||||
|
logger.info("✅ Background Service initialized successfully")
|
||||||
|
|
||||||
|
async def start(self):
|
||||||
|
"""Start background processes"""
|
||||||
|
if not self._initialized:
|
||||||
|
raise Exception("Background service not initialized")
|
||||||
|
|
||||||
|
self.running = True
|
||||||
|
|
||||||
|
# Start background tasks
|
||||||
|
self._background_tasks.add(asyncio.create_task(self._health_monitor()))
|
||||||
|
self._background_tasks.add(asyncio.create_task(self._performance_optimizer()))
|
||||||
|
self._background_tasks.add(asyncio.create_task(self._cleanup_manager()))
|
||||||
|
|
||||||
|
logger.info("🚀 Background Service processes started")
|
||||||
|
|
||||||
|
async def shutdown(self):
|
||||||
|
"""Shutdown background processes"""
|
||||||
|
logger.info("🛑 Shutting down Background Service...")
|
||||||
|
|
||||||
|
self.running = False
|
||||||
|
|
||||||
|
# Cancel background tasks
|
||||||
|
for task in self._background_tasks:
|
||||||
|
task.cancel()
|
||||||
|
|
||||||
|
# Wait for tasks to complete
|
||||||
|
if self._background_tasks:
|
||||||
|
await asyncio.gather(*self._background_tasks, return_exceptions=True)
|
||||||
|
|
||||||
|
# Shutdown executor
|
||||||
|
self.executor.shutdown(wait=True)
|
||||||
|
|
||||||
|
logger.info("✅ Background Service shutdown complete")
|
||||||
|
|
||||||
|
async def _health_monitor(self):
|
||||||
|
"""Background health monitoring"""
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
if self.agent_service:
|
||||||
|
await self.agent_service.health_monitor_cycle()
|
||||||
|
await asyncio.sleep(30) # Check every 30 seconds
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Health monitor error: {e}")
|
||||||
|
await asyncio.sleep(60)
|
||||||
|
|
||||||
|
async def _performance_optimizer(self):
|
||||||
|
"""Background performance optimization"""
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
if self.performance_service and self.agent_service:
|
||||||
|
await self.performance_service.optimization_cycle(
|
||||||
|
self.agent_service.get_all_agents()
|
||||||
|
)
|
||||||
|
await asyncio.sleep(300) # Optimize every 5 minutes
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Performance optimizer error: {e}")
|
||||||
|
await asyncio.sleep(600)
|
||||||
|
|
||||||
|
async def _cleanup_manager(self):
|
||||||
|
"""Background cleanup management"""
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
# Cleanup completed tasks
|
||||||
|
if self.task_service:
|
||||||
|
cleaned_count = await self._cleanup_completed_tasks()
|
||||||
|
if cleaned_count > 0:
|
||||||
|
logger.info(f"🧹 Cleaned up {cleaned_count} old tasks")
|
||||||
|
|
||||||
|
# Cleanup workflows
|
||||||
|
if self.workflow_service:
|
||||||
|
workflow_cleaned = self.workflow_service.cleanup_completed_workflows(max_age_hours=24)
|
||||||
|
if workflow_cleaned > 0:
|
||||||
|
logger.info(f"🧹 Cleaned up {workflow_cleaned} old workflows")
|
||||||
|
|
||||||
|
await asyncio.sleep(3600) # Cleanup every hour
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Cleanup manager error: {e}")
|
||||||
|
await asyncio.sleep(1800) # Retry in 30 minutes
|
||||||
|
|
||||||
|
async def _cleanup_completed_tasks(self) -> int:
|
||||||
|
"""Clean up old completed tasks"""
|
||||||
|
try:
|
||||||
|
# Clean up database tasks (older ones)
|
||||||
|
db_cleaned_count = self.task_service.cleanup_completed_tasks(max_age_hours=24)
|
||||||
|
return db_cleaned_count
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Failed to cleanup completed tasks: {e}")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def add_background_task(self, coro):
|
||||||
|
"""Add a custom background task"""
|
||||||
|
if self.running:
|
||||||
|
task = asyncio.create_task(coro)
|
||||||
|
self._background_tasks.add(task)
|
||||||
|
|
||||||
|
# Clean up completed tasks
|
||||||
|
task.add_done_callback(self._background_tasks.discard)
|
||||||
|
|
||||||
|
return task
|
||||||
|
return None
|
||||||
|
|
||||||
|
def schedule_periodic_task(self, coro_func: Callable, interval_seconds: int):
|
||||||
|
"""Schedule a periodic task"""
|
||||||
|
async def periodic_wrapper():
|
||||||
|
while self.running:
|
||||||
|
try:
|
||||||
|
await coro_func()
|
||||||
|
await asyncio.sleep(interval_seconds)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Periodic task error: {e}")
|
||||||
|
await asyncio.sleep(interval_seconds)
|
||||||
|
|
||||||
|
return self.add_background_task(periodic_wrapper())
|
||||||
|
|
||||||
|
def get_status(self) -> dict:
|
||||||
|
"""Get background service status"""
|
||||||
|
return {
|
||||||
|
"running": self.running,
|
||||||
|
"active_tasks": len([t for t in self._background_tasks if not t.done()]),
|
||||||
|
"total_tasks": len(self._background_tasks),
|
||||||
|
"executor_threads": self.executor._threads if hasattr(self.executor, '_threads') else 0
|
||||||
|
}
|
||||||
173
backend/app/services/performance_service.py
Normal file
173
backend/app/services/performance_service.py
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
"""
|
||||||
|
Performance Monitoring and Optimization Service
|
||||||
|
|
||||||
|
Handles performance metrics, load balancing, and system optimization.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import time
|
||||||
|
import logging
|
||||||
|
from typing import Dict, List, Optional
|
||||||
|
from prometheus_client import Counter, Histogram, Gauge
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# Performance Metrics
|
||||||
|
TASK_COUNTER = Counter('hive_tasks_total', 'Total tasks processed', ['task_type', 'agent'])
|
||||||
|
TASK_DURATION = Histogram('hive_task_duration_seconds', 'Task execution time', ['task_type', 'agent'])
|
||||||
|
ACTIVE_TASKS = Gauge('hive_active_tasks', 'Currently active tasks', ['agent'])
|
||||||
|
AGENT_UTILIZATION = Gauge('hive_agent_utilization', 'Agent utilization percentage', ['agent'])
|
||||||
|
|
||||||
|
|
||||||
|
class AdaptiveLoadBalancer:
|
||||||
|
"""Adaptive load balancer for optimal agent selection"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.weights: Dict[str, float] = {}
|
||||||
|
self.performance_history: Dict[str, List[float]] = {}
|
||||||
|
self.max_history = 100 # Keep last 100 performance measurements
|
||||||
|
|
||||||
|
def update_weight(self, agent_id: str, performance_metric: float):
|
||||||
|
"""Update agent weight based on performance (lower is better)"""
|
||||||
|
# Inverse relationship: better performance = lower weight
|
||||||
|
self.weights[agent_id] = performance_metric
|
||||||
|
|
||||||
|
# Update performance history
|
||||||
|
if agent_id not in self.performance_history:
|
||||||
|
self.performance_history[agent_id] = []
|
||||||
|
|
||||||
|
self.performance_history[agent_id].append(performance_metric)
|
||||||
|
|
||||||
|
# Keep only recent history
|
||||||
|
if len(self.performance_history[agent_id]) > self.max_history:
|
||||||
|
self.performance_history[agent_id] = self.performance_history[agent_id][-self.max_history:]
|
||||||
|
|
||||||
|
def get_weight(self, agent_id: str) -> float:
|
||||||
|
"""Get agent weight (lower = more preferred)"""
|
||||||
|
return self.weights.get(agent_id, 1.0)
|
||||||
|
|
||||||
|
def get_average_performance(self, agent_id: str) -> float:
|
||||||
|
"""Get average performance for an agent"""
|
||||||
|
history = self.performance_history.get(agent_id, [])
|
||||||
|
if not history:
|
||||||
|
return 1.0
|
||||||
|
return sum(history) / len(history)
|
||||||
|
|
||||||
|
def get_performance_stats(self) -> Dict[str, Dict[str, float]]:
|
||||||
|
"""Get performance statistics for all agents"""
|
||||||
|
stats = {}
|
||||||
|
for agent_id in self.weights:
|
||||||
|
history = self.performance_history.get(agent_id, [])
|
||||||
|
if history:
|
||||||
|
stats[agent_id] = {
|
||||||
|
"current_weight": self.weights[agent_id],
|
||||||
|
"average_time": sum(history) / len(history),
|
||||||
|
"min_time": min(history),
|
||||||
|
"max_time": max(history),
|
||||||
|
"sample_count": len(history)
|
||||||
|
}
|
||||||
|
return stats
|
||||||
|
|
||||||
|
|
||||||
|
class PerformanceService:
|
||||||
|
"""Service for performance monitoring and optimization"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.load_balancer = AdaptiveLoadBalancer()
|
||||||
|
self._initialized = False
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
"""Initialize the performance service"""
|
||||||
|
if self._initialized:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._initialized = True
|
||||||
|
logger.info("✅ Performance Service initialized successfully")
|
||||||
|
|
||||||
|
def record_task_start(self, agent_id: str):
|
||||||
|
"""Record task start for metrics"""
|
||||||
|
ACTIVE_TASKS.labels(agent=agent_id).inc()
|
||||||
|
|
||||||
|
def record_task_completion(self, agent_id: str, task_type: str, execution_time: float):
|
||||||
|
"""Record task completion metrics"""
|
||||||
|
TASK_COUNTER.labels(task_type=task_type, agent=agent_id).inc()
|
||||||
|
TASK_DURATION.labels(task_type=task_type, agent=agent_id).observe(execution_time)
|
||||||
|
ACTIVE_TASKS.labels(agent=agent_id).dec()
|
||||||
|
|
||||||
|
# Update load balancer
|
||||||
|
self.load_balancer.update_weight(agent_id, execution_time)
|
||||||
|
|
||||||
|
def record_task_failure(self, agent_id: str):
|
||||||
|
"""Record task failure for metrics"""
|
||||||
|
ACTIVE_TASKS.labels(agent=agent_id).dec()
|
||||||
|
|
||||||
|
def update_agent_utilization(self, agent_id: str, current_tasks: int, max_concurrent: int):
|
||||||
|
"""Update agent utilization metrics"""
|
||||||
|
utilization = current_tasks / max_concurrent if max_concurrent > 0 else 0
|
||||||
|
AGENT_UTILIZATION.labels(agent=agent_id).set(utilization)
|
||||||
|
|
||||||
|
def get_load_balancer(self) -> AdaptiveLoadBalancer:
|
||||||
|
"""Get the load balancer instance"""
|
||||||
|
return self.load_balancer
|
||||||
|
|
||||||
|
async def optimization_cycle(self, agents: Dict):
|
||||||
|
"""Single cycle of performance optimization"""
|
||||||
|
try:
|
||||||
|
# Update utilization metrics for all agents
|
||||||
|
for agent in agents.values():
|
||||||
|
utilization = agent.current_tasks / agent.max_concurrent if agent.max_concurrent > 0 else 0
|
||||||
|
AGENT_UTILIZATION.labels(agent=agent.id).set(utilization)
|
||||||
|
|
||||||
|
# Additional optimization logic could go here
|
||||||
|
# - Dynamic scaling recommendations
|
||||||
|
# - Agent rebalancing suggestions
|
||||||
|
# - Performance alerts
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"❌ Performance optimization cycle error: {e}")
|
||||||
|
|
||||||
|
def get_performance_metrics(self) -> Dict:
|
||||||
|
"""Get current performance metrics"""
|
||||||
|
return {
|
||||||
|
"load_balancer_stats": self.load_balancer.get_performance_stats(),
|
||||||
|
"prometheus_available": True
|
||||||
|
}
|
||||||
|
|
||||||
|
async def get_prometheus_metrics(self):
|
||||||
|
"""Get Prometheus metrics"""
|
||||||
|
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
|
||||||
|
return generate_latest()
|
||||||
|
|
||||||
|
def generate_performance_report(self, agents: Dict, tasks: Dict) -> Dict:
|
||||||
|
"""Generate comprehensive performance report"""
|
||||||
|
from .workflow_service import TaskStatus
|
||||||
|
|
||||||
|
# Agent performance
|
||||||
|
agent_stats = {}
|
||||||
|
for agent_id, agent in agents.items():
|
||||||
|
agent_stats[agent_id] = {
|
||||||
|
"current_tasks": agent.current_tasks,
|
||||||
|
"max_concurrent": agent.max_concurrent,
|
||||||
|
"utilization": agent.current_tasks / agent.max_concurrent if agent.max_concurrent > 0 else 0,
|
||||||
|
"average_performance": self.load_balancer.get_average_performance(agent_id),
|
||||||
|
"weight": self.load_balancer.get_weight(agent_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Task statistics
|
||||||
|
total_tasks = len(tasks)
|
||||||
|
completed_tasks = len([t for t in tasks.values() if t.status == TaskStatus.COMPLETED])
|
||||||
|
failed_tasks = len([t for t in tasks.values() if t.status == TaskStatus.FAILED])
|
||||||
|
active_tasks = len([t for t in tasks.values() if t.status == TaskStatus.IN_PROGRESS])
|
||||||
|
|
||||||
|
return {
|
||||||
|
"timestamp": time.time(),
|
||||||
|
"task_statistics": {
|
||||||
|
"total": total_tasks,
|
||||||
|
"completed": completed_tasks,
|
||||||
|
"failed": failed_tasks,
|
||||||
|
"active": active_tasks,
|
||||||
|
"success_rate": completed_tasks / total_tasks if total_tasks > 0 else 0
|
||||||
|
},
|
||||||
|
"agent_performance": agent_stats,
|
||||||
|
"active_agents": len([a for a in agents.values() if a.current_tasks > 0]),
|
||||||
|
"load_balancer": self.load_balancer.get_performance_stats()
|
||||||
|
}
|
||||||
263
backend/app/services/workflow_service.py
Normal file
263
backend/app/services/workflow_service.py
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
"""
|
||||||
|
Workflow Management Service
|
||||||
|
|
||||||
|
Handles workflow parsing, scheduling, dependency tracking, and execution management.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import time
|
||||||
|
import logging
|
||||||
|
from typing import Dict, List, Optional, Any
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
# Import shared types
|
||||||
|
from .agent_service import AgentType
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class TaskStatus(Enum):
|
||||||
|
"""Task status tracking"""
|
||||||
|
PENDING = "pending"
|
||||||
|
IN_PROGRESS = "in_progress"
|
||||||
|
COMPLETED = "completed"
|
||||||
|
FAILED = "failed"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Task:
|
||||||
|
"""Unified task representation"""
|
||||||
|
id: str
|
||||||
|
type: AgentType
|
||||||
|
priority: int = 3
|
||||||
|
status: TaskStatus = TaskStatus.PENDING
|
||||||
|
context: Dict[str, Any] = field(default_factory=dict)
|
||||||
|
payload: Dict[str, Any] = field(default_factory=dict)
|
||||||
|
assigned_agent: Optional[str] = None
|
||||||
|
result: Optional[Dict] = None
|
||||||
|
created_at: float = field(default_factory=time.time)
|
||||||
|
completed_at: Optional[float] = None
|
||||||
|
|
||||||
|
# Workflow support
|
||||||
|
workflow_id: Optional[str] = None
|
||||||
|
dependencies: List[str] = field(default_factory=list)
|
||||||
|
|
||||||
|
def cache_key(self) -> str:
|
||||||
|
"""Generate cache key for task result"""
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
payload_hash = hashlib.md5(json.dumps(self.payload, sort_keys=True).encode()).hexdigest()
|
||||||
|
return f"task_result:{self.type.value}:{payload_hash}"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class WorkflowExecution:
|
||||||
|
"""Represents a workflow execution instance"""
|
||||||
|
workflow_id: str
|
||||||
|
execution_id: str
|
||||||
|
tasks: List[Task]
|
||||||
|
created_at: float
|
||||||
|
completed_at: Optional[float] = None
|
||||||
|
status: str = "running"
|
||||||
|
metadata: Dict[str, Any] = None
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
if self.metadata is None:
|
||||||
|
self.metadata = {}
|
||||||
|
|
||||||
|
|
||||||
|
class WorkflowService:
|
||||||
|
"""Service for managing workflows and their execution"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.workflow_tasks: Dict[str, List[Task]] = {}
|
||||||
|
self.workflow_executions: Dict[str, WorkflowExecution] = {}
|
||||||
|
self._initialized = False
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
"""Initialize the workflow service"""
|
||||||
|
if self._initialized:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._initialized = True
|
||||||
|
logger.info("✅ Workflow Service initialized successfully")
|
||||||
|
|
||||||
|
async def submit_workflow(self, workflow: Dict[str, Any]) -> str:
|
||||||
|
"""Submit a workflow for execution"""
|
||||||
|
workflow_id = f"workflow_{int(time.time())}"
|
||||||
|
execution_id = f"exec_{workflow_id}"
|
||||||
|
|
||||||
|
tasks = self._parse_workflow_to_tasks(workflow, workflow_id)
|
||||||
|
|
||||||
|
# Create workflow execution record
|
||||||
|
execution = WorkflowExecution(
|
||||||
|
workflow_id=workflow_id,
|
||||||
|
execution_id=execution_id,
|
||||||
|
tasks=tasks,
|
||||||
|
created_at=time.time(),
|
||||||
|
metadata=workflow.get('metadata', {})
|
||||||
|
)
|
||||||
|
|
||||||
|
self.workflow_tasks[workflow_id] = tasks
|
||||||
|
self.workflow_executions[execution_id] = execution
|
||||||
|
|
||||||
|
logger.info(f"🔄 Submitted workflow: {workflow_id} with {len(tasks)} tasks")
|
||||||
|
return workflow_id
|
||||||
|
|
||||||
|
def _parse_workflow_to_tasks(self, workflow: Dict[str, Any], workflow_id: str) -> List[Task]:
|
||||||
|
"""Parse workflow definition into tasks"""
|
||||||
|
tasks = []
|
||||||
|
base_tasks = workflow.get('tasks', [])
|
||||||
|
|
||||||
|
for i, task_def in enumerate(base_tasks):
|
||||||
|
task_id = f"{workflow_id}_task_{i}"
|
||||||
|
task_type = AgentType(task_def.get('type', 'general_ai'))
|
||||||
|
|
||||||
|
task = Task(
|
||||||
|
id=task_id,
|
||||||
|
type=task_type,
|
||||||
|
workflow_id=workflow_id,
|
||||||
|
context=task_def.get('context', {}),
|
||||||
|
payload=task_def.get('payload', {}),
|
||||||
|
dependencies=task_def.get('dependencies', []),
|
||||||
|
priority=task_def.get('priority', 3)
|
||||||
|
)
|
||||||
|
tasks.append(task)
|
||||||
|
|
||||||
|
return tasks
|
||||||
|
|
||||||
|
def get_ready_workflow_tasks(self, all_tasks: Dict[str, Task]) -> List[Task]:
|
||||||
|
"""Get workflow tasks that are ready to execute (dependencies satisfied)"""
|
||||||
|
ready_tasks = []
|
||||||
|
|
||||||
|
for workflow_id, workflow_tasks in self.workflow_tasks.items():
|
||||||
|
for task in workflow_tasks:
|
||||||
|
if (task.status == TaskStatus.PENDING and
|
||||||
|
self._dependencies_satisfied(task, all_tasks)):
|
||||||
|
ready_tasks.append(task)
|
||||||
|
|
||||||
|
return ready_tasks
|
||||||
|
|
||||||
|
def _dependencies_satisfied(self, task: Task, all_tasks: Dict[str, Task]) -> bool:
|
||||||
|
"""Check if task dependencies are satisfied"""
|
||||||
|
for dep_id in task.dependencies:
|
||||||
|
dep_task = all_tasks.get(dep_id)
|
||||||
|
if not dep_task or dep_task.status != TaskStatus.COMPLETED:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def handle_task_completion(self, task: Task):
|
||||||
|
"""Handle completion of a workflow task"""
|
||||||
|
if not task.workflow_id:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Check if workflow is complete
|
||||||
|
workflow_tasks = self.workflow_tasks.get(task.workflow_id, [])
|
||||||
|
completed_tasks = [t for t in workflow_tasks if t.status == TaskStatus.COMPLETED]
|
||||||
|
failed_tasks = [t for t in workflow_tasks if t.status == TaskStatus.FAILED]
|
||||||
|
|
||||||
|
# Update workflow execution status
|
||||||
|
for execution in self.workflow_executions.values():
|
||||||
|
if execution.workflow_id == task.workflow_id:
|
||||||
|
if len(failed_tasks) > 0:
|
||||||
|
execution.status = "failed"
|
||||||
|
execution.completed_at = time.time()
|
||||||
|
logger.info(f"❌ Workflow {task.workflow_id} failed")
|
||||||
|
elif len(completed_tasks) == len(workflow_tasks):
|
||||||
|
execution.status = "completed"
|
||||||
|
execution.completed_at = time.time()
|
||||||
|
logger.info(f"🎉 Workflow {task.workflow_id} completed")
|
||||||
|
break
|
||||||
|
|
||||||
|
def get_workflow_status(self, workflow_id: str) -> Dict[str, Any]:
|
||||||
|
"""Get workflow execution status"""
|
||||||
|
workflow_tasks = self.workflow_tasks.get(workflow_id, [])
|
||||||
|
|
||||||
|
if not workflow_tasks:
|
||||||
|
return {"error": "Workflow not found"}
|
||||||
|
|
||||||
|
status_counts = {}
|
||||||
|
for status in TaskStatus:
|
||||||
|
status_counts[status.value] = len([t for t in workflow_tasks if t.status == status])
|
||||||
|
|
||||||
|
# Find execution record
|
||||||
|
execution = None
|
||||||
|
for exec_record in self.workflow_executions.values():
|
||||||
|
if exec_record.workflow_id == workflow_id:
|
||||||
|
execution = exec_record
|
||||||
|
break
|
||||||
|
|
||||||
|
return {
|
||||||
|
"workflow_id": workflow_id,
|
||||||
|
"execution_id": execution.execution_id if execution else None,
|
||||||
|
"total_tasks": len(workflow_tasks),
|
||||||
|
"status_breakdown": status_counts,
|
||||||
|
"completed": status_counts.get("completed", 0) == len(workflow_tasks),
|
||||||
|
"status": execution.status if execution else "unknown",
|
||||||
|
"created_at": execution.created_at if execution else None,
|
||||||
|
"completed_at": execution.completed_at if execution else None
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_workflow_tasks(self, workflow_id: str) -> List[Task]:
|
||||||
|
"""Get all tasks for a workflow"""
|
||||||
|
return self.workflow_tasks.get(workflow_id, [])
|
||||||
|
|
||||||
|
def get_all_workflows(self) -> Dict[str, List[Task]]:
|
||||||
|
"""Get all workflows"""
|
||||||
|
return self.workflow_tasks.copy()
|
||||||
|
|
||||||
|
def get_workflow_executions(self, workflow_id: Optional[str] = None) -> List[Dict[str, Any]]:
|
||||||
|
"""Get workflow execution history"""
|
||||||
|
executions = []
|
||||||
|
|
||||||
|
for execution in self.workflow_executions.values():
|
||||||
|
if workflow_id is None or execution.workflow_id == workflow_id:
|
||||||
|
executions.append({
|
||||||
|
"workflow_id": execution.workflow_id,
|
||||||
|
"execution_id": execution.execution_id,
|
||||||
|
"status": execution.status,
|
||||||
|
"task_count": len(execution.tasks),
|
||||||
|
"created_at": execution.created_at,
|
||||||
|
"completed_at": execution.completed_at,
|
||||||
|
"metadata": execution.metadata
|
||||||
|
})
|
||||||
|
|
||||||
|
# Sort by creation time, newest first
|
||||||
|
executions.sort(key=lambda x: x["created_at"], reverse=True)
|
||||||
|
return executions
|
||||||
|
|
||||||
|
def cleanup_completed_workflows(self, max_age_hours: int = 24):
|
||||||
|
"""Clean up old completed workflow executions"""
|
||||||
|
cutoff_time = time.time() - (max_age_hours * 3600)
|
||||||
|
|
||||||
|
# Find completed executions older than cutoff
|
||||||
|
to_remove = []
|
||||||
|
for execution_id, execution in self.workflow_executions.items():
|
||||||
|
if (execution.status in ["completed", "failed"] and
|
||||||
|
execution.completed_at and
|
||||||
|
execution.completed_at < cutoff_time):
|
||||||
|
to_remove.append(execution_id)
|
||||||
|
|
||||||
|
# Remove old executions and their associated workflow tasks
|
||||||
|
removed_count = 0
|
||||||
|
for execution_id in to_remove:
|
||||||
|
execution = self.workflow_executions[execution_id]
|
||||||
|
workflow_id = execution.workflow_id
|
||||||
|
|
||||||
|
# Remove workflow tasks if this is the only execution for this workflow
|
||||||
|
other_executions = [
|
||||||
|
e for e in self.workflow_executions.values()
|
||||||
|
if e.workflow_id == workflow_id and e.execution_id != execution_id
|
||||||
|
]
|
||||||
|
|
||||||
|
if not other_executions:
|
||||||
|
self.workflow_tasks.pop(workflow_id, None)
|
||||||
|
|
||||||
|
# Remove execution record
|
||||||
|
del self.workflow_executions[execution_id]
|
||||||
|
removed_count += 1
|
||||||
|
|
||||||
|
if removed_count > 0:
|
||||||
|
logger.info(f"🧹 Cleaned up {removed_count} old workflow executions")
|
||||||
|
|
||||||
|
return removed_count
|
||||||
1
frontend/dist/assets/index-9i8CMzyD.css
vendored
1
frontend/dist/assets/index-9i8CMzyD.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend/dist/assets/index-CBw2HfAv.css
vendored
Normal file
1
frontend/dist/assets/index-CBw2HfAv.css
vendored
Normal file
File diff suppressed because one or more lines are too long
4
frontend/dist/index.html
vendored
4
frontend/dist/index.html
vendored
@@ -61,8 +61,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script type="module" crossorigin src="/assets/index-DF5q6xIR.js"></script>
|
<script type="module" crossorigin src="/assets/index-BsrGdklV.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-9i8CMzyD.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-CBw2HfAv.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>
|
<noscript>
|
||||||
|
|||||||
55
frontend/node_modules/.package-lock.json
generated
vendored
55
frontend/node_modules/.package-lock.json
generated
vendored
@@ -1922,12 +1922,6 @@
|
|||||||
"@types/react": "^18.0.0"
|
"@types/react": "^18.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/resize-observer-browser": {
|
|
||||||
"version": "0.1.11",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz",
|
|
||||||
"integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@types/semver": {
|
"node_modules/@types/semver": {
|
||||||
"version": "7.7.0",
|
"version": "7.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
|
||||||
@@ -4131,12 +4125,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lucide-react": {
|
"node_modules/lucide-react": {
|
||||||
"version": "0.294.0",
|
"version": "0.453.0",
|
||||||
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.294.0.tgz",
|
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.453.0.tgz",
|
||||||
"integrity": "sha512-V7o0/VECSGbLHn3/1O67FUgBwWB+hmzshrgDVRJQhMh8uj5D3HBuIvhuAmQTtlupILSplwIZg5FTc4tTKMA2SA==",
|
"integrity": "sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"react": "^16.5.1 || ^17.0.0 || ^18.0.0"
|
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/math-intrinsics": {
|
"node_modules/math-intrinsics": {
|
||||||
@@ -4739,47 +4733,6 @@
|
|||||||
"react": "^18.3.1"
|
"react": "^18.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-flow-renderer": {
|
|
||||||
"version": "10.3.17",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-flow-renderer/-/react-flow-renderer-10.3.17.tgz",
|
|
||||||
"integrity": "sha512-bywiqVErlh5kCDqw3x0an5Ur3mT9j9CwJsDwmhmz4i1IgYM1a0SPqqEhClvjX+s5pU4nHjmVaGXWK96pwsiGcQ==",
|
|
||||||
"deprecated": "react-flow-renderer has been renamed to reactflow, please use this package from now on https://reactflow.dev/docs/guides/migrate-to-v11/",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@babel/runtime": "^7.18.9",
|
|
||||||
"@types/d3": "^7.4.0",
|
|
||||||
"@types/resize-observer-browser": "^0.1.7",
|
|
||||||
"classcat": "^5.0.3",
|
|
||||||
"d3-drag": "^3.0.0",
|
|
||||||
"d3-selection": "^3.0.0",
|
|
||||||
"d3-zoom": "^3.0.0",
|
|
||||||
"zustand": "^3.7.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"react": "16 || 17 || 18",
|
|
||||||
"react-dom": "16 || 17 || 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/react-flow-renderer/node_modules/zustand": {
|
|
||||||
"version": "3.7.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz",
|
|
||||||
"integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12.7.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"react": ">=16.8"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"react": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/react-hook-form": {
|
"node_modules/react-hook-form": {
|
||||||
"version": "7.60.0",
|
"version": "7.60.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz",
|
||||||
|
|||||||
21
frontend/node_modules/@types/resize-observer-browser/LICENSE
generated
vendored
21
frontend/node_modules/@types/resize-observer-browser/LICENSE
generated
vendored
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) Microsoft Corporation.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE
|
|
||||||
60
frontend/node_modules/@types/resize-observer-browser/README.md
generated
vendored
60
frontend/node_modules/@types/resize-observer-browser/README.md
generated
vendored
@@ -1,60 +0,0 @@
|
|||||||
# Installation
|
|
||||||
> `npm install --save @types/resize-observer-browser`
|
|
||||||
|
|
||||||
# Summary
|
|
||||||
This package contains type definitions for resize-observer-browser (https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver).
|
|
||||||
|
|
||||||
# Details
|
|
||||||
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/resize-observer-browser.
|
|
||||||
## [index.d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/resize-observer-browser/index.d.ts)
|
|
||||||
````ts
|
|
||||||
interface Window {
|
|
||||||
ResizeObserver: typeof ResizeObserver;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserverOptions {
|
|
||||||
/**
|
|
||||||
* Sets which box model the observer will observe changes to. Possible values
|
|
||||||
* are `content-box` (the default), and `border-box`.
|
|
||||||
*
|
|
||||||
* @default 'content-box'
|
|
||||||
*/
|
|
||||||
box?: "content-box" | "border-box" | "device-pixel-content-box" | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserverSize {
|
|
||||||
readonly inlineSize: number;
|
|
||||||
readonly blockSize: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserver {
|
|
||||||
disconnect(): void;
|
|
||||||
observe(target: Element, options?: ResizeObserverOptions): void;
|
|
||||||
unobserve(target: Element): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare var ResizeObserver: {
|
|
||||||
new(callback: ResizeObserverCallback): ResizeObserver;
|
|
||||||
prototype: ResizeObserver;
|
|
||||||
};
|
|
||||||
|
|
||||||
interface ResizeObserverCallback {
|
|
||||||
(entries: ResizeObserverEntry[], observer: ResizeObserver): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserverEntry {
|
|
||||||
readonly target: Element;
|
|
||||||
readonly contentRect: DOMRectReadOnly;
|
|
||||||
readonly borderBoxSize: readonly ResizeObserverSize[];
|
|
||||||
readonly contentBoxSize: readonly ResizeObserverSize[];
|
|
||||||
readonly devicePixelContentBoxSize: readonly ResizeObserverSize[];
|
|
||||||
}
|
|
||||||
|
|
||||||
````
|
|
||||||
|
|
||||||
### Additional Details
|
|
||||||
* Last updated: Mon, 20 Nov 2023 23:36:24 GMT
|
|
||||||
* Dependencies: none
|
|
||||||
|
|
||||||
# Credits
|
|
||||||
These definitions were written by [Chives](https://github.com/chivesrs), [William Furr](https://github.com/wffurr), and [Alexander Shushunov](https://github.com/AlexanderShushunov).
|
|
||||||
41
frontend/node_modules/@types/resize-observer-browser/index.d.ts
generated
vendored
41
frontend/node_modules/@types/resize-observer-browser/index.d.ts
generated
vendored
@@ -1,41 +0,0 @@
|
|||||||
interface Window {
|
|
||||||
ResizeObserver: typeof ResizeObserver;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserverOptions {
|
|
||||||
/**
|
|
||||||
* Sets which box model the observer will observe changes to. Possible values
|
|
||||||
* are `content-box` (the default), and `border-box`.
|
|
||||||
*
|
|
||||||
* @default 'content-box'
|
|
||||||
*/
|
|
||||||
box?: "content-box" | "border-box" | "device-pixel-content-box" | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserverSize {
|
|
||||||
readonly inlineSize: number;
|
|
||||||
readonly blockSize: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserver {
|
|
||||||
disconnect(): void;
|
|
||||||
observe(target: Element, options?: ResizeObserverOptions): void;
|
|
||||||
unobserve(target: Element): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
declare var ResizeObserver: {
|
|
||||||
new(callback: ResizeObserverCallback): ResizeObserver;
|
|
||||||
prototype: ResizeObserver;
|
|
||||||
};
|
|
||||||
|
|
||||||
interface ResizeObserverCallback {
|
|
||||||
(entries: ResizeObserverEntry[], observer: ResizeObserver): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ResizeObserverEntry {
|
|
||||||
readonly target: Element;
|
|
||||||
readonly contentRect: DOMRectReadOnly;
|
|
||||||
readonly borderBoxSize: readonly ResizeObserverSize[];
|
|
||||||
readonly contentBoxSize: readonly ResizeObserverSize[];
|
|
||||||
readonly devicePixelContentBoxSize: readonly ResizeObserverSize[];
|
|
||||||
}
|
|
||||||
36
frontend/node_modules/@types/resize-observer-browser/package.json
generated
vendored
36
frontend/node_modules/@types/resize-observer-browser/package.json
generated
vendored
@@ -1,36 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@types/resize-observer-browser",
|
|
||||||
"version": "0.1.11",
|
|
||||||
"description": "TypeScript definitions for resize-observer-browser",
|
|
||||||
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/resize-observer-browser",
|
|
||||||
"license": "MIT",
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Chives",
|
|
||||||
"githubUsername": "chivesrs",
|
|
||||||
"url": "https://github.com/chivesrs"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "William Furr",
|
|
||||||
"githubUsername": "wffurr",
|
|
||||||
"url": "https://github.com/wffurr"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Alexander Shushunov",
|
|
||||||
"githubUsername": "AlexanderShushunov",
|
|
||||||
"url": "https://github.com/AlexanderShushunov"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"main": "",
|
|
||||||
"types": "index.d.ts",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
|
|
||||||
"directory": "types/resize-observer-browser"
|
|
||||||
},
|
|
||||||
"scripts": {},
|
|
||||||
"dependencies": {},
|
|
||||||
"typesPublisherContentHash": "799e292136e171f271a3b93d2e1f6cb31d66755aa1adff2c4cb5057007d69bb0",
|
|
||||||
"typeScriptVersion": "4.5",
|
|
||||||
"nonNpm": true
|
|
||||||
}
|
|
||||||
136
frontend/node_modules/lucide-react/README.md
generated
vendored
136
frontend/node_modules/lucide-react/README.md
generated
vendored
@@ -1,3 +1,13 @@
|
|||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/lucide-icons/lucide#gh-light-mode-only">
|
||||||
|
<img src="https://lucide.dev/lucide-react.svg#gh-light-mode-only" alt="Lucide React - Implementation of the lucide icon library for react applications." width="540">
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/lucide-icons/lucide#gh-dark-mode-only">
|
||||||
|
<img src="https://lucide.dev/package-logos/dark/lucide-react.svg#gh-dark-mode-only" alt="Lucide React - Implementation of the lucide icon library for react applications." width="540">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
# Lucide React
|
# Lucide React
|
||||||
|
|
||||||
Implementation of the lucide icon library for react applications.
|
Implementation of the lucide icon library for react applications.
|
||||||
@@ -16,126 +26,26 @@ or
|
|||||||
npm install lucide-react
|
npm install lucide-react
|
||||||
```
|
```
|
||||||
|
|
||||||
## How to use
|
## Documentation
|
||||||
|
|
||||||
It's built with ES modules so it's completely tree-shakable.
|
For full documentation, visit [lucide.dev](https://lucide.dev/guide/packages/lucide-react)
|
||||||
Each icon can be imported as a react component.
|
|
||||||
|
|
||||||
### Example
|
## Community
|
||||||
|
|
||||||
You can pass additional props to adjust the icon.
|
Join the [Discord server](https://discord.gg/EH6nSts) to chat with the maintainers and other users.
|
||||||
|
|
||||||
```js
|
## License
|
||||||
import { Camera } from 'lucide-react';
|
|
||||||
|
|
||||||
const App = () => {
|
Lucide is licensed under the ISC license. See [LICENSE](https://lucide.dev/license).
|
||||||
return <Camera color="red" size={48} />;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default App;
|
## Sponsors
|
||||||
```
|
|
||||||
|
|
||||||
### Props
|
<a href="https://vercel.com?utm_source=lucide&utm_campaign=oss">
|
||||||
|
<img src="https://lucide.dev/vercel.svg" alt="Powered by Vercel" width="200" />
|
||||||
|
</a>
|
||||||
|
|
||||||
| name | type | default |
|
<a href="https://www.digitalocean.com/?refcode=b0877a2caebd&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge"><img src="https://lucide.dev/digitalocean.svg" width="200" alt="DigitalOcean Referral Badge" /></a>
|
||||||
| ------------- | -------- | ------------ |
|
|
||||||
| `size` | _Number_ | 24 |
|
|
||||||
| `color` | _String_ | currentColor |
|
|
||||||
| `strokeWidth` | _Number_ | 2 |
|
|
||||||
|
|
||||||
### Custom props
|
### Awesome backer 🍺
|
||||||
|
|
||||||
You can also pass custom props that will be added in the svg as attributes.
|
<a href="https://www.scipress.io?utm_source=lucide"><img src="https://lucide.dev/sponsors/scipress.svg" width="180" alt="Scipress sponsor badge" /></a>
|
||||||
|
|
||||||
```js
|
|
||||||
const App = () => {
|
|
||||||
return <Camera fill="red" />;
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### Generic icon component
|
|
||||||
|
|
||||||
It is possible to create a generic icon component to load icons.
|
|
||||||
|
|
||||||
> :warning: The example below is importing all ES modules. This is **not** recommended when you using a bundler since your application build size will grow substantially.
|
|
||||||
|
|
||||||
```js
|
|
||||||
import { icons } from 'lucide-react';
|
|
||||||
|
|
||||||
const Icon = ({ name, color, size }) => {
|
|
||||||
const LucideIcon = icons[name];
|
|
||||||
|
|
||||||
return <LucideIcon color={color} size={size} />;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Icon;
|
|
||||||
```
|
|
||||||
|
|
||||||
#### With Dynamic Imports
|
|
||||||
|
|
||||||
Lucide react exports a dynamic import map `dynamicIconImports`. Useful for applications that want to show icons dynamically by icon name. For example when using a content management system with where icon names are stored in a database.
|
|
||||||
|
|
||||||
When using client side rendering, it will fetch the icon component when it's needed. This will reduce the initial bundle size.
|
|
||||||
|
|
||||||
The keys of the dynamic import map are the lucide original icon names.
|
|
||||||
|
|
||||||
Example with React suspense:
|
|
||||||
|
|
||||||
```tsx
|
|
||||||
import React, { lazy, Suspense } from 'react';
|
|
||||||
import { dynamicIconImports, LucideProps } from 'lucide-react';
|
|
||||||
|
|
||||||
const fallback = <div style={{ background: '#ddd', width: 24, height: 24 }}/>
|
|
||||||
|
|
||||||
interface IconProps extends Omit<LucideProps, 'ref'> {
|
|
||||||
name: keyof typeof dynamicIconImports;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Icon = ({ name, ...props }: IconProps) => {
|
|
||||||
const LucideIcon = lazy(dynamicIconImports[name]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Suspense fallback={fallback}>
|
|
||||||
<LucideIcon {...props} />
|
|
||||||
</Suspense>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Icon
|
|
||||||
```
|
|
||||||
|
|
||||||
##### NextJS Example
|
|
||||||
|
|
||||||
In NextJS, [the dynamic function](https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#nextdynamic) can be used to dynamically load the icon component.
|
|
||||||
|
|
||||||
To make dynamic imports work with NextJS, you need to add `lucide-react` to the [`transpilePackages`](https://nextjs.org/docs/app/api-reference/next-config-js/transpilePackages) option in your `next.config.js` like this:
|
|
||||||
|
|
||||||
```js
|
|
||||||
/** @type {import('next').NextConfig} */
|
|
||||||
const nextConfig = {
|
|
||||||
transpilePackages: ['lucide-react'] // add this
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = nextConfig
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
You can then start using it:
|
|
||||||
|
|
||||||
```tsx
|
|
||||||
import dynamic from 'next/dynamic'
|
|
||||||
import { LucideProps } from 'lucide-react';
|
|
||||||
import dynamicIconImports from 'lucide-react/dynamicIconImports';
|
|
||||||
|
|
||||||
interface IconProps extends LucideProps {
|
|
||||||
name: keyof typeof dynamicIconImports;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Icon = ({ name, ...props }: IconProps) => {
|
|
||||||
const LucideIcon = dynamic(dynamicIconImports[name])
|
|
||||||
|
|
||||||
return <LucideIcon {...props} />;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Icon;
|
|
||||||
```
|
|
||||||
|
|||||||
9109
frontend/node_modules/lucide-react/dist/cjs/lucide-react.js
generated
vendored
9109
frontend/node_modules/lucide-react/dist/cjs/lucide-react.js
generated
vendored
File diff suppressed because it is too large
Load Diff
2
frontend/node_modules/lucide-react/dist/cjs/lucide-react.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/cjs/lucide-react.js.map
generated
vendored
File diff suppressed because one or more lines are too long
44
frontend/node_modules/lucide-react/dist/esm/Icon.js
generated
vendored
Normal file
44
frontend/node_modules/lucide-react/dist/esm/Icon.js
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { forwardRef, createElement } from 'react';
|
||||||
|
import defaultAttributes from './defaultAttributes.js';
|
||||||
|
import { mergeClasses } from './shared/src/utils.js';
|
||||||
|
|
||||||
|
const Icon = forwardRef(
|
||||||
|
({
|
||||||
|
color = "currentColor",
|
||||||
|
size = 24,
|
||||||
|
strokeWidth = 2,
|
||||||
|
absoluteStrokeWidth,
|
||||||
|
className = "",
|
||||||
|
children,
|
||||||
|
iconNode,
|
||||||
|
...rest
|
||||||
|
}, ref) => {
|
||||||
|
return createElement(
|
||||||
|
"svg",
|
||||||
|
{
|
||||||
|
ref,
|
||||||
|
...defaultAttributes,
|
||||||
|
width: size,
|
||||||
|
height: size,
|
||||||
|
stroke: color,
|
||||||
|
strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,
|
||||||
|
className: mergeClasses("lucide", className),
|
||||||
|
...rest
|
||||||
|
},
|
||||||
|
[
|
||||||
|
...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
|
||||||
|
...Array.isArray(children) ? children : [children]
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export { Icon as default };
|
||||||
|
//# sourceMappingURL=Icon.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/Icon.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/Icon.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"Icon.js","sources":["../../src/Icon.ts"],"sourcesContent":["import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) => {\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n"],"names":[],"mappings":";;;;;;;;;;;AAwBA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CACX,CACE,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,GAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACd,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,GAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACZ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACA,GAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KAEL,GACG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACH,CAAA,CAAA,CAAA,CAAO,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACA,GAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACR,WAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAuB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAI,CAAA,CAAA,CAAA,CAAM,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAI,CAAA,CAAA,CAAA,CAAI,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC/E,SAAA,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,SAAS,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC3C,GAAG,CAAA,CAAA,CAAA,CAAA;AAAA,CACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACE,GAAG,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAI,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAM,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAC,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAC3D,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA;AAAA,CACpD,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CAAA,CACF,CAAA;AAAA,CACF,CAAA,CAAA;AACF,CAAA,CAAA;;"}
|
||||||
31
frontend/node_modules/lucide-react/dist/esm/createLucideIcon.js
generated
vendored
31
frontend/node_modules/lucide-react/dist/esm/createLucideIcon.js
generated
vendored
@@ -1,37 +1,26 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { forwardRef, createElement } from 'react';
|
import { forwardRef, createElement } from 'react';
|
||||||
import defaultAttributes from './defaultAttributes.js';
|
import { mergeClasses, toKebabCase } from './shared/src/utils.js';
|
||||||
|
import Icon from './Icon.js';
|
||||||
|
|
||||||
const toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase().trim();
|
|
||||||
const createLucideIcon = (iconName, iconNode) => {
|
const createLucideIcon = (iconName, iconNode) => {
|
||||||
const Component = forwardRef(
|
const Component = forwardRef(
|
||||||
({ color = "currentColor", size = 24, strokeWidth = 2, absoluteStrokeWidth, className = "", children, ...rest }, ref) => createElement(
|
({ className, ...props }, ref) => createElement(Icon, {
|
||||||
"svg",
|
ref,
|
||||||
{
|
iconNode,
|
||||||
ref,
|
className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),
|
||||||
...defaultAttributes,
|
...props
|
||||||
width: size,
|
})
|
||||||
height: size,
|
|
||||||
stroke: color,
|
|
||||||
strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,
|
|
||||||
className: ["lucide", `lucide-${toKebabCase(iconName)}`, className].join(" "),
|
|
||||||
...rest
|
|
||||||
},
|
|
||||||
[
|
|
||||||
...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),
|
|
||||||
...Array.isArray(children) ? children : [children]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
Component.displayName = `${iconName}`;
|
Component.displayName = `${iconName}`;
|
||||||
return Component;
|
return Component;
|
||||||
};
|
};
|
||||||
|
|
||||||
export { createLucideIcon as default, toKebabCase };
|
export { createLucideIcon as default };
|
||||||
//# sourceMappingURL=createLucideIcon.js.map
|
//# sourceMappingURL=createLucideIcon.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/createLucideIcon.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/createLucideIcon.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
frontend/node_modules/lucide-react/dist/esm/defaultAttributes.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/defaultAttributes.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
18
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-down.js
generated
vendored
Normal file
18
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-down.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const AArrowDown = createLucideIcon("AArrowDown", [
|
||||||
|
["path", { d: "M3.5 13h6", key: "p1my2r" }],
|
||||||
|
["path", { d: "m2 16 4.5-9 4.5 9", key: "ndf0b3" }],
|
||||||
|
["path", { d: "M18 7v9", key: "pknjwm" }],
|
||||||
|
["path", { d: "m14 12 4 4 4-4", key: "buelq4" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { AArrowDown as default };
|
||||||
|
//# sourceMappingURL=a-arrow-down.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-down.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-down.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"a-arrow-down.js","sources":["../../../src/icons/a-arrow-down.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AArrowDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/a-arrow-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AArrowDown = createLucideIcon('AArrowDown', [\n ['path', { d: 'M3.5 13h6', key: 'p1my2r' }],\n ['path', { d: 'm2 16 4.5-9 4.5 9', key: 'ndf0b3' }],\n ['path', { d: 'M18 7v9', key: 'pknjwm' }],\n ['path', { d: 'm14 12 4 4 4-4', key: 'buelq4' }],\n]);\n\nexport default AArrowDown;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,iBAAiB,YAAc,CAAA,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAClD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACxC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACjD,CAAC,CAAA,CAAA;;"}
|
||||||
18
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-up.js
generated
vendored
Normal file
18
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-up.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const AArrowUp = createLucideIcon("AArrowUp", [
|
||||||
|
["path", { d: "M3.5 13h6", key: "p1my2r" }],
|
||||||
|
["path", { d: "m2 16 4.5-9 4.5 9", key: "ndf0b3" }],
|
||||||
|
["path", { d: "M18 16V7", key: "ty0viw" }],
|
||||||
|
["path", { d: "m14 11 4-4 4 4", key: "1pu57t" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { AArrowUp as default };
|
||||||
|
//# sourceMappingURL=a-arrow-up.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-up.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/a-arrow-up.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"a-arrow-up.js","sources":["../../../src/icons/a-arrow-up.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/a-arrow-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AArrowUp = createLucideIcon('AArrowUp', [\n ['path', { d: 'M3.5 13h6', key: 'p1my2r' }],\n ['path', { d: 'm2 16 4.5-9 4.5 9', key: 'ndf0b3' }],\n ['path', { d: 'M18 16V7', key: 'ty0viw' }],\n ['path', { d: 'm14 11 4-4 4 4', key: '1pu57t' }],\n]);\n\nexport default AArrowUp;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,iBAAiB,UAAY,CAAA,CAAA,CAAA;AAAA,CAAA,CAC5C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAClD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACjD,CAAC,CAAA,CAAA;;"}
|
||||||
18
frontend/node_modules/lucide-react/dist/esm/icons/a-large-small.js
generated
vendored
Normal file
18
frontend/node_modules/lucide-react/dist/esm/icons/a-large-small.js
generated
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const ALargeSmall = createLucideIcon("ALargeSmall", [
|
||||||
|
["path", { d: "M21 14h-5", key: "1vh23k" }],
|
||||||
|
["path", { d: "M16 16v-3.5a2.5 2.5 0 0 1 5 0V16", key: "1wh10o" }],
|
||||||
|
["path", { d: "M4.5 13h6", key: "dfilno" }],
|
||||||
|
["path", { d: "m3 16 4.5-9 4.5 9", key: "2dxa0e" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { ALargeSmall as default };
|
||||||
|
//# sourceMappingURL=a-large-small.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/a-large-small.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/a-large-small.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"a-large-small.js","sources":["../../../src/icons/a-large-small.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ALargeSmall\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/a-large-small\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ALargeSmall = createLucideIcon('ALargeSmall', [\n ['path', { d: 'M21 14h-5', key: '1vh23k' }],\n ['path', { d: 'M16 16v-3.5a2.5 2.5 0 0 1 5 0V16', key: '1wh10o' }],\n ['path', { d: 'M4.5 13h6', key: 'dfilno' }],\n ['path', { d: 'm3 16 4.5-9 4.5 9', key: '2dxa0e' }],\n]);\n\nexport default ALargeSmall;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,iBAAiB,aAAe,CAAA,CAAA,CAAA;AAAA,CAAA,CAClD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAoC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACjE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAqB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACpD,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/accessibility.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/accessibility.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
11
frontend/node_modules/lucide-react/dist/esm/icons/activity-square.js
generated
vendored
11
frontend/node_modules/lucide-react/dist/esm/icons/activity-square.js
generated
vendored
@@ -1,16 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createLucideIcon from '../createLucideIcon.js';
|
export { default } from './square-activity.js';
|
||||||
|
|
||||||
const ActivitySquare = createLucideIcon("ActivitySquare", [
|
|
||||||
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
|
|
||||||
["path", { d: "M17 12h-2l-2 5-2-10-2 5H7", key: "15hlnc" }]
|
|
||||||
]);
|
|
||||||
|
|
||||||
export { ActivitySquare as default };
|
|
||||||
//# sourceMappingURL=activity-square.js.map
|
//# sourceMappingURL=activity-square.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/activity-square.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/activity-square.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"activity-square.js","sources":["../../../src/icons/activity-square.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ActivitySquare\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/activity-square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ActivitySquare = createLucideIcon('ActivitySquare', [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n ['path', { d: 'M17 12h-2l-2 5-2-10-2 5H7', key: '15hlnc' }],\n]);\n\nexport default ActivitySquare;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,iBAAiB,gBAAkB,CAAA,CAAA,CAAA;AAAA,CAAA,CACxD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC9E,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA6B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC5D,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"activity-square.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||||
10
frontend/node_modules/lucide-react/dist/esm/icons/activity.js
generated
vendored
10
frontend/node_modules/lucide-react/dist/esm/icons/activity.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,7 +8,13 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const Activity = createLucideIcon("Activity", [
|
const Activity = createLucideIcon("Activity", [
|
||||||
["path", { d: "M22 12h-4l-3 9L9 3l-3 9H2", key: "d5dnw9" }]
|
[
|
||||||
|
"path",
|
||||||
|
{
|
||||||
|
d: "M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",
|
||||||
|
key: "169zse"
|
||||||
|
}
|
||||||
|
]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { Activity as default };
|
export { Activity as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/activity.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/activity.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"activity.js","sources":["../../../src/icons/activity.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Activity\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Activity = createLucideIcon('Activity', [\n ['path', { d: 'M22 12h-4l-3 9L9 3l-3 9H2', key: 'd5dnw9' }],\n]);\n\nexport default Activity;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,iBAAiB,UAAY,CAAA,CAAA,CAAA;AAAA,CAAA,CAC5C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA6B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC5D,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"activity.js","sources":["../../../src/icons/activity.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Activity\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Activity = createLucideIcon('Activity', [\n [\n 'path',\n {\n d: 'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n key: '169zse',\n },\n ],\n]);\n\nexport default Activity;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,iBAAiB,UAAY,CAAA,CAAA,CAAA;AAAA,CAC5C,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA;AAAA,CACF,CAAA,CAAA;AACF,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/air-vent.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/air-vent.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
4
frontend/node_modules/lucide-react/dist/esm/icons/airplay.js
generated
vendored
4
frontend/node_modules/lucide-react/dist/esm/icons/airplay.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -15,7 +15,7 @@ const Airplay = createLucideIcon("Airplay", [
|
|||||||
key: "ns4c3b"
|
key: "ns4c3b"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
["polygon", { points: "12 15 17 21 7 21 12 15", key: "1sy95i" }]
|
["path", { d: "m12 15 5 6H7Z", key: "14qnn2" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { Airplay as default };
|
export { Airplay as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/airplay.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/airplay.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"airplay.js","sources":["../../../src/icons/airplay.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Airplay\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/airplay\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Airplay = createLucideIcon('Airplay', [\n [\n 'path',\n {\n d: 'M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1',\n key: 'ns4c3b',\n },\n ],\n ['polygon', { points: '12 15 17 21 7 21 12 15', key: '1sy95i' }],\n]);\n\nexport default Airplay;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,iBAAiB,SAAW,CAAA,CAAA,CAAA;AAAA,CAC1C,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA;AAAA,CACF,CAAA,CAAA,CAAA;AAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAW,CAAA,CAAA,CAAA,CAAE,QAAQ,CAA0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACjE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"airplay.js","sources":["../../../src/icons/airplay.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Airplay\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/airplay\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Airplay = createLucideIcon('Airplay', [\n [\n 'path',\n {\n d: 'M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1',\n key: 'ns4c3b',\n },\n ],\n ['path', { d: 'm12 15 5 6H7Z', key: '14qnn2' }],\n]);\n\nexport default Airplay;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,iBAAiB,SAAW,CAAA,CAAA,CAAA;AAAA,CAC1C,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA;AAAA,CACF,CAAA,CAAA,CAAA;AAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAiB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAChD,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-check.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-check.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-check.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-check.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
20
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-minus.js
generated
vendored
Normal file
20
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-minus.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const AlarmClockMinus = createLucideIcon("AlarmClockMinus", [
|
||||||
|
["circle", { cx: "12", cy: "13", r: "8", key: "3y4lt7" }],
|
||||||
|
["path", { d: "M5 3 2 6", key: "18tl5t" }],
|
||||||
|
["path", { d: "m22 6-3-3", key: "1opdir" }],
|
||||||
|
["path", { d: "M6.38 18.7 4 21", key: "17xu3x" }],
|
||||||
|
["path", { d: "M17.64 18.67 20 21", key: "kv2oe2" }],
|
||||||
|
["path", { d: "M9 13h6", key: "1uhe8q" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { AlarmClockMinus as default };
|
||||||
|
//# sourceMappingURL=alarm-clock-minus.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-minus.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-minus.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"alarm-clock-minus.js","sources":["../../../src/icons/alarm-clock-minus.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlarmClockMinus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alarm-clock-minus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlarmClockMinus = createLucideIcon('AlarmClockMinus', [\n ['circle', { cx: '12', cy: '13', r: '8', key: '3y4lt7' }],\n ['path', { d: 'M5 3 2 6', key: '18tl5t' }],\n ['path', { d: 'm22 6-3-3', key: '1opdir' }],\n ['path', { d: 'M6.38 18.7 4 21', key: '17xu3x' }],\n ['path', { d: 'M17.64 18.67 20 21', key: 'kv2oe2' }],\n ['path', { d: 'M9 13h6', key: '1uhe8q' }],\n]);\n\nexport default AlarmClockMinus;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAkB,iBAAiB,iBAAmB,CAAA,CAAA,CAAA;AAAA,CAC1D,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CAAA,CACxD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACnD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-off.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-off.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
21
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-plus.js
generated
vendored
Normal file
21
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-plus.js
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const AlarmClockPlus = createLucideIcon("AlarmClockPlus", [
|
||||||
|
["circle", { cx: "12", cy: "13", r: "8", key: "3y4lt7" }],
|
||||||
|
["path", { d: "M5 3 2 6", key: "18tl5t" }],
|
||||||
|
["path", { d: "m22 6-3-3", key: "1opdir" }],
|
||||||
|
["path", { d: "M6.38 18.7 4 21", key: "17xu3x" }],
|
||||||
|
["path", { d: "M17.64 18.67 20 21", key: "kv2oe2" }],
|
||||||
|
["path", { d: "M12 10v6", key: "1bos4e" }],
|
||||||
|
["path", { d: "M9 13h6", key: "1uhe8q" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { AlarmClockPlus as default };
|
||||||
|
//# sourceMappingURL=alarm-clock-plus.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-plus.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock-plus.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"alarm-clock-plus.js","sources":["../../../src/icons/alarm-clock-plus.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlarmClockPlus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alarm-clock-plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlarmClockPlus = createLucideIcon('AlarmClockPlus', [\n ['circle', { cx: '12', cy: '13', r: '8', key: '3y4lt7' }],\n ['path', { d: 'M5 3 2 6', key: '18tl5t' }],\n ['path', { d: 'm22 6-3-3', key: '1opdir' }],\n ['path', { d: 'M6.38 18.7 4 21', key: '17xu3x' }],\n ['path', { d: 'M17.64 18.67 20 21', key: 'kv2oe2' }],\n ['path', { d: 'M12 10v6', key: '1bos4e' }],\n ['path', { d: 'M9 13h6', key: '1uhe8q' }],\n]);\n\nexport default AlarmClockPlus;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiB,iBAAiB,gBAAkB,CAAA,CAAA,CAAA;AAAA,CACxD,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CAAA,CACxD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACnD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-clock.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
15
frontend/node_modules/lucide-react/dist/esm/icons/alarm-minus.js
generated
vendored
15
frontend/node_modules/lucide-react/dist/esm/icons/alarm-minus.js
generated
vendored
@@ -1,20 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createLucideIcon from '../createLucideIcon.js';
|
export { default } from './alarm-clock-minus.js';
|
||||||
|
|
||||||
const AlarmMinus = createLucideIcon("AlarmMinus", [
|
|
||||||
["circle", { cx: "12", cy: "13", r: "8", key: "3y4lt7" }],
|
|
||||||
["path", { d: "M5 3 2 6", key: "18tl5t" }],
|
|
||||||
["path", { d: "m22 6-3-3", key: "1opdir" }],
|
|
||||||
["path", { d: "M6.38 18.7 4 21", key: "17xu3x" }],
|
|
||||||
["path", { d: "M17.64 18.67 20 21", key: "kv2oe2" }],
|
|
||||||
["path", { d: "M9 13h6", key: "1uhe8q" }]
|
|
||||||
]);
|
|
||||||
|
|
||||||
export { AlarmMinus as default };
|
|
||||||
//# sourceMappingURL=alarm-minus.js.map
|
//# sourceMappingURL=alarm-minus.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-minus.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-minus.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"alarm-minus.js","sources":["../../../src/icons/alarm-minus.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlarmMinus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alarm-minus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlarmMinus = createLucideIcon('AlarmMinus', [\n ['circle', { cx: '12', cy: '13', r: '8', key: '3y4lt7' }],\n ['path', { d: 'M5 3 2 6', key: '18tl5t' }],\n ['path', { d: 'm22 6-3-3', key: '1opdir' }],\n ['path', { d: 'M6.38 18.7 4 21', key: '17xu3x' }],\n ['path', { d: 'M17.64 18.67 20 21', key: 'kv2oe2' }],\n ['path', { d: 'M9 13h6', key: '1uhe8q' }],\n]);\n\nexport default AlarmMinus;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,iBAAiB,YAAc,CAAA,CAAA,CAAA;AAAA,CAChD,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CAAA,CACxD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACnD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"alarm-minus.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||||
16
frontend/node_modules/lucide-react/dist/esm/icons/alarm-plus.js
generated
vendored
16
frontend/node_modules/lucide-react/dist/esm/icons/alarm-plus.js
generated
vendored
@@ -1,21 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createLucideIcon from '../createLucideIcon.js';
|
export { default } from './alarm-clock-plus.js';
|
||||||
|
|
||||||
const AlarmPlus = createLucideIcon("AlarmPlus", [
|
|
||||||
["circle", { cx: "12", cy: "13", r: "8", key: "3y4lt7" }],
|
|
||||||
["path", { d: "M5 3 2 6", key: "18tl5t" }],
|
|
||||||
["path", { d: "m22 6-3-3", key: "1opdir" }],
|
|
||||||
["path", { d: "M6.38 18.7 4 21", key: "17xu3x" }],
|
|
||||||
["path", { d: "M17.64 18.67 20 21", key: "kv2oe2" }],
|
|
||||||
["path", { d: "M12 10v6", key: "1bos4e" }],
|
|
||||||
["path", { d: "M9 13h6", key: "1uhe8q" }]
|
|
||||||
]);
|
|
||||||
|
|
||||||
export { AlarmPlus as default };
|
|
||||||
//# sourceMappingURL=alarm-plus.js.map
|
//# sourceMappingURL=alarm-plus.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-plus.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alarm-plus.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"alarm-plus.js","sources":["../../../src/icons/alarm-plus.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlarmPlus\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alarm-plus\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlarmPlus = createLucideIcon('AlarmPlus', [\n ['circle', { cx: '12', cy: '13', r: '8', key: '3y4lt7' }],\n ['path', { d: 'M5 3 2 6', key: '18tl5t' }],\n ['path', { d: 'm22 6-3-3', key: '1opdir' }],\n ['path', { d: 'M6.38 18.7 4 21', key: '17xu3x' }],\n ['path', { d: 'M17.64 18.67 20 21', key: 'kv2oe2' }],\n ['path', { d: 'M12 10v6', key: '1bos4e' }],\n ['path', { d: 'M9 13h6', key: '1uhe8q' }],\n]);\n\nexport default AlarmPlus;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,iBAAiB,WAAa,CAAA,CAAA,CAAA;AAAA,CAC9C,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CAAA,CACxD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAmB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAsB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACnD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"alarm-plus.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||||
22
frontend/node_modules/lucide-react/dist/esm/icons/alarm-smoke.js
generated
vendored
Normal file
22
frontend/node_modules/lucide-react/dist/esm/icons/alarm-smoke.js
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const AlarmSmoke = createLucideIcon("AlarmSmoke", [
|
||||||
|
["path", { d: "M11 21c0-2.5 2-2.5 2-5", key: "1sicvv" }],
|
||||||
|
["path", { d: "M16 21c0-2.5 2-2.5 2-5", key: "1o3eny" }],
|
||||||
|
["path", { d: "m19 8-.8 3a1.25 1.25 0 0 1-1.2 1H7a1.25 1.25 0 0 1-1.2-1L5 8", key: "1bvca4" }],
|
||||||
|
[
|
||||||
|
"path",
|
||||||
|
{ d: "M21 3a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a1 1 0 0 1 1-1z", key: "x3qr1j" }
|
||||||
|
],
|
||||||
|
["path", { d: "M6 21c0-2.5 2-2.5 2-5", key: "i3w1gp" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { AlarmSmoke as default };
|
||||||
|
//# sourceMappingURL=alarm-smoke.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/alarm-smoke.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/alarm-smoke.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"alarm-smoke.js","sources":["../../../src/icons/alarm-smoke.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlarmSmoke\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alarm-smoke\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlarmSmoke = createLucideIcon('AlarmSmoke', [\n ['path', { d: 'M11 21c0-2.5 2-2.5 2-5', key: '1sicvv' }],\n ['path', { d: 'M16 21c0-2.5 2-2.5 2-5', key: '1o3eny' }],\n ['path', { d: 'm19 8-.8 3a1.25 1.25 0 0 1-1.2 1H7a1.25 1.25 0 0 1-1.2-1L5 8', key: '1bvca4' }],\n [\n 'path',\n { d: 'M21 3a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a1 1 0 0 1 1-1z', key: 'x3qr1j' },\n ],\n ['path', { d: 'M6 21c0-2.5 2-2.5 2-5', key: 'i3w1gp' }],\n]);\n\nexport default AlarmSmoke;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,iBAAiB,YAAc,CAAA,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACvD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA0B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACvD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAgE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC7F,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAwE,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAS,CAAA,CAAA;AAAA,CAC7F,CAAA,CAAA,CAAA;AAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAyB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACxD,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/album.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/album.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
12
frontend/node_modules/lucide-react/dist/esm/icons/alert-circle.js
generated
vendored
12
frontend/node_modules/lucide-react/dist/esm/icons/alert-circle.js
generated
vendored
@@ -1,17 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createLucideIcon from '../createLucideIcon.js';
|
export { default } from './circle-alert.js';
|
||||||
|
|
||||||
const AlertCircle = createLucideIcon("AlertCircle", [
|
|
||||||
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
||||||
["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
|
|
||||||
["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
|
|
||||||
]);
|
|
||||||
|
|
||||||
export { AlertCircle as default };
|
|
||||||
//# sourceMappingURL=alert-circle.js.map
|
//# sourceMappingURL=alert-circle.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alert-circle.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alert-circle.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"alert-circle.js","sources":["../../../src/icons/alert-circle.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlertCircle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alert-circle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlertCircle = createLucideIcon('AlertCircle', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n]);\n\nexport default AlertCircle;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,iBAAiB,aAAe,CAAA,CAAA,CAAA;AAAA,CAClD,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CACzD,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACjE,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACvE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"alert-circle.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||||
18
frontend/node_modules/lucide-react/dist/esm/icons/alert-octagon.js
generated
vendored
18
frontend/node_modules/lucide-react/dist/esm/icons/alert-octagon.js
generated
vendored
@@ -1,23 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createLucideIcon from '../createLucideIcon.js';
|
export { default } from './octagon-alert.js';
|
||||||
|
|
||||||
const AlertOctagon = createLucideIcon("AlertOctagon", [
|
|
||||||
[
|
|
||||||
"polygon",
|
|
||||||
{
|
|
||||||
points: "7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2",
|
|
||||||
key: "h1p8hx"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
|
|
||||||
["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
|
|
||||||
]);
|
|
||||||
|
|
||||||
export { AlertOctagon as default };
|
|
||||||
//# sourceMappingURL=alert-octagon.js.map
|
//# sourceMappingURL=alert-octagon.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alert-octagon.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alert-octagon.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"alert-octagon.js","sources":["../../../src/icons/alert-octagon.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlertOctagon\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alert-octagon\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlertOctagon = createLucideIcon('AlertOctagon', [\n [\n 'polygon',\n {\n points: '7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2',\n key: 'h1p8hx',\n },\n ],\n ['line', { x1: '12', x2: '12', y1: '8', y2: '12', key: '1pkeuh' }],\n ['line', { x1: '12', x2: '12.01', y1: '16', y2: '16', key: '4dfq90' }],\n]);\n\nexport default AlertOctagon;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,iBAAiB,cAAgB,CAAA,CAAA,CAAA;AAAA,CACpD,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACR,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA;AAAA,CACF,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACjE,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACvE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"alert-octagon.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||||
18
frontend/node_modules/lucide-react/dist/esm/icons/alert-triangle.js
generated
vendored
18
frontend/node_modules/lucide-react/dist/esm/icons/alert-triangle.js
generated
vendored
@@ -1,23 +1,9 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import createLucideIcon from '../createLucideIcon.js';
|
export { default } from './triangle-alert.js';
|
||||||
|
|
||||||
const AlertTriangle = createLucideIcon("AlertTriangle", [
|
|
||||||
[
|
|
||||||
"path",
|
|
||||||
{
|
|
||||||
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z",
|
|
||||||
key: "c3ski4"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
["path", { d: "M12 9v4", key: "juzpu7" }],
|
|
||||||
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
||||||
]);
|
|
||||||
|
|
||||||
export { AlertTriangle as default };
|
|
||||||
//# sourceMappingURL=alert-triangle.js.map
|
//# sourceMappingURL=alert-triangle.js.map
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/alert-triangle.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/alert-triangle.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"alert-triangle.js","sources":["../../../src/icons/alert-triangle.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlertTriangle\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/alert-triangle\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlertTriangle = createLucideIcon('AlertTriangle', [\n [\n 'path',\n {\n d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z',\n key: 'c3ski4',\n },\n ],\n ['path', { d: 'M12 9v4', key: 'juzpu7' }],\n ['path', { d: 'M12 17h.01', key: 'p32p05' }],\n]);\n\nexport default AlertTriangle;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgB,iBAAiB,eAAiB,CAAA,CAAA,CAAA;AAAA,CACtD,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA;AAAA,CACF,CAAA,CAAA,CAAA;AAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACxC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC7C,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"alert-triangle.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-center-horizontal.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-center-horizontal.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-center-vertical.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-center-vertical.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
8
frontend/node_modules/lucide-react/dist/esm/icons/align-center.js
generated
vendored
8
frontend/node_modules/lucide-react/dist/esm/icons/align-center.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const AlignCenter = createLucideIcon("AlignCenter", [
|
const AlignCenter = createLucideIcon("AlignCenter", [
|
||||||
["line", { x1: "21", x2: "3", y1: "6", y2: "6", key: "1fp77t" }],
|
["path", { d: "M17 12H7", key: "16if0g" }],
|
||||||
["line", { x1: "17", x2: "7", y1: "12", y2: "12", key: "rsh8ii" }],
|
["path", { d: "M19 18H5", key: "18s9l3" }],
|
||||||
["line", { x1: "19", x2: "5", y1: "18", y2: "18", key: "1t0tuv" }]
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { AlignCenter as default };
|
export { AlignCenter as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-center.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-center.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"align-center.js","sources":["../../../src/icons/align-center.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignCenter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-center\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignCenter = createLucideIcon('AlignCenter', [\n ['line', { x1: '21', x2: '3', y1: '6', y2: '6', key: '1fp77t' }],\n ['line', { x1: '17', x2: '7', y1: '12', y2: '12', key: 'rsh8ii' }],\n ['line', { x1: '19', x2: '5', y1: '18', y2: '18', key: '1t0tuv' }],\n]);\n\nexport default AlignCenter;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,iBAAiB,aAAe,CAAA,CAAA,CAAA;AAAA,CAClD,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC/D,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACjE,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACnE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"align-center.js","sources":["../../../src/icons/align-center.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignCenter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-center\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignCenter = createLucideIcon('AlignCenter', [\n ['path', { d: 'M17 12H7', key: '16if0g' }],\n ['path', { d: 'M19 18H5', key: '18s9l3' }],\n ['path', { d: 'M21 6H3', key: '1jwq7v' }],\n]);\n\nexport default AlignCenter;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAc,iBAAiB,aAAe,CAAA,CAAA,CAAA;AAAA,CAAA,CAClD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-end-horizontal.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-end-horizontal.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-end-vertical.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-end-vertical.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-distribute-end.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-distribute-end.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-justify-center.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-justify-center.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-justify-end.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-justify-end.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-justify-start.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-justify-start.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-space-around.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-space-around.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-space-between.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-horizontal-space-between.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
8
frontend/node_modules/lucide-react/dist/esm/icons/align-justify.js
generated
vendored
8
frontend/node_modules/lucide-react/dist/esm/icons/align-justify.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const AlignJustify = createLucideIcon("AlignJustify", [
|
const AlignJustify = createLucideIcon("AlignJustify", [
|
||||||
["line", { x1: "3", x2: "21", y1: "6", y2: "6", key: "4m8b97" }],
|
["path", { d: "M3 12h18", key: "1i2n21" }],
|
||||||
["line", { x1: "3", x2: "21", y1: "12", y2: "12", key: "10d38w" }],
|
["path", { d: "M3 18h18", key: "1h113x" }],
|
||||||
["line", { x1: "3", x2: "21", y1: "18", y2: "18", key: "kwyyxn" }]
|
["path", { d: "M3 6h18", key: "d0wm0j" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { AlignJustify as default };
|
export { AlignJustify as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-justify.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-justify.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"align-justify.js","sources":["../../../src/icons/align-justify.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignJustify\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-justify\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignJustify = createLucideIcon('AlignJustify', [\n ['line', { x1: '3', x2: '21', y1: '6', y2: '6', key: '4m8b97' }],\n ['line', { x1: '3', x2: '21', y1: '12', y2: '12', key: '10d38w' }],\n ['line', { x1: '3', x2: '21', y1: '18', y2: '18', key: 'kwyyxn' }],\n]);\n\nexport default AlignJustify;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,iBAAiB,cAAgB,CAAA,CAAA,CAAA;AAAA,CACpD,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC/D,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACjE,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACnE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"align-justify.js","sources":["../../../src/icons/align-justify.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignJustify\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-justify\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignJustify = createLucideIcon('AlignJustify', [\n ['path', { d: 'M3 12h18', key: '1i2n21' }],\n ['path', { d: 'M3 18h18', key: '1h113x' }],\n ['path', { d: 'M3 6h18', key: 'd0wm0j' }],\n]);\n\nexport default AlignJustify;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAe,iBAAiB,cAAgB,CAAA,CAAA,CAAA;AAAA,CAAA,CACpD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
||||||
8
frontend/node_modules/lucide-react/dist/esm/icons/align-left.js
generated
vendored
8
frontend/node_modules/lucide-react/dist/esm/icons/align-left.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const AlignLeft = createLucideIcon("AlignLeft", [
|
const AlignLeft = createLucideIcon("AlignLeft", [
|
||||||
["line", { x1: "21", x2: "3", y1: "6", y2: "6", key: "1fp77t" }],
|
["path", { d: "M15 12H3", key: "6jk70r" }],
|
||||||
["line", { x1: "15", x2: "3", y1: "12", y2: "12", key: "v6grx8" }],
|
["path", { d: "M17 18H3", key: "1amg6g" }],
|
||||||
["line", { x1: "17", x2: "3", y1: "18", y2: "18", key: "1awlsn" }]
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { AlignLeft as default };
|
export { AlignLeft as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-left.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-left.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"align-left.js","sources":["../../../src/icons/align-left.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignLeft = createLucideIcon('AlignLeft', [\n ['line', { x1: '21', x2: '3', y1: '6', y2: '6', key: '1fp77t' }],\n ['line', { x1: '15', x2: '3', y1: '12', y2: '12', key: 'v6grx8' }],\n ['line', { x1: '17', x2: '3', y1: '18', y2: '18', key: '1awlsn' }],\n]);\n\nexport default AlignLeft;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,iBAAiB,WAAa,CAAA,CAAA,CAAA;AAAA,CAC9C,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC/D,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACjE,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACnE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"align-left.js","sources":["../../../src/icons/align-left.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignLeft\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-left\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignLeft = createLucideIcon('AlignLeft', [\n ['path', { d: 'M15 12H3', key: '6jk70r' }],\n ['path', { d: 'M17 18H3', key: '1amg6g' }],\n ['path', { d: 'M21 6H3', key: '1jwq7v' }],\n]);\n\nexport default AlignLeft;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,iBAAiB,WAAa,CAAA,CAAA,CAAA;AAAA,CAAA,CAC9C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
||||||
8
frontend/node_modules/lucide-react/dist/esm/icons/align-right.js
generated
vendored
8
frontend/node_modules/lucide-react/dist/esm/icons/align-right.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const AlignRight = createLucideIcon("AlignRight", [
|
const AlignRight = createLucideIcon("AlignRight", [
|
||||||
["line", { x1: "21", x2: "3", y1: "6", y2: "6", key: "1fp77t" }],
|
["path", { d: "M21 12H9", key: "dn1m92" }],
|
||||||
["line", { x1: "21", x2: "9", y1: "12", y2: "12", key: "1uyos4" }],
|
["path", { d: "M21 18H7", key: "1ygte8" }],
|
||||||
["line", { x1: "21", x2: "7", y1: "18", y2: "18", key: "1g9eri" }]
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { AlignRight as default };
|
export { AlignRight as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-right.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-right.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"align-right.js","sources":["../../../src/icons/align-right.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignRight = createLucideIcon('AlignRight', [\n ['line', { x1: '21', x2: '3', y1: '6', y2: '6', key: '1fp77t' }],\n ['line', { x1: '21', x2: '9', y1: '12', y2: '12', key: '1uyos4' }],\n ['line', { x1: '21', x2: '7', y1: '18', y2: '18', key: '1g9eri' }],\n]);\n\nexport default AlignRight;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,iBAAiB,YAAc,CAAA,CAAA,CAAA;AAAA,CAChD,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC/D,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACjE,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACnE,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"align-right.js","sources":["../../../src/icons/align-right.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignRight = createLucideIcon('AlignRight', [\n ['path', { d: 'M21 12H9', key: 'dn1m92' }],\n ['path', { d: 'M21 18H7', key: '1ygte8' }],\n ['path', { d: 'M21 6H3', key: '1jwq7v' }],\n]);\n\nexport default AlignRight;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAa,iBAAiB,YAAc,CAAA,CAAA,CAAA;AAAA,CAAA,CAChD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-start-horizontal.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-start-horizontal.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-start-vertical.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-start-vertical.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
12
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-distribute-center.js
generated
vendored
12
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-distribute-center.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,12 +8,12 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const AlignVerticalDistributeCenter = createLucideIcon("AlignVerticalDistributeCenter", [
|
const AlignVerticalDistributeCenter = createLucideIcon("AlignVerticalDistributeCenter", [
|
||||||
["rect", { width: "14", height: "6", x: "5", y: "14", rx: "2", key: "jmoj9s" }],
|
|
||||||
["rect", { width: "10", height: "6", x: "7", y: "4", rx: "2", key: "aza5on" }],
|
|
||||||
["path", { d: "M22 7h-5", key: "o2endc" }],
|
|
||||||
["path", { d: "M7 7H1", key: "105l6j" }],
|
|
||||||
["path", { d: "M22 17h-3", key: "1lwga1" }],
|
["path", { d: "M22 17h-3", key: "1lwga1" }],
|
||||||
["path", { d: "M5 17H2", key: "1gx9xc" }]
|
["path", { d: "M22 7h-5", key: "o2endc" }],
|
||||||
|
["path", { d: "M5 17H2", key: "1gx9xc" }],
|
||||||
|
["path", { d: "M7 7H2", key: "6bq26l" }],
|
||||||
|
["rect", { x: "5", y: "14", width: "14", height: "6", rx: "2", key: "1qrzuf" }],
|
||||||
|
["rect", { x: "7", y: "4", width: "10", height: "6", rx: "2", key: "we8e9z" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { AlignVerticalDistributeCenter as default };
|
export { AlignVerticalDistributeCenter as default };
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"align-vertical-distribute-center.js","sources":["../../../src/icons/align-vertical-distribute-center.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignVerticalDistributeCenter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-vertical-distribute-center\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignVerticalDistributeCenter = createLucideIcon('AlignVerticalDistributeCenter', [\n ['rect', { width: '14', height: '6', x: '5', y: '14', rx: '2', key: 'jmoj9s' }],\n ['rect', { width: '10', height: '6', x: '7', y: '4', rx: '2', key: 'aza5on' }],\n ['path', { d: 'M22 7h-5', key: 'o2endc' }],\n ['path', { d: 'M7 7H1', key: '105l6j' }],\n ['path', { d: 'M22 17h-3', key: '1lwga1' }],\n ['path', { d: 'M5 17H2', key: '1gx9xc' }],\n]);\n\nexport default AlignVerticalDistributeCenter;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgC,iBAAiB,+BAAiC,CAAA,CAAA,CAAA;AAAA,CAAA,CACtF,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC9E,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,MAAM,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAG,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC7E,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACvC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC1C,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"align-vertical-distribute-center.js","sources":["../../../src/icons/align-vertical-distribute-center.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name AlignVerticalDistributeCenter\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/align-vertical-distribute-center\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst AlignVerticalDistributeCenter = createLucideIcon('AlignVerticalDistributeCenter', [\n ['path', { d: 'M22 17h-3', key: '1lwga1' }],\n ['path', { d: 'M22 7h-5', key: 'o2endc' }],\n ['path', { d: 'M5 17H2', key: '1gx9xc' }],\n ['path', { d: 'M7 7H2', key: '6bq26l' }],\n ['rect', { x: '5', y: '14', width: '14', height: '6', rx: '2', key: '1qrzuf' }],\n ['rect', { x: '7', y: '4', width: '10', height: '6', rx: '2', key: 'we8e9z' }],\n]);\n\nexport default AlignVerticalDistributeCenter;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAgC,iBAAiB,+BAAiC,CAAA,CAAA,CAAA;AAAA,CAAA,CACtF,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACxC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACvC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAE,CAAA,CAAA,CAAG,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,QAAQ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC9E,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAE,CAAA,CAAA,CAAG,KAAK,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,CAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,QAAQ,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC/E,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-distribute-end.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-distribute-end.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-distribute-start.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-distribute-start.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-justify-center.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-justify-center.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-justify-end.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-justify-end.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-justify-start.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-justify-start.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-space-around.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-space-around.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-space-between.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/align-vertical-space-between.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
27
frontend/node_modules/lucide-react/dist/esm/icons/ambulance.js
generated
vendored
Normal file
27
frontend/node_modules/lucide-react/dist/esm/icons/ambulance.js
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const Ambulance = createLucideIcon("Ambulance", [
|
||||||
|
["path", { d: "M10 10H6", key: "1bsnug" }],
|
||||||
|
["path", { d: "M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2", key: "wrbu53" }],
|
||||||
|
[
|
||||||
|
"path",
|
||||||
|
{
|
||||||
|
d: "M19 18h2a1 1 0 0 0 1-1v-3.28a1 1 0 0 0-.684-.948l-1.923-.641a1 1 0 0 1-.578-.502l-1.539-3.076A1 1 0 0 0 16.382 8H14",
|
||||||
|
key: "lrkjwd"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
["path", { d: "M8 8v4", key: "1fwk8c" }],
|
||||||
|
["path", { d: "M9 18h6", key: "x1upvd" }],
|
||||||
|
["circle", { cx: "17", cy: "18", r: "2", key: "332jqn" }],
|
||||||
|
["circle", { cx: "7", cy: "18", r: "2", key: "19iecd" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { Ambulance as default };
|
||||||
|
//# sourceMappingURL=ambulance.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/ambulance.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/ambulance.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"ambulance.js","sources":["../../../src/icons/ambulance.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Ambulance\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/ambulance\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ambulance = createLucideIcon('Ambulance', [\n ['path', { d: 'M10 10H6', key: '1bsnug' }],\n ['path', { d: 'M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2', key: 'wrbu53' }],\n [\n 'path',\n {\n d: 'M19 18h2a1 1 0 0 0 1-1v-3.28a1 1 0 0 0-.684-.948l-1.923-.641a1 1 0 0 1-.578-.502l-1.539-3.076A1 1 0 0 0 16.382 8H14',\n key: 'lrkjwd',\n },\n ],\n ['path', { d: 'M8 8v4', key: '1fwk8c' }],\n ['path', { d: 'M9 18h6', key: 'x1upvd' }],\n ['circle', { cx: '17', cy: '18', r: '2', key: '332jqn' }],\n ['circle', { cx: '7', cy: '18', r: '2', key: '19iecd' }],\n]);\n\nexport default Ambulance;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAY,iBAAiB,WAAa,CAAA,CAAA,CAAA;AAAA,CAAA,CAC9C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA6D,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC1F,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA;AAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACH,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACP,CAAA,CAAA,CAAA,CAAA;AAAA,CACF,CAAA,CAAA,CAAA;AAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACvC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CACxC,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CACxD,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,EAAK,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA;AACzD,CAAC,CAAA,CAAA;;"}
|
||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/ampersand.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/ampersand.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/ampersands.js
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/ampersands.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
|||||||
23
frontend/node_modules/lucide-react/dist/esm/icons/amphora.js
generated
vendored
Normal file
23
frontend/node_modules/lucide-react/dist/esm/icons/amphora.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* @license lucide-react v0.453.0 - ISC
|
||||||
|
*
|
||||||
|
* This source code is licensed under the ISC license.
|
||||||
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
|
const Amphora = createLucideIcon("Amphora", [
|
||||||
|
[
|
||||||
|
"path",
|
||||||
|
{ d: "M10 2v5.632c0 .424-.272.795-.653.982A6 6 0 0 0 6 14c.006 4 3 7 5 8", key: "1h8rid" }
|
||||||
|
],
|
||||||
|
["path", { d: "M10 5H8a2 2 0 0 0 0 4h.68", key: "3ezsi6" }],
|
||||||
|
["path", { d: "M14 2v5.632c0 .424.272.795.652.982A6 6 0 0 1 18 14c0 4-3 7-5 8", key: "yt6q09" }],
|
||||||
|
["path", { d: "M14 5h2a2 2 0 0 1 0 4h-.68", key: "8f95yk" }],
|
||||||
|
["path", { d: "M18 22H6", key: "mg6kv4" }],
|
||||||
|
["path", { d: "M9 2h6", key: "1jrp98" }]
|
||||||
|
]);
|
||||||
|
|
||||||
|
export { Amphora as default };
|
||||||
|
//# sourceMappingURL=amphora.js.map
|
||||||
1
frontend/node_modules/lucide-react/dist/esm/icons/amphora.js.map
generated
vendored
Normal file
1
frontend/node_modules/lucide-react/dist/esm/icons/amphora.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"amphora.js","sources":["../../../src/icons/amphora.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Amphora\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/amphora\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Amphora = createLucideIcon('Amphora', [\n [\n 'path',\n { d: 'M10 2v5.632c0 .424-.272.795-.653.982A6 6 0 0 0 6 14c.006 4 3 7 5 8', key: '1h8rid' },\n ],\n ['path', { d: 'M10 5H8a2 2 0 0 0 0 4h.68', key: '3ezsi6' }],\n ['path', { d: 'M14 2v5.632c0 .424.272.795.652.982A6 6 0 0 1 18 14c0 4-3 7-5 8', key: 'yt6q09' }],\n ['path', { d: 'M14 5h2a2 2 0 0 1 0 4h-.68', key: '8f95yk' }],\n ['path', { d: 'M18 22H6', key: 'mg6kv4' }],\n ['path', { d: 'M9 2h6', key: '1jrp98' }],\n]);\n\nexport default Amphora;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,iBAAiB,SAAW,CAAA,CAAA,CAAA;AAAA,CAC1C,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA,CACE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,CACA,CAAA,CAAA,CAAA,CAAA,CAAE,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAsE,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,QAAS,CAAA,CAAA;AAAA,CAC3F,CAAA,CAAA,CAAA;AAAA,CAAA,CACA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA6B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1D,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAkE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC/F,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA8B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC3D,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AACzC,CAAC,CAAA,CAAA;;"}
|
||||||
8
frontend/node_modules/lucide-react/dist/esm/icons/anchor.js
generated
vendored
8
frontend/node_modules/lucide-react/dist/esm/icons/anchor.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
import createLucideIcon from '../createLucideIcon.js';
|
import createLucideIcon from '../createLucideIcon.js';
|
||||||
|
|
||||||
const Anchor = createLucideIcon("Anchor", [
|
const Anchor = createLucideIcon("Anchor", [
|
||||||
["circle", { cx: "12", cy: "5", r: "3", key: "rqqgnr" }],
|
["path", { d: "M12 22V8", key: "qkxhtm" }],
|
||||||
["line", { x1: "12", x2: "12", y1: "22", y2: "8", key: "abakz7" }],
|
["path", { d: "M5 12H2a10 10 0 0 0 20 0h-3", key: "1hv3nh" }],
|
||||||
["path", { d: "M5 12H2a10 10 0 0 0 20 0h-3", key: "1hv3nh" }]
|
["circle", { cx: "12", cy: "5", r: "3", key: "rqqgnr" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { Anchor as default };
|
export { Anchor as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/anchor.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/anchor.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"anchor.js","sources":["../../../src/icons/anchor.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Anchor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/anchor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Anchor = createLucideIcon('Anchor', [\n ['circle', { cx: '12', cy: '5', r: '3', key: 'rqqgnr' }],\n ['line', { x1: '12', x2: '12', y1: '22', y2: '8', key: 'abakz7' }],\n ['path', { d: 'M5 12H2a10 10 0 0 0 20 0h-3', key: '1hv3nh' }],\n]);\n\nexport default Anchor;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,iBAAiB,QAAU,CAAA,CAAA,CAAA;AAAA,CACxC,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,GAAA,CAAK,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CACvD,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAE,CAAA,CAAA,CAAA,EAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAI,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAI,CAAA,CAAA,CAAA,CAAK,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACjE,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA+B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC9D,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"anchor.js","sources":["../../../src/icons/anchor.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Anchor\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/anchor\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Anchor = createLucideIcon('Anchor', [\n ['path', { d: 'M12 22V8', key: 'qkxhtm' }],\n ['path', { d: 'M5 12H2a10 10 0 0 0 20 0h-3', key: '1hv3nh' }],\n ['circle', { cx: '12', cy: '5', r: '3', key: 'rqqgnr' }],\n]);\n\nexport default Anchor;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,iBAAiB,QAAU,CAAA,CAAA,CAAA;AAAA,CAAA,CACxC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACzC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA+B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAC5D,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,GAAA,CAAK,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA;AACzD,CAAC,CAAA,CAAA;;"}
|
||||||
6
frontend/node_modules/lucide-react/dist/esm/icons/angry.js
generated
vendored
6
frontend/node_modules/lucide-react/dist/esm/icons/angry.js
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* @license lucide-react v0.294.0 - ISC
|
* @license lucide-react v0.453.0 - ISC
|
||||||
*
|
*
|
||||||
* This source code is licensed under the ISC license.
|
* This source code is licensed under the ISC license.
|
||||||
* See the LICENSE file in the root directory of this source tree.
|
* See the LICENSE file in the root directory of this source tree.
|
||||||
@@ -12,8 +12,8 @@ const Angry = createLucideIcon("Angry", [
|
|||||||
["path", { d: "M16 16s-1.5-2-4-2-4 2-4 2", key: "epbg0q" }],
|
["path", { d: "M16 16s-1.5-2-4-2-4 2-4 2", key: "epbg0q" }],
|
||||||
["path", { d: "M7.5 8 10 9", key: "olxxln" }],
|
["path", { d: "M7.5 8 10 9", key: "olxxln" }],
|
||||||
["path", { d: "m14 9 2.5-1", key: "1j6cij" }],
|
["path", { d: "m14 9 2.5-1", key: "1j6cij" }],
|
||||||
["path", { d: "M9 10h0", key: "1vxvly" }],
|
["path", { d: "M9 10h.01", key: "qbtxuw" }],
|
||||||
["path", { d: "M15 10h0", key: "1j6oav" }]
|
["path", { d: "M15 10h.01", key: "1qmjsl" }]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
export { Angry as default };
|
export { Angry as default };
|
||||||
|
|||||||
2
frontend/node_modules/lucide-react/dist/esm/icons/angry.js.map
generated
vendored
2
frontend/node_modules/lucide-react/dist/esm/icons/angry.js.map
generated
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"angry.js","sources":["../../../src/icons/angry.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Angry\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/angry\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Angry = createLucideIcon('Angry', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M16 16s-1.5-2-4-2-4 2-4 2', key: 'epbg0q' }],\n ['path', { d: 'M7.5 8 10 9', key: 'olxxln' }],\n ['path', { d: 'm14 9 2.5-1', key: '1j6cij' }],\n ['path', { d: 'M9 10h0', key: '1vxvly' }],\n ['path', { d: 'M15 10h0', key: '1j6oav' }],\n]);\n\nexport default Angry;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,iBAAiB,OAAS,CAAA,CAAA,CAAA;AAAA,CACtC,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CAAA,CACzD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA6B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1D,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC5C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC5C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAW,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CACxC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC3C,CAAC,CAAA,CAAA;;"}
|
{"version":3,"file":"angry.js","sources":["../../../src/icons/angry.ts"],"sourcesContent":["import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Angry\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview  - https://lucide.dev/icons/angry\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Angry = createLucideIcon('Angry', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M16 16s-1.5-2-4-2-4 2-4 2', key: 'epbg0q' }],\n ['path', { d: 'M7.5 8 10 9', key: 'olxxln' }],\n ['path', { d: 'm14 9 2.5-1', key: '1j6cij' }],\n ['path', { d: 'M9 10h.01', key: 'qbtxuw' }],\n ['path', { d: 'M15 10h.01', key: '1qmjsl' }],\n]);\n\nexport default Angry;\n"],"names":[],"mappings":";;;;;;;;;AAaM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,iBAAiB,OAAS,CAAA,CAAA,CAAA;AAAA,CACtC,CAAA,CAAC,QAAU,CAAA,CAAA,CAAA,CAAE,EAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAM,CAAI,CAAA,CAAA,CAAA,IAAA,CAAM,CAAA,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAU,CAAA,CAAA;AAAA,CAAA,CACzD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAA6B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1D,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC5C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC5C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,CAAA;AAAA,CAAA,CAC1C,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,CAAA,CAAE,GAAG,CAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA;AAC7C,CAAC,CAAA,CAAA;;"}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user