diff --git a/.claude/commands/nourish.md b/.claude/commands/nourish.md new file mode 100644 index 0000000000000000000000000000000000000000..d8d22bdc70de688ff60f9c509da8a2a0b552a8c4 --- /dev/null +++ b/.claude/commands/nourish.md @@ -0,0 +1,51 @@ +# 🍃 /nourish + +Complete conversation by updating context and applying cleanup. + +## Auto-Loaded Context: + +@CLAUDE.md +@layers/structure.md +@llms.txt + +User arguments: "$ARGUMENTS" + +## Steps + +### 1. Identify Changes + +- Detect modified, added, or deleted files in conversation +- Map changes to their parent folders and components + +### 2. Update Context Chain + +Traverse upward through context tiers (see CLAUDE.md): + +- **Tier 2**: Update relevant `context.md` files to reflect current code state +- **Tier 1**: Update `layers/structure.md` if structure/commands/stack changed +- Follow all rules from CLAUDE.md, especially "No History" principle + +### 3. Apply Cleanup + +Fix obvious issues encountered: + +- Remove comments; code should be self-explanatory without comments +- Remove dead code and unused files +- Consolidate duplicate patterns +- Apply CLAUDE.md principles (simplicity, reuse, single responsibility) + +### 4. Verify + +- Context accurately reflects current state +- Project is leaner or same size as before +- No history references in code or context + +## Output + +Report conversation completion: updated context files and improvements made. + +## Guidelines + +- When updating context, don't over-specify implementation details +- If changes were internal (e.g. business logic), it may not be necessary to update context +- Context should be even shorter after updates, avoiding context rot diff --git a/.claude/commands/peel.md b/.claude/commands/peel.md new file mode 100644 index 0000000000000000000000000000000000000000..08eeab15bc01b3955ad180082b19dfa9b7bfaa49 --- /dev/null +++ b/.claude/commands/peel.md @@ -0,0 +1,35 @@ +# 🧄 /peel + +Load relevant context for the current conversation. + +## Auto-Loaded Context: + +@CLAUDE.md +@layers/structure.md +@llms.txt + +User arguments: "$ARGUMENTS" + +## Steps + +### 1. Parse Work Area + +- Analyze user request or arguments +- Determine relevant components or features +- Assess required context depth + +### 2. Load Targeted Context + +- Read relevant `context.md` files for identified areas +- Skip unrelated component contexts to minimize tokens + +### 3. Confirm Scope + +- Brief summary of loaded context +- State understanding of work focus +- Note any assumptions made + +## Guidelines + +- Load only what's needed for the current task +- Defer code reading until necessary diff --git a/.claude/commands/plant.md b/.claude/commands/plant.md new file mode 100644 index 0000000000000000000000000000000000000000..e73f2c2559010984e15a9afb895a9f28685101c9 --- /dev/null +++ b/.claude/commands/plant.md @@ -0,0 +1,40 @@ +# 🌱 /plant + +Initialize context management structure for the project. + +## Auto-Loaded Context: + +@CLAUDE.md +@layers/structure.md + +User arguments: "$ARGUMENTS" + +## Steps + +### 1. Analyze Project + +- Scan technology stack, build tools, directory structure +- Identify major components and entry points +- Understand existing patterns and conventions + +### 2. Fill Core Templates + +- Update `CLAUDE.md` with project-specific details +- Complete `layers/structure.md` with actual stack, commands, layout +- Remove template placeholders + +### 3. Create Component Context + +- Generate `context.md` files for major folders using templates +- Document purpose, scope, dependencies for each component +- Place in appropriate directories + +### 4. Validate + +- Ensure coverage of main components +- Check that context hierarchy makes sense +- Verify no placeholder text remains + +## Output + +List created/updated files by tier and any areas needing attention. diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..a6344aac8c09253b3b630fb776ae94478aa0275b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,35 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..deaca963d990e8ddb5ce15d2c6d7add1842d8d74 --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ +# Dependencies +node_modules/ +.pnp +.pnp.js + +# Build outputs +dist/ +dist-ssr/ +build/ +*.local + +# Vite +.vite/ + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Environment files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +*.env + +# IDE +.vscode/* +!.vscode/extensions.json +!.vscode/settings.json +.idea/ +*.swp +*.swo +*~ +.DS_Store + +# OS +Thumbs.db +.DS_Store + +# Testing +coverage/ +*.lcov +.nyc_output/ + +# TypeScript +*.tsbuildinfo + +# Package managers +.npm +.yarn/ +.pnpm-store/ + +# Temporary files +*.tmp +.temp/ +tmp/ + +# HuggingFace Spaces +.huggingface/ +flagged/ + +# Python (for future AI integration) +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +venv/ +ENV/ +env/ +.venv + +# Jupyter Notebooks +.ipynb_checkpoints/ + +# Bun +bun.lockb + +# LLMs +.vscode/ +.claude/settings.local.json + +# Dev Scripts +scripts/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000000000000000000000000000000000000..ea241e293e23b2ed16215fe301d0650eefac438d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,36 @@ +# AI Context - Working Agreement + + +AI-assisted game development environment using the VibeGame engine. Iterative development with Svelte UI, Monaco editor, and Smolagents for AI-driven game modifications with console feedback loops. + + +**Required**: Read [layers/structure.md](layers/structure.md) before proceeding with any task + +## Context Management System + +- **Tier 0 — global**: `CLAUDE.md` (root). Global standards and system overview +- **Tier 1 — project**: `layers/structure.md`. Project map (stack, commands, layout, entry points) +- **Tier 2 — folder context**: `context.md` in any folder; one per folder; explains purpose/structure of that folder +- **Tier 3 — implementation**: Code files (scripts) + +## Rules + +- **Priority**: Your number one priority is to manage your own context; always load appropriate context before doing anything else +- **No History**: CRITICAL - Code and context must NEVER reference their own history. Write everything as the current, final state. Never include comments like "changed from X to Y" or "previously was Z". This is a severe form of context rot +- **Simplicity**: Keep code simple, elegant, concise, and readable +- **Structure**: Keep files small and single-responsibility; separate concerns (MVC/ECS as appropriate) +- **Reuse**: Reuse before adding new code; avoid repetition +- **Comments**: Code should be self-explanatory without comments; use concise comments only when necessary +- **State**: Single source of truth; caches/derivations only +- **Data**: Favor data-driven/declarative design +- **Fail Fast**: Make bugs immediately visible rather than hiding them; favor simplicity over defensive patterns +- **Backwards Compatibility**: Unless stated otherwise, favor simplicity over backwards compatibility; the design rules above should make breaking changes easy to trace and fix + +## Security + +- **Inputs & secrets**: Validate inputs; secrets only in env; never log sensitive data +- **Auth**: Gateway auth; server-side token validation; sanitize inputs + +## Tools + +- **Context7**: Use as needed to fetch documentation diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..58ca7b7dd6e17e358c923aa45c53f28e0dbf8962 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +FROM node:20-slim + +# Install dependencies as root +RUN apt-get update && apt-get install -y \ + curl unzip \ + && rm -rf /var/lib/apt/lists/* + +# Use existing node user (UID 1000) for Hugging Face Spaces compatibility +# The node:20-slim image already has a 'node' user with UID 1000 + +# Install bun globally +RUN curl -fsSL https://bun.sh/install | BUN_INSTALL=/usr/local bash +ENV PATH="/usr/local/bin:${PATH}" + +# Set working directory with proper permissions +WORKDIR /app +RUN chown -R node:node /app + +# Switch to non-root user +USER node + +# Copy package files and install dependencies +COPY --chown=node:node package.json bun.lock* ./ +RUN bun install + +# Copy application files +COPY --chown=node:node . . + +# Create writable directory for Vite temp files + +RUN mkdir -p /app/.vite && chmod 755 /app/.vite + +EXPOSE 7860 +ENV NODE_ENV=production +ENV HOME=/home/node + +ENTRYPOINT [] +CMD ["bun", "run", "dev", "--host", "0.0.0.0", "--port", "7860"] diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000000000000000000000000000000000000..910cdcc442f0f49a594f6e457c6d804c7a9a1411 --- /dev/null +++ b/PLAN.md @@ -0,0 +1,870 @@ +# AI Agent Development Plan - Refined Strategy + +## Overview + +Iterative AI-driven game development system using **browser-native TypeScript architecture** with streaming AI agents for real-time VibeGame game modification and self-correcting feedback loops. + +## Current Status + +**Phase 1 - Foundation COMPLETED** ✅ + +- ✅ WebSocket server integrated with Vite +- ✅ HuggingFace Inference API connected +- ✅ Real-time streaming chat interface +- ✅ Agent state management with Svelte stores +- ✅ Bidirectional communication working + +**Next: Tool Implementation** 🚀 + +## Core Strategy: Small, Testable Iterations + +### Guiding Principles + +1. **Start Ultra-Simple** - First tool in ~10 lines of code +2. **Test Continuously** - Every iteration delivers testable value +3. **Fail Visibly** - Errors shown immediately in UI +4. **Incremental Complexity** - Add features one at a time +5. **User-Centric Progress** - Each day delivers visible improvement + +### Development Phases + +- **Week 1**: Make it Work (basic tools) +- **Week 2**: Make it Good (error handling) +- **Week 3**: Make it Fast (optimization) + +## Architecture Evolution + +### Current Architecture (Simple) + +``` +Browser → WebSocket → Agent → Tools → Stores → UI +``` + +### Target Architecture (Advanced) + +``` +Browser → SSE/WebSocket → Composite Agent System → MCP Tools → Stores → UI + ├── Base Model (Complex reasoning) + ├── Quick Edit Model (Fast edits) + └── AutoFix Model (Error correction) +``` + +## Implementation Phases + +### Phase 1: Minimal Viable Tools (Days 1-7) + +**Goal:** Agent can read and edit game code + +#### Day 1: First Tool - Read Game Code + +- [ ] Create `src/lib/tools/registry.ts` with simple tool interface +- [ ] Implement `read-game-code.ts` (returns editor content) +- [ ] Update agent-runner to detect tool calls +- **Test:** "What's in the game?" → Agent describes scene + +#### Day 2: Tool Execution + +- [ ] Parse tool requests from agent responses +- [ ] Execute tools and return results +- [ ] Add tool context to agent +- **Test:** Agent accurately describes game elements + +#### Day 3: Edit Game Code + +- [ ] Implement `edit-game-code.ts` with string replacement +- [ ] Connect to editor store +- [ ] Basic XML validation +- **Test:** "Add a red box" → Box appears + +#### Day 4: Console Reading + +- [ ] Implement `read-console.ts` +- [ ] Filter and format messages +- **Test:** Agent reports console errors + +#### Day 5-6: Tool Chaining + +- [ ] Multiple tools per response +- [ ] Simple sequencing +- [ ] Context preservation +- **Test:** Multi-step operations work + +#### Day 7: Testing & Stabilization + +- [ ] Fix discovered bugs +- [ ] Improve error messages +- [ ] Add logging +- **Success Metrics:** + - ✅ Agent can describe game content + - ✅ Agent can add/modify elements + - ✅ Agent can read console + - ✅ 5 basic operations work reliably + +### Phase 2: Error Detection & Correction (Days 8-14) + +**Goal:** Agent detects and fixes simple errors + +#### Day 8: Error Pattern Recognition + +- [ ] Parse common VibeGame errors +- [ ] Categorize: syntax, physics, missing components +- **Test:** Agent identifies "no ground" error + +#### Day 9: Simple Self-Correction + +- [ ] Single retry on error +- [ ] Generate fix attempts +- **Test:** Agent adds missing ground + +#### Day 10: Undo/Redo + +- [ ] Edit history in editor store +- [ ] Rollback on failure +- **Test:** Failed edits can be undone + +#### Day 11: Validation Tool + +- [ ] Check required components +- [ ] Pre-validate changes +- **Test:** Prevents invalid states + +#### Day 12-13: Better Prompting + +- [ ] VibeGame-specific examples +- [ ] Few-shot learning +- **Test:** Higher first-attempt success + +#### Day 14: Polish + +- [ ] Clear error messages +- [ ] Better explanations +- **Success Metrics:** + - ✅ Agent detects common errors + - ✅ Agent fixes simple mistakes + - ✅ Edit history prevents data loss + - ✅ 80% success rate on common tasks + +### Phase 3: Advanced Features (Days 15-21) + +**Goal:** Faster, smarter, more capable + +#### Day 15: Code-Based Tools + +- [ ] Agent generates TypeScript for tools +- [ ] Controlled execution environment +- **Test:** More flexible tool usage + +#### Day 16: Streaming Improvements + +- [ ] Migrate to Server-Sent Events (SSE) +- [ ] Real-time tool visualization +- **Test:** Better feedback + +#### Day 17: Quick Edit Model + +- [ ] Route simple edits to Qwen3-Coder-7B +- [ ] Instant text/color changes +- **Test:** Sub-second simple edits + +#### Day 18: Context Management + +- [ ] Sliding window for long chats +- [ ] Iteration summarization +- **Test:** 50+ message sessions + +#### Day 19: Template System + +- [ ] Pre-built game templates +- [ ] Quick start patterns +- **Test:** "Make a platformer" works + +#### Day 20: Thinking Visualization + +- [ ] Show reasoning process +- [ ] Chain-of-thought UI +- **Test:** Users understand logic + +#### Day 21: Final Polish + +- [ ] Performance optimization +- [ ] Documentation +- **Success Metrics:** + - ✅ Sub-second simple edits + - ✅ Complex multi-step tasks work + - ✅ Users understand process + - ✅ Production-ready quality + +## Tool Specifications + +### Core Tool Interface (MCP-Compatible) + +```typescript +interface Tool { + name: string; + description: string; + execute: (params: any) => Promise; +} + +interface ToolResult { + success: boolean; + data?: any; + error?: string; +} +``` + +### Initial Tool Set + +1. **read_game_code** - Get current editor content +2. **edit_game_code** - Modify via search/replace +3. **read_console** - Get console messages +4. **validate_game** - Check VibeGame rules + +### Future Tools + +5. **list_entities** - Get all scene entities +6. **add_entity** - Add new entity +7. **remove_entity** - Delete entity +8. **test_physics** - Simulate and check +9. **reset_game** - Restart scene + +## Model Strategy + +### Phase 1: Single Model + +- **Primary:** DeepSeek-R1-Distill-Qwen-1.5B (current) +- Simple prompting, basic tool use + +### Phase 2: Fallback Chain + +- **Primary:** DeepSeek-R1-Distill +- **Fallback:** Qwen3-Coder-7B +- Error recovery and retry logic + +### Phase 3: Composite System + +- **Complex Tasks:** ERNIE-4.5-21B-A3B-Thinking (128K context) +- **Quick Edits:** Qwen3-Coder-7B-Instruct +- **Error Fix:** Dedicated correction model +- **Streaming Post-Processor:** Real-time validation + +## Key Improvements from Research + +### From v0/Vercel + +- Composite model architecture +- Streaming post-processing +- Quick edit optimization +- Real-time error correction + +### From Smolagents + +- Code-based tools (TypeScript instead of JSON) +- Direct execution without translation +- Simpler debugging + +### From Modern Thinking Models + +- 128K context windows +- Chain-of-thought reasoning +- Sparse MoE activation (3B active params) + +### From MCP/Agentic Web + +- Standardized tool protocols +- Browser-native execution +- SSE for streaming +- Direct store integration + +## Testing Strategy + +### Unit Tests + +- Individual tool validation +- Mock stores for isolation + +### Integration Tests + +- Full flow: request → tools → response +- Multi-tool sequences +- Error recovery + +### User Tests + +- "Add jumping platforms" +- "Fix the bouncing balls" +- "Create a coin collector" + +## Deployment + +### Environment Variables + +```env +HF_TOKEN= +MODEL_PRIMARY=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B +MODEL_QUICK=Qwen/Qwen3-Coder-7B-Instruct +MAX_ITERATIONS=10 +ITERATION_TIMEOUT=30000 +PORT=7860 +``` + +### Single Container (HuggingFace Spaces) + +```dockerfile +FROM oven/bun:1-alpine +WORKDIR /app +COPY package.json bun.lockb ./ +RUN bun install --frozen-lockfile +COPY . . +RUN bun run build +EXPOSE 7860 +CMD ["bun", "run", "preview", "--host", "0.0.0.0", "--port", "7860"] +``` + +## Implementation Details + +### Tool System Architecture + +#### Pattern Recognition in Agent Responses + +The agent will naturally include tool calls in its responses using a simple pattern: + +``` +[TOOL: tool_name {"param": "value"}] +``` + +Example agent response: + +``` +I'll check what's currently in your game. + +[TOOL: read_game_code] + +Based on the code, I can see you have a ground platform and a red ball... +``` + +#### Complete Tool Registry Implementation + +```typescript +// src/lib/tools/registry.ts - FULL CODE TO CREATE + +export interface Tool { + name: string; + description: string; + execute: (params: any) => Promise; +} + +export interface ToolResult { + success: boolean; + data?: any; + error?: string; +} + +export interface ToolCall { + tool: string; + parameters?: any; +} + +class ToolRegistry { + private tools: Map = new Map(); + + register(tool: Tool) { + if (this.tools.has(tool.name)) { + console.warn(`Tool ${tool.name} already registered, overwriting`); + } + this.tools.set(tool.name, tool); + console.log(`Registered tool: ${tool.name}`); + } + + async execute(toolName: string, params?: any): Promise { + const tool = this.tools.get(toolName); + + if (!tool) { + return { + success: false, + error: `Tool '${toolName}' not found. Available: ${Array.from(this.tools.keys()).join(", ")}`, + }; + } + + try { + console.log(`Executing tool: ${toolName}`, params); + const result = await tool.execute(params); + console.log(`Tool ${toolName} result:`, result); + return result; + } catch (error) { + console.error(`Tool ${toolName} error:`, error); + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error", + }; + } + } + + getTools(): Tool[] { + return Array.from(this.tools.values()); + } + + getToolNames(): string[] { + return Array.from(this.tools.keys()); + } + + getToolDescriptions(): string { + return Array.from(this.tools.values()) + .map((tool) => `- ${tool.name}: ${tool.description}`) + .join("\n"); + } +} + +// Global registry instance +export const toolRegistry = new ToolRegistry(); + +// Helper function to parse tool calls from agent response +export function parseToolCalls(response: string): ToolCall[] { + const toolCalls: ToolCall[] = []; + + // Pattern: [TOOL: tool_name] or [TOOL: tool_name {"param": "value"}] + const toolPattern = /\[TOOL:\s*(\w+)(?:\s+({[^}]+}))?\]/g; + + let match; + while ((match = toolPattern.exec(response)) !== null) { + const toolName = match[1]; + const paramsStr = match[2]; + + let parameters = undefined; + if (paramsStr) { + try { + parameters = JSON.parse(paramsStr); + } catch (e) { + console.warn(`Failed to parse tool parameters: ${paramsStr}`); + } + } + + toolCalls.push({ tool: toolName, parameters }); + } + + return toolCalls; +} + +// Helper to format tool results for agent context +export function formatToolResult(toolName: string, result: ToolResult): string { + if (result.success) { + return `[TOOL_RESULT: ${toolName}]\n${JSON.stringify(result.data, null, 2)}\n[/TOOL_RESULT]`; + } else { + return `[TOOL_ERROR: ${toolName}]\n${result.error}\n[/TOOL_ERROR]`; + } +} +``` + +#### Tool Implementation Examples + +**read-game-code.ts** (Ultra-simple first tool): + +```typescript +import { editorStore } from "$lib/stores/editor"; +import { get } from "svelte/store"; + +export const readGameCodeTool: Tool = { + name: "read_game_code", + description: "Get the current game code from the editor", + execute: async () => { + const state = get(editorStore); + return { + success: true, + data: { + content: state.content, + language: state.language, + }, + }; + }, +}; +``` + +**edit-game-code.ts** (Simple string replacement): + +```typescript +export const editGameCodeTool: Tool = { + name: "edit_game_code", + description: "Edit game code using search and replace", + execute: async (params: { search: string; replace: string }) => { + const state = get(editorStore); + const newContent = state.content.replace(params.search, params.replace); + editorStore.setContent(newContent); + return { + success: true, + data: { modified: true, newContent }, + }; + }, +}; +``` + +#### Agent Runner Updates + +Add to `src/lib/server/agent-runner.ts`: + +```typescript +import { parseToolCalls, toolRegistry, formatToolResult } from '../tools/registry'; + +async processMessage(message: string, onStream?: (chunk: string) => void) { + // ... existing code ... + + // After getting response, check for tool calls + const toolCalls = parseToolCalls(fullResponse); + + if (toolCalls.length > 0) { + // Execute tools and add results to context + for (const call of toolCalls) { + const result = await toolRegistry.execute(call.tool, call.parameters); + const formatted = formatToolResult(call.tool, result); + + // Add to message history for context + this.messageHistory.push({ + id: this.generateId(), + role: 'system', + content: formatted, + timestamp: Date.now() + }); + } + + // Continue conversation with tool results + // (In phase 2, we'll make this recursive for self-correction) + } +} +``` + +#### System Prompt Enhancement + +```typescript +const systemPrompt = `You are an AI assistant helping to build games with VibeGame. + +Available tools: +${toolRegistry.getToolDescriptions()} + +To use a tool, include in your response: [TOOL: tool_name {"param": "value"}] + +Example: +- To read game code: [TOOL: read_game_code] +- To edit: [TOOL: edit_game_code {"search": "old text", "replace": "new text"}] + +Always validate changes and ensure the game remains playable. +Use small, incremental changes rather than large rewrites.`; +``` + +### Testing Scenarios + +#### Phase 1 Test Cases + +1. **"What's in the game?"** + - Expected: Agent uses `read_game_code`, describes scene elements + +2. **"Add a blue box at position 5,2,0"** + - Expected: Agent uses `edit_game_code` to insert `` + +3. **"Change the ball color to green"** + - Expected: Agent finds and replaces color attribute + +4. **"What errors are in the console?"** + - Expected: Agent uses `read_console` tool + +5. **"Check the code and fix any issues"** + - Expected: Agent chains multiple tools + +### Current File Structure + +``` +src/lib/ +├── server/ +│ ├── agent-runner.ts (✅ exists - needs tool integration) +│ └── api.ts (✅ exists - WebSocket handler) +├── tools/ +│ └── (empty directory - needs implementation) +└── stores/ + ├── agent.ts (✅ exists) + ├── editor.ts (✅ exists) + ├── console.ts (✅ exists) + ├── game.ts (✅ exists) + └── ui.ts (✅ exists) +``` + +### Target File Structure After Implementation + +``` +src/lib/ +├── server/ +│ ├── agent-runner.ts (updated with tool execution) +│ └── api.ts (existing WebSocket handler) +├── tools/ +│ ├── registry.ts (to create) +│ ├── read-game-code.ts (to create) +│ ├── edit-game-code.ts (to create) +│ ├── read-console.ts (to create) +│ └── index.ts (to create - exports all tools) +└── stores/ + └── (all existing) +``` + +## Next Immediate Steps + +1. ✅ Update PLAN.md with implementation details +2. ⏳ Create tool registry (`src/lib/tools/registry.ts`) +3. ⏳ Implement read-game-code tool +4. ⏳ Update agent-runner for tool execution +5. ⏳ Test in UI with "What's in the game?" + +## Success Criteria + +### Week 1 + +- [ ] Basic tools working +- [ ] Agent can modify games +- [ ] Console feedback visible + +### Week 2 + +- [ ] Error detection working +- [ ] Self-correction attempts +- [ ] Higher success rate + +### Week 3 + +- [ ] Fast response times +- [ ] Advanced features +- [ ] Production ready + +## Model Configuration Details + +### HuggingFace Inference API Setup + +#### Available Models (via Serverless API) + +```typescript +// Phase 1: Simple model +const MODELS = { + primary: "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", + + // Phase 2: Fallback chain + fallback: "Qwen/Qwen2.5-Coder-7B-Instruct", + + // Phase 3: Thinking models (require special handling) + thinking: { + ernie: "baidu/ERNIE-4.5-21B-A3B-Thinking", // Apache 2.0, 128K context + qwen: "Qwen/Qwen3-Next-80B-A3B-Thinking", // Longer thinking chains + }, +}; +``` + +#### Thinking Model Integration + +For thinking models, parse and display reasoning: + +```typescript +// Response may contain thinking process +const thinkingPattern = /(.*?)<\/thinking>/s; +const match = response.match(thinkingPattern); +if (match) { + // Store thinking for UI display + const thinking = match[1]; + // Extract actual response + const answer = response.replace(thinkingPattern, ""); +} +``` + +### Advanced Features Implementation + +#### Server-Sent Events (SSE) Migration + +Replace WebSocket with SSE for simpler streaming: + +```typescript +// src/lib/server/sse.ts +export function createSSEStream(req: Request) { + const stream = new ReadableStream({ + start(controller) { + controller.enqueue('data: {"type":"connected"}\n\n'); + }, + async pull(controller) { + // Stream agent responses + const chunk = await getNextChunk(); + controller.enqueue(`data: ${JSON.stringify(chunk)}\n\n`); + }, + }); + + return new Response(stream, { + headers: { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", + }, + }); +} +``` + +#### Code-Based Tool Execution (Smolagents-inspired) + +Allow agent to write TypeScript code for tools: + +```typescript +// Agent generates code like: +const code = ` + const editor = await tools.readGameCode(); + const content = editor.data.content; + const modified = content.replace('color="#ff0000"', 'color="#00ff00"'); + await tools.editGameCode({ search: content, replace: modified }); + return "Changed red to green"; +`; + +// Execute in sandboxed context +const sandbox = { + tools: toolRegistry, + console: { log: (...args) => consoleStore.addMessage("log", args.join(" ")) }, +}; +const result = await executeInSandbox(code, sandbox); +``` + +#### Composite Model Router + +Route requests based on complexity: + +```typescript +class ModelRouter { + async route(message: string, context: AgentMessage[]): Promise { + const complexity = this.assessComplexity(message); + + if (complexity === "simple") { + // Text changes, color modifications + return this.quickEditModel(message); + } else if (complexity === "complex") { + // Multi-step reasoning, debugging + return this.thinkingModel(message); + } else { + // Default + return this.primaryModel(message); + } + } + + private assessComplexity(message: string): "simple" | "medium" | "complex" { + // Simple heuristics + if (message.match(/change|color|text|rename/i)) return "simple"; + if (message.match(/debug|fix|error|why/i)) return "complex"; + return "medium"; + } +} +``` + +## Common Patterns & Solutions + +### Pattern: Adding Game Elements + +```typescript +// User: "Add a platform at 0,3,0" +// Agent response with tool: +`I'll add a platform at position 0,3,0 for you. + +[TOOL: edit_game_code {"search": "", "replace": " \n"}] + +I've added a gray platform at position (0, 3, 0).`; +``` + +### Pattern: Debugging Errors + +```typescript +// User: "The player keeps falling" +// Agent workflow: +1. [TOOL: read_game_code] - Check for ground +2. [TOOL: read_console] - Check for physics errors +3. Identify: No ground platform +4. [TOOL: edit_game_code] - Add ground +5. [TOOL: validate_game] - Verify fix +``` + +### Pattern: Complex Modifications + +```typescript +// User: "Make this into a platformer" +// Agent uses template: +const platformerTemplate = ` + + + + + + + + + +`; +``` + +## Troubleshooting Guide + +### Issue: Agent doesn't use tools + +**Solution**: Enhance system prompt with examples + +```typescript +const systemPrompt = ` +IMPORTANT: You have tools available. Use them! + +Examples of when to use tools: +- User asks "what's in the game?" → Use [TOOL: read_game_code] +- User says "add a box" → Use [TOOL: edit_game_code] +- User mentions "error" → Use [TOOL: read_console] +`; +``` + +### Issue: Tool execution fails + +**Solution**: Add error recovery + +```typescript +try { + const result = await tool.execute(params); + if (!result.success) { + // Retry with adjusted parameters + const adjusted = this.adjustParameters(params, result.error); + return await tool.execute(adjusted); + } +} catch (error) { + // Fallback to manual instruction + return { + success: false, + error: `Tool failed. Manual fix: ${this.getManualInstructions(tool.name)}`, + }; +} +``` + +### Issue: Context overflow + +**Solution**: Implement sliding window + +```typescript +class ContextManager { + private maxTokens = 4000; + + summarize(messages: AgentMessage[]): AgentMessage[] { + if (this.countTokens(messages) < this.maxTokens) { + return messages; + } + + // Keep system, first user, and last N messages + const summary = this.createSummary(messages.slice(1, -5)); + return [ + messages[0], // system + { role: "system", content: `Previous conversation summary: ${summary}` }, + ...messages.slice(-5), // recent context + ]; + } +} +``` + +## Resources + +- [HuggingFace Inference API](https://huggingface.co/docs/api-inference/index) +- [MCP Specification](https://modelcontextprotocol.io/specification) +- [VibeGame Docs](llms.txt) +- [Smolagents](https://github.com/huggingface/smolagents) +- [AI SDK](https://ai-sdk.dev) +- [ERNIE-4.5 Model](https://huggingface.co/baidu/ERNIE-4.5-21B-A3B-Thinking) +- [Qwen3-Next Model](https://huggingface.co/Qwen/Qwen3-Next-80B-A3B-Thinking) + +--- + +_This plan provides a complete roadmap for implementing an AI agent system for VibeGame game development. Start with Phase 1 for immediate value, then progressively add sophistication. Each iteration is designed to be completed in hours, not days, with immediate testing in the UI._ diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5c1a28f1e32ba9dfd7ef740383aaca30e8915e96 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +--- +title: VibeGame +emoji: 🥕 +colorFrom: purple +colorTo: green +sdk: docker +app_port: 7860 +pinned: false +license: mit +short_description: Vibe code 3D games +hf_oauth: true +hf_oauth_expiration_minutes: 43200 +hf_oauth_scopes: + - inference-api +--- + +# 🥕 VibeGame + +Vibe code 3D games with [VibeGame](https://github.com/dylanebert/vibegame). diff --git a/auth-callback.html b/auth-callback.html new file mode 100644 index 0000000000000000000000000000000000000000..c60f7199d9aa5256e017fd8765fc12477f3d0fbd --- /dev/null +++ b/auth-callback.html @@ -0,0 +1,62 @@ + + + + + + Authentication - VibeGame + + + +
+
+

Authenticating...

+

Please wait while we complete your login.

+
+ + + diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000000000000000000000000000000000000..5a222a5a4079e709059388f23be4186b0c20f91e --- /dev/null +++ b/bun.lock @@ -0,0 +1,769 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "vibegame", + "dependencies": { + "@huggingface/hub": "^2.6.3", + "@huggingface/inference": "^4.8.0", + "@types/node": "^24.3.3", + "gsap": "^3.13.0", + "monaco-editor": "^0.50.0", + "svelte-splitpanes": "^8.0.5", + "vibegame": "^0.1.1", + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@types/ws": "^8.18.1", + "@typescript-eslint/eslint-plugin": "^8.40.0", + "@typescript-eslint/parser": "^8.40.0", + "eslint": "^9.33.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", + "svelte": "^4.2.18", + "svelte-check": "^3.8.4", + "typescript": "^5.6.0", + "vite": "^5.4.10", + "ws": "^8.18.3", + }, + }, + }, + "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.18.2", "", {}, "sha512-DTXrOsn3ra9ZonB+VyqJc16xnRXWsHVa5FK230Z+R1PJ7q8oSRmWQ+AU6e+IJYBHxkM0a5QVDqd729DyeEhHPA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], + + "@eslint/core": ["@eslint/core@0.15.2", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.35.0", "", {}, "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], + + "@huggingface/hub": ["@huggingface/hub@2.6.3", "", { "dependencies": { "@huggingface/tasks": "^0.19.45" }, "optionalDependencies": { "cli-progress": "^3.12.0" }, "bin": { "hfjs": "dist/cli.js" } }, "sha512-IEZ67adV+gWqg98A//mU0Ed+Q6xGPQxMfK+aV36b0Ww7R4EXG1O0zyiCcbLE/cvryfCD8+PNEwQgiPU+v63tsQ=="], + + "@huggingface/inference": ["@huggingface/inference@4.8.0", "", { "dependencies": { "@huggingface/jinja": "^0.5.1", "@huggingface/tasks": "^0.19.45" } }, "sha512-Eq98EAXqYn4rKMfrbEXuhc3IjKfaeIO6eXNOZk9xk6v5akrIWRtd6d1h0fjAWyX4zRbdUpXRh6MvsqXnzGvXCA=="], + + "@huggingface/jinja": ["@huggingface/jinja@0.5.1", "", {}, "sha512-yUZLld4lrM9iFxHCwFQ7D1HW2MWMwSbeB7WzWqFYDWK+rEb+WldkLdAJxUPOmgICMHZLzZGVcVjFh3w/YGubng=="], + + "@huggingface/tasks": ["@huggingface/tasks@0.19.45", "", {}, "sha512-lM3QOgbfkGZ5gAZOYWOmzMM6BbKcXOIHjgnUAoymTdZEcEcGSr0vy/LWGEiK+vBXC4vU+sCT+WNoA/JZ8TEWdA=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.1", "", { "os": "android", "cpu": "arm" }, "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.1", "", { "os": "android", "cpu": "arm64" }, "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.1", "", { "os": "linux", "cpu": "arm" }, "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.1", "", { "os": "linux", "cpu": "none" }, "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.1", "", { "os": "none", "cpu": "arm64" }, "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.1", "", { "os": "win32", "cpu": "x64" }, "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA=="], + + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@3.1.2", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", "debug": "^4.3.4", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.10", "svelte-hmr": "^0.16.0", "vitefu": "^0.2.5" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.0" } }, "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA=="], + + "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@2.1.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.0" } }, "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/node": ["@types/node@24.3.3", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-GKBNHjoNw3Kra1Qg5UXttsY5kiWMEfoHq2TmXb+b1rcm6N7B3wTrFYIf/oSZ1xNQ+hVVijgLkiDZh7jRRsh+Gw=="], + + "@types/pug": ["@types/pug@2.0.10", "", {}, "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.43.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.43.0", "@typescript-eslint/type-utils": "8.43.0", "@typescript-eslint/utils": "8.43.0", "@typescript-eslint/visitor-keys": "8.43.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.43.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.43.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.43.0", "@typescript-eslint/types": "8.43.0", "@typescript-eslint/typescript-estree": "8.43.0", "@typescript-eslint/visitor-keys": "8.43.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.43.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.43.0", "@typescript-eslint/types": "^8.43.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.43.0", "", { "dependencies": { "@typescript-eslint/types": "8.43.0", "@typescript-eslint/visitor-keys": "8.43.0" } }, "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.43.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.43.0", "", { "dependencies": { "@typescript-eslint/types": "8.43.0", "@typescript-eslint/typescript-estree": "8.43.0", "@typescript-eslint/utils": "8.43.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.43.0", "", {}, "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.43.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.43.0", "@typescript-eslint/tsconfig-utils": "8.43.0", "@typescript-eslint/types": "8.43.0", "@typescript-eslint/visitor-keys": "8.43.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.43.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.43.0", "@typescript-eslint/types": "8.43.0", "@typescript-eslint/typescript-estree": "8.43.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.43.0", "", { "dependencies": { "@typescript-eslint/types": "8.43.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bitecs": ["bitecs@0.3.40", "", {}, "sha512-wAylY4pNfX8IeIH5phtwt1lUNtHKrkoSNrArI7Ris2Y4nEQWFIVvXdgAuqprEg9bq8Wolmlj0gVfeG6MFmtI2Q=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "cli-progress": ["cli-progress@3.12.0", "", { "dependencies": { "string-width": "^4.2.3" } }, "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A=="], + + "code-red": ["code-red@1.0.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", "acorn": "^8.10.0", "estree-walker": "^3.0.3", "periscopic": "^3.1.0" } }, "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "es6-promise": ["es6-promise@3.3.1", "", {}, "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="], + + "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.35.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.35.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], + + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], + + "esm-env-robust": ["esm-env-robust@0.0.3", "", { "dependencies": { "esm-env": "^1.0.0" } }, "sha512-90Gnuw2DALOqlL1581VxP3GHPUNHX9U+fQ+8FNcTTFClhY5gEggAAnJ3q1b2Oq23knRsjv8YpNeMRPaMLUymOA=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "gsap": ["gsap@3.13.0", "", {}, "sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "monaco-editor": ["monaco-editor@0.50.0", "", {}, "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "periscopic": ["periscopic@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", "is-reference": "^3.0.0" } }, "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "rollup": ["rollup@4.50.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.1", "@rollup/rollup-android-arm64": "4.50.1", "@rollup/rollup-darwin-arm64": "4.50.1", "@rollup/rollup-darwin-x64": "4.50.1", "@rollup/rollup-freebsd-arm64": "4.50.1", "@rollup/rollup-freebsd-x64": "4.50.1", "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", "@rollup/rollup-linux-arm-musleabihf": "4.50.1", "@rollup/rollup-linux-arm64-gnu": "4.50.1", "@rollup/rollup-linux-arm64-musl": "4.50.1", "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", "@rollup/rollup-linux-ppc64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-gnu": "4.50.1", "@rollup/rollup-linux-riscv64-musl": "4.50.1", "@rollup/rollup-linux-s390x-gnu": "4.50.1", "@rollup/rollup-linux-x64-gnu": "4.50.1", "@rollup/rollup-linux-x64-musl": "4.50.1", "@rollup/rollup-openharmony-arm64": "4.50.1", "@rollup/rollup-win32-arm64-msvc": "4.50.1", "@rollup/rollup-win32-ia32-msvc": "4.50.1", "@rollup/rollup-win32-x64-msvc": "4.50.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "sander": ["sander@0.5.1", "", { "dependencies": { "es6-promise": "^3.1.2", "graceful-fs": "^4.1.3", "mkdirp": "^0.5.1", "rimraf": "^2.5.2" } }, "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "sorcery": ["sorcery@0.11.1", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.14", "buffer-crc32": "^1.0.0", "minimist": "^1.2.0", "sander": "^0.5.0" }, "bin": { "sorcery": "bin/sorcery" } }, "sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svelte": ["svelte@4.2.20", "", { "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", "@jridgewell/trace-mapping": "^0.3.18", "@types/estree": "^1.0.1", "acorn": "^8.9.0", "aria-query": "^5.3.0", "axobject-query": "^4.0.0", "code-red": "^1.0.3", "css-tree": "^2.3.1", "estree-walker": "^3.0.3", "is-reference": "^3.0.1", "locate-character": "^3.0.0", "magic-string": "^0.30.4", "periscopic": "^3.1.0" } }, "sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q=="], + + "svelte-check": ["svelte-check@3.8.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "chokidar": "^3.4.1", "picocolors": "^1.0.0", "sade": "^1.7.4", "svelte-preprocess": "^5.1.3", "typescript": "^5.0.3" }, "peerDependencies": { "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-ij0u4Lw/sOTREP13BdWZjiXD/BlHE6/e2e34XzmVmsp5IN4kVa3PWP65NM32JAgwjZlwBg/+JtiNV1MM8khu0Q=="], + + "svelte-hmr": ["svelte-hmr@0.16.0", "", { "peerDependencies": { "svelte": "^3.19.0 || ^4.0.0" } }, "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA=="], + + "svelte-preprocess": ["svelte-preprocess@5.1.4", "", { "dependencies": { "@types/pug": "^2.0.6", "detect-indent": "^6.1.0", "magic-string": "^0.30.5", "sorcery": "^0.11.0", "strip-indent": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.10.2", "coffeescript": "^2.5.1", "less": "^3.11.3 || ^4.0.0", "postcss": "^7 || ^8", "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "pug": "^3.0.0", "sass": "^1.26.8", "stylus": "^0.55.0", "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["@babel/core", "coffeescript", "less", "postcss", "postcss-load-config", "pug", "sass", "stylus", "sugarss", "typescript"] }, "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA=="], + + "svelte-splitpanes": ["svelte-splitpanes@8.0.9", "", { "dependencies": { "esm-env-robust": "0.0.3" }, "peerDependencies": { "svelte": "^4.2.19 || ^5.1.0" } }, "sha512-L3oLXTC99M191FInTXJ/f/2i0welRql1QuVbPaU8iy6nvCR6X9VyjHCsCpLqKGWHwqkWo/AM9CQ1c0nzlb+MkA=="], + + "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], + + "three": ["three@0.180.0", "", {}, "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "vibegame": ["vibegame@0.1.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "^0.18.2", "gsap": "^3.13.0", "zod": "^4.1.5" }, "peerDependencies": { "bitecs": ">=0.3.40", "three": ">=0.170.0" } }, "sha512-HjWMlO4qUus9ChEBsD+abS9UGle/qiDZWukIqkve811N2oliKjWE7WYCDhqaDhWS18FaaYaY1a/Vc8yF0HaS1Q=="], + + "vite": ["vite@5.4.20", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g=="], + + "vitefu": ["vitefu@0.2.5", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["vite"] }, "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + } +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000000000000000000000000000000000..ed47f3d143051cea44a76ab3188997f4c4050a4c --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,62 @@ +import js from "@eslint/js"; +import tseslint from "@typescript-eslint/eslint-plugin"; +import tsparser from "@typescript-eslint/parser"; +import prettierConfig from "eslint-config-prettier"; +import importPlugin from "eslint-plugin-import"; +import prettier from "eslint-plugin-prettier"; + +export default [ + js.configs.recommended, + { + files: ["**/*.ts", "**/*.tsx"], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + globals: { + console: "readonly", + window: "readonly", + document: "readonly", + HTMLElement: "readonly", + HTMLCanvasElement: "readonly", + KeyboardEvent: "readonly", + MouseEvent: "readonly", + WheelEvent: "readonly", + requestAnimationFrame: "readonly", + cancelAnimationFrame: "readonly", + performance: "readonly", + process: "readonly", + WebSocket: "readonly", + setTimeout: "readonly", + clearTimeout: "readonly", + setInterval: "readonly", + clearInterval: "readonly", + sessionStorage: "readonly", + localStorage: "readonly", + }, + }, + plugins: { + "@typescript-eslint": tseslint, + prettier: prettier, + import: importPlugin, + }, + rules: { + ...tseslint.configs.recommended.rules, + ...prettierConfig.rules, + "prettier/prettier": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, + ], + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "warn", + "no-console": "off", + }, + }, + { + ignores: ["dist/**", "node_modules/**"], + }, +]; diff --git a/index.html b/index.html new file mode 100644 index 0000000000000000000000000000000000000000..f48d3d641befab4c84466c41d7a06179778667b4 --- /dev/null +++ b/index.html @@ -0,0 +1,33 @@ + + + + + + 🥕 VibeGame + + + +
+ + + diff --git a/layers/context-template.md b/layers/context-template.md new file mode 100644 index 0000000000000000000000000000000000000000..78f5baa1d8481b80a570b93a296e84f0267f486f --- /dev/null +++ b/layers/context-template.md @@ -0,0 +1,34 @@ +# Context Template + +Concise context for any folder; link to code or subfolders for deeper context + +## Purpose + +- [What this folder/module does] + +## Layout + +``` +[FOLDER]/ +context.md # This file, folder context (Tier 2) +├── [FILE1].[ext] # File +├── [FILE2].[ext] # File +├── [subfolder]/ # Subfolder +│ ├── context.md # Subfolder context +│ ├── [FILE3].[ext] # File +│ └── [FILE4].[ext] # File +``` + +## Scope + +- [In-scope] +- [Out-of-scope] + +## Entrypoints + +- [Primary entry files or functions and when they are called] + +## Dependencies + +- [Internal modules] +- [External libraries/services] diff --git a/layers/structure.md b/layers/structure.md new file mode 100644 index 0000000000000000000000000000000000000000..d1cb70e86b15dd7341cc20d12b2c29001c8bcade --- /dev/null +++ b/layers/structure.md @@ -0,0 +1,106 @@ +# Project Structure + +AI-assisted iterative game development environment with real-time feedback + +## Stack + +- Runtime: Bun +- Language: TypeScript +- UI Framework: Svelte +- Game Engine: VibeGame (3D physics, ECS) +- Code Editor: Monaco Editor +- AI Agent: Hugging Face Inference API +- WebSocket: ws (for real-time communication) +- Build: Vite +- Animation: GSAP (bundled with VibeGame) +- Physics: Rapier (via VibeGame) +- Rendering: Three.js (via VibeGame) + +## Commands + +- `bun dev` - Development server with hot reload on port 7860 +- `bun run build` - Build for production +- `bun run preview` - Preview production build +- `bun run check` - TypeScript + Svelte type checking +- `bun run lint` - ESLint code quality check +- `bun run format` - Auto-format with Prettier +- `bun run validate` - Complete validation (format, lint, type check) +- `bun run update` - Update llms.txt from VibeGame + +## Layout + +``` +vibegame/ +├── CLAUDE.md # Global context (Tier 0) +├── PLAN.md # Development roadmap +├── layers/ +│ ├── structure.md # Project structure (Tier 1) +│ └── context-template.md +├── src/ +│ ├── main.ts # Svelte app initialization +│ ├── App.svelte # Root UI component (declarative) +│ └── lib/ +│ ├── stores/ # State management +│ ├── services/ # Business logic +│ ├── server/ # WebSocket server & agent +│ ├── components/ # UI components +│ │ ├── chat/ # AI chat interface +│ │ ├── console/ +│ │ ├── editor/ +│ │ ├── game/ +│ │ └── layout/ +│ └── config/ # Configuration +├── index.html # Entry point +├── package.json # Dependencies and scripts +├── tsconfig.json # TypeScript configuration +├── vite.config.ts # Vite + Svelte + VibeGame config +├── bun.lock # Dependency lock file +├── llms.txt # VibeGame documentation +└── README.md +``` + +## Architecture + +Three-layer architecture: UI (Svelte) → Agent (Hugging Face) → Game (VibeGame) + +- **UI Layer**: Svelte components for chat, code editing, console display +- **Agent Layer**: Hugging Face models via WebSocket for game assistance +- **Game Layer**: VibeGame ECS with declarative XML scene definition +- **Feedback Loop**: Console output → Agent parsing → Self-correction (planned) + +## Entry points + +- Main entry: `index.html` (HTML shell) +- UI entry: `src/main.ts` (Svelte app mount) +- App root: `src/App.svelte` (Component tree root) +- Game definition: `` tag in editor (Live-editable XML) + +## Naming Conventions + +TypeScript/Web standards with Svelte and ECS conventions + +- Files: kebab-case for utilities, PascalCase for components (e.g., `Chat.svelte`, `mcp-tools.js`) +- Directories: lowercase (e.g., `src/`, `components/`, `stores/`) +- Svelte components: PascalCase (e.g., `Editor.svelte`, `Preview.svelte`) +- Stores: camelCase (e.g., `gameState`, `consoleMessages`) +- ECS Components: PascalCase (e.g., `Health`, `Transform`) +- Systems: PascalCase with "System" suffix (e.g., `HealthSystem`) + +## Configuration + +- TypeScript: `tsconfig.json` (Strict mode, ESNext target) +- Build: `vite.config.ts` (Vite with Svelte, VibeGame, WebSocket plugins) +- Dependencies: `package.json` (Svelte, VibeGame, Monaco, Hugging Face, ws) +- Game Scene: Live-editable in Monaco editor + +## Where to add code + +- UI components → `src/lib/components/[feature]/[Component].svelte` +- State management → `src/lib/stores/[store].ts` +- Business logic → `src/lib/services/[service].ts` +- Server/Agent logic → `src/lib/server/[module].ts` +- MCP tools → `src/lib/tools/[tool].ts` +- Configuration → `src/lib/config/[config].ts` +- Game entities → XML in Monaco editor +- Custom ECS components → `src/lib/game/components/[Component].ts` +- Custom systems → `src/lib/game/systems/[System].ts` diff --git a/llms.txt b/llms.txt new file mode 100644 index 0000000000000000000000000000000000000000..c698c77e98379e5301037cab12529120b7dcd532 --- /dev/null +++ b/llms.txt @@ -0,0 +1,1107 @@ +# VibeGame + +A 3D game engine with declarative XML syntax and ECS architecture. Start playing immediately with automatic player, camera, and lighting - just add a ground to prevent falling. + +## Instant Playable Game + +```html + + + + + + + + + +``` + +This creates a complete game with: +- ✅ Player character (auto-created) +- ✅ Orbital camera (auto-created) +- ✅ Directional + ambient lighting (auto-created) +- ✅ Ground platform (you provide this) +- ✅ WASD movement, mouse camera, space to jump + +## Development Setup + +After installation with `npm create vibegame@latest my-game`: + +```bash +cd my-game +bun dev # Start dev server with hot reload +``` + +### Project Structure +- **TypeScript** - Full TypeScript support with strict type checking +- **src/main.ts** - Entry point for your game +- **index.html** - HTML template with canvas element +- **vite.config.ts** - Build configuration + +### Commands +- `bun dev` - Development server with hot reload +- `bun run build` - Production build +- `bun run preview` - Preview production build +- `bun run check` - TypeScript type checking +- `bun run lint` - Lint code with ESLint +- `bun run format` - Format code with Prettier +- `bun run update` - Update llms.txt after upgrading vibegame + +## Physics Objects + +```xml + + + + + + + + + + + + + +``` + +## CRITICAL: Physics Position vs Transform Position + + +⚠️ **Physics bodies override transform positions!** +Always set position on the body, not the transform, for physics entities. + + +```xml + + + + + + + + +``` + +## ECS Architecture Explained + +Unlike traditional game engines with GameObjects, VibeGame uses Entity-Component-System: + +- **Entities**: Just numbers (IDs), no data or behavior +- **Components**: Pure data containers (position, health, color) +- **Systems**: Functions that process entities with specific components + +```typescript +// Component = Data only +const Health = GAME.defineComponent({ + current: GAME.Types.f32, + max: GAME.Types.f32 +}); + +// System = Logic only +const DamageSystem: GAME.System = { + update: (state) => { + const entities = GAME.defineQuery([Health])(state.world); + for (const entity of entities) { + Health.current[entity] -= 1 * state.time.delta; + if (Health.current[entity] <= 0) { + state.destroyEntity(entity); + } + } + } +}; +``` + +## What's Auto-Created (Game Engine Defaults) + +The engine automatically creates these if missing: +1. **Player** - Character with physics, controls, and respawn (at 0, 1, 0) +2. **Camera** - Orbital camera following the player +3. **Lighting** - Ambient + directional light with shadows + +You only need to provide: +- **Ground/platforms** - Or the player falls forever +- **Game objects** - Whatever makes your game unique + +### Override Auto-Creation (When Needed) + +While auto-creation is recommended, you can manually create these for customization: + +```xml + + + + + + + + + + + + + +``` + +**Best Practice**: Use auto-creation unless you specifically need custom positions, properties, or multiple instances. The defaults are well-tuned for most games. + +## Common Game Patterns + +### Basic Platformer +```xml + + + + + + + + + + + + + + + + + +``` + +### Collectible Coins (Collision-based) +```xml + + + + + + + + + + + + +``` + +### Physics Playground +```xml + + + + + + + + + + + + + + + + + + +``` + +## Recipe Reference + +| Recipe | Purpose | Key Attributes | Common Use | +|--------|---------|---------------|------------| +| `` | Immovable objects | `pos`, `shape`, `size`, `color` | Grounds, walls, platforms | +| `` | Gravity-affected objects | `pos`, `shape`, `size`, `color`, `mass` | Balls, crates, falling objects | +| `` | Script-controlled physics | `pos`, `shape`, `size`, `color` | Moving platforms, doors | +| `` | Player character | `pos`, `speed`, `jump-height` | Main character (auto-created) | +| `` | Base entity | Any components via attributes | Custom entities | + +### Shape Options +- `box` - Rectangular solid (default) +- `sphere` - Ball shape +- `cylinder` - Cylindrical shape +- `capsule` - Pill shape (good for characters) + +### Size Attribute +- Box: `size="width height depth"` or `size="2 1 2"` +- Sphere: `size="diameter"` or `size="1"` +- Cylinder: `size="diameter height"` or `size="1 2"` +- Broadcast: `size="2"` becomes `size="2 2 2"` + +## How Recipes and Shorthands Work + +### Everything is an Entity +Every XML tag creates an entity. Recipes like `` are just shortcuts for `` with preset components. + +```xml + + + + +``` + +### Component Attributes +Components are declared using bare attributes (no value means "use defaults"): + +```xml + + + + + + + + + + + +``` + +**Important**: Bare attributes like `transform` mean "include this component with default values", NOT "empty" or "disabled". + +### Automatic Shorthand Expansion +Shorthands expand to ANY component with matching properties: + +```xml + + + + + + + + + + + + + +``` + +### Recipe Internals +Recipes are registered component bundles with defaults: + +```xml + + + collider + renderer + respawn +> + + + + + + + collider + renderer="color: 0xff0000" + respawn +> +``` + +### Common Pitfall: Component Requirements +```xml + + + + + + + + +``` + +### Best Practices Summary +1. **Use recipes** (``, ``, etc.) instead of raw `` tags +2. **Use shorthands** (`pos`, `size`, `color`) for cleaner code +3. **Override only what you need** - recipes have good defaults +4. **Mix recipes with custom components** - e.g., `` + +## Currently Supported Features + +### ✅ What Works Well +- **Basic platforming** - Jump puzzles, obstacle courses +- **Physics interactions** - Balls, dominoes, stacking +- **Moving platforms** - Via kinematic bodies + tweening +- **Collectibles** - Using collision detection in systems +- **Third-person character control** - WASD + mouse camera +- **Gamepad support** - Xbox/PlayStation controllers +- **Visual effects** - Tweening colors, positions, rotations + +### Example Prompts That Work +- "Create a platformer with moving platforms and collectible coins" +- "Make bouncing balls that collide with walls" +- "Build an obstacle course with rotating platforms" +- "Add falling crates that stack up" +- "Create a simple parkour level" + +## Features Not Yet Built-In + +### ❌ Engine Features Not Available +- **Multiplayer/Networking** - No server sync +- **Sound/Audio** - No audio system yet +- **Save/Load** - No persistence system +- **Inventory** - No item management +- **Dialog/NPCs** - No conversation system +- **AI/Pathfinding** - No enemy AI +- **Particles** - No particle effects +- **Custom shaders** - Fixed rendering pipeline +- **Terrain** - Use box platforms instead + +### ✅ Available Through Web Platform +- **UI/HUD** - Use standard HTML/CSS overlays on the canvas +- **Animations** - GSAP is included for advanced UI animations +- **Score display** → HTML elements positioned over canvas +- **Menus** → Standard web UI (divs, buttons, etc.) + +### Recommended Approaches +- **UI** → Position HTML elements over the canvas with CSS +- **Animations** → Use GSAP for smooth UI transitions +- **Level progression** → Reload with different XML or hide/show worlds +- **Enemy behavior** → Tweened movement patterns +- **Interactions** → Collision detection in custom systems + +## Common Mistakes to Avoid + +### ❌ Forgetting the Ground +```xml + + + + +``` + +### ❌ Setting Transform Position on Physics Objects +```xml + + + + + + + + +``` + +### ❌ Missing World Tag +```xml + + + + + + + +``` + +### ❌ Wrong Physics Type +```xml + + + + + + + + + +``` + +## Custom Components and Systems + +### Creating a Health System +```typescript +import * as GAME from 'vibegame'; + +// Define the component +const Health = GAME.defineComponent({ + current: GAME.Types.f32, + max: GAME.Types.f32 +}); + +// Create the system +const HealthSystem: GAME.System = { + update: (state) => { + const entities = GAME.defineQuery([Health])(state.world); + for (const entity of entities) { + // Regenerate health over time + if (Health.current[entity] < Health.max[entity]) { + Health.current[entity] += 5 * state.time.delta; + } + } + } +}; + +// Bundle as plugin +const HealthPlugin: GAME.Plugin = { + components: { Health }, + systems: [HealthSystem], + config: { + defaults: { + "health": { current: 100, max: 100 } + } + } +}; + +// Use in game +GAME.withPlugin(HealthPlugin).run(); +``` + +### Using in XML +```xml + + + + +``` + +## State API Reference + +Available in all systems via the `state` parameter: + +### Entity Management +- `createEntity(): number` - Create new entity +- `destroyEntity(entity: number)` - Remove entity +- `query(...Components): number[]` - Find entities with components + +### Component Operations +- `addComponent(entity, Component, data?)` - Add component +- `removeComponent(entity, Component)` - Remove component +- `hasComponent(entity, Component): boolean` - Check component +- `getComponent(name: string): Component | null` - Get by name + +### Time +- `time.delta: number` - Frame time in seconds +- `time.elapsed: number` - Total time in seconds +- `time.fixed: number` - Fixed timestep (1/60) + +### Physics Helpers +- `addComponent(entity, ApplyImpulse, {x, y, z})` - One-time push +- `addComponent(entity, ApplyForce, {x, y, z})` - Continuous force +- `addComponent(entity, KinematicMove, {x, y, z})` - Move kinematic + +## Plugin System + +### Using Specific Plugins +```typescript +import * as GAME from 'vibegame'; + +// Start with no plugins +GAME + .withoutDefaultPlugins() + .withPlugin(TransformsPlugin) // Just transforms + .withPlugin(RenderingPlugin) // Add rendering + .withPlugin(PhysicsPlugin) // Add physics + .run(); +``` + +### Default Plugin Bundle +- **RecipesPlugin** - XML parsing and entity creation +- **TransformsPlugin** - Position, rotation, scale, hierarchy +- **RenderingPlugin** - Three.js meshes, lights, camera +- **PhysicsPlugin** - Rapier physics simulation +- **InputPlugin** - Keyboard, mouse, gamepad input +- **OrbitCameraPlugin** - Third-person camera +- **PlayerPlugin** - Character controller +- **TweenPlugin** - Animation system +- **RespawnPlugin** - Fall detection and reset +- **StartupPlugin** - Auto-create player/camera/lights + +## Module Documentation + +### Core +Math utilities for interpolation and 3D transformations. + +### Animation +Procedural character animation with body parts that respond to movement states. + +### Input +Focus-aware input handling for mouse, keyboard, and gamepad with buffered actions. Keyboard input only responds when canvas has focus. + +### Orbit Camera +Orbital camera controller for third-person views and smooth target following. + +### Physics +3D physics simulation with Rapier including rigid bodies, collisions, and character controllers. + +### Player +Complete player character controller with physics movement and jumping. + +### Recipes +Foundation for declarative XML entity creation with parent-child hierarchies and attribute shorthands. + +### Rendering +Three.js rendering pipeline with meshes, lights, and cameras. + +### Respawn +Automatic respawn system that resets entities when falling below Y=-100. + +### Startup +Auto-creates player, camera, and lighting entities at startup if missing. + +### Transforms +3D transforms with position, rotation, scale, and parent-child hierarchies. + +### Tweening +Animates component properties with easing functions and loop modes. + +## Plugin Reference + +### Core + +### Functions + +#### lerp(a, b, t): number +Linear interpolation + +#### slerp(fromX, fromY, fromZ, fromW, toX, toY, toZ, toW, t): Quaternion +Quaternion spherical interpolation + +### Animation + +### Components + +#### AnimatedCharacter +- headEntity: eid +- torsoEntity: eid +- leftArmEntity: eid +- rightArmEntity: eid +- leftLegEntity: eid +- rightLegEntity: eid +- phase: f32 - Walk cycle phase (0-1) +- jumpTime: f32 +- fallTime: f32 +- animationState: ui8 - 0=IDLE, 1=WALKING, 2=JUMPING, 3=FALLING, 4=LANDING +- stateTransition: f32 + +#### HasAnimator +Tag component (no properties) + +### Systems + +#### AnimatedCharacterInitializationSystem +- Group: setup +- Creates body part entities for AnimatedCharacter components + +#### AnimatedCharacterUpdateSystem +- Group: simulation +- Updates character animation based on movement and physics state + +### Input + +### Components + +#### InputState +- moveX: f32 - Horizontal axis (-1 left, 1 right) +- moveY: f32 - Forward/backward (-1 back, 1 forward) +- moveZ: f32 - Vertical axis (-1 down, 1 up) +- lookX: f32 - Mouse delta X +- lookY: f32 - Mouse delta Y +- scrollDelta: f32 - Mouse wheel delta +- jump: ui8 - Jump available (0/1) +- primaryAction: ui8 - Primary action (0/1) +- secondaryAction: ui8 - Secondary action (0/1) +- leftMouse: ui8 - Left button (0/1) +- rightMouse: ui8 - Right button (0/1) +- middleMouse: ui8 - Middle button (0/1) +- jumpBufferTime: f32 +- primaryBufferTime: f32 +- secondaryBufferTime: f32 + +### Systems + +#### InputSystem +- Group: simulation +- Updates InputState components with current input data + +### Functions + +#### setTargetCanvas(canvas: HTMLCanvasElement | null): void +Registers canvas for focus-based keyboard input + +#### consumeJump(): boolean +Consumes buffered jump input + +#### consumePrimary(): boolean +Consumes buffered primary action + +#### consumeSecondary(): boolean +Consumes buffered secondary action + +#### handleMouseMove(event: MouseEvent): void +Processes mouse movement + +#### handleMouseDown(event: MouseEvent): void +Processes mouse button press + +#### handleMouseUp(event: MouseEvent): void +Processes mouse button release + +#### handleWheel(event: WheelEvent): void +Processes mouse wheel + +### Constants + +#### INPUT_CONFIG +Default input mappings and sensitivity settings + +### Orbit Camera + +### Components + +#### OrbitCamera +- target: eid (0) - Target entity ID +- current-yaw: f32 (π) - Current horizontal angle +- current-pitch: f32 (π/6) - Current vertical angle +- current-distance: f32 (4) - Current distance +- target-yaw: f32 (π) - Target horizontal angle +- target-pitch: f32 (π/6) - Target vertical angle +- target-distance: f32 (4) - Target distance +- min-distance: f32 (1) +- max-distance: f32 (25) +- min-pitch: f32 (0) +- max-pitch: f32 (π/2) +- smoothness: f32 (0.5) - Interpolation speed +- offset-x: f32 (0) +- offset-y: f32 (1.25) +- offset-z: f32 (0) + +### Systems + +#### OrbitCameraSystem +- Group: draw +- Updates camera position and rotation around target + +### Recipes + +#### camera +- Creates orbital camera with default settings +- Components: orbit-camera, transform, world-transform, main-camera + +### Physics + +### Constants + +- DEFAULT_GRAVITY: -60 + +### Enums + +#### BodyType +- Dynamic = 0 - Affected by forces +- Fixed = 1 - Immovable static +- KinematicPositionBased = 2 - Script position +- KinematicVelocityBased = 3 - Script velocity + +#### ColliderShape +- Box = 0 +- Sphere = 1 +- Capsule = 2 + +### Components + +#### PhysicsWorld +- gravityX: f32 (0) +- gravityY: f32 (-60) +- gravityZ: f32 (0) + +#### Body +- type: ui8 - BodyType enum (Fixed) +- mass: f32 (1) +- linearDamping: f32 (0) +- angularDamping: f32 (0) +- gravityScale: f32 (1) +- ccd: ui8 (0) +- lockRotX: ui8 (0) +- lockRotY: ui8 (0) +- lockRotZ: ui8 (0) +- posX, posY, posZ: f32 +- rotX, rotY, rotZ, rotW: f32 (rotW=1) +- eulerX, eulerY, eulerZ: f32 +- velX, velY, velZ: f32 +- rotVelX, rotVelY, rotVelZ: f32 + +#### Collider +- shape: ui8 - ColliderShape enum (Box) +- sizeX, sizeY, sizeZ: f32 (1) +- radius: f32 (0.5) +- height: f32 (1) +- friction: f32 (0.5) +- restitution: f32 (0) +- density: f32 (1) +- isSensor: ui8 (0) +- membershipGroups: ui16 (0xffff) +- filterGroups: ui16 (0xffff) +- posOffsetX, posOffsetY, posOffsetZ: f32 +- rotOffsetX, rotOffsetY, rotOffsetZ, rotOffsetW: f32 (rotOffsetW=1) + +#### CharacterController +- offset: f32 (0.08) +- maxSlope: f32 (45°) +- maxSlide: f32 (30°) +- snapDist: f32 (0.5) +- autoStep: ui8 (1) +- maxStepHeight: f32 (0.3) +- minStepWidth: f32 (0.05) +- upX, upY, upZ: f32 (upY=1) +- moveX, moveY, moveZ: f32 +- grounded: ui8 + +#### CharacterMovement +- desiredVelX, desiredVelY, desiredVelZ: f32 +- velocityY: f32 +- actualMoveX, actualMoveY, actualMoveZ: f32 + +#### InterpolatedTransform +- prevPosX, prevPosY, prevPosZ: f32 +- prevRotX, prevRotY, prevRotZ, prevRotW: f32 +- posX, posY, posZ: f32 +- rotX, rotY, rotZ, rotW: f32 + +#### Force/Impulse Components +- ApplyForce: x, y, z (f32) +- ApplyTorque: x, y, z (f32) +- ApplyImpulse: x, y, z (f32) +- ApplyAngularImpulse: x, y, z (f32) +- SetLinearVelocity: x, y, z (f32) +- SetAngularVelocity: x, y, z (f32) +- KinematicMove: x, y, z (f32) +- KinematicRotate: x, y, z, w (f32) + +#### Collision Events +- CollisionEvents: activeEvents (ui8) +- TouchedEvent: other, handle1, handle2 (ui32) +- TouchEndedEvent: other, handle1, handle2 (ui32) + +### Systems + +- PhysicsWorldSystem - Initializes physics world +- PhysicsInitializationSystem - Creates bodies and colliders +- CharacterMovementSystem - Character controller movement +- PhysicsCleanupSystem - Removes physics on entity destroy +- CollisionEventCleanupSystem - Clears collision events +- ApplyForcesSystem - Applies forces +- ApplyTorquesSystem - Applies torques +- ApplyImpulsesSystem - Applies impulses +- ApplyAngularImpulsesSystem - Applies angular impulses +- SetVelocitySystem - Sets velocities +- TeleportationSystem - Instant position changes +- KinematicMovementSystem - Kinematic movement +- PhysicsStepSystem - Steps simulation +- PhysicsRapierSyncSystem - Syncs Rapier to ECS +- PhysicsInterpolationSystem - Interpolates for rendering + +### Functions + +#### initializePhysics(): Promise +Initializes Rapier WASM physics engine + +### Recipes + +- static-part - Immovable physics objects +- dynamic-part - Gravity-affected objects +- kinematic-part - Script-controlled objects + +### Player + +### Components + +#### Player +- speed: f32 (5.3) +- jumpHeight: f32 (2.3) +- rotationSpeed: f32 (10) +- canJump: ui8 (1) +- isJumping: ui8 (0) +- jumpCooldown: f32 (0) +- lastGroundedTime: f32 (0) +- jumpBufferTime: f32 (-10000) +- cameraSensitivity: f32 (0.007) +- cameraZoomSensitivity: f32 (1.5) +- cameraEntity: eid (0) + +### Systems + +#### PlayerMovementSystem +- Group: fixed +- Handles movement, rotation, and jumping from input + +#### PlayerGroundedSystem +- Group: fixed +- Tracks grounded state and jump availability + +#### PlayerCameraLinkingSystem +- Group: simulation +- Links player to orbit camera + +#### PlayerCameraControlSystem +- Group: simulation +- Camera control via mouse input + +### Recipes + +#### player +- Complete player setup with physics +- Components: player, character-movement, transform, world-transform, body, collider, character-controller, input-state, respawn + +### Functions + +#### processInput(moveForward, moveRight, cameraYaw): Vector3 +Converts input to world-space movement + +#### handleJump(entity, jumpPressed, currentTime): number +Processes jump with buffering + +#### updateRotation(entity, inputVector, deltaTime, rotationData): Quaternion +Smooth rotation towards movement + +### Recipes + +### Components + +#### Parent +- entity: i32 - Parent entity ID + +### Functions + +#### parseXMLToEntities(state, xmlContent): EntityCreationResult[] +Converts XML elements to ECS entities with hierarchy + +#### createEntityFromRecipe(state, recipeName, attributes?): number +Creates entity from recipe with attributes + +#### fromEuler(x, y, z): Quaternion +Converts Euler angles (radians) to quaternion + +### Types + +#### EntityCreationResult +- entity: number - Entity ID +- tagName: string - Recipe name +- children: EntityCreationResult[] + +### Recipes + +#### entity +- Base recipe with no default components + +### Property Formats + +- Single value: `transform="scale: 2"` +- Vector3: `transform="pos: 0 5 -3"` +- Broadcast: `transform="scale: 2"` → scale: 2 2 2 +- Euler angles: `transform="euler: 0 45 0"` (degrees) +- Multiple: `transform="pos: 0 5 0; euler: 0 45 0"` +- Shorthands: `pos="0 5 0"` → transform component + +### Rendering + +### Components + +#### Renderer +- shape: ui8 - 0=box, 1=sphere, 2=cylinder, 3=plane +- sizeX, sizeY, sizeZ: f32 (1) +- color: ui32 (0xffffff) +- visible: ui8 (1) + +#### RenderContext +- clearColor: ui32 (0x000000) +- hasCanvas: ui8 + +#### MainCamera +Tag component (no properties) + +#### Ambient +- skyColor: ui32 (0x87ceeb) +- groundColor: ui32 (0x4a4a4a) +- intensity: f32 (0.6) + +#### Directional +- color: ui32 (0xffffff) +- intensity: f32 (1) +- castShadow: ui8 (1) +- shadowMapSize: ui32 (4096) +- directionX: f32 (-1) +- directionY: f32 (2) +- directionZ: f32 (-1) +- distance: f32 (30) + +### Systems + +#### MeshInstanceSystem +- Group: draw +- Synchronizes transforms with Three.js meshes + +#### LightSyncSystem +- Group: draw +- Updates Three.js lights + +#### CameraSyncSystem +- Group: draw +- Updates Three.js camera + +#### WebGLRenderSystem +- Group: draw (last) +- Renders scene to canvas + +### Functions + +#### setCanvasElement(entity, canvas): void +Associates canvas with RenderContext + +### Recipes + +- ambient-light - Ambient hemisphere lighting +- directional-light - Directional light with shadows +- light - Both ambient and directional + +### Respawn + +### Components + +#### Respawn +- posX, posY, posZ: f32 - Spawn position +- eulerX, eulerY, eulerZ: f32 - Spawn rotation (degrees) + +### Systems + +#### RespawnSystem +- Group: simulation +- Resets entities when Y < -100 + +### Startup + +### Systems + +#### LightingStartupSystem +- Group: setup +- Creates default lighting if none exists + +#### CameraStartupSystem +- Group: setup +- Creates main camera if none exists + +#### PlayerStartupSystem +- Group: setup +- Creates player entity if none exists + +#### PlayerCharacterSystem +- Group: setup +- Adds animated character to players + +### Transforms + +### Components + +#### Transform +- posX, posY, posZ: f32 (0) +- rotX, rotY, rotZ, rotW: f32 (rotW=1) - Quaternion +- eulerX, eulerY, eulerZ: f32 (0) - Degrees +- scaleX, scaleY, scaleZ: f32 (1) + +#### WorldTransform +- Same properties as Transform +- Auto-computed from hierarchy (read-only) + +### Systems + +#### TransformHierarchySystem +- Group: simulation (last) +- Syncs euler/quaternion and computes world transforms + +### Tweening + +### Components + +#### Tween +- duration: f32 (1) - Seconds +- elapsed: f32 +- easingIndex: ui8 +- loopMode: ui8 - 0=Once, 1=Loop, 2=PingPong + +#### TweenValue +- source: ui32 - Tween entity +- target: ui32 - Target entity +- componentId: ui32 +- fieldIndex: ui32 +- from: f32 +- to: f32 +- value: f32 - Current value + +### Systems + +#### TweenSystem +- Group: simulation +- Interpolates values with easing and auto-cleanup + +### Functions + +#### createTween(state, entity, target, options): number | null +Animates component property + +### Easing Functions + +- linear +- sine-in, sine-out, sine-in-out +- quad-in, quad-out, quad-in-out +- cubic-in, cubic-out, cubic-in-out +- quart-in, quart-out, quart-in-out +- expo-in, expo-out, expo-in-out +- circ-in, circ-out, circ-in-out +- back-in, back-out, back-in-out +- elastic-in, elastic-out, elastic-in-out +- bounce-in, bounce-out, bounce-in-out + +### Loop Modes + +- once - Play once and destroy +- loop - Repeat indefinitely +- ping-pong - Alternate directions + +### Shorthand Targets + +- rotation - body.eulerX/Y/Z +- at - body.posX/Y/Z +- scale - transform.scaleX/Y/Z + +## API Reference (External Links) + +- [Core](https://dylanebert.github.io/vibegame/reference/core) +- [Animation](https://dylanebert.github.io/vibegame/reference/animation) +- [Input](https://dylanebert.github.io/vibegame/reference/input) +- [Orbit Camera](https://dylanebert.github.io/vibegame/reference/orbit-camera) +- [Physics](https://dylanebert.github.io/vibegame/reference/physics) +- [Player](https://dylanebert.github.io/vibegame/reference/player) +- [Recipes](https://dylanebert.github.io/vibegame/reference/recipes) +- [Rendering](https://dylanebert.github.io/vibegame/reference/rendering) +- [Respawn](https://dylanebert.github.io/vibegame/reference/respawn) +- [Startup](https://dylanebert.github.io/vibegame/reference/startup) +- [Transforms](https://dylanebert.github.io/vibegame/reference/transforms) +- [Tweening](https://dylanebert.github.io/vibegame/reference/tweening) + +## Examples (External Links) + +- [Core](https://dylanebert.github.io/vibegame/examples/core) +- [Animation](https://dylanebert.github.io/vibegame/examples/animation) +- [Input](https://dylanebert.github.io/vibegame/examples/input) +- [Orbit Camera](https://dylanebert.github.io/vibegame/examples/orbit-camera) +- [Physics](https://dylanebert.github.io/vibegame/examples/physics) +- [Player](https://dylanebert.github.io/vibegame/examples/player) +- [Recipes](https://dylanebert.github.io/vibegame/examples/recipes) +- [Rendering](https://dylanebert.github.io/vibegame/examples/rendering) +- [Respawn](https://dylanebert.github.io/vibegame/examples/respawn) +- [Startup](https://dylanebert.github.io/vibegame/examples/startup) +- [Transforms](https://dylanebert.github.io/vibegame/examples/transforms) +- [Tweening](https://dylanebert.github.io/vibegame/examples/tweening) diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..fcea8555c66045561c5f0b88095e0021296d28de --- /dev/null +++ b/package.json @@ -0,0 +1,46 @@ +{ + "name": "vibegame", + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "tsc --noEmit && svelte-check", + "check:ts": "tsc --noEmit", + "check:svelte": "svelte-check", + "update": "cp node_modules/vibegame/llms.txt ./llms.txt && echo '✓ Updated llms.txt from VibeGame'", + "postinstall": "test -f node_modules/vibegame/llms.txt && cp node_modules/vibegame/llms.txt ./llms.txt || true", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "validate": "bun run format:check && bun run lint && bun run check" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@types/ws": "^8.18.1", + "@typescript-eslint/eslint-plugin": "^8.40.0", + "@typescript-eslint/parser": "^8.40.0", + "eslint": "^9.33.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", + "svelte": "^4.2.18", + "svelte-check": "^3.8.4", + "typescript": "^5.6.0", + "vite": "^5.4.10", + "ws": "^8.18.3" + }, + "dependencies": { + "@huggingface/hub": "^2.6.3", + "@huggingface/inference": "^4.8.0", + "@types/node": "^24.3.3", + "gsap": "^3.13.0", + "monaco-editor": "^0.50.0", + "svelte-splitpanes": "^8.0.5", + "vibegame": "^0.1.1" + } +} diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000000000000000000000000000000000000..667d3750931f11bd7a9186c6b32540afaa2e6c18 --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,65 @@ + + + + +
+ + +
+ + diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000000000000000000000000000000000000..0981baa3cdc0b7ec1d65f812907bba9cbc335236 --- /dev/null +++ b/src/app.css @@ -0,0 +1,16 @@ +* { + box-sizing: border-box; +} + +html, +body { + margin: 0; + padding: 0; + height: 100%; + overflow: hidden; +} + +#app { + height: 100vh; + width: 100vw; +} diff --git a/src/context.md b/src/context.md new file mode 100644 index 0000000000000000000000000000000000000000..9b95e3d7649af7ff2f42e6c6224e196f57bdb75f --- /dev/null +++ b/src/context.md @@ -0,0 +1,18 @@ +# src/ + +Main application source code. + +## Structure + +- `main.ts` - Svelte app mount point +- `App.svelte` - Game development environment with view modes +- `app.css` - Global styles + +## Interface + +- **Header**: View toggle (Code/Preview), status indicator, restart button +- **Code mode**: Split view with editor (40%) and game/console (60%) +- **Preview mode**: Full-screen game view +- **Animations**: GSAP transitions (0.2s) for smooth mode switching +- **Auto-reload**: 800ms debounce on code changes +- **Console**: Auto-scroll, message animations, hidden in preview mode diff --git a/src/lib/components/Editor.svelte b/src/lib/components/Editor.svelte new file mode 100644 index 0000000000000000000000000000000000000000..fe6e8bc9a74c53a4439000d58cda1257727f29b7 --- /dev/null +++ b/src/lib/components/Editor.svelte @@ -0,0 +1,128 @@ + + +
+ + diff --git a/src/lib/components/auth/LoginButton.svelte b/src/lib/components/auth/LoginButton.svelte new file mode 100644 index 0000000000000000000000000000000000000000..c1d6dd380a5839dbaf88f1e7a1704991cdc70709 --- /dev/null +++ b/src/lib/components/auth/LoginButton.svelte @@ -0,0 +1,167 @@ + + +
+ {#if authState.loading} +
Loading...
+ {:else if authState.error} +
+ {authState.error} + +
+ {:else if authState.isAuthenticated} + + {:else} + + {/if} +
+ + \ No newline at end of file diff --git a/src/lib/components/auth/context.md b/src/lib/components/auth/context.md new file mode 100644 index 0000000000000000000000000000000000000000..588a1399d3244156066ef24a4c1f2a196c7de255 --- /dev/null +++ b/src/lib/components/auth/context.md @@ -0,0 +1,28 @@ +# Auth Components + +Authentication UI for Hugging Face OAuth + +## Purpose + +Handle user authentication flow and state display + +## Layout + +``` +auth/ +├── context.md # This file +└── LoginButton.svelte # OAuth login button +``` + +## Components + +### LoginButton.svelte + +- Subtle glassmorphic sign-in button with pulse animation +- User info display when authenticated +- Located in header top right + +## Dependencies + +- authStore for authentication state +- GSAP for subtle animations diff --git a/src/lib/components/chat/ChatPanel.svelte b/src/lib/components/chat/ChatPanel.svelte new file mode 100644 index 0000000000000000000000000000000000000000..e2738a378f1d79ef8a274bf47df432ac43eb841c --- /dev/null +++ b/src/lib/components/chat/ChatPanel.svelte @@ -0,0 +1,430 @@ + + +
+
+ {#if !$authStore.isAuthenticated && !$authStore.loading} +
+

Sign in to chat.

+ +
+ {:else} + {#if $agentStore.messages.length === 0 && $isConnected} +
Ready to Chat!
+ {/if} + {#each $agentStore.messages as message} +
+
+ {message.content.trim()} + {#if message.streaming} + + {/if} +
+
+ {/each} + {#if $agentStore.error} +
+ Error: {$agentStore.error} +
+ {/if} + {/if} +
+ +
+