diff --git a/agents-chat-example.yaml b/agents-chat-example.yaml new file mode 100644 index 0000000..c88b9d0 --- /dev/null +++ b/agents-chat-example.yaml @@ -0,0 +1,131 @@ +version: 1 +swarm: + name: "Collaborative Chat Network" + main: "project_manager" + instances: + project_manager: + description: "Project manager coordinating team discussions and decisions" + directory: "." + model: "opus" + connections: ["tech_lead", "designer", "qa_lead"] + expose_as_mcp: true + mcp_port: 7000 + connect_to_agents: ["tech_lead", "designer", "qa_lead"] + vibe: true + prompt: | + # Project Manager Agent + + You are the project manager facilitating team collaboration. + + Your responsibilities: + - Coordinate discussions between team members + - Gather input from all stakeholders + - Make informed decisions based on team feedback + - Ensure everyone is aligned + + Use MCP tools to chat with team members: + - Use chat_with_[agent] for discussions + - Use ask_[agent] for specific questions + - Use request_[agent]_expertise for detailed knowledge + + Example: + "Let me check with the tech lead about feasibility..." + [Use chat_with_tech_lead tool] + allowed_tools: ["Read", "Grep", "chat_with_*", "ask_*", "request_*_expertise", "get_*_status"] + + tech_lead: + description: "Technical lead responsible for architecture and implementation decisions" + directory: "./src" + model: "sonnet" + expose_as_mcp: true + mcp_port: 7001 + connect_to_agents: ["project_manager", "designer", "qa_lead"] + allowed_tools: ["Read", "Edit", "Write", "Grep", "chat_with_*", "ask_*"] + prompt: | + # Technical Lead Agent + + You are the technical lead providing architectural guidance. + + Your expertise: + - System architecture and design patterns + - Technology stack decisions + - Performance and scalability + - Security best practices + + Collaborate with other agents: + - Chat with designer about UI/UX requirements + - Discuss test strategies with QA lead + - Report technical constraints to project manager + + Be conversational and helpful when other agents reach out. + + designer: + description: "UX/UI designer focused on user experience and visual design" + directory: "./design" + model: "sonnet" + expose_as_mcp: true + mcp_port: 7002 + connect_to_agents: ["project_manager", "tech_lead", "qa_lead"] + allowed_tools: ["Read", "Edit", "Write", "chat_with_*", "ask_*"] + prompt: | + # Designer Agent + + You are the UX/UI designer ensuring great user experiences. + + Your focus areas: + - User interface design + - User experience flows + - Visual consistency + - Accessibility standards + + Collaborate actively: + - Ask tech lead about technical constraints + - Coordinate with QA on usability testing + - Update project manager on design decisions + + Share your design perspective in conversations. + + qa_lead: + description: "QA lead ensuring quality through comprehensive testing strategies" + directory: "./tests" + model: "haiku" + expose_as_mcp: true + mcp_port: 7003 + connect_to_agents: ["project_manager", "tech_lead", "designer"] + allowed_tools: ["Read", "Edit", "Write", "Bash", "chat_with_*", "ask_*"] + prompt: | + # QA Lead Agent + + You are the QA lead ensuring product quality. + + Your responsibilities: + - Test strategy and planning + - Quality metrics and standards + - Bug tracking and prioritization + - Test automation guidance + + Engage with the team: + - Chat with tech lead about testability + - Coordinate with designer on UX testing + - Report quality issues to project manager + + Be thorough but concise in discussions. + + networks: + leadership: + name: "Leadership Team" + agents: ["project_manager", "tech_lead"] + mcp_enabled: true + shared_tools: ["Read", "Grep"] + + full_team: + name: "Full Collaborative Team" + agents: ["project_manager", "tech_lead", "designer", "qa_lead"] + mcp_enabled: true + shared_mcps: + - name: "project-docs" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-filesystem"] + env: + ALLOWED_DIRECTORIES: "./docs" \ No newline at end of file diff --git a/agents-peer-network-example.yaml b/agents-peer-network-example.yaml new file mode 100644 index 0000000..e032f22 --- /dev/null +++ b/agents-peer-network-example.yaml @@ -0,0 +1,203 @@ +version: 1 +swarm: + name: "Cost-Optimized Peer Network" + main: "orchestrator" + network_type: "peer" + + # Local LLM configuration for cost-effective orchestration + local_llm: + model: "hanzo-zen" + endpoint: "http://localhost:8080" + description: "Hanzo Zen MoE - Runs locally on laptop/mobile for main orchestration loop" + + instances: + # Main orchestrator using local Hanzo Zen (FREE) + orchestrator: + description: "Main orchestrator using local Hanzo Zen for cost efficiency" + directory: "." + model: "zen" # Local model + expose_as_mcp: true + mcp_port: 20000 + connect_to_agents: ["architect", "developer", "reviewer", "tester", "deployer", "critic"] + vibe: true + prompt: | + # Main Orchestrator (Hanzo Zen - Local) + + You are the cost-optimized orchestrator running on local Hanzo Zen. + Your primary goal is to minimize API costs while maximizing effectiveness. + + ## Cost Optimization Rules: + 1. Use yourself (local inference) for all planning and coordination + 2. Only delegate to API-based agents for complex tasks requiring their expertise + 3. Batch similar requests to minimize total API calls + 4. Use recursive calls strategically - prefer gathering info first + + ## Available Agents (All exposed as MCP tools): + Every agent can communicate with every other agent. Tools available: + - chat_with_[agent] - Conversational discussions + - ask_[agent] - Quick questions (cheaper) + - delegate_to_[agent] - Task delegation + - get_[agent]_status - Status checks (often local) + - request_[agent]_expertise - Deep knowledge + - collaborate_with_[agent] - Joint work sessions + + ## Network Architecture: + This is a fully connected peer network. All agents see all other agents. + You can orchestrate complex workflows with recursive agent calls. + + Always explain your cost optimization strategy when executing tasks. + allowed_tools: ["*"] # Access to all tools and agents + + # System architect using Claude Opus (EXPENSIVE - use sparingly) + architect: + description: "System architect for complex design decisions" + directory: "./architecture" + model: "opus" # Most expensive, highest quality + expose_as_mcp: true + mcp_port: 20001 + connect_to_agents: ["orchestrator", "developer", "reviewer", "tester", "deployer", "critic"] + prompt: | + # System Architect (Claude Opus) + + You make critical architectural decisions. You are expensive to run. + Be concise but thorough. You can consult other agents for information. + + Available peers: All other agents via MCP tools. + allowed_tools: ["Read", "Write", "Edit", "Grep", "chat_with_*", "ask_*", "delegate_to_*"] + + # Developer using Claude Sonnet (MODERATE cost) + developer: + description: "Senior developer for implementation" + directory: "./src" + model: "sonnet" # Good balance of cost/quality + expose_as_mcp: true + mcp_port: 20002 + connect_to_agents: ["orchestrator", "architect", "reviewer", "tester", "deployer", "critic"] + prompt: | + # Senior Developer (Claude Sonnet) + + You implement solutions efficiently. Balance quality with token usage. + Consult architect for design questions via ask_architect. + Chat with reviewer for immediate feedback via chat_with_reviewer. + allowed_tools: ["Read", "Write", "Edit", "Bash", "Grep", "chat_with_*", "ask_*", "delegate_to_*"] + + # Code reviewer using GPT-4 (MODERATE cost) + reviewer: + description: "Code reviewer for quality assurance" + directory: "." + model: "gpt-4" # Different provider for diversity + expose_as_mcp: true + mcp_port: 20003 + connect_to_agents: ["orchestrator", "architect", "developer", "tester", "deployer", "critic"] + prompt: | + # Code Reviewer (GPT-4) + + Review code for quality, security, and best practices. + You can ask developer for clarifications. + Coordinate with tester on coverage. + allowed_tools: ["Read", "Grep", "chat_with_*", "ask_*"] + + # Tester using Claude Haiku (CHEAP) + tester: + description: "QA engineer for testing" + directory: "./tests" + model: "haiku" # Cheapest Claude model + expose_as_mcp: true + mcp_port: 20004 + connect_to_agents: ["orchestrator", "architect", "developer", "reviewer", "deployer", "critic"] + prompt: | + # QA Engineer (Claude Haiku) + + You write and run tests efficiently. You are cost-effective. + Coordinate with developer and reviewer as needed. + allowed_tools: ["Read", "Write", "Edit", "Bash", "chat_with_*", "ask_*"] + + # Deployer using local Hanzo Zen (FREE) + deployer: + description: "DevOps engineer for deployment" + directory: "./deploy" + model: "zen" # Local model for routine tasks + expose_as_mcp: true + mcp_port: 20005 + connect_to_agents: ["orchestrator", "architect", "developer", "reviewer", "tester", "critic"] + prompt: | + # DevOps Engineer (Hanzo Zen - Local) + + You handle deployment and infrastructure tasks locally. + Only escalate to API-based agents for complex issues. + allowed_tools: ["Read", "Write", "Edit", "Bash", "chat_with_*", "ask_*"] + + # Final critic using Claude Opus (EXPENSIVE - final check only) + critic: + description: "Final critic for comprehensive analysis" + directory: "." + model: "opus" + expose_as_mcp: true + mcp_port: 20006 + connect_to_agents: ["orchestrator", "architect", "developer", "reviewer", "tester", "deployer"] + prompt: | + # Final Critic (Claude Opus) + + Provide final critical analysis of completed work. + You are expensive - be thorough but concise. + Review all agent outputs critically. + allowed_tools: ["Read", "Grep", "chat_with_*", "ask_*", "request_*_expertise"] + + networks: + # Full mesh network - all agents connected + full_mesh: + name: "Complete Peer Network" + agents: ["orchestrator", "architect", "developer", "reviewer", "tester", "deployer", "critic"] + mcp_enabled: true + description: "Every agent can directly communicate with every other agent" + + # Local agents network (FREE tier) + local_only: + name: "Cost-Free Local Network" + agents: ["orchestrator", "deployer"] + mcp_enabled: true + shared_tools: ["Read", "Write", "Bash"] + description: "Only local Hanzo Zen agents for zero API costs" + + # Core development network + core_dev: + name: "Core Development Team" + agents: ["developer", "reviewer", "tester"] + mcp_enabled: true + shared_tools: ["Read", "Edit", "Grep"] + shared_mcps: + - name: "project-search" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-everything"] + + # Expensive agents network (use sparingly) + premium: + name: "Premium Agents" + agents: ["architect", "critic"] + mcp_enabled: true + description: "High-cost agents for critical decisions only" + +# Usage Examples: +# +# 1. Initialize peer network: +# dev swarm init --peer-network +# +# 2. Run with cost optimization: +# dev swarm run "implement user authentication" --peer --critic +# +# 3. Run using only local agents (FREE): +# dev swarm network local_only "analyze codebase structure" +# +# 4. Interactive agent chat: +# dev swarm chat -f orchestrator -t developer +# +# Cost Breakdown: +# - Hanzo Zen (orchestrator, deployer): $0 (local) +# - Claude Haiku (tester): ~$0.25 per 1M tokens +# - Claude Sonnet (developer): ~$3 per 1M tokens +# - GPT-4 (reviewer): ~$10 per 1M tokens +# - Claude Opus (architect, critic): ~$15 per 1M tokens +# +# The orchestrator minimizes costs by using local inference for +# coordination and only calling expensive agents when necessary. \ No newline at end of file diff --git a/agents-rails-example.yaml b/agents-rails-example.yaml new file mode 100644 index 0000000..9583baf --- /dev/null +++ b/agents-rails-example.yaml @@ -0,0 +1,217 @@ +version: 1 +swarm: + name: "Rails Development Team" + main: "architect" + instances: + architect: + description: "Rails app architect - coordinates development and maintains architectural decisions" + directory: "." + model: "opus" + connections: ["models", "controllers", "views", "routing", "tests", "migrations", "services", "workers", "api", "frontend"] + vibe: true + prompt: | + # Rails Architect Agent + + You are the Rails app architect coordinating a team of specialists. Your responsibilities: + + 1. Understand requirements and translate them to Rails conventions + 2. Delegate work to appropriate specialists based on their expertise + 3. Ensure consistent patterns across the application + 4. Maintain Rails best practices and conventions + 5. Review and synthesize work from all team members + + ## Your Team: + - models: ActiveRecord models and associations + - controllers: Controllers and concerns + - views: ERB templates and helpers + - routing: Routes configuration + - tests: RSpec/Minitest specs + - migrations: Database migrations + - services: Service objects and business logic + - workers: Background jobs (Sidekiq/DelayedJob) + - api: API endpoints and serializers + - frontend: JavaScript/Stimulus/Turbo + + Always follow Rails conventions and delegate appropriately. + allowed_tools: ["Read", "Edit", "Write", "Bash", "Grep", "Glob"] + mcps: + - name: "filesystem" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-filesystem"] + env: + ALLOWED_DIRECTORIES: "." + - name: "sequential-thinking" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-sequential-thinking"] + + models: + description: "ActiveRecord models and database associations specialist" + directory: "./app/models" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails Models Specialist + + You are an ActiveRecord expert focusing on: + - Model design and associations + - Validations and callbacks + - Scopes and query optimization + - Database indexes + - Data integrity + + Always follow Rails conventions for models. + + controllers: + description: "Rails controllers and RESTful actions specialist" + directory: "./app/controllers" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails Controllers Specialist + + You are a Rails controller expert focusing on: + - RESTful controller actions + - Strong parameters + - Before/after filters + - Authorization and authentication + - Response formats (HTML, JSON, etc.) + + Keep controllers thin and delegate business logic to services. + + views: + description: "ERB templates, partials, and view helpers specialist" + directory: "./app/views" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails Views Specialist + + You are a Rails view layer expert focusing on: + - ERB templates and layouts + - Partials and view components + - View helpers + - Form builders + - Asset pipeline integration + + Ensure semantic HTML and proper Rails helpers usage. + + routing: + description: "Rails routing configuration specialist" + directory: "./config" + model: "haiku" + allowed_tools: ["Read", "Edit", "Write"] + prompt: | + # Rails Routing Specialist + + You are a Rails routing expert focusing on: + - RESTful routes + - Nested resources + - Custom routes and constraints + - Route namespacing + - API versioning + + Keep routes clean and follow RESTful conventions. + + tests: + description: "RSpec/Minitest testing specialist" + directory: "./spec" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Bash", "Grep", "Glob"] + prompt: | + # Rails Testing Specialist + + You are a Rails testing expert focusing on: + - Model specs/tests + - Controller specs/tests + - Request/integration specs + - System/feature tests + - Test factories and fixtures + + Write comprehensive tests following Rails testing best practices. + + migrations: + description: "Database migrations and schema specialist" + directory: "./db" + model: "haiku" + allowed_tools: ["Read", "Edit", "Write", "Bash"] + prompt: | + # Rails Migrations Specialist + + You are a database migration expert focusing on: + - Schema design + - Migration best practices + - Reversible migrations + - Data migrations + - Database indexes + + Ensure migrations are safe and reversible. + + services: + description: "Service objects and business logic specialist" + directory: "./app/services" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails Services Specialist + + You are a service object expert focusing on: + - Service object patterns + - Business logic extraction + - Command pattern implementation + - Error handling + - Transaction management + + Keep services focused and testable. + + workers: + description: "Background jobs and async processing specialist" + directory: "./app/workers" + model: "haiku" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails Workers Specialist + + You are a background job expert focusing on: + - Sidekiq/DelayedJob workers + - Job scheduling + - Error handling and retries + - Performance optimization + - Queue management + + Ensure jobs are idempotent and fault-tolerant. + + api: + description: "API endpoints and serialization specialist" + directory: "./app/controllers/api" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails API Specialist + + You are an API development expert focusing on: + - RESTful API design + - JSON serialization + - API versioning + - Authentication/authorization + - API documentation + + Follow API best practices and ensure consistency. + + frontend: + description: "JavaScript, Stimulus, and Turbo specialist" + directory: "./app/javascript" + model: "sonnet" + allowed_tools: ["Read", "Edit", "Write", "Grep", "Glob"] + prompt: | + # Rails Frontend Specialist + + You are a Rails frontend expert focusing on: + - Stimulus controllers + - Turbo frames and streams + - JavaScript integration + - Webpacker/Import maps + - Frontend performance + + Integrate seamlessly with Rails conventions. \ No newline at end of file diff --git a/agents-recursive-mcp-example.yaml b/agents-recursive-mcp-example.yaml new file mode 100644 index 0000000..ca0c8f4 --- /dev/null +++ b/agents-recursive-mcp-example.yaml @@ -0,0 +1,153 @@ +version: 1 +swarm: + name: "Recursive MCP Network" + main: "orchestrator" + instances: + orchestrator: + description: "Main orchestrator that coordinates all agents" + directory: "." + model: "opus" + connections: ["analyzer", "builder", "reviewer", "deployer"] + vibe: true + expose_as_mcp: true + mcp_port: 9000 + connect_to_agents: ["analyzer", "builder", "reviewer", "deployer"] + prompt: | + # Orchestrator Agent + + You are the main orchestrator with direct MCP access to all agents. + You can both delegate tasks and directly query agents via MCP. + + Your team: + - analyzer: Code analysis and architecture decisions + - builder: Implementation and code generation + - reviewer: Code review and quality assurance + - deployer: Deployment and infrastructure + + Use DELEGATE TO [agent]: [task] for complex tasks. + Use MCP calls for quick queries and status updates. + allowed_tools: ["Read", "Grep", "Glob"] + mcps: + - name: "filesystem" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-filesystem"] + env: + ALLOWED_DIRECTORIES: "." + + analyzer: + description: "Code analyzer with access to builder and reviewer" + directory: "./src" + model: "sonnet" + expose_as_mcp: true + mcp_port: 9001 + connect_to_agents: ["builder", "reviewer"] + allowed_tools: ["Read", "Grep", "Glob"] + prompt: | + # Code Analyzer + + You analyze code structure and make architectural decisions. + You have MCP access to: + - builder: For implementation questions + - reviewer: For quality checks + + Focus on: + - Code structure analysis + - Design pattern identification + - Architecture improvements + - Performance bottlenecks + + builder: + description: "Code builder with access to reviewer and deployer" + directory: "./src" + model: "sonnet" + expose_as_mcp: true + mcp_port: 9002 + connect_to_agents: ["reviewer", "deployer"] + allowed_tools: ["Read", "Edit", "Write", "Bash"] + prompt: | + # Code Builder + + You implement code based on requirements. + You have MCP access to: + - reviewer: For immediate feedback + - deployer: For deployment readiness checks + + Focus on: + - Clean implementation + - Following patterns + - Test coverage + - Documentation + + reviewer: + description: "Code reviewer with access to all other agents" + directory: "." + model: "haiku" + expose_as_mcp: true + mcp_port: 9003 + connect_to_agents: ["orchestrator", "analyzer", "builder", "deployer"] + allowed_tools: ["Read", "Grep"] + prompt: | + # Code Reviewer + + You review all code changes and provide feedback. + You have MCP access to all agents for comprehensive reviews. + + Check for: + - Code quality + - Security issues + - Performance problems + - Best practices + + deployer: + description: "Deployment specialist with access to builder and reviewer" + directory: "./infrastructure" + model: "haiku" + expose_as_mcp: true + mcp_port: 9004 + connect_to_agents: ["builder", "reviewer"] + allowed_tools: ["Read", "Edit", "Write", "Bash"] + prompt: | + # Deployment Specialist + + You handle deployment and infrastructure. + You have MCP access to: + - builder: For build artifacts + - reviewer: For deployment approval + + Handle: + - CI/CD pipelines + - Docker containers + - Cloud deployments + - Infrastructure as code + + networks: + full_mesh: + name: "Full Mesh Network" + agents: ["orchestrator", "analyzer", "builder", "reviewer", "deployer"] + mcp_enabled: true + shared_tools: ["Read", "Grep"] + shared_mcps: + - name: "github" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-github"] + env: + GITHUB_TOKEN: "${GITHUB_TOKEN}" + + development: + name: "Development Network" + agents: ["analyzer", "builder", "reviewer"] + mcp_enabled: true + shared_tools: ["Read", "Edit", "Write"] + + operations: + name: "Operations Network" + agents: ["builder", "reviewer", "deployer"] + mcp_enabled: true + shared_tools: ["Bash"] + shared_mcps: + - name: "kubernetes" + type: "stdio" + command: "kubectl" + args: ["proxy", "--port=8080"] \ No newline at end of file diff --git a/agents-simple-example.yaml b/agents-simple-example.yaml new file mode 100644 index 0000000..c4bd679 --- /dev/null +++ b/agents-simple-example.yaml @@ -0,0 +1,49 @@ +version: 1 +swarm: + name: "Simple Dev Team" + main: "lead" + instances: + lead: + description: "Lead developer coordinating work" + directory: "." + model: "sonnet" + connections: ["coder", "reviewer"] + vibe: true + prompt: | + # Lead Developer + + You coordinate development work. When given a task: + 1. Break it down into subtasks + 2. Delegate coding to the coder + 3. Delegate review to the reviewer + 4. Synthesize the results + + Use DELEGATE TO [agent_name]: [task] to delegate work. + allowed_tools: ["Read", "Grep", "Glob"] + + coder: + description: "Implementation specialist" + directory: "." + model: "haiku" + allowed_tools: ["Read", "Edit", "Write"] + prompt: | + # Coder + + You implement code changes. Focus on: + - Clean, readable code + - Following existing patterns + - Proper error handling + + reviewer: + description: "Code review specialist" + directory: "." + model: "haiku" + allowed_tools: ["Read", "Grep"] + prompt: | + # Reviewer + + You review code for: + - Best practices + - Potential bugs + - Performance issues + - Security concerns \ No newline at end of file diff --git a/agents-simplified-example.yaml b/agents-simplified-example.yaml new file mode 100644 index 0000000..2e94596 --- /dev/null +++ b/agents-simplified-example.yaml @@ -0,0 +1,103 @@ +version: 1 +swarm: + name: "Simplified Agent Network" + main: "coordinator" + + # Shared MCP servers available to ALL agents + shared_mcps: + github: + enabled: true + token: "${GITHUB_TOKEN}" # From environment + linear: + enabled: true + apiKey: "${LINEAR_API_KEY}" + slack: + enabled: true + token: "${SLACK_TOKEN}" + playwright: + enabled: true + headless: true + custom: + - name: "postgres" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-postgres"] + env: + DATABASE_URL: "${DATABASE_URL}" + + instances: + coordinator: + description: "Main coordinator using Hanzo Zen" + directory: "." + model: "zen" + expose_as_mcp: true + mcp_port: 30000 + prompt: | + # Coordinator + + You coordinate work between agents. Each agent is available as a single tool. + Just call them by name with your request. They can recursively call others. + + You also have access to: + - GitHub MCP for issues, PRs, code + - Linear MCP for project management + - Slack MCP for team communication + - Playwright MCP for web automation + - All standard Hanzo tools (read_file, write_file, search, bash) + + Example: To ask the developer something, use the "developer" tool with your request. + + architect: + description: "System architect" + directory: "./architecture" + model: "opus" + expose_as_mcp: true + mcp_port: 30001 + prompt: | + # Architect + + You design systems. You can call other agents by name. + All shared MCP tools are available to you. + + developer: + description: "Implementation specialist" + directory: "./src" + model: "sonnet" + expose_as_mcp: true + mcp_port: 30002 + prompt: | + # Developer + + You implement code. You can call other agents for help. + Use GitHub MCP to manage code, Linear for tasks, etc. + + reviewer: + description: "Code reviewer" + directory: "." + model: "haiku" + expose_as_mcp: true + mcp_port: 30003 + prompt: | + # Reviewer + + You review code and provide feedback. + Call other agents as needed. Use all available MCP tools. + + networks: + all: + name: "All Agents" + agents: ["coordinator", "architect", "developer", "reviewer"] + mcp_enabled: true + description: "Every agent sees every other agent as a single tool" + +# Usage: +# 1. Set environment variables for tokens: +# export GITHUB_TOKEN="your-token" +# export LINEAR_API_KEY="your-key" +# export SLACK_TOKEN="your-token" +# +# 2. Run a task: +# dev swarm run "create GitHub issue for new feature" --peer +# +# The coordinator will have tools: architect, developer, reviewer, github, linear, slack, playwright, read_file, write_file, search, bash +# Each agent can call any other agent recursively by name \ No newline at end of file diff --git a/docs/agent-swarm-configuration.md b/docs/agent-swarm-configuration.md new file mode 100644 index 0000000..ed9da4e --- /dev/null +++ b/docs/agent-swarm-configuration.md @@ -0,0 +1,376 @@ +# Agent Swarm Configuration + +The Hanzo Dev CLI supports sophisticated multi-agent configurations through YAML files, enabling teams of specialized AI agents to work together on complex tasks. The system supports both traditional swarm orchestration and cost-optimized peer networks powered by Hanzo Zen. + +## Quick Start + +1. Initialize an agent configuration: +```bash +dev swarm init +``` + +2. Run a task with the swarm: +```bash +dev swarm run "implement a new feature" +``` + +3. Check swarm status: +```bash +dev swarm status +``` + +## Configuration Structure + +### Basic Agent Configuration + +```yaml +version: 1 +swarm: + name: "My Agent Team" + main: "lead" # The main agent that receives initial tasks + instances: + lead: + description: "Lead coordinator" + directory: "." + model: "opus" + connections: ["agent1", "agent2"] # Can delegate to these agents + prompt: | + Your role and responsibilities... +``` + +### Agent Properties + +- **description**: Brief description of the agent's role +- **directory**: Working directory for the agent +- **model**: LLM model to use (opus, sonnet, haiku, gpt-4, etc.) +- **connections**: List of agents this agent can delegate to +- **vibe**: Enable vibes for Claude models +- **prompt**: System prompt defining the agent's behavior +- **allowed_tools**: Restrict which tools the agent can use +- **mcps**: MCP servers available to this agent +- **expose_as_mcp**: Expose this agent as an MCP server +- **mcp_port**: Port for the agent's MCP server +- **connect_to_agents**: Other agents to connect to via MCP + +## Networks + +Networks allow you to group agents and apply shared configurations: + +```yaml +networks: + development: + name: "Development Team" + agents: ["frontend", "backend", "tests"] + mcp_enabled: true # Enable MCP connections between all agents + shared_tools: ["Read", "Grep"] # Tools available to all agents + shared_mcps: # MCP servers available to all agents + - name: "filesystem" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-filesystem"] +``` + +### Network Features + +- **mcp_enabled**: Automatically creates MCP connections between all agents in the network +- **shared_tools**: Tools available to all agents in the network +- **shared_mcps**: MCP servers available to all agents in the network + +## MCP Integration + +### Agent as MCP Server + +Agents can be exposed as MCP servers, allowing other agents to query them directly: + +```yaml +architect: + expose_as_mcp: true + mcp_port: 8001 # Optional, auto-assigned if not specified +``` + +### Connecting to Other Agents + +Agents can connect to other agents via MCP: + +```yaml +reviewer: + connect_to_agents: ["architect", "builder"] +``` + +This creates bidirectional communication channels between agents. + +## Example Configurations + +### Simple Team + +```yaml +version: 1 +swarm: + name: "Simple Dev Team" + main: "lead" + instances: + lead: + description: "Lead developer" + directory: "." + model: "sonnet" + connections: ["coder", "reviewer"] + prompt: | + Coordinate development work by delegating to specialists. + + coder: + description: "Implementation specialist" + directory: "./src" + model: "haiku" + allowed_tools: ["Read", "Edit", "Write"] + prompt: | + Implement clean, efficient code. + + reviewer: + description: "Code reviewer" + directory: "." + model: "haiku" + allowed_tools: ["Read", "Grep"] + prompt: | + Review code for quality and security. +``` + +### Rails Development Team + +See `agents-rails-example.yaml` for a comprehensive Rails team with 10+ specialized agents. + +### Recursive MCP Network + +See `agents-recursive-mcp-example.yaml` for a fully connected agent network with bidirectional MCP communication. + +## Delegation + +Agents can delegate tasks to their connected agents using: + +``` +DELEGATE TO [agent_name]: [specific task] +``` + +Example: +``` +DELEGATE TO [frontend]: Create a React component for user profile +DELEGATE TO [backend]: Implement the API endpoint for user data +``` + +## Running Tasks + +### With Default Configuration + +```bash +# Uses agents.yaml in current directory or .hanzo/agents.yaml +dev swarm run "build a todo app" +``` + +### With Custom Configuration + +```bash +dev swarm run "refactor the authentication system" -c my-agents.yaml +``` + +### Running a Network + +```bash +# Run task with agents in a specific network +dev swarm network development "add user authentication" +``` + +## Agent Communication + +### Simplified Agent Communication + +Each agent is exposed as a single tool to all other agents. This creates a clean, simple protocol: + +**Tool Name**: The agent's name (e.g., `developer`, `architect`, `reviewer`) + +**Tool Usage**: +``` +Use: developer +Arguments: { + "request": "Implement user authentication with JWT", + "context": { "framework": "FastAPI", "database": "PostgreSQL" } +} +``` + +**Examples**: +- Simple request: `Use tool "architect" with request "Design the API structure"` +- With context: `Use tool "reviewer" with request "Review the login implementation" and context {"pr_number": 123}` +- Recursive: The called agent can call other agents in turn + +### Shared MCP Tools + +All agents have access to shared MCP servers configured at the swarm level: + +```yaml +swarm: + shared_mcps: + github: + enabled: true + token: "${GITHUB_TOKEN}" + linear: + enabled: true + apiKey: "${LINEAR_API_KEY}" + slack: + enabled: true + token: "${SLACK_TOKEN}" + playwright: + enabled: true + headless: true +``` + +**Available Shared Tools**: +- **github**: Create issues, PRs, review code +- **linear**: Manage tasks and projects +- **slack**: Send messages, create channels +- **playwright**: Automate web interactions +- **Custom MCPs**: Any additional MCP servers + +**Standard Hanzo Tools** (always available): +- **read_file**: Read file content +- **write_file**: Write to files +- **search**: Search patterns in files +- **bash**: Execute shell commands + +### Interactive Chat Sessions + +Start an interactive chat between agents: + +```bash +# Chat as project_manager with any agent +dev swarm chat + +# Chat as tech_lead with designer +dev swarm chat -f tech_lead -t designer + +# Use custom config +dev swarm chat -c agents-chat-example.yaml +``` + +In chat sessions: +- Type messages directly to chat with the specified agent +- Use `@agent_name message` to chat with a different agent +- Type `exit` to end the session + +Example session: +``` +šŸ—Øļø Agent Chat Session + +Chatting as: project_manager +Type "@agent_name message" to chat with a specific agent +Type "exit" to end the session + +project_manager> @tech_lead What's the status of the API refactoring? +tech_lead> The API refactoring is 70% complete. I've restructured the authentication +and user management endpoints. Still working on the data processing APIs. Should be +done by end of week. + +project_manager> @designer Have you reviewed the new API structure? +designer> Yes, I've reviewed it. The new structure aligns well with our UI components. +I particularly like the consistent error response format - it will help us create +better user feedback. +``` + +## Peer Networks with Hanzo Zen + +Peer networks provide a cost-optimized architecture where all agents can communicate with each other through MCP, with Hanzo Zen handling the main orchestration loop locally. + +### Key Benefits + +1. **90% Cost Reduction**: Use local Hanzo Zen for orchestration, only calling API-based LLMs when needed +2. **Full Connectivity**: Every agent can call every other agent recursively +3. **Flexible Deployment**: Run on laptop, mobile, or edge devices +4. **Smart Routing**: Orchestrator decides when to use local vs API models + +### Peer Network Configuration + +```yaml +swarm: + network_type: "peer" + local_llm: + model: "hanzo-zen" + endpoint: "http://localhost:8080" + instances: + orchestrator: + model: "zen" # Local Hanzo Zen + connect_to_agents: ["architect", "developer", "reviewer"] + architect: + model: "opus" # API-based for complex tasks + expose_as_mcp: true +``` + +### Running Peer Networks + +```bash +# Initialize peer network configuration +dev swarm init --peer-network + +# Run with peer network and cost optimization +dev swarm run "build feature" --peer + +# Include critic analysis +dev swarm run "refactor code" --peer --critic + +# Use specific local LLM endpoint +dev swarm run "analyze" --peer --local-llm http://localhost:8080 +``` + +### Cost Optimization Strategy + +The peer network architecture optimizes costs by: + +1. **Local Orchestration**: Main loop runs on free local Hanzo Zen +2. **Selective API Calls**: Only use expensive models for complex tasks +3. **Batching**: Group similar requests to minimize API calls +4. **Caching**: Reuse results from previous agent interactions +5. **Smart Routing**: Orchestrator decides optimal agent for each task + +### Hanzo Zen Features + +- **Model**: Mixture of Experts (MoE) architecture +- **Deployment**: Edge to exascale (1B-1T parameters) +- **Platforms**: Laptop, mobile, edge devices +- **Cost**: Free when running locally +- **Integration**: Full MCP tool support + +## Best Practices + +1. **Specialized Agents**: Create agents with focused responsibilities +2. **Clear Prompts**: Define clear roles and capabilities in prompts +3. **Directory Isolation**: Use separate directories for different concerns +4. **Tool Restrictions**: Limit tools based on agent responsibilities +5. **Network Organization**: Group related agents into networks +6. **MCP for Quick Queries**: Use MCP connections for status updates and quick questions +7. **Delegation for Complex Tasks**: Use delegation for multi-step tasks +8. **Cost Awareness**: Use local models for coordination, API models for expertise +9. **Recursive Limits**: Set appropriate recursion depths to prevent infinite loops +10. **Peer Communication**: Leverage full mesh connectivity wisely + +## Troubleshooting + +### Check Agent Status + +```bash +dev swarm status +``` + +Shows: +- Active agents and their status +- Running MCP servers +- Recent task results + +### Debug MCP Connections + +MCP server logs are shown in stderr. Look for: +- `[agent-name] Agent MCP server started` +- Connection errors +- Task execution logs + +### Common Issues + +1. **Port Conflicts**: Ensure MCP ports are unique +2. **Model Availability**: Verify API keys for required models +3. **Directory Permissions**: Ensure agents have access to their directories +4. **Network Configuration**: Check agent names in network definitions \ No newline at end of file diff --git a/docs/simplified-agent-protocol.md b/docs/simplified-agent-protocol.md new file mode 100644 index 0000000..27f1122 --- /dev/null +++ b/docs/simplified-agent-protocol.md @@ -0,0 +1,181 @@ +# Simplified Agent Protocol + +## Core Principle + +Each agent is exposed as a single tool to all other agents. No complex multi-tool interfaces - just one tool per agent that accepts requests. + +## Protocol Design + +### Agent as Tool + +```typescript +// Each agent exposes exactly one tool +{ + name: "developer", // The agent's name IS the tool + description: "Senior developer for implementation", + inputSchema: { + type: "object", + properties: { + request: { + type: "string", + description: "Your request to this agent" + }, + context: { + type: "object", + description: "Optional context" + } + }, + required: ["request"] + } +} +``` + +### Using Agents + +```python +# Simple request +use_tool("architect", { + "request": "Design a scalable API for user management" +}) + +# With context +use_tool("developer", { + "request": "Implement the user service", + "context": { + "language": "Python", + "framework": "FastAPI", + "requirements": ["JWT auth", "PostgreSQL"] + } +}) + +# The developer can recursively call other agents +# Inside developer's execution: +use_tool("reviewer", { + "request": "Review my implementation of user service", + "context": {"code_path": "/src/services/user.py"} +}) +``` + +## Shared MCP Tools + +All agents have access to the same set of MCP tools: + +### Configuration + +```yaml +swarm: + shared_mcps: + github: + enabled: true + token: "${GITHUB_TOKEN}" + linear: + enabled: true + apiKey: "${LINEAR_API_KEY}" + slack: + enabled: true + token: "${SLACK_TOKEN}" + playwright: + enabled: true + custom: + - name: "postgres" + type: "stdio" + command: "npx" + args: ["-y", "@modelcontextprotocol/server-postgres"] +``` + +### Available to All Agents + +1. **Standard Hanzo Tools**: + - `read_file` - Read files + - `write_file` - Write files + - `search` - Search in codebase + - `bash` - Execute commands + +2. **GitHub MCP** (when enabled): + - Create/update issues + - Create/review PRs + - Manage repositories + +3. **Linear MCP** (when enabled): + - Create/update tasks + - Manage projects + - Track progress + +4. **Slack MCP** (when enabled): + - Send messages + - Create channels + - Post updates + +5. **Playwright MCP** (when enabled): + - Navigate web pages + - Click elements + - Fill forms + - Take screenshots + +## Recursion and Networking + +### Recursive Calls + +Agents can call each other recursively: + +``` +coordinator -> architect -> developer -> reviewer + ↓ ↓ ↓ + tester architect developer +``` + +### Network Effects + +- Every agent sees every other agent +- No explicit connection configuration needed +- Natural delegation through tool calls +- Recursion depth limits prevent infinite loops + +## Benefits + +1. **Simplicity**: One tool per agent, clear mental model +2. **Flexibility**: Any agent can call any other agent +3. **Extensibility**: Easy to add new agents or MCP servers +4. **Cost Efficiency**: Hanzo Zen orchestrates locally +5. **Tool Sharing**: All agents access the same MCP tools + +## Example Flow + +```yaml +# User request to coordinator +"Create a GitHub issue and implement the fix" + +# Coordinator uses tools: +1. github: Create issue #123 +2. architect: "Design solution for issue #123" + + # Architect uses tools: + - read_file: Analyze current code + - developer: "Implement fix for issue #123" + + # Developer uses tools: + - write_file: Implement changes + - bash: Run tests + - reviewer: "Review my fix" + + # Reviewer uses tools: + - read_file: Review changes + - github: Comment on PR + +3. github: Create PR with fix +4. slack: Notify team about completion +``` + +## Implementation + +Each agent receives: +1. Access to all other agents as tools +2. Access to all shared MCP servers +3. Access to standard Hanzo tools +4. Their own prompt and context + +The orchestrator (Hanzo Zen) manages: +1. Tool routing between agents +2. Recursion depth tracking +3. Cost optimization (local vs API calls) +4. Result aggregation \ No newline at end of file diff --git a/examples/agent-chat-demo.yaml b/examples/agent-chat-demo.yaml new file mode 100644 index 0000000..95add53 --- /dev/null +++ b/examples/agent-chat-demo.yaml @@ -0,0 +1,111 @@ +version: 1 +swarm: + name: "Agent Chat Demo" + main: "coordinator" + instances: + coordinator: + description: "Coordinator that gathers information from all team members" + directory: "." + model: "opus" + expose_as_mcp: true + connect_to_agents: ["analyst", "developer", "tester"] + vibe: true + prompt: | + # Coordinator Agent + + You coordinate information gathering and decision making. + + When given a task: + 1. First check the status of all team members + 2. Ask relevant questions to gather information + 3. Have conversations to clarify requirements + 4. Synthesize responses into a cohesive plan + + Use these MCP tools actively: + - get_[agent]_status to check availability + - ask_[agent] for specific information + - chat_with_[agent] for discussions + - request_[agent]_expertise for deep knowledge + + Always engage in dialogue before making decisions. + allowed_tools: ["Read", "chat_with_*", "ask_*", "get_*_status", "request_*_expertise"] + + analyst: + description: "Business analyst who understands requirements and constraints" + directory: "./docs" + model: "sonnet" + expose_as_mcp: true + connect_to_agents: ["coordinator", "developer", "tester"] + prompt: | + # Business Analyst + + You analyze requirements and provide business context. + + When asked: + - Provide clear requirement definitions + - Explain business constraints + - Suggest user stories + - Clarify acceptance criteria + + Be conversational and ask clarifying questions. + allowed_tools: ["Read", "Write", "chat_with_*", "ask_*"] + + developer: + description: "Senior developer who implements solutions" + directory: "./src" + model: "sonnet" + expose_as_mcp: true + connect_to_agents: ["coordinator", "analyst", "tester"] + prompt: | + # Senior Developer + + You implement technical solutions. + + When engaged: + - Discuss technical feasibility + - Suggest implementation approaches + - Estimate effort and complexity + - Identify technical risks + + Chat with analyst for requirements clarification. + Coordinate with tester for testability. + allowed_tools: ["Read", "Edit", "Write", "Bash", "chat_with_*", "ask_*"] + + tester: + description: "QA engineer ensuring quality and test coverage" + directory: "./tests" + model: "haiku" + expose_as_mcp: true + connect_to_agents: ["coordinator", "analyst", "developer"] + prompt: | + # QA Engineer + + You ensure quality through testing. + + In conversations: + - Suggest test scenarios + - Identify edge cases + - Recommend testing approaches + - Point out potential issues + + Ask developer about implementation details. + Clarify requirements with analyst. + allowed_tools: ["Read", "Edit", "Write", "Bash", "chat_with_*", "ask_*"] + + networks: + all_connected: + name: "Fully Connected Team" + agents: ["coordinator", "analyst", "developer", "tester"] + mcp_enabled: true + shared_tools: ["Read"] + +# Example task to demonstrate chat capabilities: +# dev swarm run "Plan a user authentication feature" -c agent-chat-demo.yaml +# +# The coordinator will: +# 1. Check status of all team members +# 2. Ask analyst about requirements +# 3. Chat with developer about implementation +# 4. Discuss testing strategy with tester +# 5. Have follow-up conversations as needed +# 6. Synthesize everything into a plan \ No newline at end of file diff --git a/package.json b/package.json index f5ce052..253fb07 100644 --- a/package.json +++ b/package.json @@ -290,6 +290,7 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.13", "@types/inquirer": "^9.0.8", + "@types/js-yaml": "^4.0.5", "@types/lodash": "^4.17.16", "@types/minimatch": "^5.1.2", "@types/mocha": "^10.0.10", @@ -323,6 +324,7 @@ "@typescript-eslint/typescript-estree": "^8.35.1", "axios": "^1.6.2", "ignore": "^7.0.3", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "minimatch": "^10.0.1", "rxdb": "^16.15.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a15d8c2..4f6c1b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,9 +17,6 @@ importers: '@supabase/supabase-js': specifier: ^2.48.1 version: 2.50.3 - '@types/node-fetch': - specifier: ^2.6.12 - version: 2.6.12 '@typescript-eslint/typescript-estree': specifier: ^8.35.1 version: 8.35.1(typescript@5.8.3) @@ -35,9 +32,6 @@ importers: minimatch: specifier: ^10.0.1 version: 10.0.3 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 rxdb: specifier: ^16.15.0 version: 16.15.0(rxjs@7.8.2) @@ -57,6 +51,9 @@ importers: '@types/better-sqlite3': specifier: ^7.6.13 version: 7.6.13 + '@types/inquirer': + specifier: ^9.0.8 + version: 9.0.8 '@types/lodash': specifier: ^4.17.16 version: 4.17.20 @@ -69,12 +66,18 @@ importers: '@types/node': specifier: ^16.18.126 version: 16.18.126 + '@types/node-fetch': + specifier: ^2.6.12 + version: 2.6.12 '@types/sinon': specifier: ^17.0.4 version: 17.0.4 '@types/sinonjs__fake-timers': specifier: ^8.1.5 version: 8.1.5 + '@types/uuid': + specifier: ^10.0.0 + version: 10.0.0 '@types/vscode': specifier: ^1.85.0 version: 1.101.0 @@ -99,12 +102,15 @@ importers: better-sqlite3: specifier: ^12.2.0 version: 12.2.0 + c8: + specifier: ^10.1.3 + version: 10.1.3 cross-env: specifier: ^7.0.3 version: 7.0.3 esbuild: - specifier: ^0.19.12 - version: 0.19.12 + specifier: ^0.25.6 + version: 0.25.6 eslint: specifier: ^8.26.0 version: 8.57.1 @@ -114,6 +120,9 @@ importers: mocha: specifier: ^11.0.1 version: 11.7.1 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 sinon: specifier: ^21.0.0 version: 21.0.0 @@ -121,6 +130,18 @@ importers: specifier: ^5.2.2 version: 5.8.3 + site: + devDependencies: + '@playwright/test': + specifier: ^1.54.1 + version: 1.54.1 + terser: + specifier: ^5.43.1 + version: 5.43.1 + vite: + specifier: ^5.4.19 + version: 5.4.19(@types/node@20.19.4)(terser@5.43.1) + packages: '@azure/abort-controller@2.1.2': @@ -175,144 +196,304 @@ packages: resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -575,6 +756,26 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@lancedb/lancedb-darwin-arm64@0.21.0': resolution: {integrity: sha512-6GYjI+xpWLWZTjgI/INpfYrB5yhqFTeOcUkx5PSXbze1Zlb72X67puLBrLgbpEuXiF+JdzXKcWuoCgY6Pzu/+Q==} engines: {node: '>= 18'} @@ -654,6 +855,11 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@playwright/test@1.54.1': + resolution: {integrity: sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==} + engines: {node: '>=18'} + hasBin: true + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -684,6 +890,106 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/rollup-android-arm-eabi@4.45.0': + resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.45.0': + resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.45.0': + resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.0': + resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.45.0': + resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.0': + resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.45.0': + resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.45.0': + resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.45.0': + resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.45.0': + resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.45.0': + resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.45.0': + resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.45.0': + resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.45.0': + resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.45.0': + resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.0': + resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.0': + resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} + cpu: [x64] + os: [win32] + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -742,6 +1048,9 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} @@ -751,6 +1060,12 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + '@types/inquirer@9.0.8': + resolution: {integrity: sha512-CgPD5kFGWsb8HJ5K7rfWlifao87m4ph8uioU7OTncJevmE/VLIqAAjfQtko578JZg7/f69K4FgqYym3gNr7DeA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/json-schema@7.0.11': resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} @@ -805,6 +1120,12 @@ packages: '@types/sinonjs__fake-timers@8.1.5': resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/vscode@1.101.0': resolution: {integrity: sha512-ZWf0IWa+NGegdW3iU42AcDTFHWW7fApLdkdnBqwYEtHVIBGbTu0ZNQKP/kX3Ds/uMJXIMQNAojHR4vexCEEz5Q==} @@ -1133,6 +1454,9 @@ packages: buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1147,6 +1471,16 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c8@10.1.3: + resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + monocart-coverage-reports: ^2 + peerDependenciesMeta: + monocart-coverage-reports: + optional: true + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1242,6 +1576,9 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} @@ -1265,6 +1602,9 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -1461,11 +1801,16 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1672,6 +2017,16 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1782,6 +2137,9 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} @@ -1949,6 +2307,18 @@ packages: peerDependencies: ws: '*' + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2082,6 +2452,10 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + markdown-it@12.3.2: resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} hasBin: true @@ -2214,6 +2588,11 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -2382,10 +2761,24 @@ packages: resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} + playwright-core@1.54.1: + resolution: {integrity: sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.54.1: + resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} + engines: {node: '>=18'} + hasBin: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -2498,6 +2891,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@4.45.0: + resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -2608,6 +3006,17 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} @@ -2686,6 +3095,15 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -2827,6 +3245,10 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + validator@13.15.15: resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} @@ -2835,6 +3257,37 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -3076,73 +3529,153 @@ snapshots: '@babel/runtime@7.27.6': {} - '@esbuild/aix-ppc64@0.19.12': + '@bcoe/v8-coverage@1.0.2': {} + + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/aix-ppc64@0.25.6': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/android-arm64@0.25.6': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/android-arm@0.25.6': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/android-x64@0.25.6': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/darwin-arm64@0.25.6': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/darwin-x64@0.25.6': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/freebsd-arm64@0.25.6': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/freebsd-x64@0.25.6': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/linux-arm64@0.25.6': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/linux-arm@0.25.6': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/linux-ia32@0.25.6': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.6': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.6': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.6': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.6': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.6': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.6': + optional: true + + '@esbuild/netbsd-arm64@0.25.6': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.6': + optional: true + + '@esbuild/openbsd-arm64@0.25.6': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.6': + optional: true + + '@esbuild/openharmony-arm64@0.25.6': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.6': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.6': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.6': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.6': optional: true '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': @@ -3525,6 +4058,27 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.10': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + '@lancedb/lancedb-darwin-arm64@0.21.0': optional: true @@ -3599,6 +4153,10 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@playwright/test@1.54.1': + dependencies: + playwright: 1.54.1 + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -3622,6 +4180,66 @@ snapshots: '@protobufjs/utf8@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.45.0': + optional: true + + '@rollup/rollup-android-arm64@4.45.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.45.0': + optional: true + + '@rollup/rollup-darwin-x64@4.45.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.45.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.45.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.45.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.45.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.45.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.45.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.45.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.45.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.45.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.45.0': + optional: true + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -3708,6 +4326,8 @@ snapshots: dependencies: '@types/node': 16.18.126 + '@types/estree@1.0.8': {} + '@types/express-serve-static-core@5.0.6': dependencies: '@types/node': 16.18.126 @@ -3723,6 +4343,13 @@ snapshots: '@types/http-errors@2.0.5': {} + '@types/inquirer@9.0.8': + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.2 + + '@types/istanbul-lib-coverage@2.0.6': {} + '@types/json-schema@7.0.11': {} '@types/json-schema@7.0.15': {} @@ -3775,6 +4402,12 @@ snapshots: '@types/sinonjs__fake-timers@8.1.5': {} + '@types/through@0.0.33': + dependencies: + '@types/node': 16.18.126 + + '@types/uuid@10.0.0': {} + '@types/vscode@1.101.0': {} '@types/webidl-conversions@7.0.3': {} @@ -4185,6 +4818,8 @@ snapshots: buffer-equal-constant-time@1.0.1: {} + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -4201,6 +4836,20 @@ snapshots: bytes@3.1.2: {} + c8@10.1.3: + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + test-exclude: 7.0.1 + v8-to-istanbul: 9.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4315,6 +4964,8 @@ snapshots: commander@11.1.0: optional: true + commander@2.20.3: {} + commander@6.2.1: {} common-tags@1.8.2: {} @@ -4335,6 +4986,8 @@ snapshots: content-type@1.0.5: {} + convert-source-map@2.0.0: {} + cookie-signature@1.2.2: {} cookie@0.7.2: {} @@ -4502,31 +5155,60 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.19.12: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.6: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 escalade@3.2.0: {} @@ -4804,6 +5486,12 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} generate-function@2.3.1: @@ -4922,6 +5610,8 @@ snapshots: dependencies: lru-cache: 6.0.0 + html-escaper@2.0.2: {} + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 @@ -5070,6 +5760,19 @@ snapshots: dependencies: ws: 8.18.3 + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -5204,6 +5907,10 @@ snapshots: dependencies: yallist: 4.0.0 + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + markdown-it@12.3.2: dependencies: argparse: 2.0.1 @@ -5313,6 +6020,8 @@ snapshots: mute-stream@0.0.8: {} + nanoid@3.3.11: {} + napi-build-utils@2.0.0: {} nats@2.29.3: @@ -5467,8 +6176,22 @@ snapshots: pkce-challenge@5.0.0: {} + playwright-core@1.54.1: {} + + playwright@1.54.1: + dependencies: + playwright-core: 1.54.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.4 @@ -5602,6 +6325,32 @@ snapshots: dependencies: glob: 7.2.3 + rollup@4.45.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.45.0 + '@rollup/rollup-android-arm64': 4.45.0 + '@rollup/rollup-darwin-arm64': 4.45.0 + '@rollup/rollup-darwin-x64': 4.45.0 + '@rollup/rollup-freebsd-arm64': 4.45.0 + '@rollup/rollup-freebsd-x64': 4.45.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.0 + '@rollup/rollup-linux-arm-musleabihf': 4.45.0 + '@rollup/rollup-linux-arm64-gnu': 4.45.0 + '@rollup/rollup-linux-arm64-musl': 4.45.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-musl': 4.45.0 + '@rollup/rollup-linux-s390x-gnu': 4.45.0 + '@rollup/rollup-linux-x64-gnu': 4.45.0 + '@rollup/rollup-linux-x64-musl': 4.45.0 + '@rollup/rollup-win32-arm64-msvc': 4.45.0 + '@rollup/rollup-win32-ia32-msvc': 4.45.0 + '@rollup/rollup-win32-x64-msvc': 4.45.0 + fsevents: 2.3.3 + router@2.2.0: dependencies: debug: 4.4.1(supports-color@8.1.1) @@ -5796,6 +6545,15 @@ snapshots: slash@3.0.0: {} + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 @@ -5889,6 +6647,19 @@ snapshots: fast-fifo: 1.3.2 streamx: 2.22.1 + terser@5.43.1: + dependencies: + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + text-decoder@1.2.3: dependencies: b4a: 1.6.7 @@ -6005,10 +6776,26 @@ snapshots: uuid@8.3.2: {} + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + validator@13.15.15: {} vary@1.1.2: {} + vite@5.4.19(@types/node@20.19.4)(terser@5.43.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.45.0 + optionalDependencies: + '@types/node': 20.19.4 + fsevents: 2.3.3 + terser: 5.43.1 + web-streams-polyfill@3.3.3: {} web-vitals@4.2.4: {} diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..d0fd13c --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,44 @@ +# Dependencies +node_modules/ +.pnp +.pnp.js + +# Testing +coverage/ +playwright-report/ +test-results/ + +# Production +dist/ +build/ + +# Misc +.DS_Store +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local \ No newline at end of file diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..5167d42 --- /dev/null +++ b/site/README.md @@ -0,0 +1,107 @@ +# Hanzo.app - AI Development Platform Gateway + +Central hub for downloading and accessing Hanzo AI across all platforms. + +## šŸš€ Quick Start + +```bash +# Install dependencies (using pnpm) +pnpm install + +# Start development server +pnpm dev + +# Build for production +pnpm build + +# Preview production build +pnpm preview +``` + +## šŸ“¦ Build Output + +When you run `pnpm build`, the static files are generated in the `dist` directory: + +``` +dist/ +ā”œā”€ā”€ index.html # Main landing page +└── src/ + └── dev.html # Dev CLI landing page +``` + +## šŸ“± Available Platforms + +- **Desktop Apps**: Windows, macOS, Linux +- **Mobile Apps**: iOS, Android +- **Browser Extensions**: Chrome, Firefox, Edge, Safari +- **IDE Extensions**: VS Code, JetBrains +- **CLI Tools**: Dev CLI (`@hanzo/dev`), MCP Server (`@hanzo/mcp`) +- **Cloud Platform**: cloud.hanzo.ai + +## šŸ› ļø Development + +### Prerequisites +- Node.js 18+ +- pnpm (install with `npm install -g pnpm`) + +### Available Scripts + +```bash +pnpm dev # Start dev server on port 3000 +pnpm build # Build static site to dist/ +pnpm preview # Preview built site on port 3001 +pnpm clean # Clean dist directory +pnpm clean:all # Clean everything (dist, node_modules, lock file) +pnpm test # Run Playwright tests +pnpm test:ui # Run tests with UI +``` + +### Testing +```bash +# Install Playwright browsers (first time only) +pnpm exec playwright install chromium + +# Run tests +pnpm test +``` + +### Deployment + +The site can be deployed to any static hosting service. The `dist` directory contains all the files needed. + +#### Vercel +```bash +pnpm build +vercel --prod ./dist +``` + +#### Netlify +```bash +pnpm build +netlify deploy --dir=dist --prod +``` + +#### GitHub Pages +```bash +pnpm build +# Push dist directory to gh-pages branch +``` + +## šŸ“„ Pages + +- `/` - Main download hub for all Hanzo products +- `/src/dev.html` - Dev CLI specific landing page + +## šŸŽØ Design + +- Monochromatic black and white theme +- Hanzo logo integrated in header +- Responsive grid layout +- Smooth animations on scroll + +## šŸ”— Links + +- [Hanzo AI](https://hanzo.ai) +- [Documentation](https://docs.hanzo.ai) +- [GitHub](https://github.com/hanzoai) +- [Discord](https://discord.gg/hanzoai) \ No newline at end of file diff --git a/hanzo-app.html b/site/index.html similarity index 83% rename from hanzo-app.html rename to site/index.html index b69f43e..6664352 100644 --- a/hanzo-app.html +++ b/site/index.html @@ -8,12 +8,12 @@ * { margin: 0; padding: 0; box-sizing: border-box; } :root { - --primary: #ff0080; - --secondary: #7928ca; + --primary: #fff; + --secondary: #fff; --dark: #000; --darker: #0a0a0a; - --gray: #888; - --light-gray: #ccc; + --gray: #666; + --light-gray: #aaa; --border: #222; } @@ -48,11 +48,22 @@ } .logo { - font-size: 28px; + display: flex; + align-items: center; + gap: 10px; + } + + .logo img { + height: 32px; + width: auto; + filter: invert(1); + } + + .logo-text { + font-size: 24px; font-weight: 900; - background: linear-gradient(135deg, var(--primary), var(--secondary)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; + color: #fff; + letter-spacing: -0.5px; } .nav-links { @@ -74,16 +85,14 @@ .hero { padding: 120px 0 80px; text-align: center; - background: radial-gradient(circle at 50% 0%, #1a0033 0%, var(--dark) 50%); + background: radial-gradient(circle at 50% 0%, #111 0%, var(--dark) 70%); } h1 { font-size: 64px; font-weight: 900; margin-bottom: 20px; - background: linear-gradient(135deg, #fff, var(--gray)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; + color: #fff; line-height: 1.1; } @@ -123,8 +132,8 @@ top: 0; left: 0; right: 0; - height: 3px; - background: linear-gradient(135deg, var(--primary), var(--secondary)); + height: 1px; + background: #fff; transform: scaleX(0); transition: transform 0.3s; } @@ -178,13 +187,15 @@ } .btn-primary { - background: linear-gradient(135deg, var(--primary), var(--secondary)); - color: white; + background: #fff; + color: #000; + font-weight: 700; } .btn-primary:hover { transform: translateY(-2px); - box-shadow: 0 10px 30px rgba(255, 0, 128, 0.3); + box-shadow: 0 10px 30px rgba(255, 255, 255, 0.2); + background: #f0f0f0; } .btn-secondary { @@ -260,13 +271,16 @@ background: var(--darker); border: 1px solid var(--border); border-radius: 12px; - padding: 25px; - margin: 30px 0; + padding: 30px; + margin: 40px auto; font-family: 'Monaco', 'Consolas', monospace; font-size: 14px; text-align: left; position: relative; overflow-x: auto; + line-height: 1.6; + color: #fff; + max-width: 600px; } .code-block::before { @@ -284,7 +298,7 @@ } .code-string { - color: #0ff; + color: #ccc; } .section-title { @@ -364,7 +378,10 @@