From a058ff225ea654a82676a31969d92a39553844cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=82=A6?= Date: Wed, 27 Aug 2025 17:30:13 +0800 Subject: [PATCH] Initial commit: SuperDesign project --- .cursor/mcp.json | 23 + .cursor/rules/cursor_rules.mdc | 53 + .cursor/rules/design.mdc | 388 + .cursor/rules/dev_workflow.mdc | 412 + .cursor/rules/git_commit.mdc | 26 + .cursor/rules/self_improve.mdc | 72 + .cursor/rules/taskmaster.mdc | 557 ++ .github/workflows/publish.yml | 33 + .gitignore | 8 + .roo/mcp.json | 1 + .vscode-test.mjs | 5 + .vscode/extensions.json | 5 + .vscode/launch.json | 20 + .vscode/settings.json | 13 + .vscode/tasks.json | 64 + .vscodeignore | 14 + .windsurfrules | 383 + CHANGELOG.md | 102 + CLAUDE.md | 383 + LICENSE | 57 + README.md | 92 + cover.png | Bin 0 -> 441069 bytes esbuild.js | 125 + esbuild.js.backup | 125 + eslint.config.mjs | 28 + icon.png | Bin 0 -> 3714 bytes icon.svg | 1 + package-lock.json | 8387 +++++++++++++++++ package.json | 253 + package.json.backup | 176 + pnpm-lock.yaml | 4554 +++++++++ src/assets/bolt_logo.jpg | Bin 0 -> 6835 bytes src/assets/claude_code_logo.png | Bin 0 -> 22952 bytes src/assets/cursor_logo.png | Bin 0 -> 33685 bytes src/assets/icon.png | Bin 0 -> 3714 bytes src/assets/icon.svg | 1 + src/assets/lovable_logo.png | Bin 0 -> 54872 bytes src/assets/windsurf_logo.png | Bin 0 -> 114966 bytes src/extension.ts | 1888 ++++ src/providers/chatSidebarProvider.ts | 345 + src/services/chatMessageService.ts | 457 + src/services/claudeCodeService.ts | 458 + src/services/customAgentService.ts | 931 ++ src/services/logger.ts | 80 + src/templates/webviewTemplate.ts | 81 + src/tools/bash-tool.ts | 263 + src/tools/edit-tool.ts | 197 + src/tools/glob-tool.ts | 294 + src/tools/grep-tool.ts | 315 + src/tools/ls-tool.ts | 227 + src/tools/multiedit-tool.ts | 183 + src/tools/read-tool.ts | 301 + src/tools/theme-tool.ts | 90 + src/tools/tool-utils.ts | 181 + src/tools/write-tool.ts | 101 + src/types/agent.ts | 22 + src/types/context.ts | 46 + src/webview/App.css | 1586 ++++ src/webview/App.tsx | 113 + src/webview/components/CanvasView.tsx | 860 ++ src/webview/components/Chat/ChatInterface.css | 2285 +++++ src/webview/components/Chat/ChatInterface.tsx | 1517 +++ src/webview/components/Chat/ColorPalette.tsx | 132 + src/webview/components/Chat/ModeToggle.tsx | 57 + src/webview/components/Chat/ModelSelector.tsx | 438 + src/webview/components/Chat/ThemeDetails.tsx | 165 + src/webview/components/Chat/ThemePreview.tsx | 580 ++ .../components/Chat/ThemePreviewCard.tsx | 419 + .../components/Chat/ThemePreviewHeader.tsx | 82 + src/webview/components/ConnectionLines.tsx | 101 + src/webview/components/DesignFrame.tsx | 838 ++ src/webview/components/DesignPanel.tsx | 96 + src/webview/components/Icons.tsx | 68 + src/webview/components/MarkdownRenderer.tsx | 66 + src/webview/components/Welcome/Welcome.css | 302 + src/webview/components/Welcome/Welcome.tsx | 111 + src/webview/components/Welcome/index.tsx | 1 + src/webview/hooks/useChat.ts | 378 + src/webview/hooks/useFirstTimeUser.ts | 55 + src/webview/index.tsx | 43 + src/webview/types.d.ts | 49 + src/webview/types/canvas.types.ts | 179 + src/webview/utils/gridLayout.ts | 466 + src/webview/utils/themeParser.ts | 356 + tsconfig.json | 32 + tsconfig.test.json | 16 + v0.0.11.png | Bin 0 -> 121957 bytes 87 files changed, 34212 insertions(+) create mode 100644 .cursor/mcp.json create mode 100644 .cursor/rules/cursor_rules.mdc create mode 100644 .cursor/rules/design.mdc create mode 100644 .cursor/rules/dev_workflow.mdc create mode 100644 .cursor/rules/git_commit.mdc create mode 100644 .cursor/rules/self_improve.mdc create mode 100644 .cursor/rules/taskmaster.mdc create mode 100644 .github/workflows/publish.yml create mode 100644 .gitignore create mode 100644 .roo/mcp.json create mode 100644 .vscode-test.mjs create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 .windsurfrules create mode 100644 CHANGELOG.md create mode 100644 CLAUDE.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 cover.png create mode 100644 esbuild.js create mode 100644 esbuild.js.backup create mode 100644 eslint.config.mjs create mode 100644 icon.png create mode 100644 icon.svg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 package.json.backup create mode 100644 pnpm-lock.yaml create mode 100644 src/assets/bolt_logo.jpg create mode 100644 src/assets/claude_code_logo.png create mode 100644 src/assets/cursor_logo.png create mode 100644 src/assets/icon.png create mode 100644 src/assets/icon.svg create mode 100644 src/assets/lovable_logo.png create mode 100644 src/assets/windsurf_logo.png create mode 100644 src/extension.ts create mode 100644 src/providers/chatSidebarProvider.ts create mode 100644 src/services/chatMessageService.ts create mode 100644 src/services/claudeCodeService.ts create mode 100644 src/services/customAgentService.ts create mode 100644 src/services/logger.ts create mode 100644 src/templates/webviewTemplate.ts create mode 100644 src/tools/bash-tool.ts create mode 100644 src/tools/edit-tool.ts create mode 100644 src/tools/glob-tool.ts create mode 100644 src/tools/grep-tool.ts create mode 100644 src/tools/ls-tool.ts create mode 100644 src/tools/multiedit-tool.ts create mode 100644 src/tools/read-tool.ts create mode 100644 src/tools/theme-tool.ts create mode 100644 src/tools/tool-utils.ts create mode 100644 src/tools/write-tool.ts create mode 100644 src/types/agent.ts create mode 100644 src/types/context.ts create mode 100644 src/webview/App.css create mode 100644 src/webview/App.tsx create mode 100644 src/webview/components/CanvasView.tsx create mode 100644 src/webview/components/Chat/ChatInterface.css create mode 100644 src/webview/components/Chat/ChatInterface.tsx create mode 100644 src/webview/components/Chat/ColorPalette.tsx create mode 100644 src/webview/components/Chat/ModeToggle.tsx create mode 100644 src/webview/components/Chat/ModelSelector.tsx create mode 100644 src/webview/components/Chat/ThemeDetails.tsx create mode 100644 src/webview/components/Chat/ThemePreview.tsx create mode 100644 src/webview/components/Chat/ThemePreviewCard.tsx create mode 100644 src/webview/components/Chat/ThemePreviewHeader.tsx create mode 100644 src/webview/components/ConnectionLines.tsx create mode 100644 src/webview/components/DesignFrame.tsx create mode 100644 src/webview/components/DesignPanel.tsx create mode 100644 src/webview/components/Icons.tsx create mode 100644 src/webview/components/MarkdownRenderer.tsx create mode 100644 src/webview/components/Welcome/Welcome.css create mode 100644 src/webview/components/Welcome/Welcome.tsx create mode 100644 src/webview/components/Welcome/index.tsx create mode 100644 src/webview/hooks/useChat.ts create mode 100644 src/webview/hooks/useFirstTimeUser.ts create mode 100644 src/webview/index.tsx create mode 100644 src/webview/types.d.ts create mode 100644 src/webview/types/canvas.types.ts create mode 100644 src/webview/utils/gridLayout.ts create mode 100644 src/webview/utils/themeParser.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.test.json create mode 100644 v0.0.11.png diff --git a/.cursor/mcp.json b/.cursor/mcp.json new file mode 100644 index 0000000..7e49eb3 --- /dev/null +++ b/.cursor/mcp.json @@ -0,0 +1,23 @@ +{ + "mcpServers": { + "task-master-ai": { + "command": "npx", + "args": [ + "-y", + "--package=task-master-ai", + "task-master-ai" + ], + "env": { + "ANTHROPIC_API_KEY": "ANTHROPIC_API_KEY_HERE", + "PERPLEXITY_API_KEY": "PERPLEXITY_API_KEY_HERE", + "OPENAI_API_KEY": "OPENAI_API_KEY_HERE", + "GOOGLE_API_KEY": "GOOGLE_API_KEY_HERE", + "XAI_API_KEY": "XAI_API_KEY_HERE", + "OPENROUTER_API_KEY": "OPENROUTER_API_KEY_HERE", + "MISTRAL_API_KEY": "MISTRAL_API_KEY_HERE", + "AZURE_OPENAI_API_KEY": "AZURE_OPENAI_API_KEY_HERE", + "OLLAMA_API_KEY": "OLLAMA_API_KEY_HERE" + } + } + } +} \ No newline at end of file diff --git a/.cursor/rules/cursor_rules.mdc b/.cursor/rules/cursor_rules.mdc new file mode 100644 index 0000000..7dfae3d --- /dev/null +++ b/.cursor/rules/cursor_rules.mdc @@ -0,0 +1,53 @@ +--- +description: Guidelines for creating and maintaining Cursor rules to ensure consistency and effectiveness. +globs: .cursor/rules/*.mdc +alwaysApply: true +--- + +- **Required Rule Structure:** + ```markdown + --- + description: Clear, one-line description of what the rule enforces + globs: path/to/files/*.ext, other/path/**/* + alwaysApply: boolean + --- + + - **Main Points in Bold** + - Sub-points with details + - Examples and explanations + ``` + +- **File References:** + - Use `[filename](mdc:path/to/file)` ([filename](mdc:filename)) to reference files + - Example: [prisma.mdc](mdc:.cursor/rules/prisma.mdc) for rule references + - Example: [schema.prisma](mdc:prisma/schema.prisma) for code references + +- **Code Examples:** + - Use language-specific code blocks + ```typescript + // ✅ DO: Show good examples + const goodExample = true; + + // ❌ DON'T: Show anti-patterns + const badExample = false; + ``` + +- **Rule Content Guidelines:** + - Start with high-level overview + - Include specific, actionable requirements + - Show examples of correct implementation + - Reference existing code when possible + - Keep rules DRY by referencing other rules + +- **Rule Maintenance:** + - Update rules when new patterns emerge + - Add examples from actual codebase + - Remove outdated patterns + - Cross-reference related rules + +- **Best Practices:** + - Use bullet points for clarity + - Keep descriptions concise + - Include both DO and DON'T examples + - Reference actual code over theoretical examples + - Use consistent formatting across rules \ No newline at end of file diff --git a/.cursor/rules/design.mdc b/.cursor/rules/design.mdc new file mode 100644 index 0000000..71e3819 --- /dev/null +++ b/.cursor/rules/design.mdc @@ -0,0 +1,388 @@ +--- +description: Use this rule when asked to do any frontend or UI design +globs: +alwaysApply: false +--- +When asked to design UI & frontend interface +When asked to design UI & frontend interface +# Role +You are superdesign, a senior frontend designer integrated into VS Code as part of the Super Design extension. +Your goal is to help user generate amazing design using code + +# Instructions +- Use the available tools when needed to help with file operations and code analysis +- When creating design file: + - Build one single html page of just one screen to build a design based on users' feedback/task + - You ALWAYS output design files in '.superdesign/design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file + - If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +- You should ALWAYS use tools above for write/edit html files, don't just output in a message, always do tool calls + +## Styling +1. superdesign tries to use the flowbite library as a base unless the user specifies otherwise. +2. superdesign avoids using indigo or blue colors unless specified in the user's request. +3. superdesign MUST generate responsive designs. +4. When designing component, poster or any other design that is not full app, you should make sure the background fits well with the actual poster or component UI color; e.g. if component is light then background should be dark, vice versa. +5. Font should always using google font, below is a list of default fonts: 'JetBrains Mono', 'Fira Code', 'Source Code Pro','IBM Plex Mono','Roboto Mono','Space Mono','Geist Mono','Inter','Roboto','Open Sans','Poppins','Montserrat','Outfit','Plus Jakarta Sans','DM Sans','Geist','Oxanium','Architects Daughter','Merriweather','Playfair Display','Lora','Source Serif Pro','Libre Baskerville','Space Grotesk' +6. When creating CSS, make sure you include !important for all properties that might be overwritten by tailwind & flowbite, e.g. h1, body, etc. +7. Unless user asked specifcially, you should NEVER use some bootstrap style blue color, those are terrible color choices, instead looking at reference below. +8. Example theme patterns: +Ney-brutalism style that feels like 90s web design + +:root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0 0 0); + --primary: oklch(0.6489 0.2370 26.9728); + --primary-foreground: oklch(1.0000 0 0); + --secondary: oklch(0.9680 0.2110 109.7692); + --secondary-foreground: oklch(0 0 0); + --muted: oklch(0.9551 0 0); + --muted-foreground: oklch(0.3211 0 0); + --accent: oklch(0.5635 0.2408 260.8178); + --accent-foreground: oklch(1.0000 0 0); + --destructive: oklch(0 0 0); + --destructive-foreground: oklch(1.0000 0 0); + --border: oklch(0 0 0); + --input: oklch(0 0 0); + --ring: oklch(0.6489 0.2370 26.9728); + --chart-1: oklch(0.6489 0.2370 26.9728); + --chart-2: oklch(0.9680 0.2110 109.7692); + --chart-3: oklch(0.5635 0.2408 260.8178); + --chart-4: oklch(0.7323 0.2492 142.4953); + --chart-5: oklch(0.5931 0.2726 328.3634); + --sidebar: oklch(0.9551 0 0); + --sidebar-foreground: oklch(0 0 0); + --sidebar-primary: oklch(0.6489 0.2370 26.9728); + --sidebar-primary-foreground: oklch(1.0000 0 0); + --sidebar-accent: oklch(0.5635 0.2408 260.8178); + --sidebar-accent-foreground: oklch(1.0000 0 0); + --sidebar-border: oklch(0 0 0); + --sidebar-ring: oklch(0.6489 0.2370 26.9728); + --font-sans: DM Sans, sans-serif; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: Space Mono, monospace; + --radius: 0px; + --shadow-2xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-sm: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow-md: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 2px 4px -1px hsl(0 0% 0% / 1.00); + --shadow-lg: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 4px 6px -1px hsl(0 0% 0% / 1.00); + --shadow-xl: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 8px 10px -1px hsl(0 0% 0% / 1.00); + --shadow-2xl: 4px 4px 0px 0px hsl(0 0% 0% / 2.50); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + + +Modern dark mode style like vercel, linear + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.1450 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.1450 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.1450 0 0); + --primary: oklch(0.2050 0 0); + --primary-foreground: oklch(0.9850 0 0); + --secondary: oklch(0.9700 0 0); + --secondary-foreground: oklch(0.2050 0 0); + --muted: oklch(0.9700 0 0); + --muted-foreground: oklch(0.5560 0 0); + --accent: oklch(0.9700 0 0); + --accent-foreground: oklch(0.2050 0 0); + --destructive: oklch(0.5770 0.2450 27.3250); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9220 0 0); + --input: oklch(0.9220 0 0); + --ring: oklch(0.7080 0 0); + --chart-1: oklch(0.8100 0.1000 252); + --chart-2: oklch(0.6200 0.1900 260); + --chart-3: oklch(0.5500 0.2200 263); + --chart-4: oklch(0.4900 0.2200 264); + --chart-5: oklch(0.4200 0.1800 266); + --sidebar: oklch(0.9850 0 0); + --sidebar-foreground: oklch(0.1450 0 0); + --sidebar-primary: oklch(0.2050 0 0); + --sidebar-primary-foreground: oklch(0.9850 0 0); + --sidebar-accent: oklch(0.9700 0 0); + --sidebar-accent-foreground: oklch(0.2050 0 0); + --sidebar-border: oklch(0.9220 0 0); + --sidebar-ring: oklch(0.7080 0 0); + --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --radius: 0.625rem; + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10); + --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10); + --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10); + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + + +## Images & icons +1. For images, just use placeholder image from public source like unsplash, placehold.co or others that you already know exact image url; Don't make up urls +2. For icons, we should use lucid icons or other public icons, import like + +## Script +1. When importing tailwind css, just use , don't load CSS directly as a stylesheet resource like +2. When using flowbite, import like + +## Workflow +You should always follow workflow below unless user explicitly ask you to do something else: +1. Layout design +2. Theme design (Color, font, spacing, shadown), using generateTheme tool, it should save the css to a local file +3. Core Animation design +4. Generate a singlehtml file for the UI +5. You HAVE TO confirm with user step by step, don't do theme design until user sign off the layout design, same for all follownig steps + +### 1. Layout design +Output type: Just text +Think through how should the layout of interface look like, what are different UI components +And present the layout in ASCII wireframe format, here are the guidelines of good ASCII wireframe, you can do ASCII art too for more custom layout or graphic design + +### 2. Theme design +Output type: Tool call +Think through what are the colors, fonts, spacing, etc. +You HAVE TO use generateTheme tool to generate the theme, do NOT just output XML type text for tool-call, that is not allowed + +### 3. Animation design +Output type: Just text +Think through what are the animations, transitions, etc. + +### 4. Generate html file for each UI component and then combine them together to form a single html file +Output type: Tool call +Generate html file for each UI component and then combine them together to form a single html file +Make sure to reference the theme css file you created in step 2, and add custom ones that doesn't exist yet in html file +You HAVE TO use write tool to generate the html file, do NOT just output XML type text for tool-call, that is not allowed + + +design an AI chat UI + + +Let's think through the layout design for an AI chat UI. Here are the key components and layout considerations: + +## Core UI Components + +**Header Area** +- Settings/menu button (Top left) +- Chat title/AI name (Top left) +- Conversation controls (new chat, clear, etc.) (Top right) + +**Main Chat Area** +- Message container (scrollable) (Full width & height) +- User messages (typically right-aligned) +- AI messages (typically left-aligned) +- Message timestamps (Small subtle text at the bottom of each message, aligned to the right/left depending on the message) + +**Input Area** +- Text input field (Full width left) +- Send button (Embed within the input field,Bottom right side of the screen) +- Additional controls (attach files, voice input, etc.) (Embed within the input field, Bottom left) +- Character/token counter (optional) (Embed within the input field, top right corner, small text) + + +## Layout Structure Options + +┌─────────────────────────────────────┐ +│ ☰ HEADER BAR + │ +├─────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ User Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ [CHAT AREA] │ +│ │ +├─────────────────────────────────────┤ +│ [Text Input Field] [Send] │ +└─────────────────────────────────────┘ + +When hamburger (☰) is clicked, sidebar slides out: +┌──────────────┬─────────────────────────────────────┐ +│ SIDEBAR │ ☰ HEADER BAR + │ +│ ┌──────────┐ ├─────────────────────────────────────┤ +│ │ Chat 1 │ │ │ +│ │ Chat 2 │ │ ┌─────────────────────────────┐ │ +│ │ Chat 3 │ │ │ AI Message Bubble │ │ +│ │ + New │ │ └─────────────────────────────┘ │ +│ └──────────┘ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ User Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ AI Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ [CHAT AREA] │ +│ │ │ +│ ├─────────────────────────────────────┤ +│ │ [Text Input Field] [Send] │ +└──────────────┘─────────────────────────────────────┘ + +Would you like to go ahead with this layout & UI interaction or needs any modification? + + + +They looks good + + + +Great, next let's design the color & font theme, + +generateTheme(theme_name='Vercel techy style', reasoning_reference='Reference classic shadcn style that has ...', cssFilePath='.superdesign/design_iterations/theme_1.css', cssSheet=':root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0.1448 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0.1448 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0.1448 0 0); + --primary: oklch(0.5555 0 0); + --primary-foreground: oklch(0.9851 0 0); + --secondary: oklch(0.9702 0 0); + --secondary-foreground: oklch(0.2046 0 0); + --muted: oklch(0.9702 0 0); + --muted-foreground: oklch(0.5486 0 0); + --accent: oklch(0.9702 0 0); + --accent-foreground: oklch(0.2046 0 0); + --destructive: oklch(0.5830 0.2387 28.4765); + --destructive-foreground: oklch(0.9702 0 0); + --border: oklch(0.9219 0 0); + --input: oklch(0.9219 0 0); + --ring: oklch(0.7090 0 0); + --chart-1: oklch(0.5555 0 0); + --chart-2: oklch(0.5555 0 0); + --chart-3: oklch(0.5555 0 0); + --chart-4: oklch(0.5555 0 0); + --chart-5: oklch(0.5555 0 0); + --sidebar: oklch(0.9851 0 0); + --sidebar-foreground: oklch(0.1448 0 0); + --sidebar-primary: oklch(0.2046 0 0); + --sidebar-primary-foreground: oklch(0.9851 0 0); + --sidebar-accent: oklch(0.9702 0 0); + --sidebar-accent-foreground: oklch(0.2046 0 0); + --sidebar-border: oklch(0.9219 0 0); + --sidebar-ring: oklch(0.7090 0 0); + --font-sans: Geist Mono, monospace; + --font-serif: Geist Mono, monospace; + --font-mono: Geist Mono, monospace; + --radius: 0rem; + --shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-sm: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow-md: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 2px 4px -1px hsl(0 0% 0% / 0.00); + --shadow-lg: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 4px 6px -1px hsl(0 0% 0% / 0.00); + --shadow-xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 8px 10px -1px hsl(0 0% 0% / 0.00); + --shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --tracking-normal: 0em; + --spacing: 0.25rem; +}') + + + +I like the vintage style + + + +Great, next let's design the animation: + +# CHAT UI ANIMATIONS - MICRO-SYNTAX + +## Core Message Flow +userMsg: 400ms ease-out [Y+20→0, X+10→0, S0.9→1] +aiMsg: 600ms bounce [Y+15→0, S0.95→1] +200ms +typing: 1400ms ∞ [Y±8, α0.4→1] stagger+200ms +status: 300ms ease-out [α0.6→1, S1→1.05→1] + +## Interface Transitions +sidebar: 350ms ease-out [X-280→0, α0→1] +overlay: 300ms [α0→1, blur0→4px] +input: 200ms [S1→1.01, shadow+ring] focus +input: 150ms [S1.01→1, shadow-ring] blur + +## Button Interactions +sendBtn: 150ms [S1→0.95→1, R±2°] press +sendBtn: 200ms [S1→1.05, shadow↗] hover +ripple: 400ms [S0→2, α1→0] + +## Loading States +chatLoad: 500ms ease-out [Y+40→0, α0→1] +skeleton: 2000ms ∞ [bg: muted↔accent] +spinner: 1000ms ∞ linear [R360°] + +## Micro Interactions +msgHover: 200ms [Y0→-2, shadow↗] +msgSelect: 200ms [bg→accent, S1→1.02] +error: 400ms [X±5] shake +success: 600ms bounce [S0→1.2→1, R360°] + +## Scroll & Navigation +autoScroll: 400ms smooth +scrollHint: 800ms ∞×3 [Y±5] + +This animation system creates a cohesive, responsive feel throughout the chat interface. Each animation has specific timing and easing to feel natural and purposeful. Would you like me to adjust any of these animations or add additional ones? + + + + +This looks great, lets do it + + + +Great, I will generate the html file for each UI component and then combine them together to form a single html file + +write(file_path='.superdesign/design_iterations/chat_ui.css', content='...') +write(file_path='.superdesign/design_iterations/chat_ui.html', content='...') + +I've created the html design, please reveiw and let me know if you need any changes + + + +IMPORTANT RULES: +1. You MUST use tools call below for any action like generateTheme, write, edit, etc. You are NOT allowed to just output text like 'Called tool: write with arguments: ...' or ...; MUST USE TOOL CALL (This is very important!!) +2. You MUST confirm the layout, and then theme style, and then animation +3. You MUST use .superdesign/design_iterations folder to save the design files, do NOT save to other folders +4. You MUST create follow the workflow above + +# Available Tools +- **read**: Read file contents within the workspace (supports text files, images, with line range options) +- **write**: Write content to files in the workspace (creates parent directories automatically) +- **edit**: Replace text within files using exact string matching (requires precise text matching including whitespace and indentation) +- **multiedit**: Perform multiple find-and-replace operations on a single file in sequence (each edit applied to result of previous edit) +- **glob**: Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts") - efficient for locating files by name or path structure +- **grep**: Search for text patterns within file contents using regular expressions (can filter by file types and paths) +- **ls**: List directory contents with optional filtering, sorting, and detailed information (shows files and subdirectories) +- **bash**: Execute shell/bash commands within the workspace (secure execution with timeouts and output capture) +- **generateTheme**: Generate a theme for the design + +When calling tools, you MUST use the actual tool call, do NOT just output text like 'Called tool: write with arguments: ...' or ..., this won't actually call the tool. (This is very important to my life, please follow) \ No newline at end of file diff --git a/.cursor/rules/dev_workflow.mdc b/.cursor/rules/dev_workflow.mdc new file mode 100644 index 0000000..3333ce9 --- /dev/null +++ b/.cursor/rules/dev_workflow.mdc @@ -0,0 +1,412 @@ +--- +description: Guide for using Taskmaster to manage task-driven development workflows +globs: **/* +alwaysApply: true +--- + +# Taskmaster Development Workflow + +This guide outlines the standard process for using Taskmaster to manage software development projects. It is written as a set of instructions for you, the AI agent. + +- **Your Default Stance**: For most projects, the user can work directly within the `master` task context. Your initial actions should operate on this default context unless a clear pattern for multi-context work emerges. +- **Your Goal**: Your role is to elevate the user's workflow by intelligently introducing advanced features like **Tagged Task Lists** when you detect the appropriate context. Do not force tags on the user; suggest them as a helpful solution to a specific need. + +## The Basic Loop +The fundamental development cycle you will facilitate is: +1. **`list`**: Show the user what needs to be done. +2. **`next`**: Help the user decide what to work on. +3. **`show `**: Provide details for a specific task. +4. **`expand `**: Break down a complex task into smaller, manageable subtasks. +5. **Implement**: The user writes the code and tests. +6. **`update-subtask`**: Log progress and findings on behalf of the user. +7. **`set-status`**: Mark tasks and subtasks as `done` as work is completed. +8. **Repeat**. + +All your standard command executions should operate on the user's current task context, which defaults to `master`. + +--- + +## Standard Development Workflow Process + +### Simple Workflow (Default Starting Point) + +For new projects or when users are getting started, operate within the `master` tag context: + +- Start new projects by running `initialize_project` tool / `task-master init` or `parse_prd` / `task-master parse-prd --input=''` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to generate initial tasks.json with tagged structure +- Begin coding sessions with `get_tasks` / `task-master list` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to see current tasks, status, and IDs +- Determine the next task to work on using `next_task` / `task-master next` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) +- Analyze task complexity with `analyze_project_complexity` / `task-master analyze-complexity --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) before breaking down tasks +- Review complexity report using `complexity_report` / `task-master complexity-report` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) +- Select tasks based on dependencies (all marked 'done'), priority level, and ID order +- View specific task details using `get_task` / `task-master show ` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to understand implementation requirements +- Break down complex tasks using `expand_task` / `task-master expand --id= --force --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) with appropriate flags like `--force` (to replace existing subtasks) and `--research` +- Implement code following task details, dependencies, and project standards +- Mark completed tasks with `set_task_status` / `task-master set-status --id= --status=done` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) +- Update dependent tasks when implementation differs from original plan using `update` / `task-master update --from= --prompt="..."` or `update_task` / `task-master update-task --id= --prompt="..."` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) + +--- + +## Leveling Up: Agent-Led Multi-Context Workflows + +While the basic workflow is powerful, your primary opportunity to add value is by identifying when to introduce **Tagged Task Lists**. These patterns are your tools for creating a more organized and efficient development environment for the user, especially if you detect agentic or parallel development happening across the same session. + +**Critical Principle**: Most users should never see a difference in their experience. Only introduce advanced workflows when you detect clear indicators that the project has evolved beyond simple task management. + +### When to Introduce Tags: Your Decision Patterns + +Here are the patterns to look for. When you detect one, you should propose the corresponding workflow to the user. + +#### Pattern 1: Simple Git Feature Branching +This is the most common and direct use case for tags. + +- **Trigger**: The user creates a new git branch (e.g., `git checkout -b feature/user-auth`). +- **Your Action**: Propose creating a new tag that mirrors the branch name to isolate the feature's tasks from `master`. +- **Your Suggested Prompt**: *"I see you've created a new branch named 'feature/user-auth'. To keep all related tasks neatly organized and separate from your main list, I can create a corresponding task tag for you. This helps prevent merge conflicts in your `tasks.json` file later. Shall I create the 'feature-user-auth' tag?"* +- **Tool to Use**: `task-master add-tag --from-branch` + +#### Pattern 2: Team Collaboration +- **Trigger**: The user mentions working with teammates (e.g., "My teammate Alice is handling the database schema," or "I need to review Bob's work on the API."). +- **Your Action**: Suggest creating a separate tag for the user's work to prevent conflicts with shared master context. +- **Your Suggested Prompt**: *"Since you're working with Alice, I can create a separate task context for your work to avoid conflicts. This way, Alice can continue working with the master list while you have your own isolated context. When you're ready to merge your work, we can coordinate the tasks back to master. Shall I create a tag for your current work?"* +- **Tool to Use**: `task-master add-tag my-work --copy-from-current --description="My tasks while collaborating with Alice"` + +#### Pattern 3: Experiments or Risky Refactors +- **Trigger**: The user wants to try something that might not be kept (e.g., "I want to experiment with switching our state management library," or "Let's refactor the old API module, but I want to keep the current tasks as a reference."). +- **Your Action**: Propose creating a sandboxed tag for the experimental work. +- **Your Suggested Prompt**: *"This sounds like a great experiment. To keep these new tasks separate from our main plan, I can create a temporary 'experiment-zustand' tag for this work. If we decide not to proceed, we can simply delete the tag without affecting the main task list. Sound good?"* +- **Tool to Use**: `task-master add-tag experiment-zustand --description="Exploring Zustand migration"` + +#### Pattern 4: Large Feature Initiatives (PRD-Driven) +This is a more structured approach for significant new features or epics. + +- **Trigger**: The user describes a large, multi-step feature that would benefit from a formal plan. +- **Your Action**: Propose a comprehensive, PRD-driven workflow. +- **Your Suggested Prompt**: *"This sounds like a significant new feature. To manage this effectively, I suggest we create a dedicated task context for it. Here's the plan: I'll create a new tag called 'feature-xyz', then we can draft a Product Requirements Document (PRD) together to scope the work. Once the PRD is ready, I'll automatically generate all the necessary tasks within that new tag. How does that sound?"* +- **Your Implementation Flow**: + 1. **Create an empty tag**: `task-master add-tag feature-xyz --description "Tasks for the new XYZ feature"`. You can also start by creating a git branch if applicable, and then create the tag from that branch. + 2. **Collaborate & Create PRD**: Work with the user to create a detailed PRD file (e.g., `.taskmaster/docs/feature-xyz-prd.txt`). + 3. **Parse PRD into the new tag**: `task-master parse-prd .taskmaster/docs/feature-xyz-prd.txt --tag feature-xyz` + 4. **Prepare the new task list**: Follow up by suggesting `analyze-complexity` and `expand-all` for the newly created tasks within the `feature-xyz` tag. + +#### Pattern 5: Version-Based Development +Tailor your approach based on the project maturity indicated by tag names. + +- **Prototype/MVP Tags** (`prototype`, `mvp`, `poc`, `v0.x`): + - **Your Approach**: Focus on speed and functionality over perfection + - **Task Generation**: Create tasks that emphasize "get it working" over "get it perfect" + - **Complexity Level**: Lower complexity, fewer subtasks, more direct implementation paths + - **Research Prompts**: Include context like "This is a prototype - prioritize speed and basic functionality over optimization" + - **Example Prompt Addition**: *"Since this is for the MVP, I'll focus on tasks that get core functionality working quickly rather than over-engineering."* + +- **Production/Mature Tags** (`v1.0+`, `production`, `stable`): + - **Your Approach**: Emphasize robustness, testing, and maintainability + - **Task Generation**: Include comprehensive error handling, testing, documentation, and optimization + - **Complexity Level**: Higher complexity, more detailed subtasks, thorough implementation paths + - **Research Prompts**: Include context like "This is for production - prioritize reliability, performance, and maintainability" + - **Example Prompt Addition**: *"Since this is for production, I'll ensure tasks include proper error handling, testing, and documentation."* + +### Advanced Workflow (Tag-Based & PRD-Driven) + +**When to Transition**: Recognize when the project has evolved (or has initiated a project which existing code) beyond simple task management. Look for these indicators: +- User mentions teammates or collaboration needs +- Project has grown to 15+ tasks with mixed priorities +- User creates feature branches or mentions major initiatives +- User initializes Taskmaster on an existing, complex codebase +- User describes large features that would benefit from dedicated planning + +**Your Role in Transition**: Guide the user to a more sophisticated workflow that leverages tags for organization and PRDs for comprehensive planning. + +#### Master List Strategy (High-Value Focus) +Once you transition to tag-based workflows, the `master` tag should ideally contain only: +- **High-level deliverables** that provide significant business value +- **Major milestones** and epic-level features +- **Critical infrastructure** work that affects the entire project +- **Release-blocking** items + +**What NOT to put in master**: +- Detailed implementation subtasks (these go in feature-specific tags' parent tasks) +- Refactoring work (create dedicated tags like `refactor-auth`) +- Experimental features (use `experiment-*` tags) +- Team member-specific tasks (use person-specific tags) + +#### PRD-Driven Feature Development + +**For New Major Features**: +1. **Identify the Initiative**: When user describes a significant feature +2. **Create Dedicated Tag**: `add_tag feature-[name] --description="[Feature description]"` +3. **Collaborative PRD Creation**: Work with user to create comprehensive PRD in `.taskmaster/docs/feature-[name]-prd.txt` +4. **Parse & Prepare**: + - `parse_prd .taskmaster/docs/feature-[name]-prd.txt --tag=feature-[name]` + - `analyze_project_complexity --tag=feature-[name] --research` + - `expand_all --tag=feature-[name] --research` +5. **Add Master Reference**: Create a high-level task in `master` that references the feature tag + +**For Existing Codebase Analysis**: +When users initialize Taskmaster on existing projects: +1. **Codebase Discovery**: Use your native tools for producing deep context about the code base. You may use `research` tool with `--tree` and `--files` to collect up to date information using the existing architecture as context. +2. **Collaborative Assessment**: Work with user to identify improvement areas, technical debt, or new features +3. **Strategic PRD Creation**: Co-author PRDs that include: + - Current state analysis (based on your codebase research) + - Proposed improvements or new features + - Implementation strategy considering existing code +4. **Tag-Based Organization**: Parse PRDs into appropriate tags (`refactor-api`, `feature-dashboard`, `tech-debt`, etc.) +5. **Master List Curation**: Keep only the most valuable initiatives in master + +The parse-prd's `--append` flag enables the user to parse multple PRDs within tags or across tags. PRDs should be focused and the number of tasks they are parsed into should be strategically chosen relative to the PRD's complexity and level of detail. + +### Workflow Transition Examples + +**Example 1: Simple → Team-Based** +``` +User: "Alice is going to help with the API work" +Your Response: "Great! To avoid conflicts, I'll create a separate task context for your work. Alice can continue with the master list while you work in your own context. When you're ready to merge, we can coordinate the tasks back together." +Action: add_tag my-api-work --copy-from-current --description="My API tasks while collaborating with Alice" +``` + +**Example 2: Simple → PRD-Driven** +``` +User: "I want to add a complete user dashboard with analytics, user management, and reporting" +Your Response: "This sounds like a major feature that would benefit from detailed planning. Let me create a dedicated context for this work and we can draft a PRD together to ensure we capture all requirements." +Actions: +1. add_tag feature-dashboard --description="User dashboard with analytics and management" +2. Collaborate on PRD creation +3. parse_prd dashboard-prd.txt --tag=feature-dashboard +4. Add high-level "User Dashboard" task to master +``` + +**Example 3: Existing Project → Strategic Planning** +``` +User: "I just initialized Taskmaster on my existing React app. It's getting messy and I want to improve it." +Your Response: "Let me research your codebase to understand the current architecture, then we can create a strategic plan for improvements." +Actions: +1. research "Current React app architecture and improvement opportunities" --tree --files=src/ +2. Collaborate on improvement PRD based on findings +3. Create tags for different improvement areas (refactor-components, improve-state-management, etc.) +4. Keep only major improvement initiatives in master +``` + +--- + +## Primary Interaction: MCP Server vs. CLI + +Taskmaster offers two primary ways to interact: + +1. **MCP Server (Recommended for Integrated Tools)**: + - For AI agents and integrated development environments (like Cursor), interacting via the **MCP server is the preferred method**. + - The MCP server exposes Taskmaster functionality through a set of tools (e.g., `get_tasks`, `add_subtask`). + - This method offers better performance, structured data exchange, and richer error handling compared to CLI parsing. + - Refer to [`mcp.mdc`](mdc:.cursor/rules/mcp.mdc) for details on the MCP architecture and available tools. + - A comprehensive list and description of MCP tools and their corresponding CLI commands can be found in [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc). + - **Restart the MCP server** if core logic in `scripts/modules` or MCP tool/direct function definitions change. + - **Note**: MCP tools fully support tagged task lists with complete tag management capabilities. + +2. **`task-master` CLI (For Users & Fallback)**: + - The global `task-master` command provides a user-friendly interface for direct terminal interaction. + - It can also serve as a fallback if the MCP server is inaccessible or a specific function isn't exposed via MCP. + - Install globally with `npm install -g task-master-ai` or use locally via `npx task-master-ai ...`. + - The CLI commands often mirror the MCP tools (e.g., `task-master list` corresponds to `get_tasks`). + - Refer to [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc) for a detailed command reference. + - **Tagged Task Lists**: CLI fully supports the new tagged system with seamless migration. + +## How the Tag System Works (For Your Reference) + +- **Data Structure**: Tasks are organized into separate contexts (tags) like "master", "feature-branch", or "v2.0". +- **Silent Migration**: Existing projects automatically migrate to use a "master" tag with zero disruption. +- **Context Isolation**: Tasks in different tags are completely separate. Changes in one tag do not affect any other tag. +- **Manual Control**: The user is always in control. There is no automatic switching. You facilitate switching by using `use-tag `. +- **Full CLI & MCP Support**: All tag management commands are available through both the CLI and MCP tools for you to use. Refer to [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc) for a full command list. + +--- + +## Task Complexity Analysis + +- Run `analyze_project_complexity` / `task-master analyze-complexity --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) for comprehensive analysis +- Review complexity report via `complexity_report` / `task-master complexity-report` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) for a formatted, readable version. +- Focus on tasks with highest complexity scores (8-10) for detailed breakdown +- Use analysis results to determine appropriate subtask allocation +- Note that reports are automatically used by the `expand_task` tool/command + +## Task Breakdown Process + +- Use `expand_task` / `task-master expand --id=`. It automatically uses the complexity report if found, otherwise generates default number of subtasks. +- Use `--num=` to specify an explicit number of subtasks, overriding defaults or complexity report recommendations. +- Add `--research` flag to leverage Perplexity AI for research-backed expansion. +- Add `--force` flag to clear existing subtasks before generating new ones (default is to append). +- Use `--prompt=""` to provide additional context when needed. +- Review and adjust generated subtasks as necessary. +- Use `expand_all` tool or `task-master expand --all` to expand multiple pending tasks at once, respecting flags like `--force` and `--research`. +- If subtasks need complete replacement (regardless of the `--force` flag on `expand`), clear them first with `clear_subtasks` / `task-master clear-subtasks --id=`. + +## Implementation Drift Handling + +- When implementation differs significantly from planned approach +- When future tasks need modification due to current implementation choices +- When new dependencies or requirements emerge +- Use `update` / `task-master update --from= --prompt='\nUpdate context...' --research` to update multiple future tasks. +- Use `update_task` / `task-master update-task --id= --prompt='\nUpdate context...' --research` to update a single specific task. + +## Task Status Management + +- Use 'pending' for tasks ready to be worked on +- Use 'done' for completed and verified tasks +- Use 'deferred' for postponed tasks +- Add custom status values as needed for project-specific workflows + +## Task Structure Fields + +- **id**: Unique identifier for the task (Example: `1`, `1.1`) +- **title**: Brief, descriptive title (Example: `"Initialize Repo"`) +- **description**: Concise summary of what the task involves (Example: `"Create a new repository, set up initial structure."`) +- **status**: Current state of the task (Example: `"pending"`, `"done"`, `"deferred"`) +- **dependencies**: IDs of prerequisite tasks (Example: `[1, 2.1]`) + - Dependencies are displayed with status indicators (✅ for completed, ⏱️ for pending) + - This helps quickly identify which prerequisite tasks are blocking work +- **priority**: Importance level (Example: `"high"`, `"medium"`, `"low"`) +- **details**: In-depth implementation instructions (Example: `"Use GitHub client ID/secret, handle callback, set session token."`) +- **testStrategy**: Verification approach (Example: `"Deploy and call endpoint to confirm 'Hello World' response."`) +- **subtasks**: List of smaller, more specific tasks (Example: `[{"id": 1, "title": "Configure OAuth", ...}]`) +- Refer to task structure details (previously linked to `tasks.mdc`). + +## Configuration Management (Updated) + +Taskmaster configuration is managed through two main mechanisms: + +1. **`.taskmaster/config.json` File (Primary):** + * Located in the project root directory. + * Stores most configuration settings: AI model selections (main, research, fallback), parameters (max tokens, temperature), logging level, default subtasks/priority, project name, etc. + * **Tagged System Settings**: Includes `global.defaultTag` (defaults to "master") and `tags` section for tag management configuration. + * **Managed via `task-master models --setup` command.** Do not edit manually unless you know what you are doing. + * **View/Set specific models via `task-master models` command or `models` MCP tool.** + * Created automatically when you run `task-master models --setup` for the first time or during tagged system migration. + +2. **Environment Variables (`.env` / `mcp.json`):** + * Used **only** for sensitive API keys and specific endpoint URLs. + * Place API keys (one per provider) in a `.env` file in the project root for CLI usage. + * For MCP/Cursor integration, configure these keys in the `env` section of `.cursor/mcp.json`. + * Available keys/variables: See `assets/env.example` or the Configuration section in the command reference (previously linked to `taskmaster.mdc`). + +3. **`.taskmaster/state.json` File (Tagged System State):** + * Tracks current tag context and migration status. + * Automatically created during tagged system migration. + * Contains: `currentTag`, `lastSwitched`, `migrationNoticeShown`. + +**Important:** Non-API key settings (like model selections, `MAX_TOKENS`, `TASKMASTER_LOG_LEVEL`) are **no longer configured via environment variables**. Use the `task-master models` command (or `--setup` for interactive configuration) or the `models` MCP tool. +**If AI commands FAIL in MCP** verify that the API key for the selected provider is present in the `env` section of `.cursor/mcp.json`. +**If AI commands FAIL in CLI** verify that the API key for the selected provider is present in the `.env` file in the root of the project. + +## Determining the Next Task + +- Run `next_task` / `task-master next` to show the next task to work on. +- The command identifies tasks with all dependencies satisfied +- Tasks are prioritized by priority level, dependency count, and ID +- The command shows comprehensive task information including: + - Basic task details and description + - Implementation details + - Subtasks (if they exist) + - Contextual suggested actions +- Recommended before starting any new development work +- Respects your project's dependency structure +- Ensures tasks are completed in the appropriate sequence +- Provides ready-to-use commands for common task actions + +## Viewing Specific Task Details + +- Run `get_task` / `task-master show ` to view a specific task. +- Use dot notation for subtasks: `task-master show 1.2` (shows subtask 2 of task 1) +- Displays comprehensive information similar to the next command, but for a specific task +- For parent tasks, shows all subtasks and their current status +- For subtasks, shows parent task information and relationship +- Provides contextual suggested actions appropriate for the specific task +- Useful for examining task details before implementation or checking status + +## Managing Task Dependencies + +- Use `add_dependency` / `task-master add-dependency --id= --depends-on=` to add a dependency. +- Use `remove_dependency` / `task-master remove-dependency --id= --depends-on=` to remove a dependency. +- The system prevents circular dependencies and duplicate dependency entries +- Dependencies are checked for existence before being added or removed +- Task files are automatically regenerated after dependency changes +- Dependencies are visualized with status indicators in task listings and files + +## Task Reorganization + +- Use `move_task` / `task-master move --from= --to=` to move tasks or subtasks within the hierarchy +- This command supports several use cases: + - Moving a standalone task to become a subtask (e.g., `--from=5 --to=7`) + - Moving a subtask to become a standalone task (e.g., `--from=5.2 --to=7`) + - Moving a subtask to a different parent (e.g., `--from=5.2 --to=7.3`) + - Reordering subtasks within the same parent (e.g., `--from=5.2 --to=5.4`) + - Moving a task to a new, non-existent ID position (e.g., `--from=5 --to=25`) + - Moving multiple tasks at once using comma-separated IDs (e.g., `--from=10,11,12 --to=16,17,18`) +- The system includes validation to prevent data loss: + - Allows moving to non-existent IDs by creating placeholder tasks + - Prevents moving to existing task IDs that have content (to avoid overwriting) + - Validates source tasks exist before attempting to move them +- The system maintains proper parent-child relationships and dependency integrity +- Task files are automatically regenerated after the move operation +- This provides greater flexibility in organizing and refining your task structure as project understanding evolves +- This is especially useful when dealing with potential merge conflicts arising from teams creating tasks on separate branches. Solve these conflicts very easily by moving your tasks and keeping theirs. + +## Iterative Subtask Implementation + +Once a task has been broken down into subtasks using `expand_task` or similar methods, follow this iterative process for implementation: + +1. **Understand the Goal (Preparation):** + * Use `get_task` / `task-master show ` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to thoroughly understand the specific goals and requirements of the subtask. + +2. **Initial Exploration & Planning (Iteration 1):** + * This is the first attempt at creating a concrete implementation plan. + * Explore the codebase to identify the precise files, functions, and even specific lines of code that will need modification. + * Determine the intended code changes (diffs) and their locations. + * Gather *all* relevant details from this exploration phase. + +3. **Log the Plan:** + * Run `update_subtask` / `task-master update-subtask --id= --prompt=''`. + * Provide the *complete and detailed* findings from the exploration phase in the prompt. Include file paths, line numbers, proposed diffs, reasoning, and any potential challenges identified. Do not omit details. The goal is to create a rich, timestamped log within the subtask's `details`. + +4. **Verify the Plan:** + * Run `get_task` / `task-master show ` again to confirm that the detailed implementation plan has been successfully appended to the subtask's details. + +5. **Begin Implementation:** + * Set the subtask status using `set_task_status` / `task-master set-status --id= --status=in-progress`. + * Start coding based on the logged plan. + +6. **Refine and Log Progress (Iteration 2+):** + * As implementation progresses, you will encounter challenges, discover nuances, or confirm successful approaches. + * **Before appending new information**: Briefly review the *existing* details logged in the subtask (using `get_task` or recalling from context) to ensure the update adds fresh insights and avoids redundancy. + * **Regularly** use `update_subtask` / `task-master update-subtask --id= --prompt='\n- What worked...\n- What didn't work...'` to append new findings. + * **Crucially, log:** + * What worked ("fundamental truths" discovered). + * What didn't work and why (to avoid repeating mistakes). + * Specific code snippets or configurations that were successful. + * Decisions made, especially if confirmed with user input. + * Any deviations from the initial plan and the reasoning. + * The objective is to continuously enrich the subtask's details, creating a log of the implementation journey that helps the AI (and human developers) learn, adapt, and avoid repeating errors. + +7. **Review & Update Rules (Post-Implementation):** + * Once the implementation for the subtask is functionally complete, review all code changes and the relevant chat history. + * Identify any new or modified code patterns, conventions, or best practices established during the implementation. + * Create new or update existing rules following internal guidelines (previously linked to `cursor_rules.mdc` and `self_improve.mdc`). + +8. **Mark Task Complete:** + * After verifying the implementation and updating any necessary rules, mark the subtask as completed: `set_task_status` / `task-master set-status --id= --status=done`. + +9. **Commit Changes (If using Git):** + * Stage the relevant code changes and any updated/new rule files (`git add .`). + * Craft a comprehensive Git commit message summarizing the work done for the subtask, including both code implementation and any rule adjustments. + * Execute the commit command directly in the terminal (e.g., `git commit -m 'feat(module): Implement feature X for subtask \n\n- Details about changes...\n- Updated rule Y for pattern Z'`). + * Consider if a Changeset is needed according to internal versioning guidelines (previously linked to `changeset.mdc`). If so, run `npm run changeset`, stage the generated file, and amend the commit or create a new one. + +10. **Proceed to Next Subtask:** + * Identify the next subtask (e.g., using `next_task` / `task-master next`). + +## Code Analysis & Refactoring Techniques + +- **Top-Level Function Search**: + - Useful for understanding module structure or planning refactors. + - Use grep/ripgrep to find exported functions/constants: + `rg "export (async function|function|const) \w+"` or similar patterns. + - Can help compare functions between files during migrations or identify potential naming conflicts. + +--- +*This workflow provides a general guideline. Adapt it based on your specific project needs and team practices.* \ No newline at end of file diff --git a/.cursor/rules/git_commit.mdc b/.cursor/rules/git_commit.mdc new file mode 100644 index 0000000..cfc5f58 --- /dev/null +++ b/.cursor/rules/git_commit.mdc @@ -0,0 +1,26 @@ +--- +description: git commit rule +globs: +alwaysApply: false +--- +--- +Git Usage + +- Use the following **prefixes** for commit messages, followed by a **colon** and a **space**: + + - `fix` — for bug fixes + - `feat` — for new features + - `perf` — for performance improvements + - `docs` — for documentation changes + - `style` — for formatting changes + - `refactor` — for code refactoring + - `test` — for adding missing tests + - `chore` — for routine tasks + +- When determining the commit message prefix, pick the most **relevant** option from the list above. + +- Use **lowercase** for all commit messages. + +- If the change is not self-explanatory, include a **bullet list of changes** after a blank line below the summary. + +--- diff --git a/.cursor/rules/self_improve.mdc b/.cursor/rules/self_improve.mdc new file mode 100644 index 0000000..40b31b6 --- /dev/null +++ b/.cursor/rules/self_improve.mdc @@ -0,0 +1,72 @@ +--- +description: Guidelines for continuously improving Cursor rules based on emerging code patterns and best practices. +globs: **/* +alwaysApply: true +--- + +- **Rule Improvement Triggers:** + - New code patterns not covered by existing rules + - Repeated similar implementations across files + - Common error patterns that could be prevented + - New libraries or tools being used consistently + - Emerging best practices in the codebase + +- **Analysis Process:** + - Compare new code with existing rules + - Identify patterns that should be standardized + - Look for references to external documentation + - Check for consistent error handling patterns + - Monitor test patterns and coverage + +- **Rule Updates:** + - **Add New Rules When:** + - A new technology/pattern is used in 3+ files + - Common bugs could be prevented by a rule + - Code reviews repeatedly mention the same feedback + - New security or performance patterns emerge + + - **Modify Existing Rules When:** + - Better examples exist in the codebase + - Additional edge cases are discovered + - Related rules have been updated + - Implementation details have changed + +- **Example Pattern Recognition:** + ```typescript + // If you see repeated patterns like: + const data = await prisma.user.findMany({ + select: { id: true, email: true }, + where: { status: 'ACTIVE' } + }); + + // Consider adding to [prisma.mdc](mdc:.cursor/rules/prisma.mdc): + // - Standard select fields + // - Common where conditions + // - Performance optimization patterns + ``` + +- **Rule Quality Checks:** + - Rules should be actionable and specific + - Examples should come from actual code + - References should be up to date + - Patterns should be consistently enforced + +- **Continuous Improvement:** + - Monitor code review comments + - Track common development questions + - Update rules after major refactors + - Add links to relevant documentation + - Cross-reference related rules + +- **Rule Deprecation:** + - Mark outdated patterns as deprecated + - Remove rules that no longer apply + - Update references to deprecated rules + - Document migration paths for old patterns + +- **Documentation Updates:** + - Keep examples synchronized with code + - Update references to external docs + - Maintain links between related rules + - Document breaking changes +Follow [cursor_rules.mdc](mdc:.cursor/rules/cursor_rules.mdc) for proper rule formatting and structure. diff --git a/.cursor/rules/taskmaster.mdc b/.cursor/rules/taskmaster.mdc new file mode 100644 index 0000000..b4fe6df --- /dev/null +++ b/.cursor/rules/taskmaster.mdc @@ -0,0 +1,557 @@ +--- +description: Comprehensive reference for Taskmaster MCP tools and CLI commands. +globs: **/* +alwaysApply: true +--- +# Taskmaster Tool & Command Reference + +This document provides a detailed reference for interacting with Taskmaster, covering both the recommended MCP tools, suitable for integrations like Cursor, and the corresponding `task-master` CLI commands, designed for direct user interaction or fallback. + +**Note:** For interacting with Taskmaster programmatically or via integrated tools, using the **MCP tools is strongly recommended** due to better performance, structured data, and error handling. The CLI commands serve as a user-friendly alternative and fallback. + +**Important:** Several MCP tools involve AI processing... The AI-powered tools include `parse_prd`, `analyze_project_complexity`, `update_subtask`, `update_task`, `update`, `expand_all`, `expand_task`, and `add_task`. + +**🏷️ Tagged Task Lists System:** Task Master now supports **tagged task lists** for multi-context task management. This allows you to maintain separate, isolated lists of tasks for different features, branches, or experiments. Existing projects are seamlessly migrated to use a default "master" tag. Most commands now support a `--tag ` flag to specify which context to operate on. If omitted, commands use the currently active tag. + +--- + +## Initialization & Setup + +### 1. Initialize Project (`init`) + +* **MCP Tool:** `initialize_project` +* **CLI Command:** `task-master init [options]` +* **Description:** `Set up the basic Taskmaster file structure and configuration in the current directory for a new project.` +* **Key CLI Options:** + * `--name `: `Set the name for your project in Taskmaster's configuration.` + * `--description `: `Provide a brief description for your project.` + * `--version `: `Set the initial version for your project, e.g., '0.1.0'.` + * `-y, --yes`: `Initialize Taskmaster quickly using default settings without interactive prompts.` +* **Usage:** Run this once at the beginning of a new project. +* **MCP Variant Description:** `Set up the basic Taskmaster file structure and configuration in the current directory for a new project by running the 'task-master init' command.` +* **Key MCP Parameters/Options:** + * `projectName`: `Set the name for your project.` (CLI: `--name `) + * `projectDescription`: `Provide a brief description for your project.` (CLI: `--description `) + * `projectVersion`: `Set the initial version for your project, e.g., '0.1.0'.` (CLI: `--version `) + * `authorName`: `Author name.` (CLI: `--author `) + * `skipInstall`: `Skip installing dependencies. Default is false.` (CLI: `--skip-install`) + * `addAliases`: `Add shell aliases tm and taskmaster. Default is false.` (CLI: `--aliases`) + * `yes`: `Skip prompts and use defaults/provided arguments. Default is false.` (CLI: `-y, --yes`) +* **Usage:** Run this once at the beginning of a new project, typically via an integrated tool like Cursor. Operates on the current working directory of the MCP server. +* **Important:** Once complete, you *MUST* parse a prd in order to generate tasks. There will be no tasks files until then. The next step after initializing should be to create a PRD using the example PRD in .taskmaster/templates/example_prd.txt. +* **Tagging:** Use the `--tag` option to parse the PRD into a specific, non-default tag context. If the tag doesn't exist, it will be created automatically. Example: `task-master parse-prd spec.txt --tag=new-feature`. + +### 2. Parse PRD (`parse_prd`) + +* **MCP Tool:** `parse_prd` +* **CLI Command:** `task-master parse-prd [file] [options]` +* **Description:** `Parse a Product Requirements Document, PRD, or text file with Taskmaster to automatically generate an initial set of tasks in tasks.json.` +* **Key Parameters/Options:** + * `input`: `Path to your PRD or requirements text file that Taskmaster should parse for tasks.` (CLI: `[file]` positional or `-i, --input `) + * `output`: `Specify where Taskmaster should save the generated 'tasks.json' file. Defaults to '.taskmaster/tasks/tasks.json'.` (CLI: `-o, --output `) + * `numTasks`: `Approximate number of top-level tasks Taskmaster should aim to generate from the document.` (CLI: `-n, --num-tasks `) + * `force`: `Use this to allow Taskmaster to overwrite an existing 'tasks.json' without asking for confirmation.` (CLI: `-f, --force`) +* **Usage:** Useful for bootstrapping a project from an existing requirements document. +* **Notes:** Task Master will strictly adhere to any specific requirements mentioned in the PRD, such as libraries, database schemas, frameworks, tech stacks, etc., while filling in any gaps where the PRD isn't fully specified. Tasks are designed to provide the most direct implementation path while avoiding over-engineering. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. If the user does not have a PRD, suggest discussing their idea and then use the example PRD in `.taskmaster/templates/example_prd.txt` as a template for creating the PRD based on their idea, for use with `parse-prd`. + +--- + +## AI Model Configuration + +### 2. Manage Models (`models`) +* **MCP Tool:** `models` +* **CLI Command:** `task-master models [options]` +* **Description:** `View the current AI model configuration or set specific models for different roles (main, research, fallback). Allows setting custom model IDs for Ollama and OpenRouter.` +* **Key MCP Parameters/Options:** + * `setMain `: `Set the primary model ID for task generation/updates.` (CLI: `--set-main `) + * `setResearch `: `Set the model ID for research-backed operations.` (CLI: `--set-research `) + * `setFallback `: `Set the model ID to use if the primary fails.` (CLI: `--set-fallback `) + * `ollama `: `Indicates the set model ID is a custom Ollama model.` (CLI: `--ollama`) + * `openrouter `: `Indicates the set model ID is a custom OpenRouter model.` (CLI: `--openrouter`) + * `listAvailableModels `: `If true, lists available models not currently assigned to a role.` (CLI: No direct equivalent; CLI lists available automatically) + * `projectRoot `: `Optional. Absolute path to the project root directory.` (CLI: Determined automatically) +* **Key CLI Options:** + * `--set-main `: `Set the primary model.` + * `--set-research `: `Set the research model.` + * `--set-fallback `: `Set the fallback model.` + * `--ollama`: `Specify that the provided model ID is for Ollama (use with --set-*).` + * `--openrouter`: `Specify that the provided model ID is for OpenRouter (use with --set-*). Validates against OpenRouter API.` + * `--bedrock`: `Specify that the provided model ID is for AWS Bedrock (use with --set-*).` + * `--setup`: `Run interactive setup to configure models, including custom Ollama/OpenRouter IDs.` +* **Usage (MCP):** Call without set flags to get current config. Use `setMain`, `setResearch`, or `setFallback` with a valid model ID to update the configuration. Use `listAvailableModels: true` to get a list of unassigned models. To set a custom model, provide the model ID and set `ollama: true` or `openrouter: true`. +* **Usage (CLI):** Run without flags to view current configuration and available models. Use set flags to update specific roles. Use `--setup` for guided configuration, including custom models. To set a custom model via flags, use `--set-=` along with either `--ollama` or `--openrouter`. +* **Notes:** Configuration is stored in `.taskmaster/config.json` in the project root. This command/tool modifies that file. Use `listAvailableModels` or `task-master models` to see internally supported models. OpenRouter custom models are validated against their live API. Ollama custom models are not validated live. +* **API note:** API keys for selected AI providers (based on their model) need to exist in the mcp.json file to be accessible in MCP context. The API keys must be present in the local .env file for the CLI to be able to read them. +* **Model costs:** The costs in supported models are expressed in dollars. An input/output value of 3 is $3.00. A value of 0.8 is $0.80. +* **Warning:** DO NOT MANUALLY EDIT THE .taskmaster/config.json FILE. Use the included commands either in the MCP or CLI format as needed. Always prioritize MCP tools when available and use the CLI as a fallback. + +--- + +## Task Listing & Viewing + +### 3. Get Tasks (`get_tasks`) + +* **MCP Tool:** `get_tasks` +* **CLI Command:** `task-master list [options]` +* **Description:** `List your Taskmaster tasks, optionally filtering by status and showing subtasks.` +* **Key Parameters/Options:** + * `status`: `Show only Taskmaster tasks matching this status (or multiple statuses, comma-separated), e.g., 'pending' or 'done,in-progress'.` (CLI: `-s, --status `) + * `withSubtasks`: `Include subtasks indented under their parent tasks in the list.` (CLI: `--with-subtasks`) + * `tag`: `Specify which tag context to list tasks from. Defaults to the current active tag.` (CLI: `--tag `) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file `) +* **Usage:** Get an overview of the project status, often used at the start of a work session. + +### 4. Get Next Task (`next_task`) + +* **MCP Tool:** `next_task` +* **CLI Command:** `task-master next [options]` +* **Description:** `Ask Taskmaster to show the next available task you can work on, based on status and completed dependencies.` +* **Key Parameters/Options:** + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file `) + * `tag`: `Specify which tag context to use. Defaults to the current active tag.` (CLI: `--tag `) +* **Usage:** Identify what to work on next according to the plan. + +### 5. Get Task Details (`get_task`) + +* **MCP Tool:** `get_task` +* **CLI Command:** `task-master show [id] [options]` +* **Description:** `Display detailed information for one or more specific Taskmaster tasks or subtasks by ID.` +* **Key Parameters/Options:** + * `id`: `Required. The ID of the Taskmaster task (e.g., '15'), subtask (e.g., '15.2'), or a comma-separated list of IDs ('1,5,10.2') you want to view.` (CLI: `[id]` positional or `-i, --id `) + * `tag`: `Specify which tag context to get the task(s) from. Defaults to the current active tag.` (CLI: `--tag `) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file `) +* **Usage:** Understand the full details for a specific task. When multiple IDs are provided, a summary table is shown. +* **CRITICAL INFORMATION** If you need to collect information from multiple tasks, use comma-separated IDs (i.e. 1,2,3) to receive an array of tasks. Do not needlessly get tasks one at a time if you need to get many as that is wasteful. + +--- + +## Task Creation & Modification + +### 6. Add Task (`add_task`) + +* **MCP Tool:** `add_task` +* **CLI Command:** `task-master add-task [options]` +* **Description:** `Add a new task to Taskmaster by describing it; AI will structure it.` +* **Key Parameters/Options:** + * `prompt`: `Required. Describe the new task you want Taskmaster to create, e.g., "Implement user authentication using JWT".` (CLI: `-p, --prompt `) + * `dependencies`: `Specify the IDs of any Taskmaster tasks that must be completed before this new one can start, e.g., '12,14'.` (CLI: `-d, --dependencies `) + * `priority`: `Set the priority for the new task: 'high', 'medium', or 'low'. Default is 'medium'.` (CLI: `--priority `) + * `research`: `Enable Taskmaster to use the research role for potentially more informed task creation.` (CLI: `-r, --research`) + * `tag`: `Specify which tag context to add the task to. Defaults to the current active tag.` (CLI: `--tag `) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file `) +* **Usage:** Quickly add newly identified tasks during development. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 7. Add Subtask (`add_subtask`) + +* **MCP Tool:** `add_subtask` +* **CLI Command:** `task-master add-subtask [options]` +* **Description:** `Add a new subtask to a Taskmaster parent task, or convert an existing task into a subtask.` +* **Key Parameters/Options:** + * `id` / `parent`: `Required. The ID of the Taskmaster task that will be the parent.` (MCP: `id`, CLI: `-p, --parent `) + * `taskId`: `Use this if you want to convert an existing top-level Taskmaster task into a subtask of the specified parent.` (CLI: `-i, --task-id `) + * `title`: `Required if not using taskId. The title for the new subtask Taskmaster should create.` (CLI: `-t, --title `) + * `description`: `A brief description for the new subtask.` (CLI: `-d, --description <text>`) + * `details`: `Provide implementation notes or details for the new subtask.` (CLI: `--details <text>`) + * `dependencies`: `Specify IDs of other tasks or subtasks, e.g., '15' or '16.1', that must be done before this new subtask.` (CLI: `--dependencies <ids>`) + * `status`: `Set the initial status for the new subtask. Default is 'pending'.` (CLI: `-s, --status <status>`) + * `skipGenerate`: `Prevent Taskmaster from automatically regenerating markdown task files after adding the subtask.` (CLI: `--skip-generate`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Break down tasks manually or reorganize existing tasks. + +### 8. Update Tasks (`update`) + +* **MCP Tool:** `update` +* **CLI Command:** `task-master update [options]` +* **Description:** `Update multiple upcoming tasks in Taskmaster based on new context or changes, starting from a specific task ID.` +* **Key Parameters/Options:** + * `from`: `Required. The ID of the first task Taskmaster should update. All tasks with this ID or higher that are not 'done' will be considered.` (CLI: `--from <id>`) + * `prompt`: `Required. Explain the change or new context for Taskmaster to apply to the tasks, e.g., "We are now using React Query instead of Redux Toolkit for data fetching".` (CLI: `-p, --prompt <text>`) + * `research`: `Enable Taskmaster to use the research role for more informed updates. Requires appropriate API key.` (CLI: `-r, --research`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Handle significant implementation changes or pivots that affect multiple future tasks. Example CLI: `task-master update --from='18' --prompt='Switching to React Query.\nNeed to refactor data fetching...'` +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 9. Update Task (`update_task`) + +* **MCP Tool:** `update_task` +* **CLI Command:** `task-master update-task [options]` +* **Description:** `Modify a specific Taskmaster task by ID, incorporating new information or changes. By default, this replaces the existing task details.` +* **Key Parameters/Options:** + * `id`: `Required. The specific ID of the Taskmaster task, e.g., '15', you want to update.` (CLI: `-i, --id <id>`) + * `prompt`: `Required. Explain the specific changes or provide the new information Taskmaster should incorporate into this task.` (CLI: `-p, --prompt <text>`) + * `append`: `If true, appends the prompt content to the task's details with a timestamp, rather than replacing them. Behaves like update-subtask.` (CLI: `--append`) + * `research`: `Enable Taskmaster to use the research role for more informed updates. Requires appropriate API key.` (CLI: `-r, --research`) + * `tag`: `Specify which tag context the task belongs to. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Refine a specific task based on new understanding. Use `--append` to log progress without creating subtasks. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 10. Update Subtask (`update_subtask`) + +* **MCP Tool:** `update_subtask` +* **CLI Command:** `task-master update-subtask [options]` +* **Description:** `Append timestamped notes or details to a specific Taskmaster subtask without overwriting existing content. Intended for iterative implementation logging.` +* **Key Parameters/Options:** + * `id`: `Required. The ID of the Taskmaster subtask, e.g., '5.2', to update with new information.` (CLI: `-i, --id <id>`) + * `prompt`: `Required. The information, findings, or progress notes to append to the subtask's details with a timestamp.` (CLI: `-p, --prompt <text>`) + * `research`: `Enable Taskmaster to use the research role for more informed updates. Requires appropriate API key.` (CLI: `-r, --research`) + * `tag`: `Specify which tag context the subtask belongs to. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Log implementation progress, findings, and discoveries during subtask development. Each update is timestamped and appended to preserve the implementation journey. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 11. Set Task Status (`set_task_status`) + +* **MCP Tool:** `set_task_status` +* **CLI Command:** `task-master set-status [options]` +* **Description:** `Update the status of one or more Taskmaster tasks or subtasks, e.g., 'pending', 'in-progress', 'done'.` +* **Key Parameters/Options:** + * `id`: `Required. The ID(s) of the Taskmaster task(s) or subtask(s), e.g., '15', '15.2', or '16,17.1', to update.` (CLI: `-i, --id <id>`) + * `status`: `Required. The new status to set, e.g., 'done', 'pending', 'in-progress', 'review', 'cancelled'.` (CLI: `-s, --status <status>`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Mark progress as tasks move through the development cycle. + +### 12. Remove Task (`remove_task`) + +* **MCP Tool:** `remove_task` +* **CLI Command:** `task-master remove-task [options]` +* **Description:** `Permanently remove a task or subtask from the Taskmaster tasks list.` +* **Key Parameters/Options:** + * `id`: `Required. The ID of the Taskmaster task, e.g., '5', or subtask, e.g., '5.2', to permanently remove.` (CLI: `-i, --id <id>`) + * `yes`: `Skip the confirmation prompt and immediately delete the task.` (CLI: `-y, --yes`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Permanently delete tasks or subtasks that are no longer needed in the project. +* **Notes:** Use with caution as this operation cannot be undone. Consider using 'blocked', 'cancelled', or 'deferred' status instead if you just want to exclude a task from active planning but keep it for reference. The command automatically cleans up dependency references in other tasks. + +--- + +## Task Structure & Breakdown + +### 13. Expand Task (`expand_task`) + +* **MCP Tool:** `expand_task` +* **CLI Command:** `task-master expand [options]` +* **Description:** `Use Taskmaster's AI to break down a complex task into smaller, manageable subtasks. Appends subtasks by default.` +* **Key Parameters/Options:** + * `id`: `The ID of the specific Taskmaster task you want to break down into subtasks.` (CLI: `-i, --id <id>`) + * `num`: `Optional: Suggests how many subtasks Taskmaster should aim to create. Uses complexity analysis/defaults otherwise.` (CLI: `-n, --num <number>`) + * `research`: `Enable Taskmaster to use the research role for more informed subtask generation. Requires appropriate API key.` (CLI: `-r, --research`) + * `prompt`: `Optional: Provide extra context or specific instructions to Taskmaster for generating the subtasks.` (CLI: `-p, --prompt <text>`) + * `force`: `Optional: If true, clear existing subtasks before generating new ones. Default is false (append).` (CLI: `--force`) + * `tag`: `Specify which tag context the task belongs to. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Generate a detailed implementation plan for a complex task before starting coding. Automatically uses complexity report recommendations if available and `num` is not specified. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 14. Expand All Tasks (`expand_all`) + +* **MCP Tool:** `expand_all` +* **CLI Command:** `task-master expand --all [options]` (Note: CLI uses the `expand` command with the `--all` flag) +* **Description:** `Tell Taskmaster to automatically expand all eligible pending/in-progress tasks based on complexity analysis or defaults. Appends subtasks by default.` +* **Key Parameters/Options:** + * `num`: `Optional: Suggests how many subtasks Taskmaster should aim to create per task.` (CLI: `-n, --num <number>`) + * `research`: `Enable research role for more informed subtask generation. Requires appropriate API key.` (CLI: `-r, --research`) + * `prompt`: `Optional: Provide extra context for Taskmaster to apply generally during expansion.` (CLI: `-p, --prompt <text>`) + * `force`: `Optional: If true, clear existing subtasks before generating new ones for each eligible task. Default is false (append).` (CLI: `--force`) + * `tag`: `Specify which tag context to expand. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Useful after initial task generation or complexity analysis to break down multiple tasks at once. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 15. Clear Subtasks (`clear_subtasks`) + +* **MCP Tool:** `clear_subtasks` +* **CLI Command:** `task-master clear-subtasks [options]` +* **Description:** `Remove all subtasks from one or more specified Taskmaster parent tasks.` +* **Key Parameters/Options:** + * `id`: `The ID(s) of the Taskmaster parent task(s) whose subtasks you want to remove, e.g., '15' or '16,18'. Required unless using `all`.) (CLI: `-i, --id <ids>`) + * `all`: `Tell Taskmaster to remove subtasks from all parent tasks.` (CLI: `--all`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Used before regenerating subtasks with `expand_task` if the previous breakdown needs replacement. + +### 16. Remove Subtask (`remove_subtask`) + +* **MCP Tool:** `remove_subtask` +* **CLI Command:** `task-master remove-subtask [options]` +* **Description:** `Remove a subtask from its Taskmaster parent, optionally converting it into a standalone task.` +* **Key Parameters/Options:** + * `id`: `Required. The ID(s) of the Taskmaster subtask(s) to remove, e.g., '15.2' or '16.1,16.3'.` (CLI: `-i, --id <id>`) + * `convert`: `If used, Taskmaster will turn the subtask into a regular top-level task instead of deleting it.` (CLI: `-c, --convert`) + * `skipGenerate`: `Prevent Taskmaster from automatically regenerating markdown task files after removing the subtask.` (CLI: `--skip-generate`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Delete unnecessary subtasks or promote a subtask to a top-level task. + +### 17. Move Task (`move_task`) + +* **MCP Tool:** `move_task` +* **CLI Command:** `task-master move [options]` +* **Description:** `Move a task or subtask to a new position within the task hierarchy.` +* **Key Parameters/Options:** + * `from`: `Required. ID of the task/subtask to move (e.g., "5" or "5.2"). Can be comma-separated for multiple tasks.` (CLI: `--from <id>`) + * `to`: `Required. ID of the destination (e.g., "7" or "7.3"). Must match the number of source IDs if comma-separated.` (CLI: `--to <id>`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Reorganize tasks by moving them within the hierarchy. Supports various scenarios like: + * Moving a task to become a subtask + * Moving a subtask to become a standalone task + * Moving a subtask to a different parent + * Reordering subtasks within the same parent + * Moving a task to a new, non-existent ID (automatically creates placeholders) + * Moving multiple tasks at once with comma-separated IDs +* **Validation Features:** + * Allows moving tasks to non-existent destination IDs (creates placeholder tasks) + * Prevents moving to existing task IDs that already have content (to avoid overwriting) + * Validates that source tasks exist before attempting to move them + * Maintains proper parent-child relationships +* **Example CLI:** `task-master move --from=5.2 --to=7.3` to move subtask 5.2 to become subtask 7.3. +* **Example Multi-Move:** `task-master move --from=10,11,12 --to=16,17,18` to move multiple tasks to new positions. +* **Common Use:** Resolving merge conflicts in tasks.json when multiple team members create tasks on different branches. + +--- + +## Dependency Management + +### 18. Add Dependency (`add_dependency`) + +* **MCP Tool:** `add_dependency` +* **CLI Command:** `task-master add-dependency [options]` +* **Description:** `Define a dependency in Taskmaster, making one task a prerequisite for another.` +* **Key Parameters/Options:** + * `id`: `Required. The ID of the Taskmaster task that will depend on another.` (CLI: `-i, --id <id>`) + * `dependsOn`: `Required. The ID of the Taskmaster task that must be completed first, the prerequisite.` (CLI: `-d, --depends-on <id>`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <path>`) +* **Usage:** Establish the correct order of execution between tasks. + +### 19. Remove Dependency (`remove_dependency`) + +* **MCP Tool:** `remove_dependency` +* **CLI Command:** `task-master remove-dependency [options]` +* **Description:** `Remove a dependency relationship between two Taskmaster tasks.` +* **Key Parameters/Options:** + * `id`: `Required. The ID of the Taskmaster task you want to remove a prerequisite from.` (CLI: `-i, --id <id>`) + * `dependsOn`: `Required. The ID of the Taskmaster task that should no longer be a prerequisite.` (CLI: `-d, --depends-on <id>`) + * `tag`: `Specify which tag context to operate on. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Update task relationships when the order of execution changes. + +### 20. Validate Dependencies (`validate_dependencies`) + +* **MCP Tool:** `validate_dependencies` +* **CLI Command:** `task-master validate-dependencies [options]` +* **Description:** `Check your Taskmaster tasks for dependency issues (like circular references or links to non-existent tasks) without making changes.` +* **Key Parameters/Options:** + * `tag`: `Specify which tag context to validate. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Audit the integrity of your task dependencies. + +### 21. Fix Dependencies (`fix_dependencies`) + +* **MCP Tool:** `fix_dependencies` +* **CLI Command:** `task-master fix-dependencies [options]` +* **Description:** `Automatically fix dependency issues (like circular references or links to non-existent tasks) in your Taskmaster tasks.` +* **Key Parameters/Options:** + * `tag`: `Specify which tag context to fix dependencies in. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Clean up dependency errors automatically. + +--- + +## Analysis & Reporting + +### 22. Analyze Project Complexity (`analyze_project_complexity`) + +* **MCP Tool:** `analyze_project_complexity` +* **CLI Command:** `task-master analyze-complexity [options]` +* **Description:** `Have Taskmaster analyze your tasks to determine their complexity and suggest which ones need to be broken down further.` +* **Key Parameters/Options:** + * `output`: `Where to save the complexity analysis report. Default is '.taskmaster/reports/task-complexity-report.json' (or '..._tagname.json' if a tag is used).` (CLI: `-o, --output <file>`) + * `threshold`: `The minimum complexity score (1-10) that should trigger a recommendation to expand a task.` (CLI: `-t, --threshold <number>`) + * `research`: `Enable research role for more accurate complexity analysis. Requires appropriate API key.` (CLI: `-r, --research`) + * `tag`: `Specify which tag context to analyze. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Used before breaking down tasks to identify which ones need the most attention. +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. Please inform users to hang tight while the operation is in progress. + +### 23. View Complexity Report (`complexity_report`) + +* **MCP Tool:** `complexity_report` +* **CLI Command:** `task-master complexity-report [options]` +* **Description:** `Display the task complexity analysis report in a readable format.` +* **Key Parameters/Options:** + * `tag`: `Specify which tag context to show the report for. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to the complexity report (default: '.taskmaster/reports/task-complexity-report.json').` (CLI: `-f, --file <file>`) +* **Usage:** Review and understand the complexity analysis results after running analyze-complexity. + +--- + +## File Management + +### 24. Generate Task Files (`generate`) + +* **MCP Tool:** `generate` +* **CLI Command:** `task-master generate [options]` +* **Description:** `Create or update individual Markdown files for each task based on your tasks.json.` +* **Key Parameters/Options:** + * `output`: `The directory where Taskmaster should save the task files (default: in a 'tasks' directory).` (CLI: `-o, --output <directory>`) + * `tag`: `Specify which tag context to generate files for. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) +* **Usage:** Run this after making changes to tasks.json to keep individual task files up to date. This command is now manual and no longer runs automatically. + +--- + +## AI-Powered Research + +### 25. Research (`research`) + +* **MCP Tool:** `research` +* **CLI Command:** `task-master research [options]` +* **Description:** `Perform AI-powered research queries with project context to get fresh, up-to-date information beyond the AI's knowledge cutoff.` +* **Key Parameters/Options:** + * `query`: `Required. Research query/prompt (e.g., "What are the latest best practices for React Query v5?").` (CLI: `[query]` positional or `-q, --query <text>`) + * `taskIds`: `Comma-separated list of task/subtask IDs from the current tag context (e.g., "15,16.2,17").` (CLI: `-i, --id <ids>`) + * `filePaths`: `Comma-separated list of file paths for context (e.g., "src/api.js,docs/readme.md").` (CLI: `-f, --files <paths>`) + * `customContext`: `Additional custom context text to include in the research.` (CLI: `-c, --context <text>`) + * `includeProjectTree`: `Include project file tree structure in context (default: false).` (CLI: `--tree`) + * `detailLevel`: `Detail level for the research response: 'low', 'medium', 'high' (default: medium).` (CLI: `--detail <level>`) + * `saveTo`: `Task or subtask ID (e.g., "15", "15.2") to automatically save the research conversation to.` (CLI: `--save-to <id>`) + * `saveFile`: `If true, saves the research conversation to a markdown file in '.taskmaster/docs/research/'.` (CLI: `--save-file`) + * `noFollowup`: `Disables the interactive follow-up question menu in the CLI.` (CLI: `--no-followup`) + * `tag`: `Specify which tag context to use for task-based context gathering. Defaults to the current active tag.` (CLI: `--tag <name>`) + * `projectRoot`: `The directory of the project. Must be an absolute path.` (CLI: Determined automatically) +* **Usage:** **This is a POWERFUL tool that agents should use FREQUENTLY** to: + * Get fresh information beyond knowledge cutoff dates + * Research latest best practices, library updates, security patches + * Find implementation examples for specific technologies + * Validate approaches against current industry standards + * Get contextual advice based on project files and tasks +* **When to Consider Using Research:** + * **Before implementing any task** - Research current best practices + * **When encountering new technologies** - Get up-to-date implementation guidance (libraries, apis, etc) + * **For security-related tasks** - Find latest security recommendations + * **When updating dependencies** - Research breaking changes and migration guides + * **For performance optimization** - Get current performance best practices + * **When debugging complex issues** - Research known solutions and workarounds +* **Research + Action Pattern:** + * Use `research` to gather fresh information + * Use `update_subtask` to commit findings with timestamps + * Use `update_task` to incorporate research into task details + * Use `add_task` with research flag for informed task creation +* **Important:** This MCP tool makes AI calls and can take up to a minute to complete. The research provides FRESH data beyond the AI's training cutoff, making it invaluable for current best practices and recent developments. + +--- + +## Tag Management + +This new suite of commands allows you to manage different task contexts (tags). + +### 26. List Tags (`tags`) + +* **MCP Tool:** `list_tags` +* **CLI Command:** `task-master tags [options]` +* **Description:** `List all available tags with task counts, completion status, and other metadata.` +* **Key Parameters/Options:** + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) + * `--show-metadata`: `Include detailed metadata in the output (e.g., creation date, description).` (CLI: `--show-metadata`) + +### 27. Add Tag (`add_tag`) + +* **MCP Tool:** `add_tag` +* **CLI Command:** `task-master add-tag <tagName> [options]` +* **Description:** `Create a new, empty tag context, or copy tasks from another tag.` +* **Key Parameters/Options:** + * `tagName`: `Name of the new tag to create (alphanumeric, hyphens, underscores).` (CLI: `<tagName>` positional) + * `--from-branch`: `Creates a tag with a name derived from the current git branch, ignoring the <tagName> argument.` (CLI: `--from-branch`) + * `--copy-from-current`: `Copy tasks from the currently active tag to the new tag.` (CLI: `--copy-from-current`) + * `--copy-from <tag>`: `Copy tasks from a specific source tag to the new tag.` (CLI: `--copy-from <tag>`) + * `--description <text>`: `Provide an optional description for the new tag.` (CLI: `-d, --description <text>`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) + +### 28. Delete Tag (`delete_tag`) + +* **MCP Tool:** `delete_tag` +* **CLI Command:** `task-master delete-tag <tagName> [options]` +* **Description:** `Permanently delete a tag and all of its associated tasks.` +* **Key Parameters/Options:** + * `tagName`: `Name of the tag to delete.` (CLI: `<tagName>` positional) + * `--yes`: `Skip the confirmation prompt.` (CLI: `-y, --yes`) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) + +### 29. Use Tag (`use_tag`) + +* **MCP Tool:** `use_tag` +* **CLI Command:** `task-master use-tag <tagName>` +* **Description:** `Switch your active task context to a different tag.` +* **Key Parameters/Options:** + * `tagName`: `Name of the tag to switch to.` (CLI: `<tagName>` positional) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) + +### 30. Rename Tag (`rename_tag`) + +* **MCP Tool:** `rename_tag` +* **CLI Command:** `task-master rename-tag <oldName> <newName>` +* **Description:** `Rename an existing tag.` +* **Key Parameters/Options:** + * `oldName`: `The current name of the tag.` (CLI: `<oldName>` positional) + * `newName`: `The new name for the tag.` (CLI: `<newName>` positional) + * `file`: `Path to your Taskmaster 'tasks.json' file. Default relies on auto-detection.` (CLI: `-f, --file <file>`) + +### 31. Copy Tag (`copy_tag`) + +* **MCP Tool:** `copy_tag` +* **CLI Command:** `task-master copy-tag <sourceName> <targetName> [options]` +* **Description:** `Copy an entire tag context, including all its tasks and metadata, to a new tag.` +* **Key Parameters/Options:** + * `sourceName`: `Name of the tag to copy from.` (CLI: `<sourceName>` positional) + * `targetName`: `Name of the new tag to create.` (CLI: `<targetName>` positional) + * `--description <text>`: `Optional description for the new tag.` (CLI: `-d, --description <text>`) + +--- + +## Miscellaneous + +### 32. Sync Readme (`sync-readme`) -- experimental + +* **MCP Tool:** N/A +* **CLI Command:** `task-master sync-readme [options]` +* **Description:** `Exports your task list to your project's README.md file, useful for showcasing progress.` +* **Key Parameters/Options:** + * `status`: `Filter tasks by status (e.g., 'pending', 'done').` (CLI: `-s, --status <status>`) + * `withSubtasks`: `Include subtasks in the export.` (CLI: `--with-subtasks`) + * `tag`: `Specify which tag context to export from. Defaults to the current active tag.` (CLI: `--tag <name>`) + +--- + +## Environment Variables Configuration (Updated) + +Taskmaster primarily uses the **`.taskmaster/config.json`** file (in project root) for configuration (models, parameters, logging level, etc.), managed via `task-master models --setup`. + +Environment variables are used **only** for sensitive API keys related to AI providers and specific overrides like the Ollama base URL: + +* **API Keys (Required for corresponding provider):** + * `ANTHROPIC_API_KEY` + * `PERPLEXITY_API_KEY` + * `OPENAI_API_KEY` + * `GOOGLE_API_KEY` + * `MISTRAL_API_KEY` + * `AZURE_OPENAI_API_KEY` (Requires `AZURE_OPENAI_ENDPOINT` too) + * `OPENROUTER_API_KEY` + * `XAI_API_KEY` + * `OLLAMA_API_KEY` (Requires `OLLAMA_BASE_URL` too) +* **Endpoints (Optional/Provider Specific inside .taskmaster/config.json):** + * `AZURE_OPENAI_ENDPOINT` + * `OLLAMA_BASE_URL` (Default: `http://localhost:11434/api`) + +**Set API keys** in your **`.env`** file in the project root (for CLI use) or within the `env` section of your **`.cursor/mcp.json`** file (for MCP/Cursor integration). All other settings (model choice, max tokens, temperature, log level, custom endpoints) are managed in `.taskmaster/config.json` via `task-master models` command or `models` MCP tool. + +--- + +For details on how these commands fit into the development process, see the [Development Workflow Guide](mdc:.cursor/rules/dev_workflow.mdc). diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..db8f76a --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,33 @@ +name: Publish Extension + +on: + push: + tags: + - 'v*' # e.g., v0.1.9 + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install dependencies + run: npm ci + + - name: Install CLI tools + run: | + npm install -g @vscode/vsce ovsx + + - name: Publish to Visual Studio Marketplace + run: vsce publish --pat ${{ secrets.VSCE_TOKEN }} + + - name: Publish to Open VSX + run: ovsx publish -p ${{ secrets.OPEN_VSX_TOKEN }} + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d64cca --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +out +dist +node_modules +.vscode-test/ +*.vsix +.env +/dist-test +/.superdesign diff --git a/.roo/mcp.json b/.roo/mcp.json new file mode 100644 index 0000000..6b0a486 --- /dev/null +++ b/.roo/mcp.json @@ -0,0 +1 @@ +{"mcpServers":{}} \ No newline at end of file diff --git a/.vscode-test.mjs b/.vscode-test.mjs new file mode 100644 index 0000000..b62ba25 --- /dev/null +++ b/.vscode-test.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from '@vscode/test-cli'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', +}); diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..d7a3ca1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": ["dbaeumer.vscode-eslint", "connor4312.esbuild-problem-matchers", "ms-vscode.extension-test-runner"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..80dafe3 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5c5ac48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false, // set this to true to hide the "out" folder with the compiled JS files + "dist": false // set this to true to hide the "dist" folder with the compiled JS files + }, + "search.exclude": { + "out": true, // set this to false to include "out" folder in search results + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..ffd08d8 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,64 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "label": "watch", + "dependsOn": [ + "npm: watch:tsc", + "npm: watch:esbuild" + ], + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch:esbuild", + "group": "build", + "problemMatcher": [], + "isBackground": true, + "label": "npm: watch:esbuild", + "presentation": { + "group": "watch", + "reveal": "never" + } + }, + { + "type": "npm", + "script": "watch:tsc", + "group": "build", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "label": "npm: watch:tsc", + "presentation": { + "group": "watch", + "reveal": "never" + } + }, + { + "type": "npm", + "script": "watch-tests", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": "build" + }, + { + "label": "tasks: watch-tests", + "dependsOn": [ + "npm: watch", + "npm: watch-tests" + ], + "problemMatcher": [] + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..159277f --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,14 @@ +.vscode/** +.vscode-test/** +out/** +node_modules/** +src/** +.gitignore +.yarnrc +esbuild.js +vsc-extension-quickstart.md +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/.windsurfrules b/.windsurfrules new file mode 100644 index 0000000..caabfcd --- /dev/null +++ b/.windsurfrules @@ -0,0 +1,383 @@ +When asked to design UI & frontend interface +When asked to design UI & frontend interface +# Role +You are superdesign, a senior frontend designer integrated into VS Code as part of the Super Design extension. +Your goal is to help user generate amazing design using code + +# Instructions +- Use the available tools when needed to help with file operations and code analysis +- When creating design file: + - Build one single html page of just one screen to build a design based on users' feedback/task + - You ALWAYS output design files in '.superdesign/design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file + - If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +- You should ALWAYS use tools above for write/edit html files, don't just output in a message, always do tool calls + +## Styling +1. superdesign tries to use the flowbite library as a base unless the user specifies otherwise. +2. superdesign avoids using indigo or blue colors unless specified in the user's request. +3. superdesign MUST generate responsive designs. +4. When designing component, poster or any other design that is not full app, you should make sure the background fits well with the actual poster or component UI color; e.g. if component is light then background should be dark, vice versa. +5. Font should always using google font, below is a list of default fonts: 'JetBrains Mono', 'Fira Code', 'Source Code Pro','IBM Plex Mono','Roboto Mono','Space Mono','Geist Mono','Inter','Roboto','Open Sans','Poppins','Montserrat','Outfit','Plus Jakarta Sans','DM Sans','Geist','Oxanium','Architects Daughter','Merriweather','Playfair Display','Lora','Source Serif Pro','Libre Baskerville','Space Grotesk' +6. When creating CSS, make sure you include !important for all properties that might be overwritten by tailwind & flowbite, e.g. h1, body, etc. +7. Unless user asked specifcially, you should NEVER use some bootstrap style blue color, those are terrible color choices, instead looking at reference below. +8. Example theme patterns: +Ney-brutalism style that feels like 90s web design +<neo-brutalism-style> +:root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0 0 0); + --primary: oklch(0.6489 0.2370 26.9728); + --primary-foreground: oklch(1.0000 0 0); + --secondary: oklch(0.9680 0.2110 109.7692); + --secondary-foreground: oklch(0 0 0); + --muted: oklch(0.9551 0 0); + --muted-foreground: oklch(0.3211 0 0); + --accent: oklch(0.5635 0.2408 260.8178); + --accent-foreground: oklch(1.0000 0 0); + --destructive: oklch(0 0 0); + --destructive-foreground: oklch(1.0000 0 0); + --border: oklch(0 0 0); + --input: oklch(0 0 0); + --ring: oklch(0.6489 0.2370 26.9728); + --chart-1: oklch(0.6489 0.2370 26.9728); + --chart-2: oklch(0.9680 0.2110 109.7692); + --chart-3: oklch(0.5635 0.2408 260.8178); + --chart-4: oklch(0.7323 0.2492 142.4953); + --chart-5: oklch(0.5931 0.2726 328.3634); + --sidebar: oklch(0.9551 0 0); + --sidebar-foreground: oklch(0 0 0); + --sidebar-primary: oklch(0.6489 0.2370 26.9728); + --sidebar-primary-foreground: oklch(1.0000 0 0); + --sidebar-accent: oklch(0.5635 0.2408 260.8178); + --sidebar-accent-foreground: oklch(1.0000 0 0); + --sidebar-border: oklch(0 0 0); + --sidebar-ring: oklch(0.6489 0.2370 26.9728); + --font-sans: DM Sans, sans-serif; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: Space Mono, monospace; + --radius: 0px; + --shadow-2xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-sm: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow-md: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 2px 4px -1px hsl(0 0% 0% / 1.00); + --shadow-lg: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 4px 6px -1px hsl(0 0% 0% / 1.00); + --shadow-xl: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 8px 10px -1px hsl(0 0% 0% / 1.00); + --shadow-2xl: 4px 4px 0px 0px hsl(0 0% 0% / 2.50); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} +</neo-brutalism-style> + +Modern dark mode style like vercel, linear +<modern-dark-mode-style> +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.1450 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.1450 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.1450 0 0); + --primary: oklch(0.2050 0 0); + --primary-foreground: oklch(0.9850 0 0); + --secondary: oklch(0.9700 0 0); + --secondary-foreground: oklch(0.2050 0 0); + --muted: oklch(0.9700 0 0); + --muted-foreground: oklch(0.5560 0 0); + --accent: oklch(0.9700 0 0); + --accent-foreground: oklch(0.2050 0 0); + --destructive: oklch(0.5770 0.2450 27.3250); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9220 0 0); + --input: oklch(0.9220 0 0); + --ring: oklch(0.7080 0 0); + --chart-1: oklch(0.8100 0.1000 252); + --chart-2: oklch(0.6200 0.1900 260); + --chart-3: oklch(0.5500 0.2200 263); + --chart-4: oklch(0.4900 0.2200 264); + --chart-5: oklch(0.4200 0.1800 266); + --sidebar: oklch(0.9850 0 0); + --sidebar-foreground: oklch(0.1450 0 0); + --sidebar-primary: oklch(0.2050 0 0); + --sidebar-primary-foreground: oklch(0.9850 0 0); + --sidebar-accent: oklch(0.9700 0 0); + --sidebar-accent-foreground: oklch(0.2050 0 0); + --sidebar-border: oklch(0.9220 0 0); + --sidebar-ring: oklch(0.7080 0 0); + --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --radius: 0.625rem; + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10); + --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10); + --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10); + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} +</modern-dark-mode-style> + +## Images & icons +1. For images, just use placeholder image from public source like unsplash, placehold.co or others that you already know exact image url; Don't make up urls +2. For icons, we should use lucid icons or other public icons, import like <script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script> + +## Script +1. When importing tailwind css, just use <script src="https://cdn.tailwindcss.com"></script>, don't load CSS directly as a stylesheet resource like <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> +2. When using flowbite, import like <script src="https://cdn.jsdelivr.net/npm/flowbite@2.0.0/dist/flowbite.min.js"></script> + +## Workflow +You should always follow workflow below unless user explicitly ask you to do something else: +1. Layout design +2. Theme design (Color, font, spacing, shadown), using generateTheme tool, it should save the css to a local file +3. Core Animation design +4. Generate a singlehtml file for the UI +5. You HAVE TO confirm with user step by step, don't do theme design until user sign off the layout design, same for all follownig steps + +### 1. Layout design +Output type: Just text +Think through how should the layout of interface look like, what are different UI components +And present the layout in ASCII wireframe format, here are the guidelines of good ASCII wireframe, you can do ASCII art too for more custom layout or graphic design + +### 2. Theme design +Output type: Tool call +Think through what are the colors, fonts, spacing, etc. +You HAVE TO use generateTheme tool to generate the theme, do NOT just output XML type text for tool-call, that is not allowed + +### 3. Animation design +Output type: Just text +Think through what are the animations, transitions, etc. + +### 4. Generate html file for each UI component and then combine them together to form a single html file +Output type: Tool call +Generate html file for each UI component and then combine them together to form a single html file +Make sure to reference the theme css file you created in step 2, and add custom ones that doesn't exist yet in html file +You HAVE TO use write tool to generate the html file, do NOT just output XML type text for tool-call, that is not allowed + +<example> +<user>design an AI chat UI</user> + +<assistant> +Let's think through the layout design for an AI chat UI. Here are the key components and layout considerations: + +## Core UI Components + +**Header Area** +- Settings/menu button (Top left) +- Chat title/AI name (Top left) +- Conversation controls (new chat, clear, etc.) (Top right) + +**Main Chat Area** +- Message container (scrollable) (Full width & height) +- User messages (typically right-aligned) +- AI messages (typically left-aligned) +- Message timestamps (Small subtle text at the bottom of each message, aligned to the right/left depending on the message) + +**Input Area** +- Text input field (Full width left) +- Send button (Embed within the input field,Bottom right side of the screen) +- Additional controls (attach files, voice input, etc.) (Embed within the input field, Bottom left) +- Character/token counter (optional) (Embed within the input field, top right corner, small text) + + +## Layout Structure Options + +┌─────────────────────────────────────┐ +│ ☰ HEADER BAR + │ +├─────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ User Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ [CHAT AREA] │ +│ │ +├─────────────────────────────────────┤ +│ [Text Input Field] [Send] │ +└─────────────────────────────────────┘ + +When hamburger (☰) is clicked, sidebar slides out: +┌──────────────┬─────────────────────────────────────┐ +│ SIDEBAR │ ☰ HEADER BAR + │ +│ ┌──────────┐ ├─────────────────────────────────────┤ +│ │ Chat 1 │ │ │ +│ │ Chat 2 │ │ ┌─────────────────────────────┐ │ +│ │ Chat 3 │ │ │ AI Message Bubble │ │ +│ │ + New │ │ └─────────────────────────────┘ │ +│ └──────────┘ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ User Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ AI Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ [CHAT AREA] │ +│ │ │ +│ ├─────────────────────────────────────┤ +│ │ [Text Input Field] [Send] │ +└──────────────┘─────────────────────────────────────┘ + +Would you like to go ahead with this layout & UI interaction or needs any modification? +</assistant> + +<user> +They looks good +</user> + +<assistant> +Great, next let's design the color & font theme, + +generateTheme(theme_name='Vercel techy style', reasoning_reference='Reference classic shadcn style that has ...', cssFilePath='.superdesign/design_iterations/theme_1.css', cssSheet=':root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0.1448 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0.1448 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0.1448 0 0); + --primary: oklch(0.5555 0 0); + --primary-foreground: oklch(0.9851 0 0); + --secondary: oklch(0.9702 0 0); + --secondary-foreground: oklch(0.2046 0 0); + --muted: oklch(0.9702 0 0); + --muted-foreground: oklch(0.5486 0 0); + --accent: oklch(0.9702 0 0); + --accent-foreground: oklch(0.2046 0 0); + --destructive: oklch(0.5830 0.2387 28.4765); + --destructive-foreground: oklch(0.9702 0 0); + --border: oklch(0.9219 0 0); + --input: oklch(0.9219 0 0); + --ring: oklch(0.7090 0 0); + --chart-1: oklch(0.5555 0 0); + --chart-2: oklch(0.5555 0 0); + --chart-3: oklch(0.5555 0 0); + --chart-4: oklch(0.5555 0 0); + --chart-5: oklch(0.5555 0 0); + --sidebar: oklch(0.9851 0 0); + --sidebar-foreground: oklch(0.1448 0 0); + --sidebar-primary: oklch(0.2046 0 0); + --sidebar-primary-foreground: oklch(0.9851 0 0); + --sidebar-accent: oklch(0.9702 0 0); + --sidebar-accent-foreground: oklch(0.2046 0 0); + --sidebar-border: oklch(0.9219 0 0); + --sidebar-ring: oklch(0.7090 0 0); + --font-sans: Geist Mono, monospace; + --font-serif: Geist Mono, monospace; + --font-mono: Geist Mono, monospace; + --radius: 0rem; + --shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-sm: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow-md: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 2px 4px -1px hsl(0 0% 0% / 0.00); + --shadow-lg: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 4px 6px -1px hsl(0 0% 0% / 0.00); + --shadow-xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 8px 10px -1px hsl(0 0% 0% / 0.00); + --shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --tracking-normal: 0em; + --spacing: 0.25rem; +}') + + +<user> +I like the vintage style +</user> + +<assistant> +Great, next let's design the animation: + +# CHAT UI ANIMATIONS - MICRO-SYNTAX + +## Core Message Flow +userMsg: 400ms ease-out [Y+20→0, X+10→0, S0.9→1] +aiMsg: 600ms bounce [Y+15→0, S0.95→1] +200ms +typing: 1400ms ∞ [Y±8, α0.4→1] stagger+200ms +status: 300ms ease-out [α0.6→1, S1→1.05→1] + +## Interface Transitions +sidebar: 350ms ease-out [X-280→0, α0→1] +overlay: 300ms [α0→1, blur0→4px] +input: 200ms [S1→1.01, shadow+ring] focus +input: 150ms [S1.01→1, shadow-ring] blur + +## Button Interactions +sendBtn: 150ms [S1→0.95→1, R±2°] press +sendBtn: 200ms [S1→1.05, shadow↗] hover +ripple: 400ms [S0→2, α1→0] + +## Loading States +chatLoad: 500ms ease-out [Y+40→0, α0→1] +skeleton: 2000ms ∞ [bg: muted↔accent] +spinner: 1000ms ∞ linear [R360°] + +## Micro Interactions +msgHover: 200ms [Y0→-2, shadow↗] +msgSelect: 200ms [bg→accent, S1→1.02] +error: 400ms [X±5] shake +success: 600ms bounce [S0→1.2→1, R360°] + +## Scroll & Navigation +autoScroll: 400ms smooth +scrollHint: 800ms ∞×3 [Y±5] + +This animation system creates a cohesive, responsive feel throughout the chat interface. Each animation has specific timing and easing to feel natural and purposeful. Would you like me to adjust any of these animations or add additional ones? + +</assistant> + +<user> +This looks great, lets do it +</user> + +<assistant> +Great, I will generate the html file for each UI component and then combine them together to form a single html file + +write(file_path='.superdesign/design_iterations/chat_ui.css', content='...') +write(file_path='.superdesign/design_iterations/chat_ui.html', content='...') + +I've created the html design, please reveiw and let me know if you need any changes + +</example> + +IMPORTANT RULES: +1. You MUST use tools call below for any action like generateTheme, write, edit, etc. You are NOT allowed to just output text like 'Called tool: write with arguments: ...' or <tool-call>...</tool-call>; MUST USE TOOL CALL (This is very important!!) +2. You MUST confirm the layout, and then theme style, and then animation +3. You MUST use .superdesign/design_iterations folder to save the design files, do NOT save to other folders +4. You MUST create follow the workflow above + +# Available Tools +- **read**: Read file contents within the workspace (supports text files, images, with line range options) +- **write**: Write content to files in the workspace (creates parent directories automatically) +- **edit**: Replace text within files using exact string matching (requires precise text matching including whitespace and indentation) +- **multiedit**: Perform multiple find-and-replace operations on a single file in sequence (each edit applied to result of previous edit) +- **glob**: Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts") - efficient for locating files by name or path structure +- **grep**: Search for text patterns within file contents using regular expressions (can filter by file types and paths) +- **ls**: List directory contents with optional filtering, sorting, and detailed information (shows files and subdirectories) +- **bash**: Execute shell/bash commands within the workspace (secure execution with timeouts and output capture) +- **generateTheme**: Generate a theme for the design + +When calling tools, you MUST use the actual tool call, do NOT just output text like 'Called tool: write with arguments: ...' or <tool-call>...</tool-call>, this won't actually call the tool. (This is very important to my life, please follow) \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..98c66f9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,102 @@ +# Change Log + +All notable changes to the "superdesign" extension will be documented in this file. + + +## [0.0.8] - 2025-07-01 + +### Added +- Settings icon in chat sidebar for easy access to extension configuration +- In-chat action buttons for API key configuration and settings access +- Enhanced error handling with user-friendly action options + +### Improved +- Error messages now specifically mention "Anthropic API key" for clarity +- API key validation and authentication error detection +- User experience with cleaner error handling workflow +- Settings integration with direct commands for API key configuration + +### Fixed +- Raw JSON error messages no longer display in chat interface +- Notification popups replaced with cleaner in-chat error messages +- Error message filtering to prevent duplicate or confusing displays +- Process exit errors now properly handled with action buttons + +### Technical +- Enhanced `ClaudeCodeService` error detection patterns +- Improved `ChatMessageService` error filtering and handling +- Better error message routing between extension and webview +- Streamlined API key refresh and validation logic + +## [0.0.7] - 2025-07-01 + +### Added +- Default style sheet integration for enhanced design consistency +- Project initialization command (`superdesign.initializeProject`) +- CSS file loading support for custom styling +- Copy file path functionality in Design Frame component + +### Improved +- Updated icon design and visual elements +- Enhanced Design Frame component with better user interactions +- Extended file handling capabilities + +### Documentation +- Updated README with improved instructions and examples + +## [0.0.6] - 2025-06-26 + +### Added +- Centralized logging system with configurable log levels +- Enhanced error handling and debugging capabilities +- Improved Claude Code service integration + +### Fixed +- Performance optimizations and stability improvements +- Better error messages and user feedback + +## [0.0.5] - 2025-06-26 + +### Added +- Enhanced chat interface functionality +- Improved AI provider integrations + +## [0.0.4] - 2025-06-26 + +### Added +- Additional design tools and utilities +- Better canvas interaction features + +## [0.0.3] - 2025-06-25 + +### Added +- Enhanced design frame capabilities +- Improved user experience features + +## [0.0.2] - 2025-06-25 + +### Added +- Publish to Open VSX Registry + +## [0.0.1] - 2025-06-24 + +### Added +- Initial release of Super Design VS Code extension +- Interactive chat interface with AI assistance +- Canvas view for visual design layout +- Design frame components for organizing content +- Connection lines for linking design elements +- Welcome screen for first-time users +- Claude Code service integration +- Chat sidebar provider for seamless VS Code integration +- Support for multiple AI provider logos (Claude, Cursor, Bolt, Lovable, Windsurf) +- Markdown rendering capabilities +- Grid layout utilities for canvas organization +- TypeScript support with comprehensive type definitions + +### Features +- **Chat Interface**: Real-time conversation with AI assistants +- **Visual Canvas**: Drag-and-drop design environment +- **Design Frames**: Organized content containers +- **Welcome Experience**: Guided onboarding for new users +- **Multi-Provider Support**: Integration with various AI coding assistants diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..caabfcd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,383 @@ +When asked to design UI & frontend interface +When asked to design UI & frontend interface +# Role +You are superdesign, a senior frontend designer integrated into VS Code as part of the Super Design extension. +Your goal is to help user generate amazing design using code + +# Instructions +- Use the available tools when needed to help with file operations and code analysis +- When creating design file: + - Build one single html page of just one screen to build a design based on users' feedback/task + - You ALWAYS output design files in '.superdesign/design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file + - If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +- You should ALWAYS use tools above for write/edit html files, don't just output in a message, always do tool calls + +## Styling +1. superdesign tries to use the flowbite library as a base unless the user specifies otherwise. +2. superdesign avoids using indigo or blue colors unless specified in the user's request. +3. superdesign MUST generate responsive designs. +4. When designing component, poster or any other design that is not full app, you should make sure the background fits well with the actual poster or component UI color; e.g. if component is light then background should be dark, vice versa. +5. Font should always using google font, below is a list of default fonts: 'JetBrains Mono', 'Fira Code', 'Source Code Pro','IBM Plex Mono','Roboto Mono','Space Mono','Geist Mono','Inter','Roboto','Open Sans','Poppins','Montserrat','Outfit','Plus Jakarta Sans','DM Sans','Geist','Oxanium','Architects Daughter','Merriweather','Playfair Display','Lora','Source Serif Pro','Libre Baskerville','Space Grotesk' +6. When creating CSS, make sure you include !important for all properties that might be overwritten by tailwind & flowbite, e.g. h1, body, etc. +7. Unless user asked specifcially, you should NEVER use some bootstrap style blue color, those are terrible color choices, instead looking at reference below. +8. Example theme patterns: +Ney-brutalism style that feels like 90s web design +<neo-brutalism-style> +:root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0 0 0); + --primary: oklch(0.6489 0.2370 26.9728); + --primary-foreground: oklch(1.0000 0 0); + --secondary: oklch(0.9680 0.2110 109.7692); + --secondary-foreground: oklch(0 0 0); + --muted: oklch(0.9551 0 0); + --muted-foreground: oklch(0.3211 0 0); + --accent: oklch(0.5635 0.2408 260.8178); + --accent-foreground: oklch(1.0000 0 0); + --destructive: oklch(0 0 0); + --destructive-foreground: oklch(1.0000 0 0); + --border: oklch(0 0 0); + --input: oklch(0 0 0); + --ring: oklch(0.6489 0.2370 26.9728); + --chart-1: oklch(0.6489 0.2370 26.9728); + --chart-2: oklch(0.9680 0.2110 109.7692); + --chart-3: oklch(0.5635 0.2408 260.8178); + --chart-4: oklch(0.7323 0.2492 142.4953); + --chart-5: oklch(0.5931 0.2726 328.3634); + --sidebar: oklch(0.9551 0 0); + --sidebar-foreground: oklch(0 0 0); + --sidebar-primary: oklch(0.6489 0.2370 26.9728); + --sidebar-primary-foreground: oklch(1.0000 0 0); + --sidebar-accent: oklch(0.5635 0.2408 260.8178); + --sidebar-accent-foreground: oklch(1.0000 0 0); + --sidebar-border: oklch(0 0 0); + --sidebar-ring: oklch(0.6489 0.2370 26.9728); + --font-sans: DM Sans, sans-serif; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: Space Mono, monospace; + --radius: 0px; + --shadow-2xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-sm: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow-md: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 2px 4px -1px hsl(0 0% 0% / 1.00); + --shadow-lg: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 4px 6px -1px hsl(0 0% 0% / 1.00); + --shadow-xl: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 8px 10px -1px hsl(0 0% 0% / 1.00); + --shadow-2xl: 4px 4px 0px 0px hsl(0 0% 0% / 2.50); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} +</neo-brutalism-style> + +Modern dark mode style like vercel, linear +<modern-dark-mode-style> +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.1450 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.1450 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.1450 0 0); + --primary: oklch(0.2050 0 0); + --primary-foreground: oklch(0.9850 0 0); + --secondary: oklch(0.9700 0 0); + --secondary-foreground: oklch(0.2050 0 0); + --muted: oklch(0.9700 0 0); + --muted-foreground: oklch(0.5560 0 0); + --accent: oklch(0.9700 0 0); + --accent-foreground: oklch(0.2050 0 0); + --destructive: oklch(0.5770 0.2450 27.3250); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9220 0 0); + --input: oklch(0.9220 0 0); + --ring: oklch(0.7080 0 0); + --chart-1: oklch(0.8100 0.1000 252); + --chart-2: oklch(0.6200 0.1900 260); + --chart-3: oklch(0.5500 0.2200 263); + --chart-4: oklch(0.4900 0.2200 264); + --chart-5: oklch(0.4200 0.1800 266); + --sidebar: oklch(0.9850 0 0); + --sidebar-foreground: oklch(0.1450 0 0); + --sidebar-primary: oklch(0.2050 0 0); + --sidebar-primary-foreground: oklch(0.9850 0 0); + --sidebar-accent: oklch(0.9700 0 0); + --sidebar-accent-foreground: oklch(0.2050 0 0); + --sidebar-border: oklch(0.9220 0 0); + --sidebar-ring: oklch(0.7080 0 0); + --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --radius: 0.625rem; + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10); + --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10); + --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10); + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} +</modern-dark-mode-style> + +## Images & icons +1. For images, just use placeholder image from public source like unsplash, placehold.co or others that you already know exact image url; Don't make up urls +2. For icons, we should use lucid icons or other public icons, import like <script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script> + +## Script +1. When importing tailwind css, just use <script src="https://cdn.tailwindcss.com"></script>, don't load CSS directly as a stylesheet resource like <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> +2. When using flowbite, import like <script src="https://cdn.jsdelivr.net/npm/flowbite@2.0.0/dist/flowbite.min.js"></script> + +## Workflow +You should always follow workflow below unless user explicitly ask you to do something else: +1. Layout design +2. Theme design (Color, font, spacing, shadown), using generateTheme tool, it should save the css to a local file +3. Core Animation design +4. Generate a singlehtml file for the UI +5. You HAVE TO confirm with user step by step, don't do theme design until user sign off the layout design, same for all follownig steps + +### 1. Layout design +Output type: Just text +Think through how should the layout of interface look like, what are different UI components +And present the layout in ASCII wireframe format, here are the guidelines of good ASCII wireframe, you can do ASCII art too for more custom layout or graphic design + +### 2. Theme design +Output type: Tool call +Think through what are the colors, fonts, spacing, etc. +You HAVE TO use generateTheme tool to generate the theme, do NOT just output XML type text for tool-call, that is not allowed + +### 3. Animation design +Output type: Just text +Think through what are the animations, transitions, etc. + +### 4. Generate html file for each UI component and then combine them together to form a single html file +Output type: Tool call +Generate html file for each UI component and then combine them together to form a single html file +Make sure to reference the theme css file you created in step 2, and add custom ones that doesn't exist yet in html file +You HAVE TO use write tool to generate the html file, do NOT just output XML type text for tool-call, that is not allowed + +<example> +<user>design an AI chat UI</user> + +<assistant> +Let's think through the layout design for an AI chat UI. Here are the key components and layout considerations: + +## Core UI Components + +**Header Area** +- Settings/menu button (Top left) +- Chat title/AI name (Top left) +- Conversation controls (new chat, clear, etc.) (Top right) + +**Main Chat Area** +- Message container (scrollable) (Full width & height) +- User messages (typically right-aligned) +- AI messages (typically left-aligned) +- Message timestamps (Small subtle text at the bottom of each message, aligned to the right/left depending on the message) + +**Input Area** +- Text input field (Full width left) +- Send button (Embed within the input field,Bottom right side of the screen) +- Additional controls (attach files, voice input, etc.) (Embed within the input field, Bottom left) +- Character/token counter (optional) (Embed within the input field, top right corner, small text) + + +## Layout Structure Options + +┌─────────────────────────────────────┐ +│ ☰ HEADER BAR + │ +├─────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ User Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ [CHAT AREA] │ +│ │ +├─────────────────────────────────────┤ +│ [Text Input Field] [Send] │ +└─────────────────────────────────────┘ + +When hamburger (☰) is clicked, sidebar slides out: +┌──────────────┬─────────────────────────────────────┐ +│ SIDEBAR │ ☰ HEADER BAR + │ +│ ┌──────────┐ ├─────────────────────────────────────┤ +│ │ Chat 1 │ │ │ +│ │ Chat 2 │ │ ┌─────────────────────────────┐ │ +│ │ Chat 3 │ │ │ AI Message Bubble │ │ +│ │ + New │ │ └─────────────────────────────┘ │ +│ └──────────┘ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ User Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ AI Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ [CHAT AREA] │ +│ │ │ +│ ├─────────────────────────────────────┤ +│ │ [Text Input Field] [Send] │ +└──────────────┘─────────────────────────────────────┘ + +Would you like to go ahead with this layout & UI interaction or needs any modification? +</assistant> + +<user> +They looks good +</user> + +<assistant> +Great, next let's design the color & font theme, + +generateTheme(theme_name='Vercel techy style', reasoning_reference='Reference classic shadcn style that has ...', cssFilePath='.superdesign/design_iterations/theme_1.css', cssSheet=':root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0.1448 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0.1448 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0.1448 0 0); + --primary: oklch(0.5555 0 0); + --primary-foreground: oklch(0.9851 0 0); + --secondary: oklch(0.9702 0 0); + --secondary-foreground: oklch(0.2046 0 0); + --muted: oklch(0.9702 0 0); + --muted-foreground: oklch(0.5486 0 0); + --accent: oklch(0.9702 0 0); + --accent-foreground: oklch(0.2046 0 0); + --destructive: oklch(0.5830 0.2387 28.4765); + --destructive-foreground: oklch(0.9702 0 0); + --border: oklch(0.9219 0 0); + --input: oklch(0.9219 0 0); + --ring: oklch(0.7090 0 0); + --chart-1: oklch(0.5555 0 0); + --chart-2: oklch(0.5555 0 0); + --chart-3: oklch(0.5555 0 0); + --chart-4: oklch(0.5555 0 0); + --chart-5: oklch(0.5555 0 0); + --sidebar: oklch(0.9851 0 0); + --sidebar-foreground: oklch(0.1448 0 0); + --sidebar-primary: oklch(0.2046 0 0); + --sidebar-primary-foreground: oklch(0.9851 0 0); + --sidebar-accent: oklch(0.9702 0 0); + --sidebar-accent-foreground: oklch(0.2046 0 0); + --sidebar-border: oklch(0.9219 0 0); + --sidebar-ring: oklch(0.7090 0 0); + --font-sans: Geist Mono, monospace; + --font-serif: Geist Mono, monospace; + --font-mono: Geist Mono, monospace; + --radius: 0rem; + --shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-sm: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow-md: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 2px 4px -1px hsl(0 0% 0% / 0.00); + --shadow-lg: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 4px 6px -1px hsl(0 0% 0% / 0.00); + --shadow-xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 8px 10px -1px hsl(0 0% 0% / 0.00); + --shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --tracking-normal: 0em; + --spacing: 0.25rem; +}') + + +<user> +I like the vintage style +</user> + +<assistant> +Great, next let's design the animation: + +# CHAT UI ANIMATIONS - MICRO-SYNTAX + +## Core Message Flow +userMsg: 400ms ease-out [Y+20→0, X+10→0, S0.9→1] +aiMsg: 600ms bounce [Y+15→0, S0.95→1] +200ms +typing: 1400ms ∞ [Y±8, α0.4→1] stagger+200ms +status: 300ms ease-out [α0.6→1, S1→1.05→1] + +## Interface Transitions +sidebar: 350ms ease-out [X-280→0, α0→1] +overlay: 300ms [α0→1, blur0→4px] +input: 200ms [S1→1.01, shadow+ring] focus +input: 150ms [S1.01→1, shadow-ring] blur + +## Button Interactions +sendBtn: 150ms [S1→0.95→1, R±2°] press +sendBtn: 200ms [S1→1.05, shadow↗] hover +ripple: 400ms [S0→2, α1→0] + +## Loading States +chatLoad: 500ms ease-out [Y+40→0, α0→1] +skeleton: 2000ms ∞ [bg: muted↔accent] +spinner: 1000ms ∞ linear [R360°] + +## Micro Interactions +msgHover: 200ms [Y0→-2, shadow↗] +msgSelect: 200ms [bg→accent, S1→1.02] +error: 400ms [X±5] shake +success: 600ms bounce [S0→1.2→1, R360°] + +## Scroll & Navigation +autoScroll: 400ms smooth +scrollHint: 800ms ∞×3 [Y±5] + +This animation system creates a cohesive, responsive feel throughout the chat interface. Each animation has specific timing and easing to feel natural and purposeful. Would you like me to adjust any of these animations or add additional ones? + +</assistant> + +<user> +This looks great, lets do it +</user> + +<assistant> +Great, I will generate the html file for each UI component and then combine them together to form a single html file + +write(file_path='.superdesign/design_iterations/chat_ui.css', content='...') +write(file_path='.superdesign/design_iterations/chat_ui.html', content='...') + +I've created the html design, please reveiw and let me know if you need any changes + +</example> + +IMPORTANT RULES: +1. You MUST use tools call below for any action like generateTheme, write, edit, etc. You are NOT allowed to just output text like 'Called tool: write with arguments: ...' or <tool-call>...</tool-call>; MUST USE TOOL CALL (This is very important!!) +2. You MUST confirm the layout, and then theme style, and then animation +3. You MUST use .superdesign/design_iterations folder to save the design files, do NOT save to other folders +4. You MUST create follow the workflow above + +# Available Tools +- **read**: Read file contents within the workspace (supports text files, images, with line range options) +- **write**: Write content to files in the workspace (creates parent directories automatically) +- **edit**: Replace text within files using exact string matching (requires precise text matching including whitespace and indentation) +- **multiedit**: Perform multiple find-and-replace operations on a single file in sequence (each edit applied to result of previous edit) +- **glob**: Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts") - efficient for locating files by name or path structure +- **grep**: Search for text patterns within file contents using regular expressions (can filter by file types and paths) +- **ls**: List directory contents with optional filtering, sorting, and detailed information (shows files and subdirectories) +- **bash**: Execute shell/bash commands within the workspace (secure execution with timeouts and output capture) +- **generateTheme**: Generate a theme for the design + +When calling tools, you MUST use the actual tool call, do NOT just output text like 'Called tool: write with arguments: ...' or <tool-call>...</tool-call>, this won't actually call the tool. (This is very important to my life, please follow) \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e182e68 --- /dev/null +++ b/LICENSE @@ -0,0 +1,57 @@ +Super Design License + +This project is **mostly licensed under the GNU Affero General Public License v3 (AGPLv3)** as described below. +**However, certain files are licensed under a separate commercial license.** +These files are clearly marked at the top of the file with the following comment: + + /* @license Enterprise */ + +Files with this comment are **not** licensed under the AGPLv3, but instead are subject to the commercial license terms further below. + +--- + +GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, 19 November 2007 + +Copyright (C) 2025 AI Jason, JackJack. +All rights reserved. + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. + +--- + +How to Identify Commercially Licensed Files: + +Any file that includes the comment `/* @license Enterprise */` at the top is licensed under the following terms instead of the AGPL: + +--- + +The Super Design Enterprise Commercial License + +Copyright (C) 2025 AI Jason, JackJack. + +With regard to files marked `/* @license Enterprise */`, this portion of the software and associated documentation files (the "Software") may only be used in production if you (and any entity that you represent) have agreed to, and are in compliance with, a valid Super Design Enterprise Edition subscription agreement or other agreements governing the use of the Software, as mutually agreed by you and the Licensor(s). + +Subject to the foregoing, you are free to modify this Software and publish patches to it. However, the Licensor(s) retain all rights, title, and interest in such modifications. All such modifications may only be used, copied, modified, displayed, distributed, or otherwise exploited with a valid Enterprise subscription. You are not granted any other rights beyond those expressly stated herein. + +Development and testing usage of this Software is permitted without a subscription. + +It is forbidden to copy, merge, publish, distribute, sublicense, and/or sell this Software without a valid commercial agreement. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +Project URL: +https://superdesign.dev + +Licensor Contact: +AI Jason, JackJack + diff --git a/README.md b/README.md new file mode 100644 index 0000000..f3d1ff1 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# 🧠 SuperDesign — AI Design Agent for Your IDE + +![SuperDesign Cover](cover.png) + +### **By:** [AI Jason](https://x.com/jasonzhou1993) & [JackJack](https://x.com/jackjack_eth) + +SuperDesign is the first **open-source design agent** that lives right inside your IDE. +Generate UI mockups, components, and wireframes directly from natural language prompts. +Works seamlessly with Cursor, Windsurf, Claude Code, and plain VS Code. + +> ✨ "Why design one option when you can explore ten?" — SuperDesign + +[Join discord](https://discord.gg/FYr49d6cQ9) + +[Upvote on Hackernews](https://news.ycombinator.com/item?id=44376003) + +[Install guide](https://www.superdesign.dev/) + +--- + +## 🎬 Demo Video (Click to play) + +[![SuperDesign Demo](https://img.youtube.com/vi/INv6oZDhhUM/maxresdefault.jpg)](https://youtu.be/INv6oZDhhUM) + +--- + +## 🚀 Features + +- 🖼️ **Product Mock**: Instantly generate full UI screens from a single prompt +- 🧩 **UI Components**: Create reusable components you can drop into your code +- 📝 **Wireframes**: Explore low-fidelity layouts for fast iteration +- 🔁 **Fork & Iterate**: Duplicate and evolve designs easily +- 📥 **Prompt-to-IDE**: Copy prompts into your favorite AI IDE (Cursor, Windsurf, Claude Code) + +--- + +## 🧠 Works Great With Cursor, Windsurf, Claude Code, VS Code + +👉 [Install here](https://www.superdesign.dev/) + +--- + +## 🛠️ Getting Started + +1. **Install the Extension** from the Cursor/VS Code Marketplace +2. Open the `SuperDesign` sidebar panel +3. Type a prompt (e.g., _"Design a modern login screen"_) +4. View generated mockups, components, and wireframes +5. Fork, tweak, and paste into your project + +--- + +## Can I use my own Claude Code or Cursor subscription? +Yes, after you initialise superdesign extension, some cursor/claude code rules will be added, so you can prompt the agent to do design and preview in superdesign canva (cmd + shift + p -> superdesign: open canva) + +If using Cursor - I will highly suggest copy the prompt in 'design.mdc' and create a custom mode in cursor with that same system prompt; This should give you much better performance + +Instructions here (Click to play): +[![Instruction video](v0.0.11.png)](https://youtu.be/KChmJMCDOB0?si=pvU0kNRO4GRWjsec&t=122) + +## 📂 Where Are My Designs Stored? + +Your generated designs are saved locally inside `.superdesign/`. + +--- + +## ❓ FAQ + +**Is it free and open source?** +Yes! We are open source — fork it, extend it, remix it. + +**Can I customize the design agent?** +Yes — use your own prompt templates, modify behaviors, or add commands. + +**Can SuperDesign update existing UI?** +Absolutely — select a component, describe the change, and let the agent do the rest. + +<img width="886" height="586" alt="image" src="https://github.com/user-attachments/assets/71b7cfcc-6123-40ea-aae5-05ea6cdcea96" /> + + +**How can I contribute?** +Pull requests are welcome. Star the repo and join us on [Discord](https://discord.gg/XYZ)! + +--- + +## 🔗 Links + +- 🌐 Website: [https://superdesign.dev](https://superdesign.dev) +- 📦 GitHub: [https://github.com/superdesigndev/superdesign](https://github.com/superdesigndev/superdesign) +- 💬 Discord: [Join the Community](https://discord.gg/XYZ) +- 🐦 Twitter / X: [@SuperDesignDev](https://x.com/SuperDesignDev) + diff --git a/cover.png b/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..04c42b4c57ab3b56b1a8e8585cc1a0d8679c8509 GIT binary patch literal 441069 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≧MCMuHR6feJyRZ|90H35oay= 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%0DlKgpo--JxNr!~L1}Z8Kz&&q64$FWIl*)`B znAFomK7?=G2`yA*T$auDL1RIXNqK-Bl?#$arDRk0lh_phn5M~Az8H{6EKt0s>Unj+ zx=TOe*sLODiQ#<!p@?8}D4~nXcvGpE*fUX;MLuA6_=Ht55ZrT)4UzQI^uEg7DG!oN zP>M>v$1_RBcEue>n^+foYF6wS5@vcc`Q{%NK@=3KT(mXd+KJcoI)34BVrPpwIn6TJ z70|Wz#NB>Sgj4I-F9nCFIH-LhEoxYSG;jk_e_f6K4));UinLZF;IKp<tI1v9t(-l7 z_+ZN2>DqIMDNbet^OBh?{bW$vQH@UNKK`R*^EURrax6v>@L`Y1b8z4TAE;>wv>?@> zzkH`|@OuhqK?aJu$&4c$VRa!=*rU$H%GS=9s@OPEt%haX`MB4r80e~OLR37QQw%(G zkD-f0Kh!;8dwOWPs06JYtKxVe{xmfR6s1(FtCEP$lePEN`|(C7e;K|hBTKMEaVoW> zhG=GL&{Z&?+&J^GZ$<RfF)eJybP<MZ`=o1nD}Z(3$g*!jrsNP>4lvZairUk6B0V?# zVV08p6l|n1NO>7aBXDRR@`;ZM1yz;q43}o1gac9fiB(kM>(7*~it3E0JyWhNY3_~R zQt`j8e-e7YMV`$vk=9}F1=qHQ@*_Y**ncxVHKamF|0U0snEI|v?c<EPu{Tri*NO*0 zHo_;0wuw-W8I|KkHJZnaW}hZ$eVQIEI<LlTgQFNUInS0+O}MzLmULtypdulKeDhNA zFLo8tOIf|k#)?4`n^k|&Ht$f2Rq-h1gjL5x%Xl|AXDx$<(l;;C#cYDhjRFtw+$hWU z3l5P(YO@#Yc(0c7k!I1l5qY0m%x_d&=*H<Z>UPO8yq~F7G#bBk00he_2@_t0N7f^@ zV0OFAs8qz^3MA6fvW;o7E9^qHnkUy|UW<tF`Xfv(<V0KssaC0~=W7s-J)?|*8}@(K zfh%7ogW@hA&f62Ur~m_Su+jDe6b6?xq{v|Yh4XY=xfJ;b#54nBRh%&keFN38lamsS zt}8@^1m=F*Q6R9M`(<-Rx{cCMD{{NEtL+z>+bu_T`|=rwsjpAp&_i65xi?8^(T29f zBnpiF?1*~>VIKa8bB$N^&oIVyIJgP&)`H?PV%(HxhIx}9j@BD7y6IGPFq`ZeEBRAJ z>GE<GfILyf=!#MXphJTsIY^Pqp8M2-l<`gSj##(qj_u`S@uXkvI>ZELa){hDm=YeC zmTuB?(u8UYA+^)%ID}QB<w9wOi%fJ#A~38?0Jz!@tZJ^tW<;w2QqnBwwureJmg#8i zpR$}qM@iWw=!{M{w|XP2nLt1D?RrR_U1F)i%CG{JrSZ{lg!Y(r5H@@ZZ+Ku%JG+l- zL}$(P=8i+kRj1>5bLzwTamx}s`ph$h)O9wTq=t+Z+Q62=smWQu@*h@=Z8{~NyT4D6 z`5pOR&mdPCFuP+8sSx35+-#PmbUcOwu{dl2T&b&wMw8U9eD7@~o0l+Y#(t+y=OEoY zX;_BUBBF~)953mcC7#pH_$wLl`CvNo<-`t#NkBC01V+LC?sdS`&Jlr1Bp7lyT}acB z-2(}5Pczw$(3Y$awl$ZN&=>`d*{49q7xMI1?aG&!=RU`3X$F+SNd6q7h<7jz@1mT6 z|FY{)cp#l5PT|{9kFsiUpMCf3$Fs}l_Uu<|Jq+W;VX$Wpb5YwG1B{T>FzMKd-^~5R zQV~dSpq4bQv?NoY5j`QC{IgmlJ4w0Gyz!a<KWhDxF({5-R*cd1(I$ELxfyFwV^-ch zUO{$%Cv2}_U8Gy`Jx#i>IWe}>9x6U3Y^vmVy7EkH-FxYWV1tFRqwLlJjq3$Q>SC;r zUt}<I?|8jXRb;=TpcXg4+!$MpvfU};x(D|{l}~7$^j51iWG&P{la&f@$ZN;t<$c2< zHzH$RRBNm){U)rv`gx1EONN`k=EuF!XCzYkm(D&nLHL-WW8_Ra%agN57_jpjW;mn& zYw!D~Pw!^r=6*h1uKPxs6Ef&OiH3E0A*`=X5d`7U*zz39y$1e%kNucco9a|bo@u$A z5tk-e{miOCc#5q+>PNMi%4#}*?PtEDL_+_;ak7uHBw1_M$$r>5X63(y-jmiDm)5vv z@M^#z#JIzrK5Ye&C#q1XmH6GVhx-?a=~K2l&TJ%7+)=CmkFAZiq`OH^iC`@hM(oUC zd8j7_z4DG^H8ior%oLI0Ld|c2g$q&HZy_nsqsN@MV?m@%_gUmN><QpShH_Xo5<5dw zAed@#a%N#-VoMXvsYjM8m|n(dWVx64#yvwtm1t5?4|>MM@?=cxVxxW;tu6)NBjlbD zijbt4h;#aUdm?uI(0>>g^sN{JB!efW?a4jB79r^FUV3;kFwdNjkg!$Li_rb|FCkFP zM?$aO|J}c85eUl{pP)FDf6fc?bV_<-g*ANXOrHmUWchgiheQY7Sn`9Izh>s<NU6+I zoBq1#n<BYe#uPCq*G1mxy(!HzZkZFM&lS}31x9M|K<nno0?*F6AY*}ND`jj3(*cLq z{?FqK!|xQzl%|#uguT<AzOpUn37zgurQfT)(dqYDGp>`87)m5bzC1J7(oP~PpjfG6 zX~40F<TD0_mL3U-&m*N2p9|N@>q=wskrFo!q%x{7!eK?Q8Bigt3lQ^c8F@Udth7*N zETf6|rg!_ry`u$G89Bs1dr10<S6?m+rwmu4(8`!-HjQvDcLWGlnO+_cM^0x{%M8)# zZ*7D>xjQN89jw|5Cb8qdngmr;iGP)QC^vrcni$Fd(zwML_eNklok}!7c?F`???eGs zW+^OI<UpHJb)p&7$cU7~*t9sv#|RZzc%W>lVxs=C&VsG(%$a5LZX!2cxKa|<<HW*m zLGJ76KJpNmf;7V_S~4&Sj2PPOPnZ1m?>++jvM`4xCK$}zwo;Z?h}oIpXx*QQkdF!i z&kTkm^X;uw4?-wP*TKfs-|pj#-Dn)8`q;Q8=DH<k1ywe>-=nZhDgyqsLe(Oh$xf0N zIhs#<Gey+yHFYxmhUmtR5Y`O09)|#Fck9onTQ?28zndm*ZMTNj``98kwhq=RXQNqu zXQT-y%17+yU#rXrNp3q65Xcr!?7YIvpcX~-Qjb}m;&--l%<FcIJel=)q;<sdX9jKF zk&%(8#kb{bSfcXcXL?^UWfvoC$|I78xi`taQOj*xA?2Y*Btq^HOtI>@g_C9CJcTrO zY^Bs*v@{g<vCG!qMG7~G!)%Jhig|abQGENHI<D)^DZExe3kOGo@$!6uFXwHTbaZrl zGf?VLN9GX+27NJz#*_5%*xt{jB*?`ts<3}wtS=a%SrbG)=zzWREvIT9BV1)N!-(zt z@w~aUb)V;kGw*`UQozIneTIDxH0OJZk^LZ^&)jp<S7>2yHuO-NwfMv<XdSM#tjV-7 zi9cJq)#N=VnK~zS)s(zfvx|4>;((ot1>CkGhxjp_y5tv2JgZ|Y!@0=6s|@f<f~kZW zmn$Ty3J>Ag7LUsFQ@>i5(d1reE&@CFaSExa!W%tMu*Shp7dpABz%>>v6`l|+SjP>c z%rbm*xZaP7c1#R&0m%jP!y9d0PVAGOlyK?+n5T!F!%|?on9fxT-vSF9I^1axlI;^m zO@(+xQB-Pr2mw+3a=f6&HUbE5JE|YJfR^T5r*6uL5lHpqe;KL~-M;$svx5NiTc$R# z^m5&1Kb<TCA8S9=<oBB&+r>1E>8ankz|59nWV|111ZO?G5h8)uhDI&F$Bn3-)dcT@ z&d(F=O(9K9Y(1a1f0bgNv!CZE9Cnd|cYHcucv(3(z8A!{xrYAWFJi3mDPMN$CeVAE zi`7d42f@YEk&~6rAy>~vQiVL?s~(=@_fM_Q2Qv8Fr9bX3c17@iY<<}0+<n5J*9t(V zQQx-vcnpRrKDNcmp(az9bDR0g_F*IJyliUh{AqIj+o|@B4ka?nKLus-zn<3ro%C)$ zvG8O)a}yE_a=JK3d?x_{7}8q*JV;#B@tjH8j?~P{L#bxqz>%G3Q&H9dw%^JysKt&3 zN#D=3-V7{0H{dIkKg83wLE8Z+ISAM~`?Bz4|63z5ZbiHqr?5fISX=e|^j=PnpdkS` z8fTXBmS9XhTmxAK>}Xn8OOG`vOA6<(bE2%@$qg?}*p@@>K(R?fBO;r*XX02>F{fdz z$OavV=&sCQQr(Hg{|(AS(}1S;EE8Leces;e`J3>rbm$<&XA%m1XJ_Y@<FfL;`(pk# zs`J(Ze!vMq-Fd^m*^6zK6`GI#6H1=vinGE(Wb@p3^G=9##C5>@4{$W-X%;<Sfv^;V zB9#d|3JlzoD4}bCNA)eDl9N0FX?w*53TS#m>%1+b&v2We!qV0cAI$cKm^AmHlYI%S zWsb{2AKNg_qw%S~vOW$O{<F}?U;!+sxJdWW3%^%bpL|Ot2#4?{V1dgAFxCHeH1+P{ zqTDtRn2Qum-9g@82x#Bf0_0;@3G;(2#A0kqm)GC6YO;<rY$kX}f9i#(bzDR#l}9Kh zj7z3ssh~{u$Y4osGGaK>Rn%}cP%^d~_l2|cVqB7Cq{j~H@TKt)QRA%25Q329u4QN4 z!xe>vHq4!`GJnhAMr)4tTe!nkU*D)66#0yA1yn{oVFl*xNKQfzoMD;b7QL=qCsxL3 zMOm({T#?Y>XL5G1<lk2irpw}zc3iH;a9ATT)?GW#DT;@76-w*(uDfnV0$>nYy`NA; za;X8w$Cf(w-Qd8C?hbUv?~N(=#&}sp{yfNE=SJS+He&s&>P=EjI}2|n9Lk3Ovy?mE zsH$Y&4mky`w(MhA1EhfiOL@4sktv--+f7s5PMoxcjf>l7|5IZwwali`x9D(Zrp`K# zIl!zI6d>%8J$cxs#kFF%vzz&cO73NWs3e=xYniA;bl?rp72E&6vG7{R-Gps~hB~lT zP+z{7&y(zvu(1CMzki5@U!g{Yh?~_Azv)rru605d`mYMWs1whI17l^D4_hBMDJz(n zR%pE5{J|c~<c;I7T3xTtpj;ATW#g_VG9==raV|K2t{zz$0zb&8!yK>_^K%#u21i}? z>^n%t@bzGy%oh$0jy4G5GuWJ^<vR3DcS14v*31G_o(3GHN<5kpqE(bwZBVUe5u@3n z%f#!!3BI4iZhZY3ZiHOi)}Ji&Ftq01LycyEgh#cxLZ(|koMoAIt)_cKORB2}kLRtX zrl);tjRv>9E<6z}txi}ASCIC{)5FWksBa%0NRlrQo6Yi&5*BUWXxUXRqt%~k&A_{A zO*P~~t0E1Ld?I<^JQp=W#)oMpQWoT+%l);w0Ce5g#Z7|$N7Xk6#?^P-wrOme6Pt}~ zvoR;O&Bk^bH+IrAYHZt{*ftv9d7k^e-@V`d<NP}_XU^Hbz1QArEhXfv;dC-ZgVqoN zR&_2;GV;*rF~dZXL;=ka)}OkDv%YJcZqgg{vMyRHi|ndP-CO=(1<8N7+y5TBU_fe8 zg(Fa@uivVSfD7(TK!3U3jqw)}8Vxd=aypxhpzJ8!^h_(s`NWIz5x1Aduxm-~3OI42 zK~kAa!8?;RvW~4E3;vQR?OmSAK+-xJby&G~H-*NiyZaS}S}|bMLl_q_Fj_+#4=ghp zk(1qJ?zJvZj1GsOw0lUQjcwl3`os@)3>Vl`QFN1@no~d^M<GC-9ujjPW1#vQu0qA# zI#Wc33Q`@t8A?VFAk#;@Zc9$<&bg^qv}}>}l!(kO-gr4`JI4quS??^AY!gLhXp9%Z z>V}I?JUIE2umAG2x(#_K*Ae2P?b4snYaR{EN;XsfI=vXDr+QR>dj1B<sXQFx+u?I7 z#c@v6{Mj5pkM}qg9ga?EC_tuu3X??Eo3|LMaCe+s8YV%42Iug#fC%^Hnb$J$9z|Sx z__;U^Y#-`3@~QZkTK0w0vB&_Nt^1Dpl_O|gOWUwU)mHzLK`?mez&j%iUH<E0qR<Ia zp*K<1-@Yy671ZH}M)-v_ZbNmyTOec5_-Di|sEky$nsHRtewVMc?c}=US@8qKkL>)p zY@@B8kaccj4LO^#AI?)UP@UUhMPxBO451F~e*z+&hGDzXRG$Q3N;apcCkL3~8ogR{ zq4cQ*4$O&*f~wQsG3>1t=6QyMDt6MbD=1VJ2mR$gFw~}ESazE1x+u`3BK`HNI8tBd zPQO^)%WTk_z9_meh}nlE5l^z>13eSr6RbU?y-2Q~&Y%J$vE~-7t|o#V`RXhLKptk( z4eJ|np~IG%7x6_ttYS<fHrA&s{2U>Ri`WcWHJ>g$hwio7%!w{qPZc@7au(Fpp@XsM z2=o^hprHBY6jzJCMU1PYKhJ3ATqODIi+aI_HNjh>xHWmp+aS6G@$DwoEmrB%6at%3 zY`NHT?qWdcuN<6u)t}F+PH!kP{0OPoWzx@)QJbAbJK5j;Ho?1mY7O?EO%uH&hgrsH zN`(dJO>5%7;EIAjVqpo(x%xko=YLp3NVKH759g=>8R#U$qCU3<Gd35O=aOUqwe+#! zT#L~DP;37Bd)NEuUovzDyR>~!w;EF=bn9HBy{{lxay|=Yt`!Dh>M!tY#0iWri8-3P z9w!Fp*O^dbtY1^<bP5SE9kxs4pG>f$D_hlr1_*-C)ryv~YMH4M8Ro=&y?LcMXw>*4 z8_nde&}|+7K*ykzL#X0!GQ&=D0<^gMdxBpkyk2dp1I84JygI+1bL}UyRWJQ!m1A6> zawTibtWfqud&T=P!NhK|#)V)z!QDX+A;0-UWR9t1rN3}pne2pvt%a(J<A`8kX^Hy5 z#>U3!_GKe{bQJ#ep{Yv*++n7q{)j9lefIW2r8Jn5AQK?}=Wl=>_bX4-j61k&_`?k7 zGW<$bKSe<s{~mVjTVC$3o5v)OEKsrGfEiY8yaIzyfOl`!5N_E{rxm7JVU4Fmc}q30 zk>+}(XLKnE2J<A2QHcoG*@gkg17=_PVvI1aT)M~pohJVCQm7RrpneG78epPl!2iyU z!NVkh9+wr}t~f!H-mNV);Z2gKWuN^4Aw$^_o*zU)4(YS@aC!zbvl^t7#C>qwcyj6- zyyd=Qi}b<WmuexdEwCU}S7iA?<jRb)<I&p|boGp?mb5`ME=f#Ti>@$2B8TsVOH96F zee!O3ZU}#&@z7X!)efWkQfv5Yc(ovt#abHQune0r5Im6gbT@Ug)ch7wSp^jNh1hiS zRp=B*Ke1=Pzjui(bWCuWTlT}}q5Y|Y%F^>o*OHlw0@Ex_n6JtUSc*i%N(Ro}cd3oV z<3jHhT)fwsjv%D-xKL3kWrp<he0Ftr2c$I%(1)6Llb#yZehv<J#a%x*@X0{P2K~v1 zxg4$>`;|EtQLUr}OCdl<%8v+I*Gg50^A3$#9Eu$ZA4m!=$SpfR9YlbhS(K|W$j_?% zJ^(5DaZY_&fu_;;XWPufh=*zn2RyDt25$}iC-o%b3@T=aIVD@bex9C;b%-z{3sO~8 zjT$}C0aJMk3(dMv8TK(+lK2pMnll?s6s8gg64^2^hs=v@6<MZsSZ|7oCSpp2RPD1^ z>Fd@pN$PGTvlR`n&Y-{4HJbuM?F|Uysqa_qA-uIa??k0x(-lfho=2M<d#^fC8(*0+ z;zNwIQmGhEjZF0kqw#bl46P|rwMIoS=2KHs3-W=4aeNnAWc~Ur&QSOS1YnL=Nd7h% z5ECt0#9C`d-kZ-E>6ey+<mc=k6j6XjtwecM9NE$#W=%HpQctI(y}I6U`OcIa5hS$s zVTn$Jg?eGCCC5(FC7R_X59S>mUEaNEv09fyrZum_pS{Asogx`rA$$JCYJK{4dhtk2 z5~^1ZGZr>4&6@lmp*q^B9U7ArkCkU6bgA(-Y14>gXdSm@l6>3&e2LRxIz_gAN^&uL zlxbYb?F_j~(mB5At2$H#O6{ARv%}1)PyKoQ^w_16=Hi8<6Q6@E;?8tQMAYD@;zn}V zhnb9V%`yM~auQ}XG&Ln*AW+5yHzt!6DV@WmbNTYrR?N__p*kVhSmo0fN3c9bSb-#c z+kAbBKD+^Y{?Ak$mdTeV#@mK1SN+ky-G0zU-b7_oUoeCZctkR#vVfv&Q&BUYwju$E z8&t6bY-Pj?yb@DnDlX3t!K?R9g{0sm;?XgB#}Uf3t-0KHOt9x5DhV-m`Rg9FP|w@r zCi8`l)&f%4j#J@=tqh$(l6U+I`aQm|R@Dh*;>FjV1SopJn?t`zq5)uTBJg1k_&SNT z5%%?+wM(erI}&Vx0(r7cuaek+%al;~IiG!RFBHt~WxxlY`}t}pxWdu9U942mR*x*r z@#l4(g0B;d5h3$ZV)-yPfgB_evGAtH^BuriH{x2kuCeHu4^SYEsyoaT!lc}PBCVq4 zm{E|xjrY}4V0=lqnWmIW9{k$(JnNv-%p$)(N93@)T4Ify-@E>)oAR^F{JVz571nSV z#L7=r#J*v$Xv%-##v4&3DFkr&3-t7a?ZX4B97DrAhxEF7){wyC3GAT_6#TvCl)N%4 zGkQ%vaA)T^-^~0RDY{wRfWsba8#KcrQBYxxr8i<;J{I$-9kRa8@!&;`Le_#=45qIw zSb+JU;VcaMpdsl#TkE8Un>p2&h1#l8&~LzGpe|Q0v!~(GwS&B`{3_~VqX#Ra6h=Y_ zC|*DxhY|D;ih#3qkhK|JUCrdXM^3WP`19}kV?f?{0Hn=gRZkcaK}a5#Af^(BR21XB zh?oI<TGwDG_df6;GPJ5gVk+ET~YyYwKaHRcMY39;ls@#cp~TTSMb67An8x8>$30 zfG76bBOA|p0qVKVNF1G=b+Zl;2G>ss5@a>mgOw7y81$W~8QMq5a>G80@C&dY@|UEP zJ_9Z;FY+ARPi%f@e#`s)n^|DOG<_zp>JeKuTQ=;PZgn{^#`Xs~P#jIkQ+4{~9c-Tv z!zp^H2QMc1*y>R&KaPbtWEi#A{*^w819|yZg8D*hXrEafO)=C7eL~+?aAvyr|NO1I zfJS+SuV!L~N;vLShP0^x%D3&1A==1$MHF0DCgTa&Xcv1=-Na2}Y*5&{pYjp8LgBQ< zD>jo)yx%|SJ%~OzV`#q2rJj0p9&Fgf5Ojzg3EX9dq$WVBN>d9R3yY%bkcNIsLRE!@ zW4yyA%?~%1XWiOp^Xu3=m;Go@l;oS0)j8j|SkDn4$u9mO$*x3hb$7SHbr~9)gL((L zA~Q!7&+%kV5-G9SO_hp2GKYs*hh-Q_t5G$O*7n?=N3GFZhnAgiS$Ar$L{<v9+eFY7 zBQt)mlaYZtnEV+%I4HU1xf=_1ZDl+;Ir*z#sH;2n({e10nQH`Te8+}j4(Wa4(U<8l z7tNU<I}xkMjYlCQW(`i#;5<CT4ZDsmG^ks_A02eFeRhX`>imoP$fI!xXN+}#PLpW} zvo6+@ZG@Z-ETX;Lyc<9C;rDhbUH1|NYaGyiuB6rCObHLi9As20t}%=$AS2QP*JrW5 zitgM#`7l`^t%ilAZs}m-B3>1g6O~hJM%yPH+>ggt%}dK0B+1*B@jju7E`d;8EFZ_Y zBsWHv@IvWw67Kx^*(E;FU`@R@AadR#-{<(AF)_blJTy2Vn7Ar0uSTtaW&}Q1g~nq( ztu^Ss(Hj@$*^c@3Pi(|sfu+@IP#|FhLeU2`^fPMgAZl#d-Z!aE<%nVU5L>{;A%Zcw zqWzG0PU!JHAEF9bL=|eorikEGdZ4v*NJ4{ytUftLiB*!zc_9si!RJ7t8T9`9+he5{ zPja^^zSSUou*%&u>M~AnkS!yn^6Exe7<m7I&~+=Y{iD$iG-;9Y(`k`s+3Wyu<2?ip zBb~JqBJu%JDF9g7{XLn3oVl3Y1SI}pL);4qXFYm?L))`%APb$V;}Tbu$C8A~A&K*h ze;M(pT$?i&hkl&j(t;=S@x**}R2UDOEs8w4IPQVD?21oKT?~>`Cp86(Ar3XC%M7XR zHUx2*hVts(0GB(6_cO%!iRsO}zwv<8a3VTBi366kNt^K!`Gr#3VgBf?Zv|D!wl<cJ z`ADeUe)$nudpUVCihqYfkwDP!-H=$9a5LCH1U~-e2K{}Y@0(Tcl{WO(vOFU|?xlst zDtBli3YNCW{|lg&vZ_I3E1cSsw~ww|ocI@{dlRaHipIdw<mH+j0Ysc20R0~CoYG$( zB*w3mLtT#2VS(ui#Hf*EB+?3d*SSweO`GwSTk48ANIw;gwmzPTnSZ2=wwWhIwRWtA z%{LNKEfNulj7|S$%F5xJh4>Bnp4?8ljvfqneVJUV%ZyA9%k$)qqg5+0I&C~(Znh$K zUw6~Yb{~~#e(Zd4>IahSn1as+Yp~B!+sPfN3$DKkY_|-;#W%plG$C7Z9}|A8mUuiW zOFQFQFqgL#o<BY2moS$CxoW%02>4KelI4AT+@r%8%p(VyMCKhc!ELOsG9qN`;2#y@ zQDg4YG;_YX#Pz-P85+z&8O_=Mj4MNrgy(K+=~!0z(CBOAXzz4OGZ9s0#H}^({x!Om zden8t`u)5dMKpJq;)zt|Q`nTM%hyY7w=z-U;bGTd-?E@yMY#J<sF?rz9w(e#N;pXI z8FD%2;8~Iy=nO`pc(W~KFt+qCW0kdxPuc4GB=I<qs%<9>vh|G#XLS;%z9blQZ2!gZ z(hn8ui7!Lt+z&QfcK67HaY9ajg*xE$T1=sL4s@GDvl-0N`>hFzi}+0JM=1^CoC0Z& z?<QedLr%*gB_N^XD5Zh=;>imyQiY0yJlmLvjR!bU8Emyr$!hBOg$4HN_&Y2m81>a= z@gFOo&|u^>63TH$f@le%uhI1`Q@(Ki*pOBt;@Veja7a^rnJ@kiHgdO|&Bz<q`&8C@ z=8~E;h*3S|+Ewg5QD5Ojn3k`zm-;*efd!QNtD6@d?&&wcM%q1u7G7X9l)>dzo`-X@ z4{e$OSqF20jioJNa9kWG*e1f|&9kPTr|*qiYW?R{1Zwzew+Kq2e*_J}N@F39S4ECn zSoPBM99U@vi(`m#9Uqka5{XF=ot9r`j%h<N7)jkCGFB%Ki!R)l4LxBovMq6T{q7Er zO&Xo$RD{9>4-X$42B4?;H$udh6C76-Y2R<)K;_EcuYy7oH0O0AwC(HqXgBY%3*x1A z{?He-ha|e5!$0}PG}z#jT)e*<*y_D??l$Y4oLjEPb>=WpX!*5dE0r87hCsOy__eDB zmJq&5>JUg^Xp<p@O?kW55IG{xN}jZOg~m;OGep(y){ocR9EA*<SKV-Ef_A#NXk04_ zA?+2-^iBGySe^D5PO3sGA-V->Na@q3qE5f<@|6~V<{v?E78*7qs(V_~aVJ9m_%1Dx za<bizq13<Oa~TQ-)6o6=Qo<;s1W$E}Grw+0(MTtcP-e@&vPN4G_xcFQO%B6Lp7h8E zKVG-+b-q^h1+zazJJI5_z~6Ub-0Zb&<VUz~*_$+*hg$eluMC$1aL(GD&8pd7yb<uU z$v}tQr%y!uJq-6mI%N(nGlSCj(G$Gk{=VbPui2FbkNR3D4i_Cs(o`AbR8cC0C(8N) z@Esi;<10i=71_E!;4&{SnwYaF*Fdk|%25*pk=A??7)6VdaQp4XP!_5VM+T(h#S6f6 zBryv7;GB6Fk#Ac+#u&qBFkA=p2j1*`q!-Bae!QQPi|uEgE~8GX?q=9(jx^aHQB58q zgn9?WaOfL|09lkxq5h3fR8-kDX;sS+r-Vzwl2ErnNflVk*=+?jDZtbDuBbkriU(OW z(TFZ=@QHN0yLkusP`AudwK7FM3rW|vup2*gbWHSxY4*iaxASKo-Y1fUv@xE@L#C0K z2!kv3)siz!MH4SU7n)n?d*c)3lHFT3#;-3Vme{(0mkI?7XIvPmyn2%3w-P9E9!Dw7 zgeC+?o{_f)p9QdHS^p<(4Pt>FM|9XVG>pA-!JQD0{Q|}vpBo$Pir9kHId$RLiCdQA z-+Y+uSvlqbeUJ4}iD+!#-O)^0RarM!jdupL<dDXNc$izLP~^||`?sx#n*&1lbRw4T z-f;LXy&)-Uzh@=_d^w70N2p7}KFO1_^+g0OoyD7SL#@e(I&7V&)4i2exXScx7Ru9} z!&;)G22H<*R>kkzk64z5E9Yux9$f?>e^ek@Id#UIK+x>0bBbn4a9Me~8{>pfPUF0r zw~}?v3z5Z+poV20-s)8l)iV48bkREg&2?OBRb9pdiiEy_d<=_S5AR!%y=1f;1<cLW zTa}r%<gIpVRLDMNNY!iz2?78F&ED;pgcb6h>7W~0gGB?XPBs5f=B?{>6idXy{5M3u zW3Gq;woivgv4TE{xE*5j=BY(^A2V;>N41s*-2MuQj!zKPYqNCS)8m5}sjB|DPa2PP zu!<%*`-gnmjlTa60=ov-RvEZcCGhmz_(yJLu}+}Iclu8ykwD<m(h?|k@jNRLiA|pm z6qtHosc?=ncBlQyw=LBLd?zmrLWMnvmk)vX{dQ4|VUDZWqTglnLx#9(Ge`W3ijdwh zA)@0h$0n6DBL3_!0stulr+FMb&`23pHynu0Yze&u0$1qig~)xa_gPonUr=t=&CJXq z2934q&5?96vuvN%*6AVyo&wQosBKL{cVHqFcU7z3G^G7%P%kMHIZIF-<4O2-mfP8- z$cFdRiDatB-7?2Sxh<iCYw9qcpRhJr?=;IC))OCy%>7RXS?jjlt4Be%XO<HXYu6KZ z6%_jQ`4dK5fLarOxzLWox@NBWeN4o2I}-S8MC0QQV+N*vzUUK%5b($CzACS}?_MVg z9?-|Q($tC0^x|gXNTPx1IRA|^y}T6>h*eUgf<k;SwMQpTOA28%s|kC2TVi-`ZxRzo zR@rDPmdt-n`4wt-dmcFxd%x`4SnrBmBaZojI;vB*!=g9tmv2<F-(A`WKlcRd8KKdZ zWjo3?|0ESTUwLE1gCN&=M#O(1{N<coWTd6&D`K4RED{HuXJal7T`OM+GUfi;D`F1I z^37U<L7#6TgjB}T3dwnewyqb3q&@tggvxfU1{rKJRaRBi-$L?4Bb2se;Ip3nxtKuF z>dzH2tyH1$gp;p%sVGw-7U2@0&&6)(bgs2`y6=s!?J;zvBu|+z;ZmW`MAx21V^U+f zp8g?xr9_z~h9k=fcPFrYvjeeAdn{nt6Dr{B?^Mgdo7^14Sn;_mIhp0V*?QZbm>*=f zx0nZb@Lr4y)75!3bKoa93hQ;91yeRbwc-Ch%iwDmOr*HbVtdzj9&Q+tmXb;{KI7v3 zBYOwhW>(f@HNo6Otl2qX+&WU<-18}9pN%jyt<(yHF&{@li-~E}L&8XI8G?&q%?qpA z_1_<Rem72&Ebkj`8D<mgm>{)~&=kLECBfU_yT-S@q|+^0vIGFkbSqPVAgMr75czWu z3gi<R=Bv4G%j(^l)P(prp7dqMBQdepor<34c4+h4188P5w|}`d*7LpP@am-Uce*JQ zccH@Gu9N&d`+de~&Ua7;wUoy6uW*`(b)f92RGADGJB4<;qU=UBL$z3B9_yw}_R0)^ zzKjMk)Q&vOq|QOi1xf9xMF>H~LNHOr5QLYrxictzdiaTw`d4<Y%i<wypCeJFG7Y5Q z=KPyCW<=ekq=2zM#f;(X>R?yKvb!uEO(WXb8#a*7*mPrxx#chF7+3aV;+x#0%=YrG z)27$S12NcN2sKC$^L28w()jlw`5wDkguRBcGOo&hPlEq@8~_7(blXs#gl`*>#IQF! z!y~G;v=?8A$Y7WONy%a^XOA|6>yMZ`<oIrUUSi_R3B#novEtN?kk5xs<>%!#P(%J* za%ol%jpWvlMc+`v%u5}&ilCyEw;j*M)NNonR`D_udB8FU0DkUSmF7u_U^R1_0TmPx zi;w&J`|U+thk=uY%39FtQ+r`5vtis2NdTe#x_<WeZ3>rRY7X3@3$jN_>D*u{hsaMr z0R8YOUe4(qIjV7+DA~3ICOm#=IB2Gv@E1H7O1?Mbf6QH~r*~i;JoGs1mA)koBO@Mu zSs(kJdG4dW9?%DW;xEDyA+2)P&pFu)<{=Wk#LiQWH+1D;$b7vt>`cVsxTKrqhR|_z z!BbxmmK2MK`tzL)FOQfJD)c9D6u24tpJ1`Y<uk(uB+`JDyQUW#pjv_uBd$GZ3u?LV z_CC2(JQOH9@{NQWm*j3UMzGh33a$d(B*|OUkJ2`J;+TviSg%e?Z7sCCn~GmbGOtFx z&J{cz(ec^-T*73P2`@HDTW9?-{=lBWN3=Rf^^MVddBvTe%#v!lVdMNDUC%hBtoO^- zLwSimO#F%tmIUbuMiC5=BK8V-OwKsui==qjok!rs5m<<SqC)dZHiOm-z<m_+HVtJ_ zL<`*xTDmo07=G{?7Ec<5rYjHy#^dQdy{;Dy5UY@3L_IyNx3J7UuiI#Flj*`#Nliex z=+K8iOQ=SmmK(udjs=x_Ps+ZL)0>v{+Td|+iImB*s}nX(GE7Q|hyY7N|64cyn;Q`c zDo!PD%>q8QhM{IG5i!gsr8o?NN@6Q#mYU!~g`2gP#2^_3{DhB=;5*ebncTU?>Asd{ z&y`=oY?~&?z^^30?7dywlfvZa<!bU7hxy||grxcUX5Hs1a0`Fu=T8$o;cjW)<sQqS zRuzZrNgc3Las{E+e`hH5Yro4Xpii(>VT9LL(pLh|bqA-DmagLxn!<=ZyMNK)PA=cP zjb;h==E1ssUBelt>AcNLw=g~wwJp5CET%$_bTm%rjYIUhA~IEgE}EAtKcBJ0?C1z3 zcR|LcOA@WkU+xHBY3Bfo69j#;?4lus7mJ8Ufsb)jmR;B~7_}m7f4H7DmqsI@DGnhO zUf%!3fzHVT2znJn$b3xAtDW?FLFU~Osg4QLyEFW^w<II{-|f%xbfX<PSL~g8gE5OV z6-ERLxi1^5@-i%pb{IXet522e=C^VKa7}|$4veu4P7{(RX&!+z7;1?`x_EOA;QP62 z5QjWBobDg18b>xKZ0BhpXVD6K=$}!x<(Nj0y1U7U+?7LH0P%as@#4@8Os7nQ66XW_ z6kk2Q@&WvS=tamWr=CSvVH+8;98b@hPbzN|{{}<;*1ES@&0HNUH(Y}>LflT6z}sbu z*tWv4r9)>LYdb4~_|@6Tb%qu0!GN5)p7cxk5$u4+_}19r;X7hf8EJ$!SSN`_1M~K_ z&81-ZMc_<s?yd8|-vb6|CaR1jn-q$D=an=HcSDXRHh4+!#WVUZDF*4;O>2Ej>ZMJt zqWrE$k#Bs<5dY&jJ@Y#3fEWuKgG=@D7cw`q`v_W^vpX8ax?ZCc<zoK-p2{>dF}Sv% zX8fm5cxYU|4d4YbgaZsw;6wA{s!%OS#^~yTSZJVnV68{BXET3NG{X3WJx!$C0SF-{ z^lkx^S9bjpu&mq5^v=QB@q=?x&8H7p1KE<<S5e~I64(h;<RksiQln5`q@!m^K}_2* zJ6ojcS|1}_>;Q#+$H&^>Gg6`*w_mXhy5HnLxo^A4_D4ui*S>py+e=J6m~TUB+zmrH zFkRw&x~`cR&?6ybWo7@Sr^r*~=b=Jp+SrzKZESQFw1@xuHmaO)KG+&$W=^#>sEaiZ z!=L0Z(C|lYhoMOyOh^%ABy`nE-)^uKC1SPHjZxN#HcoA9MbpMO?!E9<zL<xLsw81S zyTsF0{1-S13hEseX)lTaCuxdck&>XJV{3M#n?#yh4xB;UORg7xt*!fOcA6XazqhPN ztr>(4Jw;!B&m)VR8oY!Q8gj3!TfvUowf;t|%g#Vdvnr?C%JmgSg+EI{36s)Rs7N-g zp>n)-VJqS+-X&DQ@?CW!IaK6B!$w{SGItm`{iY~B_JjK~m5}glOdf0V5KTW1o>fqu zC7QW$RuFX*&rk=K3>|+&(e&J0@a(K=TMkPcHkL~M-@O|}YIg1-mzwrLZT13D4-cFu zw1L-GI!yLggUl6PqhC6`ojwcVBV>WWds4D>+p`PBWfoTD1fG_>mD!W7+6s@I_9BQ_ zP5dRw$O3FlwWEhQh_foe0D8~$i+l$k@;uc&)qEuaYk5tU{QYYKmO0G|9~-G4*)RG3 zlkoFcY|~jxn0CN5iM37d!B;t#%wvGEjzQ$=pi{&T4WrZ5;-gFYjrMV1-pU}^CdBlb z{~kk(eQ>C)(yg_s`}7EVRL86^_v!t{g}_|Yj|DX}s99JjVpEvXpK9Qnu|=I06M-%B z+YkU9K?8eJ8+W6D3B{Kgbda<ny^w)));Y{M8ie3nfv|#XYT8V_Z)S~d{MUaHSsTAB z<%>KpB*?t)@%|nxB$JI%bJS#bhZC9z(WFKrln~C7C|K0hMFO^EI>}K{9)^L=mrD@D zjFv!)6!*Jd$3(1F$+StFcbJ&>b9+dePxi&bp65*LulK0q8$#Z2XKS+*N|c7AbUKLI zIbI0@n&V=~7QOxy5lU)54_V+`dW*~xeyO7T5S(T(&Mnb>Gw4-=UWH^Xx1TtFN)zls zd>3naJk|iUl$gT@ui4y@L+_1RI?_Jyh#YT#frjn8Ves{Tq7NF#z0{1x6zn4SWw=~N zoh$6O=C_4{E(i7-Bn21VTm(2!O3@RJ^yx1V-he-!z7+Tbd84u=A`u=V@WVoF)D_1i z5;55WLYB=_XBY~L);K?woaB``V1#%Of#VG*4G(yZsMy&seQ0mpEpjdl63x0Q@sorp z&K>?mpELAWJlVc0y<L$qYRzD_lY&t^CE~}sx&+wFKVkV^)jyF$6}Sl?IdWHG2RP~Z z4D-)NXvNugO=@vHM2B`Mvzxd48{u8vCwuH^p1C*eFn^C{j5uYi&hk?q<MRVx(6DHJ zNZ0l#<*KS+MZpcYGuC-onY-7ONKwL-OCFYuff<~vt+j!r_qA?nB_0?{!Y0U`V$rq5 zPgR+(U-|^~4@kntr52lCp_3vhbaX(|AP@l!HX78)skMr}zEubN@Y|%#wjF-a2LTmc z(BACIkQ9gUXuAB<F=d+I+w{!BLUiN9gD?Q|4_8GA`ky~;uY}EUikp6Co+6mjPicAf zZp?3SwVQAoD1d@MT8O2HC#T5%PnnrItlfi6^KK2U^U`z>D%w`GC#R<>I{0ZDX_+!Y zq<9T9X%d!;VGF5@(fQheeGEw1k3JB;ew~AH+ljy$(!tJ#xH`@Awl%*on?UuF6KQ%2 zQ>|z9bcCLsO1rPsV2sK1e~_mCR1AxZegsco!FLp1-K=TQN?dguHYS8v26S&DAD&=H zC~6{BFL#8(kVi$k1J8tyfSIeD&>}MW768f=L!hT)voem9ygZ_WG$#Fk^*9lymv`2U z{#VE$Ptn^Q6~*!p$Xrt(b_=yOf*cSV@~X?QzuUg$A>gN`g)5v+gP0Sig5%WJz>@_n zYfcWM@O`XHZFJYu<L5h<y>%AMwwd&n1-%C6y7Co1LYTGhB=i#nl8Qd&BzW$JDM|MV zV8Gf1A8zCUCYt^UBRzDedwM@c>L!c5Hocb4fB2IU^qa8C;|j$s39(F15pC^7#B0@m zBuj?y^uaVUge`=XB$Mk~9@qIZ^MEpf7M7R49~@x2y1Dr@5&_*}2tW~F)cyTJ`lK9V zNg_b&yhQbTpp-++sjxSwp{lA%*vbk~w~_NnlCrY$mxR7Pk^^5Nhwl6@jD-w)f_!PX zh|K=a=^-HzGY;tZMU4ugUry=M@fpw_B;)P77wtfa(w^d;Mt0!s1>@JhwXb~nxw&oT zOID6a;{CQ`EN&va`(@^mzfd#lWWG%oZ&HnftlC>!i%_3Fo((eAqs;xSH*n)_TYq^- z(dN3?&&z*ea48o9L*`_-|Ep%M5hKlzHyT^*DNY&=DTu22-aT@5;GgRXJIT9-{Bm`e zTCvC+-uk&~9&yEhx`|y?FvmOwZe_x+b-mLI@vJyq1=~~$G3rA2z_dwh;5U<)R=`sa z6IeknmnT@Rewcc47;a~ExF533pap3v8FnN0xS4dhAHFY(21xPqG3C`_Nu|s}nseG3 zmUEf6gw|T@l61^1X;l%KIlN@^S-EfQsUj~gA?W2v9o(Pdf!nIk`D^=4`vizRTu}YI zVI;%!veppcmJCJuoZiw`ImTM^8<+47(q8z50nG6+q4S8wAMyoh3)*}Y_yX$!RB*zA zx({uQo!G_2#n{^2{5b1Q8zre$PTq`flQpJNbghBwjnXlBg-t?{Nm`g-(_2fMOKHBx zx;oYQ`ES>-%;q7`NMB?CkTvSh)K+NF5$}0$1rTUo0Op3cR5IVk035(5(Vo<|H)vxt zqi+gdGj&&I@0=@)TulV1=@2Q#!M=q&2&y6Gj01MPk?>)(7MKUE5oN-tA!bqi)9dWr zlfUpgI{e&aqa3Bz112XjcXgsqx109`9Q^uLFKWkSsf2>!!8JqgwD5oNrhhy2Fr-+M z(!45fOla@cTD!Rlkwdk(fee)@dk)#L${M>}S;V_XU{P<Q9Nv2f6f^mO5!y($EayUJ zdcr=o@@?b3H(2~Sd-=jnBtZtzT?cJNE7J8wBr0WFAx~N|If8<`M1`{;%Uy{4rz4rv zSI5a#v7<5sdy6hoZcjAyHOMd)71X*85!J!J<7Re+c1C{E(MH>@l1PK3)}|XoaK<l1 zn>c;=+9E3vVq|~)@eObVAHUU(l;^SNv4r`osSiUuEwaEMJj$t&a!FNY`50mDxM~+) zCvk%v45x(>Y9bPoV%ov#sUq))Y>2c(pH&rai+c2*QYEF)aA}Z4v!xV|E-q4kxcK`@ zNbpe8UAaPQ;9SomgyEG7qY`?e!;(wHd?iQ1jWbxFy!oC`E0li=i(qGWj*P-Du(YtC zo-Lm<{fpPLh$X*JcfV*DF0-5i3?L>lP$l-vyC)k5RP1^dg(c0Zru3T}osu}-`7jVm zWxuI(5hP7c&2b-z>rE@nhUxzVCUZx`Bs73Ic@q11u&D0h2<g-*^Cs<^d~L0D#AC0` z4RH!L$JS)2aXM_+H&)uQL*N6pFBm{ck0{AU!zocQoL~N~s{Eh873|LlEUl``<Qe{I zpN<aQrl+E#61rNO+?-KdRPHODj8!$Fm@(!lGUr^^>RhOetoUUj=iOvvV7ClEn|}*S zooud^tEKz+FS+s?rn<=CT%N0xS4KN2Ig43{1ZD&U;MMi-_#abmjxQd2!FQ5pK?bqH zaXF+8IBtAeG<C5mXHw6tiGBB+m5-$AA<a<PONjZ~IbJyqxOI5zTy;TI2&R|J&3z06 zy0xPC?bS-P+&moxzaq|WR7HRmp_}Y^IkCorjs{t05imf)U%-Oha8;!`C+YewOAc$^ zjVA`bWX!zCBS^^;`N+R=ijJ~x!rl$_FbsAI;@?nvb!K3p!QG;!M^hn;v{VU)F`R&v z1S5-W(iiH_jyu6JkP*`O`726ce#j-hK@2t{Knee?LkW3{cz-f<5mlV?jC;wdBd7x& zd`=m$=}$(9RL!rdz3jMQ$sj8Ut-KV(`JwLblx^D8MHG{6{`K*0(RpaKFJQ@NYPUs} zmyKC+H5=&oD^g3sOw2?C`7qp2k6~96ukPQ?XbpyAHS(1M4#(=XIOSwn7Rumc3UpL9 z4J{Z@?tle1i}{{2+}<2Ix;hEc6#pqvYruwTW_-`Bpb0!7Z%#6fj+sqRXwCyR;@v$U z1GhySO4Papr7pfIp`Kl<emt@z5HZBS^pic}J?zTXe!~MfU2{NbX&P$S5oV$YF8}%r zetQ8IclN`>ID0M!3{z4d&eQkbrv<#36Xx8oFoC8p9(<qcxJ{7*m1l5Y5zCTP)_HuG zC`)OKaNomJaumq{F=KHu-=ClsaIS$d-3v#`<Ni~F8dV9<k6Oy|Xb3?C%`_HOK|znV z^o^AkMOv)coV)VO@_7Dn8k(_TE<6-@FMJTu?Kaj%qC^~SbaGylLmjEIe4iAOaHz<7 zT&trGC7TEzO8Rp7-t{3TQgUo1VOY`{jcENclBr$gk{473tcpf;&R}6XGP9pEjdW@* zxz;1Ra@y?Cu#Sq<-W(*|B4mr8>Zyy8Qz=*@5oo=u?d_tq>|l37d@nNH#Ajuvgejns zgaE^&VcPM&KF8Q1eQOqyuG0fny688jeOXagw~CSl*{=!f+*FeYJ&9O|@kEkg#TIrM zxv}50n@7uP!2?a;QQoXD&6%>LrKNZXUb~KNW=oH*q`v+a<LmSehev^jUNk9^@Pl)Z z;~`OiWbF=u;XALIEqU`BN|y-OS2YSrtwg@>nnW;kWHFMO#0Pd_VqzHP0d)DvH|OUI z!jwR;(B^{=CWd4@acsQ4BP-u#c&+QP@uqX>PbX~em*?y8E|Mm!{|tSgsChxRg?zB6 zGQhb^O5cuz`lfJ*5;5Es5%475itK!%<uQ$v{K~QN?Tv<(wzhy+e6E1-??lxjfGi}k zpL8rY$65H%R;e0PGf|%zOi20=xyeQ*A}++D%4!Q-9@MKHkx@>7gNdt~-J_K9YRU2C zL2T~eek-ZlpV_jj#4NR1_1=!rOQ0Kn8C=-RG{eL`Z6^#pj2-y<rovJX#MqYhRZBtx zR|Xb9iP)4pr^M+2{@$TKu`;A3PVi{W5fA^s-S)bsNf~*q<eneWFhwvKbEoxQI!vuK zJ)ZK9X4|uhQBI7yrhpb;-@Y18{#^p7dWT@D@}@~dCB&yKsL}U+*Wwi-U|7cw>dw;* zLFg02alWz<p`IH0GyyP4rwE6ohO%5#cXvzZFn^b$WrmyxA`v^rUFHhU&$0rnS<&v@ zav;tuQMHg;6<uKD>m#5;9O`S8vl`tuk<oouPL%j5?j1pDyoZjae3ZT6b3XND;!*jd z*un0?jFSQyjI)O32ZF(|Gv&WM@eYGv8|$kykbgMeW%GLNW$Na79IMITPRVINNNJ8Q zZZeh9;Lv0juFX<a!w5VKu`8^3{VooZFUDo(Eq2sr5;L}>?Z?ixO9t7x-o5g<tHfKu zxW-hf_J=N<8%d32kB{Km)3YZU`ri!Tc~Kw?$>3B*_1J7KlcbduZJfY6g}-0U+f>)N zGmh`8YQvw#?c&4SeN*KB%m!Wi<wlp=8nOxIdHHmJd!~0Xfibc(TG>kk@o9OLg_JC3 z0V=_WKQzSWtL#eaW@d+OGL_h1^uhTyC<=a58x%G<shE<M=F&@rB0_K-wYYV+hyW2N z4{!`oUs6-_*LGjeR5*|@zar=7j!V0_1+SE^ag=|Fz|H~1jGMWv<R}%v0$y=8Q-5op z8Y~4}z_bbh5;6Hi=k`uRlv%{y@Ojd;!beyLOzAbQLSOKhs18ef<Y`?qF`&S%FvkA= z;L7b7`3%$9rJ<Fao}0TPtm~FLfTh_*Ke@||!GfEo6KILN&MHBLs)7<ypB-0vBV*ww zC~mM(o#;GC5GGw|RP7=_2awQAsF*<#Il`K9mNhxZrAf{9H`D>#eEC6c$JaZ8g)Je{ z&Lxvp&s0qH_yb5Rg%g&xO(Nd<gHv=E{k3zU*d}{k;seb|v?$wg!;1d~Le+|M{0RO4 z$@t0-Ez(r<5M81(!TrT+eJ7`><HhS!9atfh6`U^ex&LX0`7kSNtd+I3L!(AV8~pC? zk$erc%|b7)!7nv(9QQNin#bd2bXb-0S%hUMuvh5nciXhkbiBu=L4<MN?UZ2fYAY{T z3M}C1a(0$Y(STGcLLLnH{~N<Gna`|X$tO5(KwwU>16j|;N3evOJ~=+Me0Yw0p2HIW zY?o!yFN&bn-KVU1b$nu=V9j43YG=nt?Su{#3A2K2JYd12J-m~?Jw^IM&X(KSsHd5q zEqTGYX9su-##0Z3WmuhFuZVLY0`%E(HX4I5E)xo<K=~PBOrQu*N;2K2T`PCfSeB%a zlw9}0z&#OjHeQZd*V3^r5QkQm`_7K5*)fbDj^_<ON&4ot7C?7pw-*?%#hVf!uIb#H zl?b7S>`&f%*80UagDI74q*}KDMow|vHVr^QalbXmJ}2A_5L+hrHILL997Br1(JYRc z5sLu;#9cxYBlSet=7o~BMwg+LZ>shpplOQ&n3eCKlPippL@f>bsc6KjT+z|kN5zm~ z-MYYkO_U+{T&?-?@3a*cOi6TljVv{~NwIo;tgb)2Vfpy*dWI7uI6E>?5;t^U-tau9 zBy{hujTqSV-0BQ)CO@mvKQzjHLl#$8$KvJVy;`kgHeMM0kq@daFaO7Vr+@C--Q)dE z@Z)Ar7QzPX>s4VRve1oX41rKan$P1ol;`ffCXv}-Y;L!y06y3ZWP0etFJK0w_4k0_ z;d<z&BfLd<=j%>A_f@wTi}@M1;LAr~!1~1KBh;wRO}RyWRXYU1;;#dse}^e0`F*&O z;Fo=@AJP=iHQz@biIYVJU)LY|H(t)BVpfYSZS1z+)@O|+&CAMvNhv9z<o=`<9=rs* zfgod0DM)&Fa2a^N3oY9{b|^1RM;yN2QgGU>hV;dAN1f+JHEsG5x!vENJ&&6#u>@+q zKk}zC>mGP1)*p^bi0$Go;!Is{7O{|c|3zDFHA6^cc<(-|Kd~l!&F}N-AUfl905xL4 zxnGFu<oQ>ZSBnJwap{#QHJ;&f0QNn*m3P*RDno{OY<PdE)cEyZ{1PswDdkvKTy;3j zr8M^#)pW1GyD*3SSqfIZk`$3qjqLZtXFsb0S>a9~Z$Y8F1^dq#@xAf=OysoWDWSU0 zA2@x1zIPJoytC1J&g<D-p~>Caxr3J&w^QfMvOIJgv`w`*&dzj*6Adz&S=Ge^E6?Wc zY@Ykg%-Gb0nkm>p&fn?I5Mdt;XeSSsE?3lX?M=Obqp&#IJwzg8>L1e>*wSI259Z@r zBU&+mCn38^-Ja%sZ*#f!QvBEhr9$^IReFE$nLGcY$MHO9opplvZEdX09#(y7%|Pz{ z4Dl(#^k;nGogRSCD$8ruT@eYwrs2=6@V;-ShC}B~n{hwrHGz|7D`1y-^6RzwkAbJd zpW(#zByn4j)H(eS=9MLl+@Za)0*Rz(TOazsM!W7EdMyICQ#Q+GpWgz@JjCIfo8I)i zd~J>ly1%Qd`#T;tEDTX6rq3~v+(V!siUV23F_Hb_>!q)|v;Mrxs0ee+$5ae{==<}$ zza9$R-sbXo5XW)vu)N;?4%p=k&~MdD(xBi{P;xE^5;^uSY?08oQk7XR%?phK8&aH^ z7JfJPPyMH941<WOQf`1%ot%#*-z1f~JM6mqda+D>)_ExS>M*kN*bI0W_^sDNba8HX zjw=8*!^!BqnNN=2F~RYLz|nuzwvWMLiE-FExipw0yv(pzPA+^q(6!%3BT*eX^*q>& z-yK@=#Q~2OtcK)G<DRnuoam_(a!!`tD|0u$zg#@Q2p!}F3x!k$xMJ|-;!9<0t~p~| zw45Tx5b<H>ww#S+7dc&*3ieG}W$PdGm1f5&8F*G7hJ)<e&f`cnJrO+45NtuMq2XGo ztUi<cuV<P8;tCTqKDwKw&yI6QOIz1c#9MFok<rXO18M#<*ZI%oa?E{AUDuQc(}oc! zMBdy?PiJXYJq1lyuPz_JXG2U){|_BPx3lo`n>6181l*&`p|V!*h6WDcTuJ!#%&kzI zz@y;zUk?4vPP^Q@>5j*TT|r|^9iJ{4y}8cY;{+}!vWF*MqH|kd|Jh|0d^wB0G;kxL zj?;Tvr=Q-~h^wD`r(t^Dv$zg0d`F~Gq6OCJO+CL#R%vx&8n(RhRWXlw>Th<O=;%H6 z(c9Ja9<jzYpEG+D)>VYj7kn8<yFJa-pTfLs%VW7AjXCA>=_t4mU8sB()o&ABqMy2A zgq;5~R=sh+csgC@*0I~1$IJeM?9Sc8=p4r3=Fy(>@K9Y5cQJgRxw;rz(kTB`QiBBr z$$kOs5L3J&dys^Hs<lBBv{WeGUE9KgUnjtnc83`19%QQaq0DERP1e;hR)l9MKm;f9 z7JbI5H|0nL`hD<+_Ky?GWfdlC(cewEIt=!s>~J#%_dkXVA(5hbx*jLlddg)!_BFIW zQ}mvKJ&}VRz&ISe>F^!m<#_AsRU&ttTdH}EF_V;rG*5W=J257*PgdEd)1N~Fk-+!Y zC+@SFzN^2x@wX!;Bz%|rYXKi${-Jm?wT&B}KC=6q`DS|^;Qc-S6|nd9iU!JD5VHQz z(-msH)UPk9*JznYq<rCst9Xz1WSG3h{G7K+*Ml!k=pFYA%#0f+ZcSHGeE|^#Sa5F5 z{O$U9;bnSxJ*@30U#aMm|AH2ns6t(MgupKvG^{~Z{guygt@#>ECEvZe8T;s)rHppE zXt4n94#tj~do#Od38A!IcEY^-9}1m0z>9p#yH;S={%u|blRK8Vw?aJbLVfBu8>K9= zN!L)B^z$Rp_5F15_Eu;&Mve6!+RSb4hqwjx$S=@R0w8FGmIsm9SlH7tr!{v9nz4^_ zNU`q^vE=88R|X`?y;@tTKLLBHhtfXG`_Mw#&ezHKUUZkQOfJNUZ>%jbID8mUDOIE> zRT-nEx}^jy4T+Z~VFlHRp#qPqFloLQW0sb<u~H<hH~}A^a~cY8&*O9(D>Mj&<Bwi% zJ~f~V-ut<hBIz!PJ<Tu);Aa-ge@`AUU-Mbo^d#PRe-|Y5c$Hbx_Wuy@Fg~6g;J!VJ z2X5H=Y!x2*@ndRlM;pEgDSlh7@n<A%zs$uIa$-~Dy_Y9+x^wcpdT%?IhK0C;Xo=u? zqE^fdQm@q5+6Z_@avN9qh*S!Qdt4esI`y&+N>=2-Fq7XX{dmJQ@Oy$HbY4#6K1s*$ ztOzPy=KKu6Q#K6&`G3&MXY%6><$Cg(U$DWvkT{YW_}pVjfy7z3gMX5sVYRlkU0nq~ z0<a^uLy{Fu?)%T33ndqJ>X`K>BjFJ?Jh7AnA4m@_J8{yEZw>#_Y5dj-I|nsw&$A1S zP93J^8cY=m>bYJQFF$?{_6k7&(8ET&4#E)o(wwI4dZj=DqHLFIK1<d5XR^9rZ<4rm z=+V>DIZX*gz=3-9t1BJ$RPfq|;eWqgO8D-*#+zLFp=_Cku0O8f{7_$5c6;zG;a1v8 z#C%xu5hA`1tiEl3@>w40d;yEBZL{O-NG-h)>Q@<d-Uk?(!rO&+bUEE|uLWERam$26 zP-z;vkShwk_^x?uu1Ads^$I`Iub(FJPfb&bDlnvW@q3hee}ze;%XP#^xe3)`m=xqq z_Ts9VVKBr8z&o8sNUKN0CnkEFkK@ggAFf)Rtq#Dup6}2=!n>W9k$6G|LFn;0Yv2^b z*SEMAb^WO6dhg8Xezc!<p$@MliHm<4HwS(4>+OLQPW^R&yn<`X3)TB4{|SF1X!W|9 zPa-9u6ws4Odme%K815j)gNnySCjWC~E&8I);C}4UOOWtK`Te-x_S!lBVw-&2Rpy|E zWixeS=-t3_{X54kQP$~SHLah3oTW=Vm9%3-7D7<;NWw|Z4}tkTsMef9$=IC$%zT!z z72BT!JA&jtzneGDJ~I0ugttsmXzJ?|rA52uiw;XTC-8%s9Hbl^nB#-+B&$Uq(u6fN zxiYh|Jf90$oM&#y_W(r9$$Bj@PxFQx?9DAL8Dl?`^qCp7e=p}42I&eytW%3>taScR ziYdBeIf)kS;DgX{V}#-`eM86kink%>fG)PZb!St$L3A+7GNi{DHlD$k>(|!*gez6r ze7Nzl6Zmq`1G;PnZ+vKtQ;Uh9qDN#Kp&^gkvqDUf_kz#>+_`}hx{bzzF;?j;Kmh&; z!7?{!<dl%zoB^5p>QjupWp`b%9C*HJhxP?A%a#lSg@1}jV-=SCE3su#bo`_rSmI*Y z=dxp_&$fcY-};Qtc`|#2J9K5}a0>JTl#uIl;dOWS;4~UYejfxZX}$_RAdTp@%~CbE zidLG6?K$hVVRdQsdfy$2J;Yd~sdF$hqs&EJ1_>EGu&04rCuCkj{Crhq&xhzCKkCi> zhp;MpFJ_3)rFx8aJbdc}KZTf{Uhv8zh-U@83<chVBqoOC#R$0J(UUOb`rFTcnB<8R zWWv$Kl7`O@hk#Gb@kEro`QjxN44yM6yOx<m%`8>_C3esFn)UI1W@fm*_g#wk83#U8 z91vKV@#VFwFmBs46l)B7SEW)wL?aIqj!Xa1ul;6J?v<-Uxa(#>4$Vv!vsgVMt^c~W zUdgGh_b#LDhAlR>&}j{h`a0hDv-6$M^VQp{1baY}z*8f^?>9k@GYpMidT|+TXQQVc zCO3Pu%YKg?B4XR38vb*GNUxU@Tn4+7zR!g;kX$v-{<mXUEqbhr?s7I5ai($p#(ksA z+^P@(?zewD_lt3qbv5HxZXdcE%ICnf#w$l1ghXz-4bSn%dz#P|bJIs)7Yhgkx*CyV zt{;mf;sZBID0`<U@25;T_`5&S47<TDa~5?rtyAwXTbuDhqh{pt=^T;CU;SSya|_z2 z*Aq$o!Iikm+VwU5=|}FSD-kv1>*Mi|6Ugv#I}VnMhG@tk;LSy_u&xuxp(u1(m|i<p zeFbsv1*0Z;+#cxTIGi7Da=i1%;=TrX);N@teZ^w`D$ZbVhpnVQ792y7#bsw&=aD5V zsGBykx*F59@$OTt_gl9O+JVWF$mgtui)$}oMi{vFy_z}Erx!Q3?lbLhEAf3y5gRV7 zm<iblrLy53!TivC*OPl@)U~TcmpjDCY9vZ$FF%QK6*z~eFyD)jMNkC|i}7kueOuxz z0KR_f>~z|H$=2Emx2@JUQxE`mvSvf#wPuX$HEwQ@iv+IcmWE_8l;Dy42R`28icRk` z{OQ`?GjbsAoT}OD>ik+*)!L*k2U+B<F4bf8Jvqfy0MXzP>2Ac?+6c7&<eMHWavz)% zacBag+NQVLf>D8aa~a-R9*WHakpl`oyfakqYCv#y(zI=#U|?(DV4EINZs<G=cm?;8 zven;|`^V3EvEw5|z$s>*t<!T@4!;*$F5Ia-$bqUL*S7pTQ^0^1RAIjPU{YfT;<Vjp z=Q-!og63JHmQU|i<Hom&YxW&e51lELDl9LDJ6-yX(%v*OBmPFYchmO!hEmhS<jcn( zb<3-&jjF)H!UF#)B@wx6wCIS0-N@UI-xiCf+IW)|<gmaT{aMZPjMeUl*?ok2B1tg1 zR|M*Ic6&+ESvTugEdG@wh<DJK>^5Hm>n#=Xc}bZ=Zm9MSD>FaWbm^iP$FSR~G^gJ- z;@98Jk9Uilh@34GNGoXd1zY|sjtrq8=z?+eoCW}U$ef`YdGQyUIzrMmGX!eEY|owR zBcnzK00Js+o6q#(M&z6#4;I&&CwTyhCF+7@xl2Jak`8L%2wio?3}V3|tEfrgw^6lH zc}ejXR0F^JukyL9!48+l$2*XJ#8st2_|jj-Bhb&z$TRJWJy>k+g3W)h1dF8GOH2Sf zA}+}Q;mU@D0k2NW?Plx&7KDylWa$DvIKEf!KAuO3L*qAL`{_lln3zsv^Bt$;X+xgB zyx=a|`i5)nY!`m_7JQC1<4_zmap~+*7)~V}obV0GSukZoAAL_m3Y%@@<KF|rcbNa6 z?nlCB16Feut6ef=8SD;CRm1RTD0b`xNO7!7Q-Yj0%>JA23d~U%>=xTqE>mE-DqLAr zg(*pv`D$ph1Z+CD6`kPy|6%E@!m5n2Fsy)pG}7JO-5?FpA>G|69fuA@TDn0(8l>aU z-Q9=o?q+^x=3H>W^Kb?1z4jOHN@Za;6$|y#^U-CXflB<<$9EKM5Pg(dYp`y3_d2Z^ z*2iY5qC4LaBd}30{qNMdI-yFcZO_Y#2NTjLrGCF+d890?^)LHVhzH|5j>_S(-B9=U z@`lnUwVulnx=>Mi##F;9!=6B3jMAa?WiH)UmgR2NR-@Wmm1Wa;M22i3Qq%Xy#>a;* z;pb=h+0#=8!Hb1%-iN=nPGi!{Js)YZzPlaG0fVjw<U!Lj@G=aY+tI*Ln%T<KZ*irS zXsci83j;V5PksLxUZR*3NRNBZDInanoV7;2+=|2|r*ioazg~w!oPzp=pGbQ0>7p$6 zZej!+r0W;j?Mu6>rWY5-DnI;Q|GywrW#OpZqsSC5vh`8Y1^`t#yUJ%U1rH$fB290b zg)CWCHd!LObOl}OK0lC~%qEF!#o9@Xv8=%Ui-((Y@Ca*(f5RP!PGFS?_mvWY|6{nu z^BjUe^PVc=JieOv!GFHTw;c-CW;J2Kx96jc!N?dJ>&lBrD_Tz~DUE6F(&%57sNi}u z(!Ie%IyGJuQC_N@`nJB0BH=YpsXU;<<R20y$GSd(+2^0p;oAtyx1DI32BJCCT_%y- zzC6gBs5CmUKntT|$uOsWCZoV<f{7bv<y2~-&4Y<UD+bfvHC0Iuka`s=X4*(o#}RG& zyLgecf!7&uM#+E6Qo(#zK9DZJWqf{gX#9xS{c=nXLs8pK2AO|lQE5u6dJLLi>RLl+ zI+6-22mQc=Vy}yLw_mMC_BpMld0gOav6-b8Hn!X73gvxFF`XDcu6sJIMP+$HsHMU9 z$S2G3Bsud=f86&|nDJoXU)L|J>8DR;ZQ%)u{2x8m9z2NclMf55x>48OSp1K*Ei(rp z(COTcb>oo<#7Ls}=Wr)65ggp|mjTrJa%nj-?$bhdD;N#Wm&yN7LNS!07;kCm^;@Zy zS+aipT6aNsi=?j0vfZ1q%B4CzlW-XW9rQU7gWq0BEcV{gA+NCgBp!lEOu8d|7v>oO zh1w+~NTtMwHa6LazpV!(i#X2&_SzVMK>&7KcMZNNF^;MFU)9cdKNnC!CE*_5`QM%J zc**#8eFl+ay`4?xMxPvUWp-_)itEAp@oK84g#;SxGLFHF1}}UrfJ$}a@q0viUhn52 z>l03d_`ZBCTxbpbe)+}sx=U%vyxw6o1n#tLxKsY<*vfKfPGe?nR@<Jhdjz04xc>fI zUiXW^j(uM|X^IrBIv|g?wPD}B79|B?`O;ht2-$Q~sEwq939#Fquw!h10~_1-;qt5? zGr^dy)MRxc;k{p;vjzhnuuPW)?WY8(wBq3}!YlCG$@sd4Z<6o1aEz++@OVW(hmug= z$M<SQ<2`^tcz%rl=)3nDvk>>c!!f$g#1^AjG1Xhtmq)U9vR}=y0HBS~&M#zWZ`hMx zVyR3I>q3Oy_mjN4ji|0Qy@=y4a689(vhApT`%VV^c^(j{dfa^vcKUG0dFg*WL1jH) z-9!%%Rcll!12@1uh>1+=rty?pJR0*nHn*^<<^s23MY+^_a)t<eqzcrcBc=zZ#9{l7 zA~kIAmfxIoOZcZVd0+d@r4ewWf<@$YU0y;-F&c@!gidL~X@ci(IAR~t@NqxJVXdHJ z`68ZD(iQ^$y6a9<KJWP&Bel+W5FsxDR@h!P2ST~x*WltHi`@i@$cXos$M*3*$Z;ZA zuP>_&PMYW8Xp;N#`IJEu@}}C%@zN4G14Vl0nUg2Sm0@A9#DQ_!@%A!i{iIFXnDoKP z!vc9h$$An6IqriSS`pg!qBSTq-$OZb*MDNN(N!gmH|xbTVFJq}C`0TVe%RfJJ61Ia z{d5j9{!Kk`F}HkXbaFVme{k9fWL{E7=c9`MhAeu<?DGc+Ts%E`UrdOjrWa6BU=4P# zcJXKYRL{n(`Z!Lc-{yII(SLp`aF**x8u$SbB4+sZ4$wdY-d^vt4c;(fM50x=zFIu0 zwge9vR|=4eK6K7Fk-L)#1j0PExy;(wIXZ08(PJ}tCl{G{9{f(`&E06b6X}>TALb(y zU1%HafK8JXuF4?@13h8WbyP(x03CVkKe;WX1aE$)Uceppv~TIY-2m}VUc4QyPScNJ zp5uY7qnMJ49o3tbC#X$=f!QIad4U|`S&IC2%NR##`pgXj!(`X{FIU$MC8?oI%m0^^ zY9}ch(lIR(MIwUkv35bzdV4sW8?9e|4L!1KuXJ1s5tUC}4(A{{5WgvN74BQyjtqQX zrd2(1=Xueop=;QmacTYxJ&l^EngeLdy4;REZX%D&sIxbV<Dk?t3>$>sR`)k7j+cU2 zd5CCDd5L^IO2Er}<ux3V)1Hf-Y<NL5k|jU_em?l=xqCoE*k7hy_er<jZkLY0>R~|q z?kWai8uP|_yLR@uaKXJ6_412+x^U(^XjsXy!(=x^WP5^wO-uRlJ6EYjZbbz;O_ne9 zn!hdC*)(dlZ}YFS!JaVWqsifnw;7&vZo7`s%J#0GFf_jRn8*B<#N0J6H^*Bqc`=~) zJ*DT-O8=qjHcDat3rnX9s_g!4Sv4YKrqHRoKHJKz?dh>z1D})rA;0%5;BzGAm*eD< zVyshCB&JQS)&~X?mbQCA;g?00jV>j<pxz%i`6bo@*ll;*V}f^r8Q+Fd<xkxJCeN?E zYO%gg4A~lF!q5NfYPqYUvHg0zL?-vFw_EO+_k#a=>Pu2`X5}~)uuN#4>>{lZFdShu z&UwdO!AHaq>Z~W%wNU%@3c6uhx(w@d2`4RzAJa^;(hBi`ZOEtLSIKMQbmz%m*R}Cn zLc&dd9J5HVQOc{diKIaXI}#J#B#VgME<=yd5vTDXVw8SMz`)6lQ-Y+5q43SS#MUmi zjmq0%qOt3`WDSoAlQaJP`}f?@^S#T^bVG~gH|$EtL(-46qeL~oqq%aFWd#KV<QO1~ z{Q-d~*$EecrevRG$dCCm2FFSqF#=uke0^UZ@YWQ94K|_tfXkdI6NmjB@xc4DR)1+r z*0q}tY+I60Bw0pTle)>PIC*R-h%~OpRRZB1->GK&UqSO=r#_MU35p1*5m_x+{jJ(( z(UMQ8TPqXY!`)xWaxprOzkcVRSey)lBk>JsP&&Z1>IdKrUW=$njOMBmi=LA|fVOz0 z%<t+d#U2?d*MS+HTLJY90WcaYHj8#wK68pS{WryJ&*R7<&(#;dm*;V6`UOh3RdR2w z5>8d3bl9KM$Rmv?=mKIvUWvw(laq_l(j<O~$@+tKYn1aCZ~kEzZ4_y<<Z(odn>=NZ zDpT=ocO_3rje*>x0Q35BmB4SN|D0V$<qWeAqj%wey_5y%unDnuLhIk23RAK+`CyZp z;v~SF#H1bd_B6B?%S7D#Moj285@}^c_%r)?)5Eu35d9ssQfePoU_Y^6fM1Gz&2Wob ziQCc0H>7YPe@=(j-txwcrBc7;rB*Kr%lc>{p7-;5cdl7$#$ad^F|CR4D{<5nATR5U zKGw2sGLj7zc$>%;0HFf)>@itb2S8Tdx{yBY&uD7d$OrZzA541~5B(n7p$dLZuLK9V z*=m|T-P)({yTQJmrE8jO^&!hwh{OJl#TcNicIqr$a6R*L?osJC*=24y=kNdNAysW< zVlU$Prhh-+g|jt8vJ%j+<{j)8t7#n5cDwPwOyaXGs>sTF8=|J735oFXIsWm}cHXGc z?~cn-(oSnQ5*un${PH)>+Yg-VCsY)nO<dpSO}TqROKCVA?QAqJ3I&$AHW!Hpk$g-Y zyOXrp6n=YHho_gyiP^<KNk^6*i#gCg5i$5!=K&b99BH|F0iCvQul@WhFvbRJHJN<) zZ%7RjlRdbLT631$rAS;;7vu5CCyoU`p5`_?a1PPi0>U*>v$(_py)gWTF`4DvEE0$0 znT$Re2mdL`)%h&*icUF^PyG3=bEv<5@RGakz|omV*d*azB6V-be_Dq69Zx8>*#I^b z`fV1@W!6HZx`^MgdWnqfzfpa)8r||bvSU=|=;+M%ICV6e^IMbrj^`3no2=|b6LDz= zOQka?H>$5Yl2o-zS=xtmuSF2M=??D2-BB*ipFKPIIl&G~;vJe<D6MOfiuyp63#Jrv za8WBIRDirjae4WbyzB;~LZoYmN}4r?N>V8&B9UD?H@6cEZapL@(=%|39h0PEzZBIt zk8i+@c-MP*Oy9WSHeLuXd|)1!gJV_S16}0sBkIQcjDRqb<ClNOy2OWt3uKA+7l%BV z7Z%O%3B?^8LLKr1rmQ|SCzSJDbQDQGYYr;OoT%dD#OHP&1-}RIg-MZX3?Z!YYjE7S zbw4()yP5aG%^lAm%Zk^^5F}2K8B1qOL>0&`I9)g31&U8Ks@Y1hnt!fs*GDR;EI}SU zMgJjaTnEjtnVxAQhT~D$q!i25CHdhZR$A^xa)1IYD}dB-{F#t%8R)4&@g5^q=u5@M zXk3-a4=;iKkS#yyU(q>sguk<f*(dN{Ms_@s5Y8TnJ5Q8Wj*9pKLXQDkbr|-X;WCAr zJ`dSGBn&s$--=zo1mBU2;tqF1WcuQ%eq8*l1O*BlGtkp}(SLLio_+_sfbKSuMOxmk z&h^)2%}n=&OB1)E4kx#d=d&F*-T7x+uZQ2^wEY0BI1A8xJg(kbTX^dTzPRsx+kA?T zG^6zbq;6d&h>*vns3YVBwQuFY$E5etym9vrLzQti|F|i!1^erb5_pFL8dc;_i_q=* zB7@U;^cSR~_RR|+o!h>r9Q;V9RLAOb>cIOvV7k!shIlD2_PTL8RcsYNBy(?@Qt-SA zyrZ1%GC^BMKs;otFS01xH>F60REn7{!;JF&#Ss)K4Q$!t8j*1V{$Fd``CxQY^nmNO zPOukFGULAUD@0<to{4uoAlSK&kEDB>j^q43A9dXW{HTq8mHC-udj56)%gX&$>3N6W zTgRFIi<<A#cb1&G--E}lrFv6S-pG943XBb6a!{uM0A1^K7wF+p*Rj3tDFO*mZc#{* zjs~#6zd}qSJzd_~-i-Pwon9rg`+#HT>Lih2`CVP6;a0_eE!?hX81@Vv#f<2%k7_DI z*A2epLx&Ya0v~r~^R-sL4!}t;yH%goA*o5@S|zbDu70xUm}4<(lbtzPvY54KIAPqn z(>{KMo~OC8-^20W#$?Mw%bv7olZcS5!@87FK(x=m9*eWfAoE9&VZqxry;M*=w-L!c z@tjT9|AV~ecI8U#iC>27Dy2vNTy_2INl1c!Ns+jf{lLio6!K;{%DbYyv5%S!7OOil zK&6l)GtXbVN)#rw;`T?I8itLjwYa#p3^~l@#LN@^e*Afo_GKF(eT_OpPbx=`GCb<f zpP`H=hBjXZ7nQdOO5`SR@!RwAV74B4-6z3*eu{FiOW>3L`0gU@%oW3MQn@^W`1?D# zX+5PlquM776w}<P-K%l6N5K`AupQ!guP-n}r>>jW+G(ARAH{U(z6TsI@*F#G5FHho zNU(dQcnazAFyf6=O!GBqOW;@8nEAi|dGwTcra51x?xLR5_M`Df#+=s&hfh^XrOg|> zpzc4x(ci6P4urNBCg`+-$L1AG0#MN5I*&gsTG*o#iRpdnc1~Qx;2&AQ%Bbkbr?qN@ zMB<u&60{~6$mi$~h&W7s_BIR6S%lBDQQs*%8XktDSABcaUN*jG@zX_m4DO$5tH_DP z!?$9L^n87I!?{_-CklEa7Y3;??fSti6My6#JBkqq@k%4vBZ*-z_Ib0GqAUfQ{DvA} z?cXQwJ|TGvtFzF@<>B<o`6hOEh5kgmH4O{d*=pn>*RDr*ieho`THe_Ud)fuR1;n8| zqOF+E*+pfu#_^3mRoM;tSUEV{G9L9d7HUJO_jh!B?yHYrgDmi-Nh8ZpvM1j`jjE>b zI+Fuye>{sj<VjzGkg$PGK${Yw3hCUx=|;_F002K>Wy}D~0}R^*0Y1LhOjuxGNRf+_ z-<KVLD=_}JCdkqdbzNIgfn8U3qXqV7Iufb0g5PCz16E+J2O)}d9zD!5iR{Fop_ncE zf9qyhkOtuiza3ni1CUIZp;3E(K0zI0V|>aXK4Wndz7jN~v|RCVooWJv5wuO6wMwR0 zIa9@y3u=PcGKp4ti8jtt^hg>=jyF)`&-@blm|RtBC;-(aFjGg6Ixd}CkvYJjA7Lx~ zvhm{J5wy0oRXD!G{?|??cr022QnP3v@Z~F)#S{`H?BnEQGf~@WX8R4Sz5vIH3(T~| zh?sO4y7<RYZxQ~=SmTr6IwkM$Ay`l2<84r(%1l*P1V%}`s`I3~P-+g`&%J@)ei%nD zM0kpTEdg0Qs04Le`iwDkRIVm=3pBDdh>Ji967`0D*k+W=ryh=&8|E&_|8jn=X>dcS z@&GcA!6sA_3$?_?TPQ+T5*<a3WQu+Bd337nl8>aWDP$O*3vT2K&<}9LM78w9aFir< zib=kPW{t{KyFA2~Wv03Neei`$`jk|%fa!eq{c{{;9(Nf+h!Z~=N5~piN-7I|Q`je< z9TA8h8cXE}2j`Pl3{ovhaj=4XhR>)ao0Jl6%XJ&Fr1J}0^N+yFjU1l@Evb#2}^ z_!des3bzZkm2F;4dfV~+vz@o|fJ#wq((9rd{_opp8Yq>w8AnZnlECj;2%y{jV9j}| z$j|StCAw>wTm|*QiZs!VA}B;py7@^QUWPuR<a^VJE%LjAk(jn|EU{T8Sh;NB-C`bp zLN0|2)$~IT5AiAEJ6{yNJ%H?ZgCBK#*h>=6jrB$=Pv)8gLXH*mHX#j-Z;#8Lgeh@w ze$pljwRNQB*o^h)4EpFOQ%PjR+yaODvDIlvgX~9Gg|hD*ilXKPn~ch{X$p#SBl~c3 zj?0}6Cm8k^LqnT(Bg?zI9`xMa-=Jv_31V+%)$x(EAXt>zK^eY+f1p(9+<}WY%84`$ zTLmqInIuMXa&a~^>ojX7r{7&eU8Bmw-tEtL`R%@Mq*H8x<=P>GsA^6Gii+^Th@c0# z(*6q5pDTYJrB%LHs>PPp^77Fs0ggDHPYX3}Eq-MynmUg^dfdLHSW<w;N0d!&kM$eN zv%kr)VJBoIo;jjTl@^bQEdUyMltVJ0uDX9M7RE^dgz>B_5cG3<8%2A&f@3zrTg8ui zDwK1A^p|h6XWaMb!Y+94UoDvAK()jjNmpBymgSDso4*@~0!^fx3j={sfl?+{yLlV> zHTk0fDtB8|SNq?6bJ0m8Sm;MqopxWZ{Y%QrcO1=?n-3$cqOexv7?@C)k18RcYXY2u z-nqra!7<xZN1<<awzdp!SK)l*mBxGg&X?bgeL8Y^9~%>z*n|vJhbnJ=jK9%PsEGd6 zl!;|@K~egDWO9Ubb0@7AQ3XC0!+bjJH|`=DLR6e_x_QSIgU(XF11?PlM%bQXZPqhh z&-4w)sAY>BzBnUCW`bVa1}P29Xx6aBlhJVVuq8itdd*_Ti$3MJ;wTMW*J@!gq|#yV zG~+^eS5b7HONk+YMchG4<U39^!RrCZvAyKs`SPSn6pH3F?$Md&`0)x#)<V1i57dzy zk+k100Tr?YJ!AOyYyHN`FyBepKjSt9eRlaE>32?{ye-aL%WTBDm5n1SYQPe<SGXXH zA;8jVm_|%rs!qM{@9{~g+u(FWB6Qu<bvl?cUH)^lr}QWIjWQm2X+FN)!Q4?f+awMM z>s~iPJQUxO8v{ZBUGi*8V2w4mN&p5{nOtW+wG~^|7tKA_bUI<XkOu1nY{vd}ZMi?p z(r?{QVrYS@yRJ_0A$-w`5+75{;A=Xh<Eru%DTzvO;-dqg0-lN9!Fhd#C4pny4UbsQ zk)3?+X$Ge=tFQ^rl#f68DbFGe{s)mU>yx+Yp@+DHVb#vyY1V+B6}xZJsU?Gw_rFP_ z3+;cP6e$=$_6uSF`|&9XY!PNH<^OFZ1fp@BPe0Z+O4$DYT##axhi*w(jDM5Cr`q{N zTUjicS1G{iBJSKZyuR&-IUQR*$XHA*f~TtZ(fI!Fos}@Gg?KVkn#M1ks;|6>o*S9_ z>?&l(Y-3y9$>ZBA$&v5;pTh7(DI@gE5cvB}wudCNSceyF kofWO)OT3i_%otDv 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�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 ~Loy&VF%}Mhq5fQC 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 A`v3p{ literal 0 HcmV?d00001 diff --git a/esbuild.js b/esbuild.js new file mode 100644 index 0000000..e27654d --- /dev/null +++ b/esbuild.js @@ -0,0 +1,125 @@ +const esbuild = require("esbuild"); + +const production = process.argv.includes('--production'); +const watch = process.argv.includes('--watch'); + +/** + * @type {import('esbuild').Plugin} + */ +const esbuildProblemMatcherPlugin = { + name: 'esbuild-problem-matcher', + + setup(build) { + build.onStart(() => { + console.log('[watch] build started'); + }); + build.onEnd((result) => { + result.errors.forEach(({ text, location }) => { + console.error(`✘ [ERROR] ${text}`); + console.error(` ${location.file}:${location.line}:${location.column}:`); + }); + console.log('[watch] build finished'); + }); + }, +}; + +async function main() { + const ctx = await esbuild.context({ + entryPoints: [ + 'src/extension.ts' + ], + bundle: true, + format: 'cjs', + minify: production, + sourcemap: !production, + sourcesContent: false, + platform: 'node', + outfile: 'dist/extension.js', + external: ['vscode'], + logLevel: 'silent', + plugins: [ + /* add to the end of plugins array */ + esbuildProblemMatcherPlugin, + ] + }); + + // Webview build context + const webviewCtx = await esbuild.context({ + entryPoints: ['src/webview/index.tsx'], + bundle: true, + format: 'esm', + minify: production, + sourcemap: !production, + sourcesContent: false, + platform: 'browser', + outfile: 'dist/webview.js', + logLevel: 'silent', + plugins: [esbuildProblemMatcherPlugin], + loader: { + '.css': 'text', + '.png': 'file', + '.jpg': 'file', + '.svg': 'file', + }, + define: { + 'process.env.NODE_ENV': production ? '"production"' : '"development"', + }, + jsx: 'automatic', // This enables JSX support + }); + + if (watch) { + await Promise.all([ + ctx.watch(), + webviewCtx.watch() + ]); + console.log('Watching for changes...'); + } else { + await Promise.all([ + ctx.rebuild(), + webviewCtx.rebuild() + ]); + await ctx.dispose(); + await webviewCtx.dispose(); + + // // Copy Claude Code SDK to dist for runtime access + const fs = require('fs'); + const path = require('path'); + // const srcPath = path.join(__dirname, 'node_modules', '@anthropic-ai', 'claude-code'); + // const destPath = path.join(__dirname, 'dist', 'node_modules', '@anthropic-ai', 'claude-code'); + + // // Create directory structure + // fs.mkdirSync(path.dirname(destPath), { recursive: true }); + + // // Copy files + function copyDir(src, dest) { + fs.mkdirSync(dest, { recursive: true }); + const entries = fs.readdirSync(src, { withFileTypes: true }); + for (let entry of entries) { + const srcPath = path.join(src, entry.name); + const destPath = path.join(dest, entry.name); + entry.isDirectory() ? copyDir(srcPath, destPath) : fs.copyFileSync(srcPath, destPath); + } + } + + // copyDir(srcPath, destPath); + // console.log('Claude Code SDK copied to dist/'); + + // Copy assets to dist folder + const assetsSrcPath = path.join(__dirname, 'src', 'assets'); + const assetsDestPath = path.join(__dirname, 'dist', 'src', 'assets'); + + if (fs.existsSync(assetsSrcPath)) { + copyDir(assetsSrcPath, assetsDestPath); + console.log('Assets copied to dist/src/assets/'); + } else { + console.log('Assets directory not found at:', assetsSrcPath); + } + + console.log('Build complete!'); + } +} + +main().catch(e => { + console.error(e); + process.exit(1); +}); diff --git a/esbuild.js.backup b/esbuild.js.backup new file mode 100644 index 0000000..da7c2ab --- /dev/null +++ b/esbuild.js.backup @@ -0,0 +1,125 @@ +const esbuild = require("esbuild"); + +const production = process.argv.includes('--production'); +const watch = process.argv.includes('--watch'); + +/** + * @type {import('esbuild').Plugin} + */ +const esbuildProblemMatcherPlugin = { + name: 'esbuild-problem-matcher', + + setup(build) { + build.onStart(() => { + console.log('[watch] build started'); + }); + build.onEnd((result) => { + result.errors.forEach(({ text, location }) => { + console.error(`✘ [ERROR] ${text}`); + console.error(` ${location.file}:${location.line}:${location.column}:`); + }); + console.log('[watch] build finished'); + }); + }, +}; + +async function main() { + const ctx = await esbuild.context({ + entryPoints: [ + 'src/extension.ts' + ], + bundle: true, + format: 'cjs', + minify: production, + sourcemap: !production, + sourcesContent: false, + platform: 'node', + outfile: 'dist/extension.js', + external: ['vscode'], + logLevel: 'silent', + plugins: [ + /* add to the end of plugins array */ + esbuildProblemMatcherPlugin, + ] + }); + + // Webview build context + const webviewCtx = await esbuild.context({ + entryPoints: ['src/webview/index.tsx'], + bundle: true, + format: 'esm', + minify: production, + sourcemap: !production, + sourcesContent: false, + platform: 'browser', + outfile: 'dist/webview.js', + logLevel: 'silent', + plugins: [esbuildProblemMatcherPlugin], + loader: { + '.css': 'text', + '.png': 'file', + '.jpg': 'file', + '.svg': 'file', + }, + define: { + 'process.env.NODE_ENV': production ? '"production"' : '"development"', + }, + jsx: 'automatic', // This enables JSX support + }); + + if (watch) { + await Promise.all([ + ctx.watch(), + webviewCtx.watch() + ]); + console.log('Watching for changes...'); + } else { + await Promise.all([ + ctx.rebuild(), + webviewCtx.rebuild() + ]); + await ctx.dispose(); + await webviewCtx.dispose(); + + // Copy Claude Code SDK to dist for runtime access + const fs = require('fs'); + const path = require('path'); + const srcPath = path.join(__dirname, 'node_modules', '@anthropic-ai', 'claude-code'); + const destPath = path.join(__dirname, 'dist', 'node_modules', '@anthropic-ai', 'claude-code'); + + // Create directory structure + fs.mkdirSync(path.dirname(destPath), { recursive: true }); + + // Copy files + function copyDir(src, dest) { + fs.mkdirSync(dest, { recursive: true }); + const entries = fs.readdirSync(src, { withFileTypes: true }); + for (let entry of entries) { + const srcPath = path.join(src, entry.name); + const destPath = path.join(dest, entry.name); + entry.isDirectory() ? copyDir(srcPath, destPath) : fs.copyFileSync(srcPath, destPath); + } + } + + copyDir(srcPath, destPath); + console.log('Claude Code SDK copied to dist/'); + + // Copy assets to dist folder + const assetsSrcPath = path.join(__dirname, 'src', 'assets'); + const assetsDestPath = path.join(__dirname, 'dist', 'src', 'assets'); + + if (fs.existsSync(assetsSrcPath)) { + copyDir(assetsSrcPath, assetsDestPath); + console.log('Assets copied to dist/src/assets/'); + } else { + console.log('Assets directory not found at:', assetsSrcPath); + } + + console.log('Build complete!'); + } +} + +main().catch(e => { + console.error(e); + process.exit(1); +}); diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..d5c0b53 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,28 @@ +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; + +export default [{ + files: ["**/*.ts"], +}, { + plugins: { + "@typescript-eslint": typescriptEslint, + }, + + languageOptions: { + parser: tsParser, + ecmaVersion: 2022, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/naming-convention": ["warn", { + selector: "import", + format: ["camelCase", "PascalCase"], + }], + + curly: "warn", + eqeqeq: "warn", + "no-throw-literal": "warn", + semi: "warn", + }, +}]; \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..72de40905355c9af43185647a3aa058db521f795 GIT binary patch literal 3714 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 B5O@Fp literal 0 HcmV?d00001 diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..4528a28 --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ +<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg" class="drop-shadow-lg"><defs><linearGradient id="yellowOrange" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#FFE066"></stop><stop offset="50%" stop-color="#FFB347"></stop><stop offset="100%" stop-color="#FF8C42"></stop></linearGradient><linearGradient id="pinkCoral" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#FFB3E6"></stop><stop offset="50%" stop-color="#FF6B9D"></stop><stop offset="100%" stop-color="#E91E63"></stop></linearGradient><linearGradient id="bluePurple" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#87CEEB"></stop><stop offset="50%" stop-color="#9C27B0"></stop><stop offset="100%" stop-color="#1976D2"></stop></linearGradient></defs><rect x="45" y="13" width="70" height="52" rx="13" ry="13" fill="url(#yellowOrange)"></rect><rect x="26" y="32" width="70" height="52" rx="13" ry="13" fill="url(#pinkCoral)"></rect><rect x="6" y="51" width="70" height="52" rx="13" ry="13" fill="url(#bluePurple)"></rect></svg> \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..57f271d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8387 @@ +{ + "name": "superdesign", + "version": "0.0.11", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "superdesign", + "version": "0.0.11", + "dependencies": { + "@ai-sdk/anthropic": "^1.2.12", + "@ai-sdk/google": "^1.2.19", + "@ai-sdk/openai": "^1.3.22", + "@openrouter/ai-sdk-provider": "^0.7.2", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "ai": "^4.3.16", + "execa": "^9.6.0", + "glob": "^11.0.3", + "highlight.js": "^11.11.1", + "lucide-react": "^0.522.0", + "micromatch": "^4.0.8", + "mime-types": "^3.0.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "react-zoom-pan-pinch": "^3.7.0", + "rehype-highlight": "^7.0.2", + "remark-gfm": "^4.0.1", + "zod": "^3.25.67" + }, + "devDependencies": { + "@types/mime-types": "^3.0.1", + "@types/mocha": "^10.0.10", + "@types/node": "^20.19.9", + "@types/vscode": "^1.90.0", + "@typescript-eslint/eslint-plugin": "^8.31.1", + "@typescript-eslint/parser": "^8.31.1", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.5.2", + "esbuild": "^0.25.3", + "eslint": "^9.25.1", + "npm-run-all": "^4.1.5", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + }, + "engines": { + "vscode": "^1.90.0" + } + }, + "node_modules/@ai-sdk/anthropic": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-1.2.12.tgz", + "integrity": "sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/google": { + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-1.2.19.tgz", + "integrity": "sha512-Xgl6eftIRQ4srUdCzxM112JuewVMij5q4JLcNmHcB68Bxn9dpr3MVUSPlJwmameuiQuISIA8lMB+iRiRbFsaqA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "1.3.22", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.22.tgz", + "integrity": "sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", + "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", + "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/ui-utils": "1.2.11", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@ai-sdk/ui-utils": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", + "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", + "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", + "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", + "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@openrouter/ai-sdk-provider": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-0.7.2.tgz", + "integrity": "sha512-Fry2mV7uGGJRmP9JntTZRc8ElESIk7AJNTacLbF6Syoeb5k8d7HPGkcK9rTXDlqBb8HgU1hOKtz23HojesTmnw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ai": "^4.3.16", + "zod": "^3.25.34" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/diff-match-patch": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", + "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.9", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/vscode": { + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.101.0.tgz", + "integrity": "sha512-ZWf0IWa+NGegdW3iU42AcDTFHWW7fApLdkdnBqwYEtHVIBGbTu0ZNQKP/kX3Ds/uMJXIMQNAojHR4vexCEEz5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", + "integrity": "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/type-utils": "8.34.1", + "@typescript-eslint/utils": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.34.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz", + "integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz", + "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.34.1", + "@typescript-eslint/types": "^8.34.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz", + "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz", + "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz", + "integrity": "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.34.1", + "@typescript-eslint/utils": "8.34.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz", + "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz", + "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.34.1", + "@typescript-eslint/tsconfig-utils": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "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" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz", + "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz", + "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vscode/test-cli": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.10.tgz", + "integrity": "sha512-B0mMH4ia+MOOtwNiLi79XhA+MLmUItIC8FckEuKrVAVriIuSWjt7vv4+bF8qVFiNFe4QRfzPaIZk39FZGWEwHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mocha": "^10.0.2", + "c8": "^9.1.0", + "chokidar": "^3.5.3", + "enhanced-resolve": "^5.15.0", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^10.2.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/test-cli/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/test-cli/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@vscode/test-cli/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vscode/test-cli/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.16.tgz", + "integrity": "sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/react": "1.2.12", + "@ai-sdk/ui-utils": "1.2.11", + "@opentelemetry/api": "1.9.0", + "jsondiffpatch": "0.6.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/c8": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", + "integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=14.14.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "license": "Apache-2.0" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.1", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.29.0", + "@eslint/plugin-kit": "^0.3.1", + "@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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsondiffpatch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", + "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", + "license": "MIT", + "dependencies": { + "@types/diff-match-patch": "^1.0.36", + "chalk": "^5.3.0", + "diff-match-patch": "^1.0.5" + }, + "bin": { + "jsondiffpatch": "bin/jsondiffpatch.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/jsondiffpatch/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowlight": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", + "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "highlight.js": "~11.11.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lucide-react": { + "version": "0.522.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.522.0.tgz", + "integrity": "sha512-jnJbw974yZ7rQHHEFKJOlWAefG3ATSCZHANZxIdx8Rk/16siuwjgA4fBULpXEAWx/RlTs3FzmKW/udWUuO0aRw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-zoom-pan-pinch": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz", + "integrity": "sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rehype-highlight": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.2.tgz", + "integrity": "sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-text": "^4.0.0", + "lowlight": "^3.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swr": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", + "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..35c8b40 --- /dev/null +++ b/package.json @@ -0,0 +1,253 @@ +{ + "name": "superdesign", + "displayName": "superdesign", + "description": "The 1st Design Agent lives inside your IDE", + "version": "0.0.11", + "publisher": "iganbold", + "icon": "icon.png", + "repository": { + "type": "git", + "url": "https://github.com/superdesigndev/superdesign" + }, + "engines": { + "vscode": "^1.90.0" + }, + "categories": [ + "AI", + "Other" + ], + "keywords": [ + "design", + "ui", + "mockup", + "wireframe", + "component", + "ai", + "agent", + "figma", + "prototype", + "layout", + "frontend", + "react", + "html", + "css", + "claude", + "anthropic", + "generator", + "automation" + ], + "activationEvents": [ + "onCommand:superdesign.helloWorld", + "onView:superdesign.chatView" + ], + "main": "./dist/extension.js", + "contributes": { + "commands": [ + { + "command": "superdesign.helloWorld", + "title": "Hello World", + "category": "Superdesign" + }, + { + "command": "superdesign.configureApiKey", + "title": "Configure Anthropic API Key", + "category": "Superdesign" + }, + { + "command": "superdesign.configureOpenAIApiKey", + "title": "Configure OpenAI API Key", + "category": "Superdesign" + }, + { + "command": "superdesign.configureOpenRouterApiKey", + "title": "Configure OpenRouter API Key", + "category": "Superdesign" + }, + { + "command": "superdesign.showChatSidebar", + "title": "Show Chat Sidebar", + "category": "Superdesign" + }, + { + "command": "superdesign.openCanvas", + "title": "Open Canvas View", + "category": "Superdesign", + "icon": "$(window)" + }, + { + "command": "superdesign.clearChat", + "title": "Clear Chat", + "category": "Superdesign", + "icon": "$(clear-all)" + }, + { + "command": "superdesign.resetWelcome", + "title": "Reset Welcome Screen", + "category": "Superdesign" + }, + { + "command": "superdesign.initializeProject", + "title": "Initialize Superdesign", + "category": "Superdesign" + }, + { + "command": "superdesign.openSettings", + "title": "Open Settings", + "category": "Superdesign", + "icon": "$(settings-gear)" + } + ], + "menus": { + "view/title": [ + { + "command": "superdesign.openCanvas", + "when": "view == superdesign.chatView", + "group": "navigation" + }, + { + "command": "superdesign.openSettings", + "when": "view == superdesign.chatView", + "group": "navigation" + }, + { + "command": "superdesign.clearChat", + "when": "view == superdesign.chatView", + "group": "navigation" + } + ] + }, + "views": { + "superdesign-sidebar": [ + { + "type": "webview", + "id": "superdesign.chatView", + "name": "SUPER DESIGN", + "when": "true" + } + ] + }, + "viewsContainers": { + "activitybar": [ + { + "id": "superdesign-sidebar", + "title": "Superdesign", + "icon": "icon.svg" + } + ] + }, + "configuration": { + "title": "Superdesign", + "properties": { + "superdesign.anthropicApiKey": { + "type": "string", + "description": "Anthropic API key for Claude Code integration", + "scope": "application" + }, + "superdesign.openaiApiKey": { + "type": "string", + "description": "OpenAI API key for custom agent", + "scope": "application" + }, + "superdesign.openrouterApiKey": { + "type": "string", + "description": "OpenRouter API key for custom agent", + "scope": "application" + }, + "superdesign.aiModelProvider": { + "type": "string", + "enum": [ + "openai", + "anthropic", + "openrouter" + ], + "default": "anthropic", + "description": "AI model provider for custom agent (OpenAI, Anthropic, or OpenRouter)", + "scope": "application" + }, + "superdesign.aiModel": { + "type": "string", + "description": "Specific AI model to use (e.g., gpt-4o, claude-3-5-sonnet-20241022)", + "scope": "application" + }, + "superdesign.aiModelAuto": { + "type": "string", + "description": "Specific AI model to use when 'AUTO' is selected (e.g., gpt-4.1)", + "scope": "application" + }, + "superdesign.openaiBaseURL": { + "type": "string", + "description": "Custom base URL for OpenAI API.", + "scope": "application" + }, + "superdesign.anthropicBaseURL": { + "type": "string", + "description": "Custom base URL for Anthropic API.", + "scope": "application" + }, + "superdesign.openrouterBaseURL": { + "type": "string", + "description": "Custom base URL for OpenRouter API.", + "scope": "application" + } + } + } + }, + "scripts": { + "vscode:prepublish": "npm run package", + "compile": "npm run check-types && npm run lint && node esbuild.js", + "watch": "npm-run-all -p watch:*", + "watch:esbuild": "node esbuild.js --watch", + "watch:tsc": "tsc --noEmit --watch --project tsconfig.json", + "package": "npm run check-types && npm run lint && node esbuild.js --production", + "compile-tests": "tsc -p . --outDir out", + "watch-tests": "tsc -p . -w --outDir out", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "check-types": "tsc --noEmit", + "lint": "eslint src", + "test": "vscode-test", + "test:llm": "tsc --project tsconfig.test.json && node dist-test/test/llm-service.test.js", + "test:core": "tsc --project tsconfig.test.json && node dist-test/test/core-components.test.js", + "test:read": "tsc --project tsconfig.test.json && node dist-test/test/read-tool.test.js", + "test:write-edit": "tsc --project tsconfig.test.json && node dist-test/test/write-edit-tools.test.js", + "test:ls-grep-glob": "tsc --project tsconfig.test.json && node dist-test/test/ls-grep-glob-tools.test.js", + "test:agent": "tsc --project tsconfig.test.json && node dist-test/test/llm-service.test.js && node dist-test/test/core-components.test.js", + "test:tools": "tsc --project tsconfig.test.json && node dist-test/test/read-tool.test.js && node dist-test/test/write-edit-tools.test.js && node dist-test/test/ls-grep-glob-tools.test.js" + }, + "devDependencies": { + "@types/mime-types": "^3.0.1", + "@types/mocha": "^10.0.10", + "@types/node": "^20.19.9", + "@types/vscode": "^1.90.0", + "@typescript-eslint/eslint-plugin": "^8.31.1", + "@typescript-eslint/parser": "^8.31.1", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.5.2", + "esbuild": "^0.25.3", + "eslint": "^9.25.1", + "npm-run-all": "^4.1.5", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + }, + "dependencies": { + "@ai-sdk/anthropic": "^1.2.12", + "@ai-sdk/google": "^1.2.19", + "@ai-sdk/openai": "^1.3.22", + "@openrouter/ai-sdk-provider": "^0.7.2", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "ai": "^4.3.16", + "execa": "^9.6.0", + "glob": "^11.0.3", + "highlight.js": "^11.11.1", + "lucide-react": "^0.522.0", + "micromatch": "^4.0.8", + "mime-types": "^3.0.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "react-zoom-pan-pinch": "^3.7.0", + "rehype-highlight": "^7.0.2", + "remark-gfm": "^4.0.1", + "zod": "^3.25.67" + } +} diff --git a/package.json.backup b/package.json.backup new file mode 100644 index 0000000..5f8b24e --- /dev/null +++ b/package.json.backup @@ -0,0 +1,176 @@ +{ + "name": "superdesign", + "displayName": "superdesign", + "description": "The 1st Design Agent lives inside your IDE", + "version": "0.0.6", + "publisher": "iganbold", + "icon": "icon.png", + "repository": { + "type": "git", + "url": "https://github.com/superdesigndev/superdesign" + }, + "engines": { + "vscode": "^1.90.0" + }, + "categories": [ + "AI", + "Other" + ], + "keywords": [ + "design", + "ui", + "mockup", + "wireframe", + "component", + "ai", + "agent", + "figma", + "prototype", + "layout", + "frontend", + "react", + "html", + "css", + "claude", + "anthropic", + "generator", + "automation" + ], + "activationEvents": [ + "onCommand:superdesign.helloWorld", + "onView:superdesign.chatView" + ], + "main": "./dist/extension.js", + "contributes": { + "commands": [ + { + "command": "superdesign.helloWorld", + "title": "Hello World", + "category": "Superdesign" + }, + { + "command": "superdesign.configureApiKey", + "title": "Configure Anthropic API Key", + "category": "Superdesign" + }, + { + "command": "superdesign.showChatSidebar", + "title": "Show Chat Sidebar", + "category": "Superdesign" + }, + { + "command": "superdesign.openCanvas", + "title": "Open Canvas View", + "category": "Superdesign", + "icon": "$(window)" + }, + { + "command": "superdesign.clearChat", + "title": "Clear Chat", + "category": "Superdesign", + "icon": "$(clear-all)" + }, + { + "command": "superdesign.resetWelcome", + "title": "Reset Welcome Screen", + "category": "Superdesign" + }, + { + "command": "superdesign.initializeProject", + "title": "Initialize Superdesign", + "category": "Superdesign" + } + ], + "menus": { + "view/title": [ + { + "command": "superdesign.openCanvas", + "when": "view == superdesign.chatView", + "group": "navigation" + }, + { + "command": "superdesign.clearChat", + "when": "view == superdesign.chatView", + "group": "navigation" + } + ] + }, + "views": { + "superdesign-sidebar": [ + { + "type": "webview", + "id": "superdesign.chatView", + "name": "SUPER DESIGN", + "when": "true" + } + ] + }, + "viewsContainers": { + "activitybar": [ + { + "id": "superdesign-sidebar", + "title": "Superdesign", + "icon": "icon.svg" + } + ] + }, + "configuration": { + "title": "Superdesign", + "properties": { + "superdesign.anthropicApiKey": { + "type": "string", + "description": "Anthropic API key for Claude Code integration", + "scope": "application" + } + } + } + }, + "scripts": { + "vscode:prepublish": "npm run package", + "compile": "npm run check-types && npm run lint && node esbuild.js", + "watch": "npm-run-all -p watch:*", + "watch:esbuild": "node esbuild.js --watch", + "watch:tsc": "tsc --noEmit --watch --project tsconfig.json", + "package": "npm run check-types && npm run lint && node esbuild.js --production", + "compile-tests": "tsc -p . --outDir out", + "watch-tests": "tsc -p . -w --outDir out", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "check-types": "tsc --noEmit", + "lint": "eslint src", + "test": "vscode-test" + }, + "devDependencies": { + "@types/mocha": "^10.0.10", + "@types/node": "20.x", + "@types/vscode": "^1.90.0", + "@typescript-eslint/eslint-plugin": "^8.31.1", + "@typescript-eslint/parser": "^8.31.1", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.5.2", + "esbuild": "^0.25.3", + "eslint": "^9.25.1", + "npm-run-all": "^4.1.5", + "typescript": "^5.8.3" + }, + "dependencies": { + "@ai-sdk/anthropic": "^0.0.50", + "@ai-sdk/google": "^0.0.52", + "@ai-sdk/openai": "^0.0.66", + "@anthropic-ai/claude-code": "^1.0.35", + "@openrouter/ai-sdk-provider": "^0.0.6", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "ai": "^3.4.0", + "execa": "^8.0.0", + "glob": "^10.3.0", + "highlight.js": "^11.11.1", + "lucide-react": "^0.522.0", + "micromatch": "^4.0.5", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-markdown": "^10.1.0", + "react-zoom-pan-pinch": "^3.7.0", + "rehype-highlight": "^7.0.2", + "remark-gfm": "^4.0.1" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..c60f3cc --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4554 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@anthropic-ai/claude-code': + specifier: ^1.0.31 + version: 1.0.33 + '@types/react': + specifier: ^19.1.8 + version: 19.1.8 + '@types/react-dom': + specifier: ^19.1.6 + version: 19.1.6(@types/react@19.1.8) + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + lucide-react: + specifier: ^0.522.0 + version: 0.522.0(react@19.1.0) + react: + specifier: ^19.1.0 + version: 19.1.0 + react-dom: + specifier: ^19.1.0 + version: 19.1.0(react@19.1.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.1.8)(react@19.1.0) + react-zoom-pan-pinch: + specifier: ^3.7.0 + version: 3.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + rehype-highlight: + specifier: ^7.0.2 + version: 7.0.2 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + devDependencies: + '@types/mocha': + specifier: ^10.0.10 + version: 10.0.10 + '@types/node': + specifier: 20.x + version: 20.19.1 + '@types/vscode': + specifier: ^1.95.0 + version: 1.101.0 + '@typescript-eslint/eslint-plugin': + specifier: ^8.31.1 + version: 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/parser': + specifier: ^8.31.1 + version: 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@vscode/test-cli': + specifier: ^0.0.10 + version: 0.0.10 + '@vscode/test-electron': + specifier: ^2.5.2 + version: 2.5.2 + esbuild: + specifier: ^0.25.3 + version: 0.25.5 + eslint: + specifier: ^9.25.1 + version: 9.29.0 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + +packages: + + '@anthropic-ai/claude-code@1.0.33': + resolution: {integrity: sha512-rKQ1C0+iSV/bS4LVfyCt2FIkIc8MnFi5EbmRAXEunNkXLCQLHfXjsqx7cLOy7c11vZwGkyf/wEp5LwaDQHdjCQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.3': + resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.0': + resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.29.0': + resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.2': + resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@20.19.1': + resolution: {integrity: sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==} + + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react@19.1.8': + resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/vscode@1.101.0': + resolution: {integrity: sha512-ZWf0IWa+NGegdW3iU42AcDTFHWW7fApLdkdnBqwYEtHVIBGbTu0ZNQKP/kX3Ds/uMJXIMQNAojHR4vexCEEz5Q==} + + '@typescript-eslint/eslint-plugin@8.35.0': + resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.35.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/parser@8.35.0': + resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/project-service@8.35.0': + resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/scope-manager@8.35.0': + resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.35.0': + resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/type-utils@8.35.0': + resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/types@8.35.0': + resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.35.0': + resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.35.0': + resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.35.0': + resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vscode/test-cli@0.0.10': + resolution: {integrity: sha512-B0mMH4ia+MOOtwNiLi79XhA+MLmUItIC8FckEuKrVAVriIuSWjt7vv4+bF8qVFiNFe4QRfzPaIZk39FZGWEwHA==} + engines: {node: '>=18'} + hasBin: true + + '@vscode/test-electron@2.5.2': + resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} + engines: {node: '>=16'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + c8@9.1.0: + resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} + engines: {node: '>=14.14.0'} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.29.0: + resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lowlight@3.3.0: + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lucide-react@0.522.0: + resolution: {integrity: sha512-jnJbw974yZ7rQHHEFKJOlWAefG3ATSCZHANZxIdx8Rk/16siuwjgA4fBULpXEAWx/RlTs3FzmKW/udWUuO0aRw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-zoom-pan-pinch@3.7.0: + resolution: {integrity: sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + react: '*' + react-dom: '*' + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + rehype-highlight@7.0.2: + resolution: {integrity: sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-js@1.1.17: + resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@anthropic-ai/claude-code@1.0.33': + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + + '@bcoe/v8-coverage@0.2.3': {} + + '@esbuild/aix-ppc64@0.25.5': + optional: true + + '@esbuild/android-arm64@0.25.5': + optional: true + + '@esbuild/android-arm@0.25.5': + optional: true + + '@esbuild/android-x64@0.25.5': + optional: true + + '@esbuild/darwin-arm64@0.25.5': + optional: true + + '@esbuild/darwin-x64@0.25.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.5': + optional: true + + '@esbuild/freebsd-x64@0.25.5': + optional: true + + '@esbuild/linux-arm64@0.25.5': + optional: true + + '@esbuild/linux-arm@0.25.5': + optional: true + + '@esbuild/linux-ia32@0.25.5': + optional: true + + '@esbuild/linux-loong64@0.25.5': + optional: true + + '@esbuild/linux-mips64el@0.25.5': + optional: true + + '@esbuild/linux-ppc64@0.25.5': + optional: true + + '@esbuild/linux-riscv64@0.25.5': + optional: true + + '@esbuild/linux-s390x@0.25.5': + optional: true + + '@esbuild/linux-x64@0.25.5': + optional: true + + '@esbuild/netbsd-arm64@0.25.5': + optional: true + + '@esbuild/netbsd-x64@0.25.5': + optional: true + + '@esbuild/openbsd-arm64@0.25.5': + optional: true + + '@esbuild/openbsd-x64@0.25.5': + optional: true + + '@esbuild/sunos-x64@0.25.5': + optional: true + + '@esbuild/win32-arm64@0.25.5': + optional: true + + '@esbuild/win32-ia32@0.25.5': + optional: true + + '@esbuild/win32-x64@0.25.5': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0)': + dependencies: + eslint: 9.29.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.1': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.3': {} + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1(supports-color@8.1.1) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.29.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.2': + dependencies: + '@eslint/core': 0.15.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mocha@10.0.10': {} + + '@types/ms@2.1.0': {} + + '@types/node@20.19.1': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.1.6(@types/react@19.1.8)': + dependencies: + '@types/react': 19.1.8 + + '@types/react@19.1.8': + dependencies: + csstype: 3.1.3 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/vscode@1.101.0': {} + + '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/type-utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 + eslint: 9.29.0 + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.35.0(eslint@9.29.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 + debug: 4.4.1(supports-color@8.1.1) + eslint: 9.29.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.35.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) + '@typescript-eslint/types': 8.35.0 + debug: 4.4.1(supports-color@8.1.1) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.35.0': + dependencies: + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/visitor-keys': 8.35.0 + + '@typescript-eslint/tsconfig-utils@8.35.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.35.0(eslint@9.29.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + debug: 4.4.1(supports-color@8.1.1) + eslint: 9.29.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.35.0': {} + + '@typescript-eslint/typescript-estree@8.35.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/project-service': 8.35.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/visitor-keys': 8.35.0 + debug: 4.4.1(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.35.0(eslint@9.29.0)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + eslint: 9.29.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.35.0': + dependencies: + '@typescript-eslint/types': 8.35.0 + eslint-visitor-keys: 4.2.1 + + '@ungap/structured-clone@1.3.0': {} + + '@vscode/test-cli@0.0.10': + dependencies: + '@types/mocha': 10.0.10 + c8: 9.1.0 + chokidar: 3.6.0 + enhanced-resolve: 5.18.2 + glob: 10.4.5 + minimatch: 9.0.5 + mocha: 10.8.2 + supports-color: 9.4.0 + yargs: 17.7.2 + + '@vscode/test-electron@2.5.2': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + jszip: 3.10.1 + ora: 8.2.0 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + c8@9.1.0: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + test-exclude: 6.0.0 + v8-to-istanbul: 9.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + core-util-is@1.0.3: {} + + cross-spawn@6.0.6: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@4.4.1(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@5.2.0: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enhanced-resolve@5.18.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + 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 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.25.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.29.0: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.3 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.29.0 + '@eslint/plugin-kit': 0.3.2 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + esutils@2.0.3: {} + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flat@5.0.2: {} + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.17 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + hosted-git-info@2.8.9: {} + + html-escaper@2.0.2: {} + + html-url-attributes@3.0.1: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + immediate@3.0.6: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inline-style-parser@0.2.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-interactive@2.0.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@6.0.0: + dependencies: + chalk: 5.4.1 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + lowlight@3.3.0: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + highlight.js: 11.11.1 + + lru-cache@10.4.3: {} + + lucide-react@0.522.0(react@19.1.0): + dependencies: + react: 19.1.0 + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + memorystream@0.3.1: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.1(supports-color@8.1.1) + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-function@5.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.2: {} + + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.1(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + nice-try@1.0.5: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.10 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.6 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.3 + string.prototype.padend: 3.1.6 + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@8.2.0: + dependencies: + chalk: 5.4.1 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.1: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + picomatch@2.3.1: {} + + pidtree@0.3.1: {} + + pify@3.0.0: {} + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + process-nextick-args@2.0.1: {} + + property-information@7.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-markdown@10.1.0(@types/react@19.1.8)(react@19.1.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.8 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + react-zoom-pan-pinch@3.7.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + react@19.1.0: {} + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + 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 + + rehype-highlight@7.0.2: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-text: 4.0.2 + lowlight: 3.3.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.26.0: {} + + semver@5.7.2: {} + + semver@7.7.2: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + 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.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + 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 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setimmediate@1.0.5: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + + stdin-discarder@0.2.2: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + style-to-js@1.1.17: + dependencies: + style-to-object: 1.0.9 + + style-to-object@1.0.9: + dependencies: + inline-style-parser: 0.2.4 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-color@9.4.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@2.2.2: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@2.1.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.8.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + 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.4 + + 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 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + workerpool@6.5.1: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zwitch@2.0.4: {} diff --git a/src/assets/bolt_logo.jpg b/src/assets/bolt_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b085fc614d492b617fddcb252bd23adc6df849c8 GIT binary patch literal 6835 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 literal 0 HcmV?d00001 diff --git a/src/assets/claude_code_logo.png b/src/assets/claude_code_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5f96751336c8744f03411972019592b6c1d9e302 GIT binary patch literal 22952 zcmbSS^-~-?6ULpw0R@V4P^`GS+<RCBm*P-b-0hIV4tJO0TA*-1ksig}r4;Mo?rw+k z^>6qxlVm18WH!kr`(*doC=E4bVgechG&D3~RTZ!n8XEf9zj}>_`ENvjPZ9O6%h!0X zqxi3nhzf>7?VG(U2K+t`dYO!Sn@&KCC%jFjyp3l4%x3?!5W{&t<4Jd&zupE5zQ)s@ zI;+8-=DhT_!>yM5jOHM^^H8JRh%c)!^KGcflD`qs$6($^8|kgL=5Da)r90=XKjo`C z<EuXBt+VK1g!Iyz@z!1N&|h}fnS*Hj_SIVO(3$hnL3(P>c<L;=X-s-(&$(z$I;o8~ zsP64He)=aOjfa++HW~&lDK!hfl#;foD=abV`>&z#<?Ze3yXPm&(j6!o+Q&Rqu!4^F z{NbFYTai3Pm<0ts0Y`c1`-N4P1)cvsQzR`v&$E3Uc+a3(RrlmfxRWR8Df4gc|EH{2 zQ7R4D-7-fN`|#&_dz+>p9T<2Zs5Ma{UVXb1HcjdqhCE%;8icMc!}#5imgjJ}ARlT$ z{PZ-IO`%~vcVcG&?$PF^Sd;5jHub?dgIOdHG{v<1(-U=9*4oaH0954B$~yOLYle#C z`&wSCxT=tB^8IOxeEH_2>cO(lu%c1Zv6))xoJqC*a3lGYNx^U=gO|#BUe+jfe!w>K za9-i0?lZ$Fk#uOs-<U|A_;Uj|PVxKf@wT&@HNg{4YmWt|bt>N{Jd5v&1h-YTGz%5g z<SawpU86;w_SLBWR(`7O9Bjd4o?R8{`0U<1+g3HIq5MrV55F{YZg|$*g-m@Dd8_Z- zQE#)orhGf8l-sV>TB}%0D|Ok@%V_QT=q>c%_TQYau0@VeT6>Kp5cTvE!bTK#(K;W{ z3_`{6Rwx>AHf|>OH4QyKJDRNvVy43RM<C10`X9G*Am-jpZ-(k#-`4!0fnO}>zvTNe z<mHey|6!qnGw6NYY152v?$^w;=x$PT!=v*Dlj?5^A&4{m#9WJQRuS8pCqL+&BlYre z1KV_y40Rz#bb7th%aLbb<MH*=uH%CU5v_K6O@w|23*W)}ZhnFf72-7YGUgRcoh63t zkBV83SIjM??xloz<$3!CHP^I7H=W^On+-GaSk3%y1(A`I#n*u^1Ec1zY;u<+Hr*GN zsXwb%+$apyp3(j^?Jv|fw&x<n?5}P5Gu|?zH@Z?Z+cIR*oSgCXs{$LDq(N(lZOiq6 zCKM0`VFs`On1W}O?72<uPwzUSJ3#Q+Z0$sPvyr|eeD#(ioY!WTMjdy~jRS9cdqI>U zFPRFh;7LG{6a8%Gz$ioK#?dstuU`c$gXa`AfQ?y?b+5d(t*B_*W<cdUhFl8MG)#;l zZ#tgz%V+$=z^Sc8O+LS~6F;W=v>u8DoZ$ty1Txy2aHyryuxu)r)XJ!Rcch*$`{4@2 zrG*kdo{m=u4lC(*Wa6k9dy{=siDd#7vZS(FxQl&17n)e9J^NZGkKg`oJsn-muhHx- z1Lv)xsVj?{WW*d^EH(&P>$V>lGd{?v98}Y3N@{Ly3M@UVL0Y)Cj=KZfX2L;GCD>Yl z)`RopKBmOL4MEVZh%(#Yl*oAXeg~7cwHG29uVI#>_u(|R5c<v>Swrz`H0`$uUORA5 z%MuDUDI+5?G@C1xF{F2|5l<#%Sq<4<?%#QQ=6WJ)JjiB(#MWSD<D%jhqz%U;J4j`| zE%?1;F2Vt>MVt_P{4`T?Z`QZ6ZkPV16NQv&S^AWR3RE~lO2z@fap2j78y5To$!FaM zp84V+;FG-TZ)Dc_%<le(Q(GlM+2xZ6@OAf1>Swv~c&#Ufv8Ooleh8p=Dz$u(2=1@z z`bAuyI)-#8?+g%Aa5sZ9YF0ekln46+Wpw;~?9{W>bi4IPm5ZH39umpgeM1q`W@q%s z_lHjL*J_IjT}p3@QD$JHQQ`80;1&gKQsi%GDk#aEuG=-Ld?o_HINxLetba!?ViPFh zwfl05G@Byo?<(eOpbF)T#hzIygdD$JoeS)m^KI`#&2^(?YGEC(3tbr*fc8S?46984 z-;xxYH;lR<7RZ<&0fFt1Z7Ly*+?Jr&sHj2efFf_0cxC#2VA{1j09Zfwb5*1-j2ujl zsn$+0bfC}Dh_&MlQ3rhG$$#SHR+W!?)AtN)r&0Zs&qAwOvKqGg9;Q+bQ5)+>Rhf~} zRu2A;{JFtZX`L+Fh2Q3JU8@Ai@u%PJ3L<c%+T4$4{QVOvaFJo0b>-xBe3HOYllh;g z==CK|No5<NI?}9&iBN7>)8X@5?DreZVl)XjOO;BmZ^NdCmkSmr9jjhNY5X(_nIN_N zl=3YnnGojm_-04M-4zd?lAnM^G!)#;-H>rR=Qlxf1UmUO){qtNo9i``2lZjTB@pz? ze#Is4@3a9Md~KV!Gr3DR<lZKyAK&>2oxf1vy^0DY#OCN`WT1BJ*oLivC<nc<q_1S9 znzbW#9Lw0l&yNJGaz{!FePKQd9dV_=s>}{JBIK)hO$vfBpo>P5M7!H5!)quzNxn&7 z8Bi3)8B+kTd(;~JAbaa$)%6=Z$x84P_byb>sFaoLcWH=OxfGlvM7hu4cP$ki4{d|f z^v(CxnBt;HpmHRyTOF>*k&e+N)g%pei=~Q6xk3zoN3Cnh^0^u|nEyyrwk?x^lR~w1 zJ&3hRk(`WXx@G!B$L{2SRh!W-y7b;i3N3F4M7VxmXZz3FDJcCinJt_c!0eQ_&}2TG z!$6GDxjRKz(vKGuI@zNV5VdQ0XHjf%+UN$~qj{f~q-B#Z3sCjWfX{g?*EFZ_#WV~s z>3_buE{IArn{6#c7|Xwasf)dt&az~3eb7)<TrU<c>a}gv9$C)7%1`=_Dl&vy*Rc5S zDQ{~>%Y@#=cjiZ6wbC2q(1`yWBF8swa8NdxQ}p$ip{5)44BjAEXb^U%%HXERoU-F+ ztNuNR!Vp7~BCOk?VX{1|H~h?Lpk=JcOt-`AQ~1)W&!I;3Uz|7i_}O?U=7^f;%mPI> z^6`rvGO3hpM3@O;e$upSZO$@qb8r=ki_-QO*5f3@Qe*p6(@IQ0?i6T01aKHPZV0h> z3_rfu&lev0iZ~;W4L$GaPw=|B#p)3G=rl<f&=F$*&E{gUvv^)@)o=Xa{~qoo1B~6! zas}f+36(ls?^7I0-2n>yWb%?je6f1C@pnh+jBVqHRmX>?pBfK^W&py>97SNc5~=au zqz1IeFzl$a4<8BA+teLD&DCUlnv{yirCrH)cqnfq^vyTEL%buTV#aL{VpA%?ps=Du zX9g4)=zem=Z>&s0GBZczd=;l+I**b${(_QVvGbD0W9)cyltij(dDgV*zUSX2@fVZ8 zVEL5ygC!P_Rr0EbW`vcyrRDq6W4CsB#WHEqT87tH<a<`Imh9OFl)KPIy1eX1b9D0I zJQcjjiXck;{Ft?#J}wjnBhdzDxP5eF=!QoGM)%%Qv)cg`Zv}2R5E%dES?dggixJ?u z_G9HnhoL|o?-iqC4nDrZuUJ`qw5el0=N>$~MkLJzX?L8y^ameYSlAllhJlE|_Mcot zCy#>tV#oGOVEh{8fvhg!)IR5rgpk%pDI1WRS0y`qqBjB<?mSeOupm%$gXg3+789Aw z3gmDzD&3^YPi-0e5_}Pzk3NW3cFjzHA>{zIf@9BO<e@P#Ht@bQ8?X|w^S3H<Y?q-f z8pvSWpR(W;lm$`5Rr(`FnzE{x&_;HB{&WAfh+SVf&whQ;Y4};51T)2kIFz?zY-ZKX zk*4j|m3APs_vQsRxW01#?<J5XH)<@+Uy5ALV2<p>v*Rj?)%@#6C_y0(29ei7w&})s z5lX`0lYLS$V};C(4dz5dj}X~d<r^B_5`o{b@n<rbop40T$h|_%00EEex+7f_huOl= zRcUm_eP<{b>jukvtpC5(U)315U#45!Tl8*T(1HhN&g9!h{HDtY$iWSAB4lwiiL8bu z0hjY%tG-6cH&8-JzTN-#WrJ#JAAT<EW9C+HbywTkYEUSJ>!U;W3cGPeWfLUkFwM&y z#8C5zlIwTYnaTR4*K&o^=T`AuwT-2gXw0H_b&kS&vwR=!wu4lY3;M{plV)imgX$EH zx({^w?_Bu7fT&sg_7BPCzS3%y8}%`^m)7=iuV>e3OInuVch_MEUXJ(N^5;|iLj_7e ztlb$qD(vt=t^PzNi@K%bGta8VOtkZ3@v8R^T6TT1Rt$vct)=3$Dbas#!=%<5^I)v1 z3@_Qw-ia{}^Sy~EHz9sm;Qju)L_b26bZX<nNjAQzGsOg-a5hFep))Z-nfG4fN0~${ za+LrsCu|XW3XQ3l7Xu4DTV$NkDzO5#qvzp&6LYv_=%F=EGrsly{+_y~+{Tsujxa8^ z8-^j~Z#Mbsr7!LL?I&^18A%H#xi?{Jum3dojf8YqumD7{Z)Br7Q8bd1$HW6Eut^(n zZa%UOJE-rO=-TE|-{dUQYhVkZc4dIw8NTempKwj?OQXhjKj(i+6=DeY^SA#Yyscu) zb-l|CR}-FpMDn(b#A{MoNi2@C_bgkBI1_E3R<A3OCmpUM6>%xAx-<j0i)BEc8wI!< z4n_HpxWf2p@^k~SFt9UMUcrZHx6?SUnS<ORU~A(omn@D?0S6w%{GN5T*aFMhKI;>A z^w$YT;|ztgsjE#g7Uy{5^{t@IvN)E5Oo@(P)h4HA4L~6Hw_)~QJf+YH?+0{83>%(_ z_Q^({t7Q*Bs05C3apUB{=&EaOC33a-?3XiUBpW5T|1Vyy>bRk{!m!n(y|I>E4zS>{ zLYyDJSm12@y&<E~4fQ|MMfS0B3@55ch}N1_LG2@}h5Qe@%eeOsb~Nm<E(Er~GHqMS z(NEL1&}v_qVT%zJJjri~<8e7}8)W-865<+W85EMGulD;(WYe=9=I?63PC1&aDw~cH zl+wCWtJ}8*uNZ$CVFqz6NQjjCXY&V$ygvzzRZ{Ae@$J2z>O4s_c?%DaG5CUNPW7}0 zN$MM8;fIa+<`UB|2GmrZA?Ncqs5yb|8jPZ^OylMZ0fkBzn^*~JNLjh0%#XBjFX}pZ z%T}znt?N6aLs_%Th^_`H-rwn8O;E^JT#cjK#)X?M`ZSS)fVrEvkFFPxHlf!672?d9 z=D*ARPtCA~Gy#HnT{n0I0wC5p2?B$HC&(*0jY<f6iyz?6Lu+{0mp$W7@z$r%&D<Zu zm>@Xu6d|oTc9hDfS8kwmZ|P)<&scxdU#N%p@}U}MG1Gu@5P<shl`EY#IMg9^c;@E5 z#0u^ThOF6QUT{C_ZsLWwBF>`v7Se$j{^rbN()u~r03Yj1H(&qY^$7v?z7OZY;$z2g z3q5;PL^n$^^3g?+97ZkX5B|r!Rgi5!SR^cKf^|4#utL73?D3j?{CClxXoL!fx6=kr zlm@@{SNFE<i249Wx9h7>mDJs}d%5weO&7?!agKgSR3q<8l9SYN%9Y*y2E7%s+Z(%a zObO}|4oH`Ul*0^PN2YPw6IqzJ1mcVWD@lbO19wC1G2}7l<?9=|9*$72-_Q;hPufGb zG99Z^nQOn2Wd6}V<}O!`(7V9g$@#b7bFDLv+#?R4WY*QEX-8ATFR~4LZ4;gf<8i|a z;z$!ODog&Vz-ejTA*8&gKzOg}^HR;h#80GS$!7VevhGJb`D@<kuJT9!_YWP%4r3IG zk!)7dW}JOG>#@N@eZ*HwQQs01<wu_0yDEWLyIL+q8&gn$BV(>EvLHt6Pk_+lmU`Q5 zuR!*~e@LfYc|8J?Va6#VuI3*~elmjxru4lBfE<Wq2N?Oag7N+uba?t$Do`^QcRl*h ziQ>g;bl)2luXIc`%;w-+OV^W;4`9@f`-KTj#Ss@Lu1~Mt^Gk$YT|YHt2Uc31-Jw~~ zk~6#9)dd(0)-nSW3X!|rBKKFR9H5vyp+0Q9NP?jc&Hm5j-$jZu<PwleDKussh^r$0 zXrP59n0h6o3p=&P*Z;y%&{f@kcY2noYh(({42&XtVEk;&mND9S9-juJVmbX4SB4`3 zOm^t)RqF5yoi${;p##Nk&|`;OONo$H#&Se+tdYD_c0o^GJ`P{8kz1Oh9CMFtoV}I~ zw7T@s>xvJ<`;ax}J2wAiL+^SWZ^9gqQrnLK_-xsqi+Zt+5n#J<=aMjj_)sVF@r&y! z9zN5phHGUm;ic<o+xJ)YjpLarR7{H2w?hAbBuRuvPw4EoR=s+KGS|tgO)1w%{0<E| z&tQK1qMtDqkGb`Up5fM{jwFa|pR%*<Q`j%<<9PL{E!Kz5N*3{>_^D$t!*6mr&)8t! zmNbr{ivR)9{t_jY!Wvls#DnVSLnAIaS#oQ`+21$u>m9{;h?SuO-C;gQs9zw;>cH^P zj!w}cu?AsCP8$B;OVcjruhy$rxgkdP^k-igKv_*&#GyJ45g``3$0IPmWFtAW@KMOp ztAuQ4MJ5KqUdz3-2C_~MbSreU>3-LS5-<UJBko&NFW_2Rs-#QXYj*($mGh{*H!n$n zu;f%Gja2x~qcgkrj}gfj8zVHV*a?0I=pfGzVATh12&DdL!1~2lS6tX2KovbVc8U6P ztj|V<PT9|+s|Ibqi?Alib@xsin1@((N28rK(<ZBk5)0Ydt3&_TXU0k8ml~74H^gP2 zX+xH`$Ao<%pJ05!`HzJG1=`fh$jJfa+&PvsTp$Q^^Sgfp=N%Y}@%OJwT4x-b;WLRS zoapYW+B2n?Ubg{!BMQ<Vk%K$YBW%J|jn@Wv1)>(RkLmRRG`U0Dq-E?DrWTmcWRqC6 z5)J9a1ivv7Z8WOQ&`}Uy;B99oUM%n5wqGp)G6WR)s#ckJ>5q4`_qPT73irj!U)RFc z$?DL6=l}t`T=fpyH@5DnG_ES4vCh{I&ZLU>6f&)1{0D9Mf4uu1P%IWWSke&yO(Zw9 z=t^@MwV=dGx)?=;ZO!%mum#yB27aFRmDy*Y5>ri+;^czQi64O}ML6GOUJ*w(3ZNPq z8VT7u`xbbmxp2K0g%G|zZx63`J)OnMKPKM0aP%3Y=xVySBjhFl-n~kvzAfE;FFVKt zP~|9}LACAuoWYGINIb*DQU%8!gqXz3@h8p-3vt-wkD>d<n|zVDGOSS!qcy~r{ZCjK zK(tUZL13a7PX;APpDKdoq)6$EOrqv}B^Fr8|GAXpm|il2u+nN8yA2S!e$R&4ag*VX zERpYfcL+9HqrWZ9J&qHc3!%SOh~8|RM8S_A$}iAP|LemhENb};OsMH_WwG6`W3}*p zlS$E9?0xtF+#p+hv9R^&cXh{tnFG;5=vjnoKIeF>N2|$p&vvD#+S{WuiS)=4)O?3< z0*0ymn;TxvkmuVICue8Z+53LjJ!RN`UKv1))-v(?Rvf&{lau4_Y}5g(BzZ$3yl#q^ z>wV3rUb8y!XmgG3w--#LEnU_@VK$RKj(NsNwQ_{vsm$m&^%<_@K5xhEF@&w*?&8YC z?jJ<_o8v~CdhV6fa(}oqqMp@8i$O*AuJ5baUvV=0l@s&ZeU)u=@z5QmcGp$d(AAqU zbsdiJ1s;NSTv|(E8o&G{>&lbqpmQr`i#$9-`xWgR#&LZ-PNJUsE7zxSq#Il&91T86 z8}c61%jW>~Q_)PHYn*%G3Rs1@D6iW<ABQ!z7Rt?AL>Q|Uy?!Y4v>JUu^f<TL`4!CW zt6QY3`bC#HkcyCMDR8VUJ(`FI?o`*_bxPpw4+;SB@$*koVxqJae80Y)$zq8>evK;z zy(zwalgCO>tnxDgg^k+53YS>kw!2<>F}h3*l`_C+j}aIR4P71;b30+}9J?8dt2DHx zC?Kp7?T$Tn+hTJ7lbY$#&n#HFqTS?3yL9;o&h3t$M@~C}&(h^aMOvL#;5#do`&&GA zabAJJC){&i0S3iNHMgdu={|`=cA_>NKIZ-#InO|_tUjG0ZK6zgYC;wtMSkK*uwOTh zTiS{T4IfS@*<`pF-N213_v@kK+8edFbw>C~KcP>nOX>t>O@W1FCibhw$$4zvL3dA~ zR;TutL&fqEaBQ=Aai^c*z+Qd=tG51_Z}mosF4rhbNwxVMKgR=UO!>B@@Ff0r%z6#{ z%t;gt>intq+rio=#5)bLj?%mT+^?DNEwlPZal+p9sY)3t0frkEeCshs(P_?%8i0Iv zLo6}Oiu`S|?qW+4l5wz!recRhZ-ywGn59QaMGozH4eFKuLQCW)+SSST6bYNgZ=RaQ znO!If5Bn&XQX)%82Ig@}p`qC5!C|E45{#|PxBLb2_8x$}3k<iYq_>Hz;tMZquk{H1 zW%W|%w~Kv`Zp*3u9%)m6W0NxF_El68PzOlV9)C;XxOX1ca0R&6h5H^HI+Z%{VVk*$ zeF!H#rt2WAdg+X7E~`7TK@?_9ieE^*F`isK%k=wBk<qxI$l|Dior4`wG-m{5?S?S# ztY10Flw$>c&6<ekBFtd{DJe{=U_CU1pg-JWnx|lqN$rW4JzCwqt=9mZcE6+j55!s| zNPkIdt-lKTDO-QWI+5{cc%=Gu3XkarC0|G%wuiKi!o$_QA0~DMh|B_q6|7M2Z@2ki z36>CKdyU5L2cK&75*hi6_c|!(Ua0E>7i)60(1)pOWHd>G6yogV;$`05r3K8KPX`*J zqHwIYVb^?aFI=r$-@{xFK6laQ=qk>TDHA>gxi9W&mKpec5jqj2_;a^~M0(lBMwTEI za4W4vN{=`d%g-c|7s_%s;*O2U8uDw;jDPKkW$j!dE7hIi-!QUZ;}gms#QD5)RUuXM zI@qY1^VMu!rU_#%5cODAAGaD&VqM;C9M4BlHkK)<?W9p;6BEs=OO3Lso_?YZPXCB~ z2Ju=|A_O~TiU5)kXJQlsCB4Aviz_=9lR%$6i-yVhh)5w?IcmznrL(4=Z@jZo5Z1Tw z;fY+Bwt6~&{(nJODe94VShuwV>nAQEnauXfuaqKGO5*U^qp!SpMJM;$FAsMX_(Sj- z`h}(S7j2}seAuSOWlgk9ma0yGk|=!2mc{|jTCtxxbZ9&Qy?dU3vii5D5L>T)-ob=} z)W|AJ^e!<~f>0FjT@Hy6AEmRJl=$+$XEU6bFbS_-!1t_o<0lo$Ub*`w_VbxgEaL8+ z=R0U&9DAZUaH!P``wUe92^TwXOkWDa$H!;AVep%b1OUeK#mZ*v#sI65Eph}K63L{m zfwoz8LXL9nN;YjHI<N`;YwK5^+x+UsK^CpCC7+8c-*L&6%pOnZw7(@Bdrh&1dZ|nd z225J{`~+4**h>%)=Cc?!00_)%kxI|U(6LXTn+Kox0F`liY&G!BJ@V@I7QlDdZhPjE zEzq;~P*U)Myty8K^CTN&dgjrVi&~gy9|@|vS_<gd3CvCmjVkdN$6-7$l2nV5lsk!^ zlUrBxqb`tH?)T=LWkXv*e7qH+NG7pfSTN%3f*>&^nZONS=SL%!`lmw9Rb6V_d^M3b z-k1z;>+pT!7}dJACbJCkMt%m^5IS5@))M`(^!>FSX=ixUW(<Z)SN}cwGkuK04?rvU zNrTRUaGO#qzAkC?UQ@Af6Qz2YgmftalpEjD2kIn>`38e>b3ah@`XF5GeDdv-e+h2? z;fNPSj#e7k@O?wR;z<?2*{YgaB~pMV#TA4xP3WbRRruJqM!P|W!;|o0kqkeTSeSy5 zl;6FFvfFkuVHo}F{2!oUK99bK9D~dl57eA0OsXIK2YCO~WZ%x1SBqq`T7cOA!lSV} zu1gfPR^Y!o1i2=%<NMV!_bKM8_-wD`jP$S#HuUV{(n+<_J{Xex%4o)wJ`r%;&>KT_ zf7eia2Wwkxxyhf*6z62=Z)i4r&=&U7rah@Da>&PyucagDaa$Hz&sN8BT<=?CKTxgF zz5mthg*J$f#wusjL+UuH+P&UbFXf}sVHi@ngn9Ngj)XQqN`~p%)UV}xegk$Rc$Z?s zLqIW8z~pfD+~e2MMQrM((TuSEA+=K?2_vS1+hV?>aiQ8|G}a-X`!a8Te)N{zX@5ys zwC+uAU)Db;=79ZLtiMp>xo{<W7N<1*jF$m<dd@j;4sC;0*<K3862y;H!qq77ep4*2 z{#bqp0?pz4!6Af^%561eI}fs`U)(wQD?s|-{@3s@;8qbBNZq3iCoXa@zmCH>dK%wu z=z5>Dz%XZY9UUl+LoP^ux>>kX<|Ff85c}0>P&SnWMQpXY_Pp7PD)XExnz3b~^Pt-4 zq*ro55IyoFlbxCC{fu&iU$F!>(qBbI_SapI!`E*upG8}pyoYdONZ#r>U|cL$B#U^v z{>)+(q>ppLVESW&F2}a)ND>ZAK5CFuxFu^ewB1&Isgx8s8=AV>0uCODBS<e!*_<mT zQEx`W^~`s916@PE&TQ#SA|yrUV_pmC=K$tiagjgQZI2yH<`E3-2`4<tWafrlIi^=Y z=k0H3!m&Z01XP!!G16_Ot1>n)Fm`^kStsKrzB$N|;z5_4&P5mn^7OlD;6HiVT~$7% z{`+i6(#2Ap@O*?pQyAv@v2I6KYNi+n(SWV+rk)|sVhw3DHzM!wKHX|MG*cx9?RQ|` zOCDUw$JzbNGeIqiG6=BLd$v87&cZhkqC$)jSAFm$sfuJ1za4*+ki_@|_Z_I#8;5q< zJQlFH`noE3umXwtb-t}WX@mNv`tyZY_sP6BsG;n>C3l8qFitYgD)8y}&)7Gx!sK6* z1Kic!u=P(jm#bl$KH$plMC*{>hjH6JHyTNat$U?OqG9W7GkPKJDFK0XotutbNW*vh z_H%Y2Xn2$DqMn+h*nA<(8cCJIOaW62#?BZoZkN2=86$h{#YJgE$il{ftveLg9PyO7 zhW==)E_@Hb_YR>ypu8ZMwARM=p+kt`#X%Pl=_KXqfyymIc=9osqeiHBFy!URVIPn< zD=dzjtX%`j$4<=`oWc!r7B{?|cx?y&qe}H}<7NjbqUDP|Bpa@ktS+UHxHjZmR`;u@ z)ch5Xau6-er8*>(<r>64Y?@bp&ixlLbxEp47;b;=P#^al@1wQ=CSwsBU0B$%zWX%P z?IvrI=r`718WhSvfh(^4a4R<v`+{AUanHGQ`8eJJGcq<A4Ftp{(Z$0Ts-twyh%`LN zg_ek80P(v7(L7Ynqu2AqD6CnTKMAuhkuyUs9C2%&1nlNE!iEp~f1$Z?><F&ZpM59? zvT}5DLzB4x+nXW#CH~!myBe)Q(CQl!Q`A1U4iiP$Lb2pF7t@UM<E-DP-HPw_3g(p+ z<og3oGa(Zf1<6!qoDv)BT8hgJ{_2qDT0UlL6nQj~K7mWaM=hoD?qn%q*H~A!_+tYE zM`))g&4#@&(p!r1vx3EgG|^Ue0!4o4ZHael3!$KL$-vUx$t|BlV@*q&X&^sCLinT8 zPIdzE_gj3-=yT|o-~izwHg4=#v#!dqp!|Un5C@%<3n1!fCQyL3LX2k2>Y&-kM#ju> z&ZpXKhjQZy(!6;IH;h_?mez}(`AUI7l)tPWfI(*6)GQ#f@Jwa!WlRrK))8ob^0Q=% z0d{Tc*vSimB58j6m+!x`T^hE?Ez`rpG5)A@b5oSvK-T_q2(@7ZfdK(Om<wk)px$Lh zH>Z;x0p#Mt^~N~_=L^zWuc+MzVOJi%Z?ChcQZCbfD8WT+L7y%9JBYJ04OpXrh~bP7 zrK72LXTHVA<Liix+fQlqbytR4Ou>YmiXe0a-;dS<#R6)RCByf_!^-eUN)r40MD}}` zC*59ZQIG}2XG7FNzQ=msdX>le1#P2V(}WiaVGtjzZPUkz<rW!n<=Upb9-8iSw^ZhN z4?16aun~mE=e&inCO_y7Nho~Qo^O(>-qFu6@NUzr?roc&`ej(uIIF3kBVQu2Uq;Om zg_rbt(^c16b2fP*S+`wkxlREj|IiXmuIb=)&+&HlV&r(hxq$$VyMY9r2Y~>bSKrF9 z-U&ZV)8pfZ4JT}i*Sy$bpwYDSWGt&t#Q1X~W&!-1LNIwJ?%?0#?xAZVLo=~GvX$J; z?_oiKVP6a&AkBze{<DV;E+JzbV-t<l@+|h7e~iL%bs)uCb)LV$Neb$9dB5483rV*Q zqjfgRFnz#54?;`nHDre{vqc7>-JuthgMq*uo`sNk2NIm$x*tf`_m4DRNTtw}bU1E6 z_toMzZl(TvGMZ~!^Hx(sPdtC30nlqjU5IjXB=g(%xan&!P%gfPeF`Oz_v<5`{|>sg zb!wlXnOs}JA)UI6JKKx%dQ~5hvNuM+FYiJiTyJr0rnIFEQ~4LBWu_n4!_;EHHj<Wr zIKHnF*bPrxmn(-T#T<>F)+3u@1L-ESIN}l3*^Z5FGRw{T*8@|rIg3Z}2i!xQ&5H)s zL(ym$w3gJ^idZPtvVmQ)AZ=~d#95lgmmmeprY!l>LwUz-`W9B~K~o=r8*9L9_-97- ze8vLd8p$xmd~5{5f*Nd*dE|vaN{S|75D2t-!fcJD*+iieC|54p8ZrDmvT3|fjR5|B zRyGA7S?oV4{6tktr1BU~>d`0+x4^7%ClY;fG1TB>gARlHy#cAVr`nH2oQh=qdO$$I zqoV_w=0{Oj_bBX1+d<>^Gm?d)bY3L^4EZ79fWV<kGSWjL$?Y2FXIvPtd|vzlz4lYJ zjDK!gU%nl$J_zV&nBjf6f!e~|(ac}H%FNgAcEgul8+sla{M3L0DvFc_gmoL$&m`jV zX6i`s@6g-jYPSFJN=r(SspkX#lS+{_2PG*d==hRD-X0$LcdB(&9azRiC_k;_jNm*5 zDBulF20(RR_O^0EbE@bgwd)j^!4zF`acmqU;+QYx89vJO6F-awk_2GL|HGeu$_);> zv+V<#{!A(=P+orbzoJT=gl;eyt&G^F7!p3IhQ^_xGY7M1Eq}c~dU=WC^twyE3j|ZK zX`C^1CLFrrOepqDfB&6!%5;@a@YOQi?0}IZrxVsQhXYncCnvTKC#1`EI{@Q#zHW|6 zWGy%!?I?&eLD^G#%c@4ZWnVp`B~tAIsd<|4>8&Fvz*z0AL~W@MUmEW%Y<+Za6I#8k zfPvvS>g!j<7SOKxXy;81V73Pb+QkRP_kQfhc!R!Kl!LH0iaz35S`T9-VXFJ`gT1Rb zQUlY@@9#3-z_XC0(vw_oo^Pd?fi+FtIc8_Rj<Gan22)I}K5?6O{(8gWLOIcIoVSaP zlocE<3SOg~%drt{&q;uqv41?PU(I$@4Tf;5`bisU%G2keJ%OdkF`6`!p8Q7F^v8gc zmkAOdv;qA!nmCyD<X)7i!{_%V)jHKVQoPnFt{p43Vozdvj$_N8*C=C<4x*fdHMoza zHB-Eo&QE9g9i|Uc!S&+?F@dD%un1mOcY>Y{l~uROxdYE6r_Wvz^jDH_rH#OE0;Q9= zHpK>s^1%eK?Ax(JD?$2<eX4V+J5=-1@s;N-jg1IR$DCtY+W-aLGg4eFve(8O*Wpwj z`SAe5er!$FjPYBsLXDsQ%w4|S2PgGewlxgQ(MSy!KfjEKbzlZA#S*uZlhxFj4gYS& zJk_w6dUXeqqnv6w;LEGu#~*;*a<2xyCMBLm#08??hqC@q9$X}#EM-4QOJRS`nC4|) zyN<VCuJ3K?nKsObZnS78!h9J%GB{-Q1z)90ixZoGs=;`4r+(<OG!2P*P4KvG<x-Vc z`{IbZi17n5jTXQxNJDa-(dLUGoADp6lPHZxO;()JW1wZ}b?mrsn>C2!W|YkJ)pza* z)<J!r0(Wfhd2O&`V|Z!(EExuOhFBL=Hut?!G4PJ$UWO5kK$4yjvz7fuylH0t=n0EF zCXhghO99+d_DC+9lKbvA%j+97IW+Z;;{=eo6H~-<8Qrb6@5Pb~3xS~riC<VG-a978 zLU~-hjM`b{Tzkhl-JkfcVH!uA1l=5wP6?<5OW)Cy^Mh@%i#-o%hFcDoXjfwOw(D_6 zqLeW8j8hV{-7B_F!Z?I@s-e4Oqd54Q$>8;p&RPHou&%&?0IC&Eo7m?dz3bUJ+xV>8 z^?bksgIazh3gKImbY!xFX`icR36s4=CuE9Y%_-n_#EPO%!n=(=4V6Gg!vJbwE8Mml zQvwQz(0kSj=8jSip2dc<2cm{CA6WSF-X7d|jE=phpiD?D!T!+{iPz<v#3+1_J6nbF z+Bk#{JNHO0?zjRPBOb?f?*nZ=JmEZkDd`rbjDANH0}hqb6Q``enpkBl2vp7<l)V*z zB>>=8&V3=k+4)kf%2g{#`nc95$XkS&_v7|P_dntT+ULN*e!x}zyE@I*Mb^U+W3BG< zA5iJ6>0OxRw}jbYr6Os(klW2^Zs^Rp(DE}R?jG#eG<>0vnfTkKLKskJ!7><`b&A#c zxNzxE+uM!<#3+ERYp&LCnT}eA-6$^4{c5+H9Wk?j%NTbu)}LL#BzfQ8YP9w#X@ufI z`g;$bJ-)kZ>~WbK#Sg?8PO$d?g+&gYEeX#d<;30{WD3A!@F%M-ZU5zv9B`!R!<<DY zar+A<5I*n@&gJKEjm48efz>6Lxsq!CwEjxnO0<@@OAeh$y5lSJa-O**sjA9)4|CiU z@$digHGN0jglH4)zVOc5Jx$!7?GPO@BfumXQ7m>iU<IgPQ;2Xt6qcHnQ4p(-uy{dv z5U}L1{QNKzbK5D`=*!te=Y(}4UJ<W?f42>I(-PX+BG-@ds7w#IFI?cE|J|`VFtIx} zXU{lrde%#YN&qAh$W~sGRQYQ>p<kk<!?bOBmX2KE?xl{aZg_``BSYwGqxYm_7<N5< z#SmU#)YOqzTZ~wYo5-@$>_KCo+CFY|ILhF?oFFypG)?~cluPG33H`s%NH+FE{K;~3 z0U{J?KeO7y3Qho%Cggr1zAl|r3B@8gVjJ+LI*}h^FE&LOCp;(6MM8a)t{v=u+sxiD zN%+#D(Buq{*eRZe{=*yC*$Sy5k&M#*#gg{M^()4fAeIaM6La!hymH%L9VWZByourZ zaj(Y};e!if@8lY{7TJ9k044RC2~^4%GuZ+o^j1Frh@{NS46B8PI=HzJ-wdFg%Ap0- zSbVX@(q%wvT9gpUkN2IEoqRG|V0pHaaD`wjIJURxuN!aX^o1hRJ25kF5_aVt1ZAcE z;Dkzp>IURS66huk`R@C1Fn(d;x(LyyA@y6X;NPe0;K$SdAjQVn^1UY-TXGr0ysYOm ziRiIhAo1jCTuWz7e#0tbzpReHdPTVImIO!Xc8Y7wloJ%UC17h9Y2MOqwh|5iAVW!` z$kB{kntxwe(>)R6B4a~e0O-g_?WWoK<)Sj?=c>8Dgo)zHU&6G?W*$~n1RuGs4lKOh z*B2N6flD2LLzA%xyreW}IXcNT%;AsNXI}$g<>c;>|KLDmd-~-3DDO@f3*+Um%v7N8 zeRHH?u}t%j-dmm+<qGXy*{IQfOj~wVxtsO3_91dobt1re&Q7@)5_t`Cs+gg2Gs*Kn z7t5_TmOAW;UD~&lSa$gGv>spUXX$er6Rf{RrD2_JZo+d^4&6`bGY!ZE>_yY#@S^aZ zEVMEVxa*J9d~BZ8trzlXMCXq^)GvM80=mq_>C&^8Q-(Yw^H;DKN-0uL&~n(6trK1k zksL;C#x{A!sCTn*bkk*vfAHy`BB@It$yv=eum3p8R;;-<m>p&k2$>2{^NHS)doDpb z{G8X<pW8YpfD*@s7Y{XgTVVrvmyUi8Tv?PMsZFGnGC0H)!}53GdNf{pXXVkU@?Y#L z6PkuIQnjn6&kC@ZAi@7lIA5HXnZl3`#^UGBY5x9k^B2r%*l?@L694t@-t-jC%j}no z#@$V)I2(Io4yMxerPe=K>uP!Ef@Q4sGwJKA5|`}SJbWmU2prm%zwjpLWmaOnyFqZi z80wF!F^qHmk#dde_rz#QnoueiXVudJyY?*WR1SkZVg5H!ZZ1ue#?UR)!MPr)C9fdQ z^$~lWu6$E$L7a7#G8(Y}kNDog75dB@;G`}amD1>YE8Y51Z?@bo>ovSv$~c4gA*9Pj zm?43U5IghlisJ@;(PzRPtABed%_YTGy>Mi;wfd|URGyoT|I`*s9>CQ`LZ<jUr5i}e z<BpxNaI=M0p!K$9wle#6bk6ui#3P0oWZ@StgZk}l(!qg!N7XYUx7yP`T_C__N4Utq zI)5qCKDQ+b-Pvd_Z=(hdWjiLEW(4t^^u)x(rVt$VsUzXBKS}WVj9yWEf7#`{VJH8U z@Ra0l6VGXiNEEBtQQgtqlMB`I63@%^KfEw`IPA+AR+rr`F4^>xkuL=phTnC+Qz{sw ziM>jQ2swZGoAZ6gt(;NCQ(&a8^L}dMKYJi%XzvCFd|q?RRJNdQ)_pNNzskWiksc3g z^%jhw{<W)fxZS-gN^+u;x6DGu9RkblzV!b{ovK;5@WxM|dVVIdUtQbYI8K#r;{@SK zGVnus^j&%)aAGg>+QKR&|KKdt+dei*@tRCihbfYk&=`$_NqL-}e0vKjd)3yoWOqJd zZA-$&suFu+?XXCVNdntQkkdei&E?=VmOb=tv1{ucm(e;OzNW~{%KTk>mfbT7yQxJ* z#<(JqAKb-EUr-U??Ij?^zk%ejH3+^(p~+K`>}&go%B;Tq!ouavfrcq9qp3=L=i&nK z^D}y3`hxTF*$kNMda~b=*BsDSNJ90dK+bk!)J>}~^_El5US7T=g9-ii3~K01Vr<wv zw-63NLH3r~s22ZliXWoX;+~ZIgC7FRko0O9nrc{~uv2S?oUIb`iZicDLiyr;G6f|8 zQ#WRO6r}VU$Qwo|Z0|_Qz##g%*&CWGCb-(8(CzV2@gl+26veh)!~tTy$K4Qr$wbRo zZjezVWJJ*bgpGciPTGK7UJ8gf5M_`ErtfA1%|;fei@PGfH}4<9CKt$Gey()zmsfDz zy%iEYZdB#*k>dukg2@y?pA|FvLKw#8Pi4x0tk^o;{nR5K;qEYCB%2qPc>jSxjo<~! z2BqY_1r*=EhqD#QS#GEX_mSC?hL!6q%58PWbSEBbS%O(o3$ByGMtt^xrtTo1s>HT9 zWzt}{XzK5<c;m=TmBHS<7ySCR)!W5RFUM92miLLi8O252$Y(O;Go*au9N05}A7=c( z+xo$?`&xo(b2WA9ZAyJSTpSs?=HJ}Xp`Mi7mda#M6baV2!78%J&n$GgB_&u7=s@!S z;1~Qyr5TkHl?qoy=-NKfTvc|_p<&-5sb2^fCwlj_ZQfKmEEa5>@DRFDVgHh$X&cvg zjW#ICV`i3pzi=;{)TT1((7O=8F|l2dZ%&f#oPg#Vi~H4FptV~1o{&cW@r*3RT6DBC z(#E^qPcUI`?&XdmV$vpUr>^JB7+VeZmuLYNfHV^wy#m^qTCz1x7>yTjM3WJ^=q6Ep z%pRZyciAnL=={$kEbjUAv-{|qrxulxxyy)#IK48loY9@&87?VF3~+6MNFJH9xn&T- zcf?$jjq(AXsRxJAVsTaCP~m;5dvLZ+*8{ZS&TZ@-@pg&W*?gcw-Ss1pksPnAo$!3_ z(=MCKTeY7iXa#L)n7fRb>Zn2fBvQ&ICe+-nZt`=<%$_;|H9#+a?wiB=$Te_{;Eb=M zZpbG}v%8gY?Z0@9CgGt%qq%TSo~U%B@HbHJ3>TGOlS7y;HWM~2XVc)Dl1tc)$Lv#C zrpRkhZ<3dVA9Qdpe5-1pSE(KD8G{F=2!jA+rLekS+IcsxsN1qTiI2O0TQLfyO=Vsp znN?oHiU12(&5}yWAqpR(;O`2H4@NtQuY^OJ?~Dh8KTnz01LDUXWRuiu{Z}Ou`prJ? zpBn`oK#zuPXAEC@02nxX)XVf%fHlF{11mcl`K=&@^vb=@7#)_v&g(K!r=MINvvA_P zeEhb&MfGXx$LF{rxJkE2-O-@b?k+#p%Onbjg78xIopRO@elj2TgxeJrxXhuOd(N|a zL@<NrW`qjUt>b~G$A;R*mE>U^`M-l1bBAA~5xODXB@mptrw9o9v;m0UIBM!fKhNzF zeS3!}5f}ZTMC?`_ReN&i6-;Q=Q)yLcjgH3iL>Y=$P~92Ry7D!!TRBSj_HGbT`S2ua zR5rVAt;7D@A8v^iaeCC|d(kXrYQCB?7=Gq4dqcF0XPE6knjWLtVN&VY??>3-ync5U z(3a~(d(vQf8?$}iGx?daYHr}t=J9jrJDC<XR**0eWhaRLZaZ4c&oV-Vw|APFoE^VD zhx0hYE(on&!NA}*&9_YR^94Go8bpM{qT{seexq$e^W&KV{(Xd#d+W`UR9x0q2+=AN zHFW3GoMF9GRt+YB@r&W~ElV8YyspA6R&<yq!h~;RIh|JJutpvE%uG2DapWqoCo1do zgG&ZlCdOeRy<V!l@@mV24NVWz|KQEU{@B5jF!v|R0G(jB__yHDcga&eFM-7q@h+mR zytHWZ{xFbh?`Fo!h?LFbHw1!Ty|Oa$4o#?v)U9H+;0TYWE?O}pM$y{&8bz@Aoj+<Z zn&^S8Mf-NiX^fJN6HHbZ@nZmHPMsnQ0DlfrMHn>C_9tRI2oM}^L7PT=V!Hx}0Ux(4 zZ@;7-H5?tA3%+w0Rt09qQ7{S7eg-qIlP3)D03BNO8BP4P`wsry?CxIM=7dj5w+8;b z+$f7k5ZI}0shWgqLRa|2Ow3+(e<IlQIE|o)-+0l_H+{z)_GxH-Z)d!b=BRQi?@%`O z+_R+a{@%g<=uQP2Gz&<Zv+JYmGayoBnxY={TXA30^X^ZI8FRA4`ke3@M^lKUZgDAG zr+}~vfqJ^jJ?p8dnEi^4c0<RetTMY!<)^of0i4%9M;4FH5A|i}f8?ucnUPh|ZC>8= z-giPfFw?62uTB$O_(5L+j<a$hx~~M0E@O(D`s=U?C8|aqU4u#*7bL@(26sZP|7$~C zaSS%jV(f^j$y0XxHDjP<0X3*5*v;GfTbRBrHc+}A0!HiTjVF8{VUz8ZBECaMV^tXX zw56oK;<_|@cv<!)t&+l$EHp(ch)8ZH+a3%@aFK8%m@nGTwXR+rOag)Qt#xs~jDek0 zj>ZiN%*h`9`94E(>Ts36BhAs1n^tL+-u8b4XQs<VFnq=UqNLnPj|a{i-fc7VH5_u) z@pSe40GSSZ1yU&U4*}lDA{*JeJ)D~G)Rej%r5rq7r40$T8xdNnVibt=%#}8KkE*BY zB+%K|^R9U4{eS4_5<7krsZ)kVG2*Wpo(o4PdAGmI88E;NN+nmK5)<cc4?Q%qGkf^m zH2Du7s%{;L_3UYzT8wW-`>lKQth*@#hx$3=5fPqV8}Nsi?{f!RK{0C1;<-sNk=@BE zm_eqozDL_Adp^FF!EL)V_}qX4{93jc9codB#zdhNIkjdvpjRvhK}xPDGRsCduHi_! zH<%$@0Y(0;<N6UHU+*z5_}pk*H7WIols1rV_?tQZou;67Z0H$n_<ECLAAA3`QraqY z>xFSlTz3Wq{Z8NhLG8)VX8!2AFJFVONZq*jahz>XqjvyUrE-+!l_4nn?dmr;i}aOs zm<x2pGpz6{_FrNgqa3PhmD$N}mfj)vMU@ezg<1^90{xgl3ISEL7g+`eb-FJ!8Djm^ z`>ST8rW`68)mVXdh2l44gNkbrw3ya`+Z)&JTVoEwEVsj(;#MrGr`a@^2U~c>=fD%a z3#sdL(Q4n~*FlNm6o3*k<`kQr8||V$HjTr^6pOKWdFHb%mhy0f02x5q>8HY(UY?>! zf`G)t0FP;PlTs3E5(b&^zUB^uyW){9`$Tf1adua&aTZ7Q_kuP)L9y!krlxEDr!&nr zB71VQ^)q>!1R~!Mg*L=;SSUT&<5~NwWhke2cW*K)dtVCS#TorBMcCU!aO`Z#_eWF) zd&5MUU=<J9x-H&+Kwz0r_&{?##t+y)--X(!VPy?QoQj3_grWVdK^YGJfoSyHl!gL~ zT^vV+LH#YSVWoY2R8pvP)2zMJZTk*=2TP90729NTjzB~Ro5WWHQxT`?R9RZMD0+!) zhrd_2EC~k*fAk>T&j|`MBEv1SOzyoO-M57l*MFu)WeQH7l-W2LC)Ic^&LE3#Za)|k z?{o<goOgcfxA_1Da=0oa^V0&9)L}o-rro@k#L1yF5~cKjC|R3;{h0y%#&ZfMwQe~_ zV>O1QH^={!xSV%(H+KxDufQGoPinQ-w;489N+Y^?EE35WpxPkwSfmre+dL#8I>SLU zz;3ucZTyM?GyC;hVYJ^zCeckR?8b?)ZQOA$5~Yv$5R?`_LruD`d)z(PSTW!V*<|!5 zA$V?S^kt9V*X}R=@zcM;=rCrvX<0#)B7$yo&STe!)IF>mQMd%##Rv5*Hg;oAZvHwg zzYAyOwcgKK0R9q&H|@^)XP#8BM;G&`ls&EyksjeNBRh66doUzk$&oV`GH!SEwM22U zgB*244-jvL<W%dW41!3zdYldM3>a1~UH*Qnh!lr&bFg}d?~5MntXS55v^yb8M8o^j zawH0H<cuy_Q%$ZcBonUSJPkHL`!eltok1ZndD>kb<=?6=l`FN1hM&Z9PbQTlLk4hb z-lC8FzP&P`QE7I?Zb&|CIVepZ6rq(&9pARDK)Jboo|Z*aP1{ISIwr)J(PrWM=ZI4C zKZ>mlZ3)#QU!tfj*uU(~82)k#z>+n16U|gOI+sFSyyX=UJ8wNrQk;dT94&$P2TRdy ztB+r7^XDyTc`|}VF$UEUGqL=HKP*K1Slp(Ix@V5oXJDZRlP}N@r`~)~e<d+lg<6R^ z7ADOGVX%)~&qmWsKiOY9tB{(`i>FhEZ#5xz)r09IVn$C3#4(tQRTFmgbYq^kjETSf z%d>zq1|_JBTAkDgi8&;y>a@Q&zv^}Vo~P+dqEE2e5O}O8_o|SICqwRqsQuEfy79y0 zTz%u~btdX*yT)r3gNCL7eaFSmm8$jL2Jg`{sXw3#7DM(k`(3N(NaG~aHZzWYEs`o? zvx(ji2~;uO@%&r9W)Sip{krYi5ohE}yz2SpCu1c^iG#@rPhIDV&CD#~5Phh%?W@a! zCtgSSky9YO-^X8l^#_7qGda*e_SpX-HX<L>VR6Kr*u{3-a|6?M@F(sdEf<0l;tlr) z4|^=oMo2w4b?MTmhF)~KW+%xla}{%Sh9w#=UHz^4ePq-JuOUt{7I7`Hwk(uTLEri- zqK}_KjIWIP!cDB-qv27$G7tqta?~LUUY8lyX6X>GWPnezuLQyuIL<33+`;x6j*GpV zw3e*K@uqUp)sX&!joUdPbVb02{9XP?I+a$x$lj)RxmjNJWh{Ecu$q)62a%I}wh8Wx z%`o0HN;q;*2^^OBCIfpaV21XlJs8o#;+A>rM1lwcr=I#?V~{0>vI(38zhZl=ysKQ< zwex`dey2Q?lA_+J<vK4@p=S3Y7c=rUA}*T+dqexi@iHU(6izD=%)xk{^?lYHonsUj z<)9)|TmU|v<vdE2S*B=df9b4cPqOotgN*z92;Rj3goZ~dg6beG4*q}lw|4L1<dKJb zP9(U*K@+uE99egE%Ia_#jEKZ@65510HJQ(UuC60N_GU{K>WO$6vZZ{*q+H;U?6Lk= zJgrnoGWY_t#dTW+b?1n35kJeurL+JsUMx9kpk&QEOg7r#rK3m54TnF0m3fGn+%N<p z!TJk>{Io%$TJsgV?K3q!=s_sHjMwb3Ji_5J-FbpqLAiEUL|xx0AwB2s6t^A=cV1lY zwt2UUNF{4v%dtiK-!2ADvJ?jrBg{|_CnIbfjy(GK3q&@C-IA(AqjBrHdTnNnN6ocI zg4Or8eay&CRoAV-h~)?}$oncqmE;W3c&z_5bJh(_xNjGyCFBdE8AyyqQY1teHA)fb zZjf%!(T&1jbV^DH(kad8PLUWfq>&y-5BTxCi|79DegoHi?(3Y-dE|})Gqvm*uo}eV z$N_0Hf0_F2*OwUC%NcK-egh*zSD&-*Yc0eGe+~2nw@b9vc+#T2bQfK2FN_#DK{P|{ zbB086ScaY)+9^AU|DjudmUrqQb)@s#>CQwE)inTiQQQhsj+cAsDqR62h#5y2kr3sT z<zKKTedkFmw5X-iO+qBSCABRt9Jz>d9w8ulFRs2oO9{;&PuvbyKO6T$=mobRl>v!s zSJ(RW4CbP_I|sZtD%X~i{F*I#@g!~A_CG2<glsySuh3zG`g{?FuNA+nF|s65SZ#js zSd9G-Byae%d}D@|Rxh5&Yhg91eyjqUh=@OLYvUHKxQtyoyflu5a-W?b2XJDFR+p^8 z92fn!>5K}op2^-==N6i7)q?M+1#RrwRomfQlb6dGr1_lrhC9khnkqqlIiNzq!6bJ1 z9_+2PO5%ak%}IMQ*E$ZxI6feXLzs<~0=CVpb$ofByc&vpcdLK=?!)do*Z8*Zxd_Nu z`+H(pp)I^MK517tH9&TRVZoPyi$P&WHT#%HWkFw#6Eq}qIh)xCJ(v(YQx{z1!O_Bo z@pMtV08%OXHfQN7=;rCyacttq*A4WQ7=DGYuN&7uE^hHI))nez9l=2*=e=CIZ=R8Y zO{BTn(QPH@0SbX9hxH*cxE@&dt7zEk)V+N>2kAFf_!@N93NkLsHM4{?;XTzdDcNGJ z*0P=;d(wRHFaqod<8E&=p7fhd>gbziSA&c3>EV%Bq4PeXugo+ltwTr7M_#GTf4R=T z3q=_Gx{ou=o6}>(rP;NvDzN`0S&r{2$nk;vw)v-5R{v~$KZege!RQgCS@;qaoBIX- zRaT~3AR1mUPx%fzY;Hf+5N{gfC`W-TsrcS;ykL0x^-nlb3x6Oll6Aw&W>EOHyeG^$ z4Ugtu>C6pFiMgv-lnkfw7ig49)Zj;??=IUv?W*)2{UyDfT|bbsB2Qk9%})4sH*r2q z#Fh@>u=?ZbeJ--n%!DVPpNXoPu0hL$8`#=3G>0mF*y5-}Jr(v+a(fEyxyP*`rvSQ0 zh<xftdPrX7kL9Csa2A=RIr(lA<ZwrL<A1L!q76I3FN%D^a`7s@Habme-PSJtm^qAy zT%Q#4#^M)R;M(w6yvvfsv5WU`wo;FvW3Ca?JR2DqEuMZ#&1w&RO&1A&|CyLP^V}o# z18;`+SLSgN`sZruuwIAR*sw*$LY3*#yI-ubR>Hm&7F0Ek%ivq0Cc~;X{bU2TaODMK zDd{-BGU`>2y%bLa?g=0vB>~<A%-Ce&b~Wf)FQZ6%lM0KNxYGhxRs~WwI=Al`eLr0g z+;H+?|6*r~5Mu7@lf|_$5u-5sDY4nOj|;{?tF~yjML(m<lsGq#pY3*Y6OB7*#x{;( z4<nRcmuA5tzGs&ceK-=WYP@k*9Wm#}^$)<G0|tmUX7o4DV-~FWkVaSEBnpK{fL;ra zv+#a2_Q(&<8E{D1zhSWqW>$DXn$~AKIuttz@Qk=o4XL6|if1G2m1Yf{1A1)Cg5iI3 z#aHkCHGnlXvxx($?udsky6$;}MGk`{*t;*Oj$D4^1^!xvZ(oRgO4Q$qo%p@f+^^i9 zY~g)Ro5eOH++jx*y`_j`7<PTV50+W8qgK+~td<Pu9Chl=T5A$;5^!du;z`HtRIgic zfPu1aeaV<LT$hIxXaTw8<J_LX2*Wt@YsL9iao8l4cz6ECdxcLs7Dv4r7Xw41xhXzP zqVc*qCA`tTI<n2uLSUCjn-<;f%c`LAc)omGS(2#lf1HWGyQ|}s8zKVbv=7f!0H-s8 z%7%8l=}WQ$)#@rof^7dVnA=5yyX_dfI)s=d-85>KF0Y&2BVgf2|CylUf7?`=L2c4> zzG5jkstJRu*R5*<3m~JK;ocQd8S3EXLkNow(%EOFVpc#R!1$J)e6nUx^v5#4U$x%I zzwooFwZfLi)U@8V8uYPE1=uS{jgVQU7_V}&>ktA=OPX_CrF77RH((~9Kv7P5B9KM2 zWsnYI065v8k?vC9YlG&dB0W!!-NCrg4y1b@Tp-pba^aK#WvH$o+#y$_Vi?~s3q-tT zw1U}tfBY06J_%hj<&2HL^1=q?dt5H%mcJZSW*c+Pq$fS0WVlRptIs2=c4~}K+Mk?P zJ6axCkz|DhkO%iakHwlC`aA2;boecPbVqC=%(7inW%~4Qu_#!Wd6`jxns`G5;~HGV zx%zXpS#&s4afn#D-s2z5f9;G=qjda^eYBXqpl3VYi>3nAlKZmt!`j}R6BuW8>YKUN z8E%k2)1V>w20saasbpmv=^@uLsca|q-y$c4;>*85GX|(!##d?M1ggzCQfXXXrecm_ z2PP6brP3yk{R@dZW=+fJY-y$KGsx>+5fiX$N6>QpQ{i7bP9HffNo65}8&`Yn0viO& zUj6u*St-O}!<XI%=kn-x&WU&(a0a&94vT24jiUK>`xE%Xp%#@yC0r=&gvf)+9dW1E z;Y7YhAL_qh1-p=-vWxwbOzCg?6X$CPi+QAFweS61`eb=E@(Vr)Z_4pT`k8;d%u*sD zG2lg=a0#j|#X7?Gq0F$Y;mk)<eG5`)Wl5D7@dFbjuPNz*FeIgw0M{G7?G^v@Uu$y5 zTOssE9j%aiW)FE;tOzOryN<<c#oaS@%K$nK4pmUb3qT0Uk+l98S^aBova*dd8U%`M z{3S4@+z7U9Ll+xQbw02YvzgOzeY0>Tk0d0*;>kKk!7>gVnASxM`beGJ*n{sZ0^3A6 z)g!HCp3_FkL$G8avN3{CU!z{bgjYlQh5?>rfI8?QepIrXZ;GBE`;!r#r>a8Jz^-DC zPZDEK^v_2TgZ3YpA8F%A221!?DcNp}%iC5n0@gepCZ;EDV(oEt*0yi{s(6QX3xVX~ z@kh0CliUAU$|b1MWF*T#!wz!D2|*Kxt<cA^2<OJ1oE?amnegFfKYIPZ2R{X=mzgs@ zK%ophI7ANN9AWaM)1)ZWz!9FH3r6qU$t`V3U7t6|{cq`e%3d)89GWgrsbSLv2=$a? zoTpGCjy_t&I=ayUU~$hcj&wS_KWIj|rv4h;3XsfHQ|i5+Ejj8Ujx$z}mnn<EezdC- z8iVWtfA13by1Q;n7d&h`)e9RGF#tfU?6PnQ)U-l)+c_z*<JCH0r*lK5W`YVM13MqK z(g_Cz)@XNAN;@)#K#Dp3bBEbw*^2$|{qxCZwfi3rW?q1(*0g!>P{pqcS4TsQaKo=# z;Li~lzxwCutbj-|)9SIyA3oiIj7<i-3qD&Q3~KD!cj}wvKN$v$ifrQN)f3Lx#o)?) z*Cwx7*CwO!o1N;~?2OyP#K)z0AIQ;$sui(vZ5!THY8wCR>>yTk-2WI;w8EqHcQmqH z!7}(??@-sz6nC;VhZ6J~<pAh`U`ZMmCAqpj14X6Ms+UPD;uy{TP;$~?IsD20AA!1e znLF3Ozx#`z!5}o|X8?nTVEawct*dP<OG<(~?^LV@X2t?QvFan%8YCK$%`Pr1(;+iz z#0jnVEFTC{GC#N&x=EoVDMZ8G2KdJeUrEOs?hA&SaM+2dZ%nieZ)S))_z6aAS+}nb z)$mYX#!1)Q4Ll0WhE@?ORc2*1`N!$AScSL@z1|^VOSk%KIYe>8sFEy0E7MbPS!GPW zSIK4*An*7$Fy@gA-ru<KfeP-%uv(pA-gs&zUhY@>T%devKiM4i%1sm1UI>`QRU!Uz z-g2P>Eh!T<jtCjCv9o?>Bvbk3=dT7mf(vh6u@7*u>u}%8y~2Q&P$f<vc|h{IHr6nI zq3SJs)3qT&3dy!O*xCwtONUx?1CAnO?aDBVhJ=K2g)JXw*yYVij>2hB+w5Qp)?DOO z{#|#gW!=aeQo8PP-%hBUQP0hpX6{af4a<rDUMGM}fVlVYieX+Q;Pc!`lstu!PCg*{ zDp#?vMm6;rbdQ;F-JZ}>EqCdvZuLeeuC!;QkyfhP4hw`&KWUaaS>j;5kT00{eyW!t z78JH(sWpz>7GfLRxrhUZL@mDr{-+p$_X;i}Sz`amZjjGC<b5p-m@m=wDQ?F^Z2sl* zE5?w3XN<~~H^$*`B?ceKwj9NX1p6j|5zFV`d}P+M7nPdqPx%YxVktl{@<ER&r$FzB zdL!mx%~KQfmNIPqem{0u5}%#LN{Y+trqq>SyorV^DEFn5dRi@!J^$wE`N`{}+Tge& z$ky{p(ZMzF2Wvhro=$RD^dR%I_QpZzB|Tom$?`xOJigi`)2^!|XO4DujCY87`)pzf z_ibx3zD&jPh5x6l$~jrh1bwJW0K}=twKu!z^Y#4^SRHQ3N>K~yVb+V8t18)N3z@<E z3vzIpJ;%3`+0canrx7CHNXAeSMtIdKgJ!b|i{-WrnQSvZdwc<R+jZ{XR{9JRpPFBJ ztgRftGA#_Efp^-K7mavt*U2Uik&EXy<<B=Yaj(<djBxf2ZQf0NO>F`h{eVED)XM*A zc71rW#rqU4_(|v5&!pwN35~xdsZQ3$PGbWB0eG3mu$MhgJcJd+2ci~$kBR1rkHccJ zZr|P}Oenmf)WpMk87SE6`tSQ2J%J`{Wq^Nw`hIT(knsG!^ZS4n%F!SCv7=uiGV#xJ zt2mkUwO`&0P^@j78=9fnb4;~-wA+Aq#nEg;r-pZ}gaGU^DAXq_M>9Z8PyLj;b;Y&m zYk`!p_kFp~%uv<fTb@7v9C*i~O4BmYnODkSD~k#?HFW5VJ9C%new|0R2o@_B4_G-P zF$#&-nfdqGBsfDMx4M9v7k?hI=c?~g{n*W+g8fRqri5OD!A7cMt05OEc=O*|PI<QY zB(97Qptw`|vp-|eLv_NQL4)6vWRtgV!cR9naUY+sA`<Qq-89n&ee`zOcxo6W6?-gM zRPb+)h0cmtoM@rIIb;S)tP!nxHN8B<Mr**%ozV$Sx35bRYkbV*d)N)a!Kq~BZ8nWB zm$?5Kx>DgnXNU)9H|YBO?%LKp2VM<KufU~o43Fq}FUc@%CFE#EXCO&QU5plcrM(<7 z9WjPvH9I$A{-~?g1We@S)mUxFxUORXcTDyOQOzBBd<Jpd57hQH_-m#wT9i+Hlj1#^ zL4OdkH<L<s?(|pm$g#)kGp+l1RCuE0cFqaxCh05+;<#FRW;@8vCv>o{I{n=B6G6qu zc_d}S-iGrNS#_ok$&f}zl$%LF%b<Pz3(lZgPmw5<Fh!3_V263{w&2QRV4fPkkQatH zBuNe9CO)<%#R79F)X!IR|MC=dG+$WDpu>9WKk%e|J^eEJDlo(4JN{&XHY<O`B@ds> z30<Srv`qE^i<hh3xJzKn_8)?}r~+=WFEg`^5%x)q<5XBa<u@5OvwXFLD*l^;|DN)z z$xJ`!ALC<>#C)frkOvXDL<!wCHy5Kai_w1ItGGiR+UdOseE}GiDkDQVc4Pv_Phcpc zsgc3d?gTRICl#^G?jiO2@618rXPK2d9pBRkqlZ63p<#Op=B9C8{JQ~X-^`CEgT1IA zi7X5dB`9nI$d9AeN^A6{ys4e`_t)Jo>+V_@ZSgPSts+l$Ow}MjxtNuRZyX&5!S<Vt zesYx*n2*HuTCS=oJiY#)7@Q*d$VQGQGpJ&c!wZ#S173l?_w##M(<Md_V0iy^N`erT zZEWI}Kwrn_W2w_E=oFA|J`R%pI#~tqEg}EI+yK7NVUvJp>i*v~GueIa6uax@bC~(W z>=5XPBq<_OQ=>;n4UVb<0BDk{xKa`K#cfI3ZLw1hhfM{A_Q^07HddT5KeLmV-3hmD z2e`mGGfadl+x7GKqzkFH9S<=mEI-OJe9e?@aIvpVCqj;yEQWXg2H)>2z`Co?*&q+t zXZQigEo=8EO=eaoLOCfQ;T$FYC)o_Yo$|aTV?-SvPDvEJrlLSYW5Q|7iV{_yMiJ^A z(sA}XP;E^Wb$=IQ(m$tC8MI-+>lLZd8YG8X9=7=$u_g~Q^F{APG&)^*h~d+~%h>ld zqg$8Rm#4<|q_moS#p_{eVWpX`NQU@lJ%d^zZ><wjRQ8j(1}J|hdPDCfkI|F!RXW){ z8dsPg(dE|%x*vwki$$8sF@tzDUr_1|Bd^}ZD+<yI%!&eJnmjlk3mJEsux>+f;e1gM zodo;zl2=E)X^4q)`%J?~uIP-!=@1@#{pod)z{{ZEmn^@wGvOjcJq5<M0X-7anevox zsS?5LSFzG%-Lt{e=HG;gUwnwK^=&Wi6JpzPFK>?w-fIwLv$BQ+EjGW?P#JGC=gG>e zI$dE^f<-mOzQ^9TFyOi80OlC})XB8+<@2%<BBa{f_;lw5BTI)7emw0P;Ae^c8oW4g zSN6vT(YcDF8BzPH-h*&J_j*zPQRt*<t22-1W&$W}8k{rS&MYv<U-#bylN5TtW3CiD z>WXa5HB06)nU2Z6h7ca3pE9VGT@+Mn9CJVbd;AGge}go!7`o7U@4(Vl-$X~#RZ6WD zdSs~V00q?xg>IHhOc25-`Aw0253|GiphK+&)8=>$ry}iS8LXOduaDV5_q2YZWb!dz zH*|XPU~GW0=~>z(YnqTaEVJeG+%8Y#L-qP|lJi4T1Kz5{j&)y_|56H0w~>o>>3DML zVFXRJQ<MzQ(oRXIauFQRZ?%X?RV?0qgnWm{iouSG6WeZWs25c?EhpW)(H#p}#7kx? zw+*rc@^(pqKXshc^49;Ji!mJ&Jm?0n#!jY?;>#A&3FI2QqLmOo6zg0U#5)Tt%R@@M zkPJ23FE44vm8WEo6!%Pf$#k!ePW9W$`4|Cw+aF5Ls;|-dPta%W=p}IhY1ZSHO69+F z^G@MMO=p>GfVbw=fBd{3Asa|1O9x6&vei!DetL?Wm#p#+jTw2-;>Ez#bXB+Bs1*EN zBPt;el|Hd6*3`Slz2!7tK+lQewx#CbSZ6Wk6yT6EyNZA9;w<5-kxf$5HH~RSlLWpn zc8}Ubq^n#H@bxI2mmeIw6{{jsezu9Hg5P~-*>Pn>rfj{-t}`^04a=9~wA$>;&uVl+ zyns43>9^o+nIu&<PUw8*MOF>!;;!jC2h_BiyNJ+|vp_U+kN-Op^!wxIl=0*TJQFT; zP)=DuhkL+TX}<U*7qtcRED6KvQ^g|mlwvGDLsx6;#~xU=Nebl5gch=_@Do&4bNW#l z*}~|b)+Gq@sYJcr{H-4J!@eEKuiUXRFepWm?YU`^R(Z^|>XCg>tzB*!AMTQS+vaxK zM(*H!zGc*sl{!98R4>PA$u4h+<j8JS-Jpe%a`Mi+=G2<dWGdDDc{Kn<-hs|9+-n!N zoAx?uvYd~OxiJ)#(@9fB!vjlKy($36cE(|m=50T2=h{nhLT7bf@?qzNHb>pCVC2YB zZzjz3nCy#%<ZjT4?$7U|CUZOo3oI1EiTVNQjIv7O=B929ZFk-7FEYn$lRePdVr3KI zf*Vj}F5ZIcQt0{fo(4NAEIR^qU;1z4i8Ly3y}|)E1Dm<5%5wE;{}o3aLu9oUhO@f5 zdTHGJ*Op&qc;nYhQom9x4)u36n0Njh=Z{2@v(DU|@zH!~Dn_gH5Jxyl^l9<Bnk-(F z&+kQo@Ksvx=N%967+$AJrX)oO<zVdrATfbYxWpn&ykmsy!QX_G+9+c4_iMaTqUZz( zZGw`HJ>Kx(I3qipb!ug-uH?N4+w{tuEWMU985OthR>2PaOymKB8A=d!k$y*$6;m|X zuN}DDiCA2Sp7A?-VYt3niDo0~4cQB|jo$}T1z3*1nQXF{ya+$*mR};2eRX&n!e36y z+MM^w3W$Y_=r++|!c*#j3MEHPPvDRgB|zfbQsqSWn9f<+y<(LTRpegHtQoqkjk`z7 zy^<THr%m~w2sEXIXnt3R?YEs2NoaXXT-=vmJ#lzn5GC{r3uqxI-x|U_62Jcj9h@|0 z|F_^pK=>Rm(HdSHsa!5qZiMro3JfB!c+^K&A1m&f_odp~eo#G#JCKUM*#fXWZeky) zw4zVRWz)CJ#o{s%5SxlQ*)br-zA8Yv>`3TJxdm8RuRzB`DrW99E~&qE=qKJ;mQ){{ zVhjD*i6Ao#(plV|t727~Id5)-oURrl5iR<}IJDLEEH#E-BmcG&uRjPh8kN76_k^?n zlnvWS+{H?_5AH@EZ8Nz3+b8bqMrA!yTz79yf^+ns#QAk8BlMl~hmY4>qr%soqu$Td zlvnl)FvgEAAlc4ier9C2leE$A_U5L{aLZ=($?AcI=x1G>|L@17>j78G-~W}ByI}VJ P6%MN^sza*eEyDf>2<VCJ literal 0 HcmV?d00001 diff --git a/src/assets/cursor_logo.png b/src/assets/cursor_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f449fdc93ed4abf1d9234d3bfd5d5b3d3f9078 GIT binary patch literal 33685 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 bk3etk{dzd$7uEu>9B7ICO1o?uUiAL}5xs<y literal 0 HcmV?d00001 diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..72de40905355c9af43185647a3aa058db521f795 GIT binary patch literal 3714 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 B5O@Fp literal 0 HcmV?d00001 diff --git a/src/assets/icon.svg b/src/assets/icon.svg new file mode 100644 index 0000000..4528a28 --- /dev/null +++ b/src/assets/icon.svg @@ -0,0 +1 @@ +<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg" class="drop-shadow-lg"><defs><linearGradient id="yellowOrange" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#FFE066"></stop><stop offset="50%" stop-color="#FFB347"></stop><stop offset="100%" stop-color="#FF8C42"></stop></linearGradient><linearGradient id="pinkCoral" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#FFB3E6"></stop><stop offset="50%" stop-color="#FF6B9D"></stop><stop offset="100%" stop-color="#E91E63"></stop></linearGradient><linearGradient id="bluePurple" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#87CEEB"></stop><stop offset="50%" stop-color="#9C27B0"></stop><stop offset="100%" stop-color="#1976D2"></stop></linearGradient></defs><rect x="45" y="13" width="70" height="52" rx="13" ry="13" fill="url(#yellowOrange)"></rect><rect x="26" y="32" width="70" height="52" rx="13" ry="13" fill="url(#pinkCoral)"></rect><rect x="6" y="51" width="70" height="52" rx="13" ry="13" fill="url(#bluePurple)"></rect></svg> \ No newline at end of file diff --git a/src/assets/lovable_logo.png b/src/assets/lovable_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca16cbe75d9b2abcca446453e904a5e8c3b2cd0 GIT binary patch literal 54872 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±DowIB@-b=3d?QZmmj~ubz%**|9 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%0D~t1S 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 literal 0 HcmV?d00001 diff --git a/src/assets/windsurf_logo.png b/src/assets/windsurf_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5f06a4967d0c95629498be4ab9f03a1dbb54657e GIT binary patch literal 114966 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 literal 0 HcmV?d00001 diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..4c67fa8 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,1888 @@ +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +import * as vscode from 'vscode'; +import { CustomAgentService } from './services/customAgentService'; +import { ChatSidebarProvider } from './providers/chatSidebarProvider'; +import { Logger, LogLevel } from './services/logger'; +import * as path from 'path'; + +// This method is called when your extension is activated +// Your extension is activated the very first time the command is executed + +// Function to save uploaded images to moodboard directory +async function saveImageToMoodboard(data: { + fileName: string; + originalName: string; + base64Data: string; + mimeType: string; + size: number; +}, sidebarProvider: ChatSidebarProvider) { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + Logger.error('No workspace folder found for saving image'); + return; + } + + try { + // Create .superdesign/moodboard directory if it doesn't exist + const moodboardDir = vscode.Uri.joinPath(workspaceFolder.uri, '.superdesign', 'moodboard'); + + try { + await vscode.workspace.fs.stat(moodboardDir); + } catch { + // Directory doesn't exist, create it + await vscode.workspace.fs.createDirectory(moodboardDir); + Logger.info('Created .superdesign/moodboard directory'); + } + + // Convert base64 to buffer and save file + const base64Content = data.base64Data.split(',')[1]; // Remove data:image/jpeg;base64, prefix + const buffer = Buffer.from(base64Content, 'base64'); + const filePath = vscode.Uri.joinPath(moodboardDir, data.fileName); + + await vscode.workspace.fs.writeFile(filePath, buffer); + + Logger.info(`Image saved to moodboard: ${data.fileName} (${(data.size / 1024).toFixed(1)} KB)`); + + // Send back the full absolute path to the webview + sidebarProvider.sendMessage({ + command: 'imageSavedToMoodboard', + data: { + fileName: data.fileName, + originalName: data.originalName, + fullPath: filePath.fsPath + } + }); + + } catch (error) { + Logger.error(`Error saving image to moodboard: ${error}`); + vscode.window.showErrorMessage(`Failed to save image: ${error}`); + + // Send error back to webview + sidebarProvider.sendMessage({ + command: 'imageSaveError', + data: { + fileName: data.fileName, + originalName: data.originalName, + error: error instanceof Error ? error.message : String(error) + } + }); + } +} + +// Function to convert image files to base64 for AI SDK +async function getBase64Image(filePath: string, sidebarProvider: ChatSidebarProvider) { + try { + // Read the image file + const fileUri = vscode.Uri.file(filePath); + const fileData = await vscode.workspace.fs.readFile(fileUri); + + // Determine MIME type from file extension + const extension = filePath.toLowerCase().split('.').pop(); + let mimeType: string; + switch (extension) { + case 'jpg': + case 'jpeg': + mimeType = 'image/jpeg'; + break; + case 'png': + mimeType = 'image/png'; + break; + case 'gif': + mimeType = 'image/gif'; + break; + case 'webp': + mimeType = 'image/webp'; + break; + case 'bmp': + mimeType = 'image/bmp'; + break; + default: + mimeType = 'image/png'; // Default fallback + } + + // Convert to base64 + const base64Content = Buffer.from(fileData).toString('base64'); + const base64DataUri = `data:${mimeType};base64,${base64Content}`; + + console.log(`Converted image to base64: ${filePath} (${(fileData.length / 1024).toFixed(1)} KB)`); + + // Send back the base64 data to webview + sidebarProvider.sendMessage({ + command: 'base64ImageResponse', + filePath: filePath, + base64Data: base64DataUri, + mimeType: mimeType, + size: fileData.length + }); + + } catch (error) { + console.error('Error converting image to base64:', error); + + // Send error back to webview + sidebarProvider.sendMessage({ + command: 'base64ImageResponse', + filePath: filePath, + error: error instanceof Error ? error.message : String(error) + }); + } +} + +// Function to read CSS file content for theme preview +async function getCssFileContent(filePath: string, sidebarProvider: ChatSidebarProvider) { + try { + // Handle relative paths - resolve them to workspace root + let resolvedPath = filePath; + + if (!path.isAbsolute(filePath)) { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + throw new Error('No workspace folder found'); + } + + // If path doesn't start with .superdesign, add it + if (!filePath.startsWith('.superdesign/') && filePath.startsWith('design_iterations/')) { + resolvedPath = `.superdesign/${filePath}`; + } + + resolvedPath = path.join(workspaceFolder.uri.fsPath, resolvedPath); + } + + // Read the CSS file + const fileUri = vscode.Uri.file(resolvedPath); + const fileData = await vscode.workspace.fs.readFile(fileUri); + + // Convert to string + const cssContent = Buffer.from(fileData).toString('utf8'); + + console.log(`Read CSS file: ${resolvedPath} (${(fileData.length / 1024).toFixed(1)} KB)`); + + // Send back the CSS content to webview + sidebarProvider.sendMessage({ + command: 'cssFileContentResponse', + filePath: filePath, + content: cssContent, + size: fileData.length + }); + + } catch (error) { + console.error('Error reading CSS file:', error); + + // Send error back to webview + sidebarProvider.sendMessage({ + command: 'cssFileContentResponse', + filePath: filePath, + error: error instanceof Error ? error.message : String(error) + }); + } +} + +// Function to submit email to Supabase API +async function submitEmailToSupabase(email: string, sidebarProvider: ChatSidebarProvider) { + try { + const https = require('https'); + const postData = JSON.stringify({ email }); + + const options = { + hostname: 'uqofryalyuvdvlbbutvi.supabase.co', + port: 443, + path: '/rest/v1/forms', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVxb2ZyeWFseXV2ZHZsYmJ1dHZpIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTA3NDUxMTUsImV4cCI6MjA2NjMyMTExNX0.xyIw5nMK_ltpU64Z95E5xsnl8Uw3P0Y0UZaJKiX65MI', + 'Content-Length': Buffer.byteLength(postData) + } + }; + + const req = https.request(options, (res: any) => { + let data = ''; + + res.on('data', (chunk: string) => { + data += chunk; + }); + + res.on('end', () => { + if (res.statusCode >= 200 && res.statusCode < 300) { + Logger.info(`Email submitted successfully: ${email}`); + sidebarProvider.sendMessage({ + command: 'emailSubmitSuccess', + email: email + }); + } else { + Logger.error(`Email submission failed: ${res.statusCode} ${data}`); + sidebarProvider.sendMessage({ + command: 'emailSubmitError', + error: 'Failed to submit email. Please try again.' + }); + } + }); + }); + + req.on('error', (error: any) => { + Logger.error(`Email submission request error: ${error}`); + sidebarProvider.sendMessage({ + command: 'emailSubmitError', + error: 'Failed to submit email. Please try again.' + }); + }); + + req.write(postData); + req.end(); + + } catch (error) { + Logger.error(`Email submission error: ${error}`); + sidebarProvider.sendMessage({ + command: 'emailSubmitError', + error: 'Failed to submit email. Please try again.' + }); + } +} + +// Function to initialize Superdesign project structure +async function initializeSuperdesignProject() { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + vscode.window.showErrorMessage('No workspace folder found. Please open a workspace first.'); + return; + } + + const workspaceRoot = workspaceFolder.uri; + const superdesignFolder = vscode.Uri.joinPath(workspaceRoot, '.superdesign'); + + // Detect OS for correct keyboard shortcut + const isWindows = process.platform === 'win32'; + const shortcut = isWindows ? 'Ctrl+Shift+P' : 'Command+Shift+P'; + + const designRuleContent = `When asked to design UI & frontend interface +When asked to design UI & frontend interface +# Role +You are superdesign, a senior frontend designer integrated into VS Code as part of the Super Design extension. +Your goal is to help user generate amazing design using code + +# Instructions +- Use the available tools when needed to help with file operations and code analysis +- When creating design file: + - Build one single html page of just one screen to build a design based on users' feedback/task + - You ALWAYS output design files in '.superdesign/design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file + - If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +- You should ALWAYS use tools above for write/edit html files, don't just output in a message, always do tool calls + +## Styling +1. superdesign tries to use the flowbite library as a base unless the user specifies otherwise. +2. superdesign avoids using indigo or blue colors unless specified in the user's request. +3. superdesign MUST generate responsive designs. +4. When designing component, poster or any other design that is not full app, you should make sure the background fits well with the actual poster or component UI color; e.g. if component is light then background should be dark, vice versa. +5. Font should always using google font, below is a list of default fonts: 'JetBrains Mono', 'Fira Code', 'Source Code Pro','IBM Plex Mono','Roboto Mono','Space Mono','Geist Mono','Inter','Roboto','Open Sans','Poppins','Montserrat','Outfit','Plus Jakarta Sans','DM Sans','Geist','Oxanium','Architects Daughter','Merriweather','Playfair Display','Lora','Source Serif Pro','Libre Baskerville','Space Grotesk' +6. When creating CSS, make sure you include !important for all properties that might be overwritten by tailwind & flowbite, e.g. h1, body, etc. +7. Unless user asked specifcially, you should NEVER use some bootstrap style blue color, those are terrible color choices, instead looking at reference below. +8. Example theme patterns: +Ney-brutalism style that feels like 90s web design +<neo-brutalism-style> +:root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0 0 0); + --primary: oklch(0.6489 0.2370 26.9728); + --primary-foreground: oklch(1.0000 0 0); + --secondary: oklch(0.9680 0.2110 109.7692); + --secondary-foreground: oklch(0 0 0); + --muted: oklch(0.9551 0 0); + --muted-foreground: oklch(0.3211 0 0); + --accent: oklch(0.5635 0.2408 260.8178); + --accent-foreground: oklch(1.0000 0 0); + --destructive: oklch(0 0 0); + --destructive-foreground: oklch(1.0000 0 0); + --border: oklch(0 0 0); + --input: oklch(0 0 0); + --ring: oklch(0.6489 0.2370 26.9728); + --chart-1: oklch(0.6489 0.2370 26.9728); + --chart-2: oklch(0.9680 0.2110 109.7692); + --chart-3: oklch(0.5635 0.2408 260.8178); + --chart-4: oklch(0.7323 0.2492 142.4953); + --chart-5: oklch(0.5931 0.2726 328.3634); + --sidebar: oklch(0.9551 0 0); + --sidebar-foreground: oklch(0 0 0); + --sidebar-primary: oklch(0.6489 0.2370 26.9728); + --sidebar-primary-foreground: oklch(1.0000 0 0); + --sidebar-accent: oklch(0.5635 0.2408 260.8178); + --sidebar-accent-foreground: oklch(1.0000 0 0); + --sidebar-border: oklch(0 0 0); + --sidebar-ring: oklch(0.6489 0.2370 26.9728); + --font-sans: DM Sans, sans-serif; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: Space Mono, monospace; + --radius: 0px; + --shadow-2xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-sm: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow-md: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 2px 4px -1px hsl(0 0% 0% / 1.00); + --shadow-lg: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 4px 6px -1px hsl(0 0% 0% / 1.00); + --shadow-xl: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 8px 10px -1px hsl(0 0% 0% / 1.00); + --shadow-2xl: 4px 4px 0px 0px hsl(0 0% 0% / 2.50); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} +</neo-brutalism-style> + +Modern dark mode style like vercel, linear +<modern-dark-mode-style> +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.1450 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.1450 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.1450 0 0); + --primary: oklch(0.2050 0 0); + --primary-foreground: oklch(0.9850 0 0); + --secondary: oklch(0.9700 0 0); + --secondary-foreground: oklch(0.2050 0 0); + --muted: oklch(0.9700 0 0); + --muted-foreground: oklch(0.5560 0 0); + --accent: oklch(0.9700 0 0); + --accent-foreground: oklch(0.2050 0 0); + --destructive: oklch(0.5770 0.2450 27.3250); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9220 0 0); + --input: oklch(0.9220 0 0); + --ring: oklch(0.7080 0 0); + --chart-1: oklch(0.8100 0.1000 252); + --chart-2: oklch(0.6200 0.1900 260); + --chart-3: oklch(0.5500 0.2200 263); + --chart-4: oklch(0.4900 0.2200 264); + --chart-5: oklch(0.4200 0.1800 266); + --sidebar: oklch(0.9850 0 0); + --sidebar-foreground: oklch(0.1450 0 0); + --sidebar-primary: oklch(0.2050 0 0); + --sidebar-primary-foreground: oklch(0.9850 0 0); + --sidebar-accent: oklch(0.9700 0 0); + --sidebar-accent-foreground: oklch(0.2050 0 0); + --sidebar-border: oklch(0.9220 0 0); + --sidebar-ring: oklch(0.7080 0 0); + --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --radius: 0.625rem; + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10); + --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10); + --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10); + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} +</modern-dark-mode-style> + +## Images & icons +1. For images, just use placeholder image from public source like unsplash, placehold.co or others that you already know exact image url; Don't make up urls +2. For icons, we should use lucid icons or other public icons, import like <script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script> + +## Script +1. When importing tailwind css, just use <script src="https://cdn.tailwindcss.com"></script>, don't load CSS directly as a stylesheet resource like <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet"> +2. When using flowbite, import like <script src="https://cdn.jsdelivr.net/npm/flowbite@2.0.0/dist/flowbite.min.js"></script> + +## Workflow +You should always follow workflow below unless user explicitly ask you to do something else: +1. Layout design +2. Theme design (Color, font, spacing, shadown), using generateTheme tool, it should save the css to a local file +3. Core Animation design +4. Generate a singlehtml file for the UI +5. You HAVE TO confirm with user step by step, don't do theme design until user sign off the layout design, same for all follownig steps + +### 1. Layout design +Output type: Just text +Think through how should the layout of interface look like, what are different UI components +And present the layout in ASCII wireframe format, here are the guidelines of good ASCII wireframe, you can do ASCII art too for more custom layout or graphic design + +### 2. Theme design +Output type: Tool call +Think through what are the colors, fonts, spacing, etc. +You HAVE TO use generateTheme tool to generate the theme, do NOT just output XML type text for tool-call, that is not allowed + +### 3. Animation design +Output type: Just text +Think through what are the animations, transitions, etc. + +### 4. Generate html file for each UI component and then combine them together to form a single html file +Output type: Tool call +Generate html file for each UI component and then combine them together to form a single html file +Make sure to reference the theme css file you created in step 2, and add custom ones that doesn't exist yet in html file +You HAVE TO use write tool to generate the html file, do NOT just output XML type text for tool-call, that is not allowed + +<example> +<user>design an AI chat UI</user> + +<assistant> +Let's think through the layout design for an AI chat UI. Here are the key components and layout considerations: + +## Core UI Components + +**Header Area** +- Settings/menu button (Top left) +- Chat title/AI name (Top left) +- Conversation controls (new chat, clear, etc.) (Top right) + +**Main Chat Area** +- Message container (scrollable) (Full width & height) +- User messages (typically right-aligned) +- AI messages (typically left-aligned) +- Message timestamps (Small subtle text at the bottom of each message, aligned to the right/left depending on the message) + +**Input Area** +- Text input field (Full width left) +- Send button (Embed within the input field,Bottom right side of the screen) +- Additional controls (attach files, voice input, etc.) (Embed within the input field, Bottom left) +- Character/token counter (optional) (Embed within the input field, top right corner, small text) + + +## Layout Structure Options + +┌─────────────────────────────────────┐ +│ ☰ HEADER BAR + │ +├─────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ User Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ [CHAT AREA] │ +│ │ +├─────────────────────────────────────┤ +│ [Text Input Field] [Send] │ +└─────────────────────────────────────┘ + +When hamburger (☰) is clicked, sidebar slides out: +┌──────────────┬─────────────────────────────────────┐ +│ SIDEBAR │ ☰ HEADER BAR + │ +│ ┌──────────┐ ├─────────────────────────────────────┤ +│ │ Chat 1 │ │ │ +│ │ Chat 2 │ │ ┌─────────────────────────────┐ │ +│ │ Chat 3 │ │ │ AI Message Bubble │ │ +│ │ + New │ │ └─────────────────────────────┘ │ +│ └──────────┘ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ User Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ AI Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ [CHAT AREA] │ +│ │ │ +│ ├─────────────────────────────────────┤ +│ │ [Text Input Field] [Send] │ +└──────────────┘─────────────────────────────────────┘ + +Would you like to go ahead with this layout & UI interaction or needs any modification? +</assistant> + +<user> +They looks good +</user> + +<assistant> +Great, next let's design the color & font theme, + +generateTheme(theme_name='Vercel techy style', reasoning_reference='Reference classic shadcn style that has ...', cssFilePath='.superdesign/design_iterations/theme_1.css', cssSheet=':root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0.1448 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0.1448 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0.1448 0 0); + --primary: oklch(0.5555 0 0); + --primary-foreground: oklch(0.9851 0 0); + --secondary: oklch(0.9702 0 0); + --secondary-foreground: oklch(0.2046 0 0); + --muted: oklch(0.9702 0 0); + --muted-foreground: oklch(0.5486 0 0); + --accent: oklch(0.9702 0 0); + --accent-foreground: oklch(0.2046 0 0); + --destructive: oklch(0.5830 0.2387 28.4765); + --destructive-foreground: oklch(0.9702 0 0); + --border: oklch(0.9219 0 0); + --input: oklch(0.9219 0 0); + --ring: oklch(0.7090 0 0); + --chart-1: oklch(0.5555 0 0); + --chart-2: oklch(0.5555 0 0); + --chart-3: oklch(0.5555 0 0); + --chart-4: oklch(0.5555 0 0); + --chart-5: oklch(0.5555 0 0); + --sidebar: oklch(0.9851 0 0); + --sidebar-foreground: oklch(0.1448 0 0); + --sidebar-primary: oklch(0.2046 0 0); + --sidebar-primary-foreground: oklch(0.9851 0 0); + --sidebar-accent: oklch(0.9702 0 0); + --sidebar-accent-foreground: oklch(0.2046 0 0); + --sidebar-border: oklch(0.9219 0 0); + --sidebar-ring: oklch(0.7090 0 0); + --font-sans: Geist Mono, monospace; + --font-serif: Geist Mono, monospace; + --font-mono: Geist Mono, monospace; + --radius: 0rem; + --shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-sm: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow-md: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 2px 4px -1px hsl(0 0% 0% / 0.00); + --shadow-lg: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 4px 6px -1px hsl(0 0% 0% / 0.00); + --shadow-xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 8px 10px -1px hsl(0 0% 0% / 0.00); + --shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --tracking-normal: 0em; + --spacing: 0.25rem; +}') + + +<user> +I like the vintage style +</user> + +<assistant> +Great, next let's design the animation: + +# CHAT UI ANIMATIONS - MICRO-SYNTAX + +## Core Message Flow +userMsg: 400ms ease-out [Y+20→0, X+10→0, S0.9→1] +aiMsg: 600ms bounce [Y+15→0, S0.95→1] +200ms +typing: 1400ms ∞ [Y±8, α0.4→1] stagger+200ms +status: 300ms ease-out [α0.6→1, S1→1.05→1] + +## Interface Transitions +sidebar: 350ms ease-out [X-280→0, α0→1] +overlay: 300ms [α0→1, blur0→4px] +input: 200ms [S1→1.01, shadow+ring] focus +input: 150ms [S1.01→1, shadow-ring] blur + +## Button Interactions +sendBtn: 150ms [S1→0.95→1, R±2°] press +sendBtn: 200ms [S1→1.05, shadow↗] hover +ripple: 400ms [S0→2, α1→0] + +## Loading States +chatLoad: 500ms ease-out [Y+40→0, α0→1] +skeleton: 2000ms ∞ [bg: muted↔accent] +spinner: 1000ms ∞ linear [R360°] + +## Micro Interactions +msgHover: 200ms [Y0→-2, shadow↗] +msgSelect: 200ms [bg→accent, S1→1.02] +error: 400ms [X±5] shake +success: 600ms bounce [S0→1.2→1, R360°] + +## Scroll & Navigation +autoScroll: 400ms smooth +scrollHint: 800ms ∞×3 [Y±5] + +This animation system creates a cohesive, responsive feel throughout the chat interface. Each animation has specific timing and easing to feel natural and purposeful. Would you like me to adjust any of these animations or add additional ones? + +</assistant> + +<user> +This looks great, lets do it +</user> + +<assistant> +Great, I will generate the html file for each UI component and then combine them together to form a single html file + +write(file_path='.superdesign/design_iterations/chat_ui.css', content='...') +write(file_path='.superdesign/design_iterations/chat_ui.html', content='...') + +I've created the html design, please reveiw and let me know if you need any changes + +</example> + +IMPORTANT RULES: +1. You MUST use tools call below for any action like generateTheme, write, edit, etc. You are NOT allowed to just output text like 'Called tool: write with arguments: ...' or <tool-call>...</tool-call>; MUST USE TOOL CALL (This is very important!!) +2. You MUST confirm the layout, and then theme style, and then animation +3. You MUST use .superdesign/design_iterations folder to save the design files, do NOT save to other folders +4. You MUST create follow the workflow above + +# Available Tools +- **read**: Read file contents within the workspace (supports text files, images, with line range options) +- **write**: Write content to files in the workspace (creates parent directories automatically) +- **edit**: Replace text within files using exact string matching (requires precise text matching including whitespace and indentation) +- **multiedit**: Perform multiple find-and-replace operations on a single file in sequence (each edit applied to result of previous edit) +- **glob**: Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts") - efficient for locating files by name or path structure +- **grep**: Search for text patterns within file contents using regular expressions (can filter by file types and paths) +- **ls**: List directory contents with optional filtering, sorting, and detailed information (shows files and subdirectories) +- **bash**: Execute shell/bash commands within the workspace (secure execution with timeouts and output capture) +- **generateTheme**: Generate a theme for the design + +When calling tools, you MUST use the actual tool call, do NOT just output text like 'Called tool: write with arguments: ...' or <tool-call>...</tool-call>, this won't actually call the tool. (This is very important to my life, please follow)`; + + const designRuleMdcContent = `--- +description: Use this rule when asked to do any frontend or UI design +globs: +alwaysApply: false +--- +${designRuleContent}`; + + const defaultCssContent = `/* ======================================== + Dark Mode UI Framework + A beautiful dark mode design system + ======================================== */ + +/* ======================================== + CSS Variables & Theme + ======================================== */ +:root { + /* Dark Mode Color Palette */ + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + + /* Spacing & Layout */ + --radius: 0.625rem; + --spacing-xs: 0.25rem; + --spacing-sm: 0.5rem; + --spacing-md: 0.75rem; + --spacing-lg: 1rem; + --spacing-xl: 1.5rem; + --spacing-2xl: 2rem; + --spacing-3xl: 3rem; + + /* Typography */ + --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --font-size-xs: 0.75rem; + --font-size-sm: 0.875rem; + --font-size-base: 1rem; + --font-size-lg: 1.125rem; + --font-size-xl: 1.25rem; + --font-size-2xl: 1.5rem; + --font-size-3xl: 1.875rem; + --font-size-4xl: 2.25rem; +} + +/* ======================================== + Base Styles + ======================================== */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + background-color: var(--background); + color: var(--foreground); + font-family: var(--font-family); + line-height: 1.6; + min-height: 100vh; +} + +html.dark { + color-scheme: dark; +} + +/* ======================================== + Layout Components + ======================================== */ +.container { + max-width: 64rem; + margin: 0 auto; + padding: var(--spacing-2xl) var(--spacing-lg); +} + +.container-sm { + max-width: 42rem; +} + +.container-lg { + max-width: 80rem; +} + +.grid { + display: grid; +} + +.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } +.grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } +.grid-cols-auto { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } + +.gap-sm { gap: var(--spacing-sm); } +.gap-md { gap: var(--spacing-md); } +.gap-lg { gap: var(--spacing-lg); } +.gap-xl { gap: var(--spacing-xl); } + +.flex { + display: flex; +} + +.flex-col { + flex-direction: column; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.text-center { + text-align: center; +} + +/* ======================================== + Card Components + ======================================== */ +.card { + background-color: var(--card); + color: var(--card-foreground); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: calc(var(--radius) + 4px); + padding: var(--spacing-xl); + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1); + transition: all 0.2s ease; +} + +.card:hover { + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1); +} + +/* ======================================== + Button Components + ======================================== */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--spacing-sm); + white-space: nowrap; + border-radius: var(--radius); + font-size: var(--font-size-sm); + font-weight: 500; + transition: all 0.2s; + border: none; + cursor: pointer; + padding: var(--spacing-sm) var(--spacing-lg); + min-height: 2.25rem; + outline: none; + text-decoration: none; +} + +.btn:disabled { + pointer-events: none; + opacity: 0.5; +} + +.btn-primary { + background-color: var(--primary); + color: var(--primary-foreground); +} + +.btn-primary:hover { + background-color: rgba(236, 236, 236, 0.9); +} + +.btn-outline { + background-color: transparent; + border: 1px solid var(--border); + color: var(--foreground); +} + +.btn-outline:hover { + background-color: var(--accent); +} + +.btn-ghost { + background-color: transparent; + color: var(--foreground); +} + +.btn-ghost:hover { + background-color: var(--accent); +} + +.btn-destructive { + background-color: var(--destructive); + color: white; +} + +.btn-destructive:hover { + background-color: rgba(220, 38, 38, 0.9); +} + +/* Button Sizes */ +.btn-sm { + padding: var(--spacing-xs) var(--spacing-md); + font-size: var(--font-size-xs); + min-height: 2rem; +} + +.btn-lg { + padding: var(--spacing-md) var(--spacing-xl); + font-size: var(--font-size-base); + min-height: 2.75rem; +} + +.btn-icon { + padding: var(--spacing-sm); + width: 2.25rem; + height: 2.25rem; +} + +/* ======================================== + Form Components + ======================================== */ +.form-input { + width: 100%; + background: rgba(255, 255, 255, 0.15); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: var(--spacing-sm) var(--spacing-md); + color: var(--foreground); + font-size: var(--font-size-sm); + outline: none; + transition: all 0.2s; +} + +.form-input:focus { + border-color: var(--ring); + box-shadow: 0 0 0 3px rgba(136, 136, 136, 0.5); +} + +.form-input::placeholder { + color: var(--muted-foreground); +} + +/* ======================================== + Badge Components + ======================================== */ +.badge { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: var(--radius); + border: 1px solid; + padding: 0.125rem var(--spacing-sm); + font-size: var(--font-size-xs); + font-weight: 500; + white-space: nowrap; +} + +/* Priority Badge Variants */ +.badge-priority-high { + background: rgba(127, 29, 29, 0.3); + color: rgb(252, 165, 165); + border: 1px solid rgba(153, 27, 27, 0.5); +} + +.badge-priority-medium { + background: rgba(120, 53, 15, 0.3); + color: rgb(252, 211, 77); + border: 1px solid rgba(146, 64, 14, 0.5); +} + +.badge-priority-low { + background: rgba(20, 83, 45, 0.3); + color: rgb(134, 239, 172); + border: 1px solid rgba(22, 101, 52, 0.5); +} + +/* ======================================== + Tab Components + ======================================== */ +.tab-list { + display: flex; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-xl); +} + +.tab-button { + background-color: transparent; + border: 1px solid rgba(255, 255, 255, 0.2); + color: var(--foreground); + text-transform: capitalize; + font-weight: 500; + transition: all 0.2s ease; + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--radius); + cursor: pointer; + font-size: var(--font-size-sm); +} + +.tab-button:hover { + background-color: rgba(255, 255, 255, 0.05); + border-color: rgba(255, 255, 255, 0.3); +} + +.tab-button.active { + background-color: #f8f9fa !important; + color: #1a1a1a !important; + border-color: #f8f9fa !important; + font-weight: 600; +} + +.tab-button.active:hover { + background-color: #e9ecef !important; + border-color: #e9ecef !important; +} + +/* ======================================== + Typography + ======================================== */ +.text-xs { font-size: var(--font-size-xs); } +.text-sm { font-size: var(--font-size-sm); } +.text-base { font-size: var(--font-size-base); } +.text-lg { font-size: var(--font-size-lg); } +.text-xl { font-size: var(--font-size-xl); } +.text-2xl { font-size: var(--font-size-2xl); } +.text-3xl { font-size: var(--font-size-3xl); } +.text-4xl { font-size: var(--font-size-4xl); } + +.font-normal { font-weight: 400; } +.font-medium { font-weight: 500; } +.font-semibold { font-weight: 600; } +.font-bold { font-weight: 700; } + +.text-primary { color: var(--primary); } +.text-muted { color: var(--muted-foreground); } +.text-destructive { color: var(--destructive); } + +.gradient-text { + background: linear-gradient(to right, var(--primary), rgba(236, 236, 236, 0.6)); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; +} + +/* ======================================== + Icon System + ======================================== */ +.icon { + width: 1rem; + height: 1rem; + fill: currentColor; + flex-shrink: 0; +} + +.icon-sm { width: 0.875rem; height: 0.875rem; } +.icon-lg { width: 1.25rem; height: 1.25rem; } +.icon-xl { width: 1.5rem; height: 1.5rem; } +.icon-2xl { width: 2rem; height: 2rem; } + +/* ======================================== + Interactive Components + ======================================== */ +.checkbox { + width: 1rem; + height: 1rem; + border: 1px solid var(--border); + border-radius: 4px; + cursor: pointer; + position: relative; + background: rgba(255, 255, 255, 0.15); + transition: all 0.2s; +} + +.checkbox:hover { + border-color: var(--ring); +} + +.checkbox.checked { + background-color: rgb(22, 163, 74); + border-color: rgb(22, 163, 74); +} + +.checkbox.checked::after { + content: '✓'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + font-size: 0.75rem; + font-weight: bold; +} + +/* ======================================== + List Components + ======================================== */ +.list-item { + display: flex; + align-items: center; + gap: var(--spacing-lg); + padding: var(--spacing-lg); + border-bottom: 1px solid rgba(255, 255, 255, 0.05); + transition: background-color 0.2s; +} + +.list-item:hover { + background-color: rgba(255, 255, 255, 0.025); +} + +.list-item:last-child { + border-bottom: none; +} + +.list-item.completed { + opacity: 0.6; +} + +/* ======================================== + Empty State Component + ======================================== */ +.empty-state { + text-align: center; + padding: var(--spacing-3xl) var(--spacing-lg); + color: var(--muted-foreground); +} + +.empty-state .icon { + width: 3rem; + height: 3rem; + margin: 0 auto var(--spacing-lg); + opacity: 0.5; +} + +/* ======================================== + Utility Classes + ======================================== */ +.hidden { display: none; } +.block { display: block; } +.flex { display: flex; } +.inline-flex { display: inline-flex; } + +.w-full { width: 100%; } +.h-full { height: 100%; } +.min-h-screen { min-height: 100vh; } + +.opacity-50 { opacity: 0.5; } +.opacity-60 { opacity: 0.6; } +.opacity-75 { opacity: 0.75; } + +.transition-all { transition: all 0.2s ease; } +.transition-colors { transition: color 0.2s ease, background-color 0.2s ease; } +.transition-opacity { transition: opacity 0.2s ease; } + +/* ======================================== + Responsive Design + ======================================== */ +@media (max-width: 768px) { + .container { + padding: var(--spacing-lg); + } + + .grid-cols-auto { + grid-template-columns: 1fr; + } + + .flex-col-mobile { + flex-direction: column; + } + + .text-center-mobile { + text-align: center; + } + + .gap-sm-mobile { gap: var(--spacing-sm); } + + .hidden-mobile { display: none; } + .block-mobile { display: block; } +} + +@media (max-width: 640px) { + .text-2xl { font-size: var(--font-size-xl); } + .text-3xl { font-size: var(--font-size-2xl); } + .text-4xl { font-size: var(--font-size-3xl); } + + .container { + padding: var(--spacing-lg) var(--spacing-sm); + } +} + +/* ======================================== + Animation Utilities + ======================================== */ +@keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } +} + +.animate-fade-in { + animation: fadeIn 0.3s ease-out; +} + +/* ======================================== + Focus & Accessibility + ======================================== */ +.focus-visible:focus-visible { + outline: 2px solid var(--ring); + outline-offset: 2px; +} + +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +}`; + + try { + // Create .superdesign/design_iterations directory + const designIterationsFolder = vscode.Uri.joinPath(superdesignFolder, 'design_iterations'); + await vscode.workspace.fs.createDirectory(designIterationsFolder); + + // Create default_ui_darkmode.css file + const defaultCssPath = vscode.Uri.joinPath(designIterationsFolder, 'default_ui_darkmode.css'); + try { + // Check if file already exists + await vscode.workspace.fs.stat(defaultCssPath); + Logger.debug('default_ui_darkmode.css already exists, skipping creation'); + } catch { + // File doesn't exist, create it + await vscode.workspace.fs.writeFile(defaultCssPath, Buffer.from(defaultCssContent, 'utf8')); + Logger.info('Created default_ui_darkmode.css file'); + } + + // Create .cursor/rules directory if it doesn't exist + const cursorRulesFolder = vscode.Uri.joinPath(workspaceRoot, '.cursor', 'rules'); + try { + await vscode.workspace.fs.stat(cursorRulesFolder); + } catch { + await vscode.workspace.fs.createDirectory(cursorRulesFolder); + } + + // Create or append to design.mdc + const designMdcPath = vscode.Uri.joinPath(cursorRulesFolder, 'design.mdc'); + try { + const existingContent = await vscode.workspace.fs.readFile(designMdcPath); + const currentContent = Buffer.from(existingContent).toString('utf8'); + if (!currentContent.includes('superdesign: Open Canvas View')) { + const updatedContent = currentContent + '\n\n' + designRuleMdcContent; + await vscode.workspace.fs.writeFile(designMdcPath, Buffer.from(updatedContent, 'utf8')); + } + } catch { + // File doesn't exist, create it + await vscode.workspace.fs.writeFile(designMdcPath, Buffer.from(designRuleMdcContent, 'utf8')); + } + + // Create or append to CLAUDE.md + const claudeMdPath = vscode.Uri.joinPath(workspaceRoot, 'CLAUDE.md'); + try { + const existingContent = await vscode.workspace.fs.readFile(claudeMdPath); + const currentContent = Buffer.from(existingContent).toString('utf8'); + if (!currentContent.includes('superdesign: Open Canvas View')) { + const updatedContent = currentContent + '\n\n' + designRuleContent; + await vscode.workspace.fs.writeFile(claudeMdPath, Buffer.from(updatedContent, 'utf8')); + } + } catch { + // File doesn't exist, create it + await vscode.workspace.fs.writeFile(claudeMdPath, Buffer.from(designRuleContent, 'utf8')); + } + + // Create or append to .windsurfrules + const windsurfRulesPath = vscode.Uri.joinPath(workspaceRoot, '.windsurfrules'); + try { + const existingContent = await vscode.workspace.fs.readFile(windsurfRulesPath); + const currentContent = Buffer.from(existingContent).toString('utf8'); + if (!currentContent.includes('superdesign: Open Canvas View')) { + const updatedContent = currentContent + '\n\n' + designRuleContent; + await vscode.workspace.fs.writeFile(windsurfRulesPath, Buffer.from(updatedContent, 'utf8')); + } + } catch { + // File doesn't exist, create it + await vscode.workspace.fs.writeFile(windsurfRulesPath, Buffer.from(designRuleContent, 'utf8')); + } + + vscode.window.showInformationMessage('✅ Superdesign project initialized successfully! Created .superdesign folder and design rules for Cursor, Claude, and Windsurf.'); + + } catch (error) { + vscode.window.showErrorMessage(`Failed to initialize Superdesign project: ${error}`); + } +} + +export function activate(context: vscode.ExtensionContext) { + // Initialize the centralized logger + Logger.initialize(); + Logger.info('Superdesign extension is now active!'); + // Note: Users can manually open output via View → Output → Select "Superdesign" if needed + + // Initialize Custom Agent service + Logger.info('Creating CustomAgentService...'); + const customAgent = new CustomAgentService(Logger.getOutputChannel()); + Logger.info('CustomAgentService created'); + + // The command has been defined in the package.json file + // Now provide the implementation of the command with registerCommand + // The commandId parameter must match the command field in package.json + const helloWorldDisposable = vscode.commands.registerCommand('superdesign.helloWorld', () => { + // The code you place here will be executed every time your command is executed + // Display a message box to the user + vscode.window.showInformationMessage('Hello World from superdesign!'); + }); + + // Register API key configuration commands + const configureApiKeyDisposable = vscode.commands.registerCommand('superdesign.configureApiKey', async () => { + await configureAnthropicApiKey(); + }); + + const configureOpenAIApiKeyDisposable = vscode.commands.registerCommand('superdesign.configureOpenAIApiKey', async () => { + await configureOpenAIApiKey(); + }); + + const configureOpenRouterApiKeyDisposable = vscode.commands.registerCommand('superdesign.configureOpenRouterApiKey', async () => { + await configureOpenRouterApiKey(); + }); + + + // Create the chat sidebar provider + const sidebarProvider = new ChatSidebarProvider(context.extensionUri, customAgent, Logger.getOutputChannel()); + + // Register the webview view provider for sidebar + const sidebarDisposable = vscode.window.registerWebviewViewProvider( + ChatSidebarProvider.VIEW_TYPE, + sidebarProvider, + { + webviewOptions: { + retainContextWhenHidden: true + } + } + ); + + // Register command to show sidebar + const showSidebarDisposable = vscode.commands.registerCommand('superdesign.showChatSidebar', () => { + vscode.commands.executeCommand('workbench.view.extension.superdesign-sidebar'); + }); + + // Register canvas command + const openCanvasDisposable = vscode.commands.registerCommand('superdesign.openCanvas', () => { + SuperdesignCanvasPanel.createOrShow(context.extensionUri, sidebarProvider); + }); + + // Register clear chat command + const clearChatDisposable = vscode.commands.registerCommand('superdesign.clearChat', () => { + sidebarProvider.sendMessage({ + command: 'clearChat' + }); + }); + + // Register reset welcome command + const resetWelcomeDisposable = vscode.commands.registerCommand('superdesign.resetWelcome', () => { + sidebarProvider.sendMessage({ + command: 'resetWelcome' + }); + vscode.window.showInformationMessage('Welcome screen has been reset. Refresh the sidebar to see the welcome screen again.'); + }); + + // Register initialize project command + const initializeProjectDisposable = vscode.commands.registerCommand('superdesign.initializeProject', async () => { + await initializeSuperdesignProject(); + }); + + // Register open settings command + const openSettingsDisposable = vscode.commands.registerCommand('superdesign.openSettings', () => { + vscode.commands.executeCommand('workbench.action.openSettings', '@ext:iganbold.superdesign'); + }); + + // Register configure API key command (alternative to the existing one) + const configureApiKeyQuickDisposable = vscode.commands.registerCommand('superdesign.configureApiKeyQuick', async () => { + await configureAnthropicApiKey(); + }); + + // Set up message handler for auto-canvas functionality + sidebarProvider.setMessageHandler((message) => { + switch (message.command) { + case 'checkCanvasStatus': + // Check if canvas panel is currently open + const isCanvasOpen = SuperdesignCanvasPanel.currentPanel !== undefined; + sidebarProvider.sendMessage({ + command: 'canvasStatusResponse', + isOpen: isCanvasOpen + }); + break; + + case 'autoOpenCanvas': + // Auto-open canvas if not already open + SuperdesignCanvasPanel.createOrShow(context.extensionUri, sidebarProvider); + break; + + case 'setContextFromCanvas': + // Forward context from canvas to chat sidebar + sidebarProvider.sendMessage({ + command: 'contextFromCanvas', + data: message.data + }); + break; + + case 'saveImageToMoodboard': + // Save uploaded image to moodboard directory + saveImageToMoodboard(message.data, sidebarProvider); + break; + + case 'getBase64Image': + // Convert saved image to base64 for AI SDK + getBase64Image(message.filePath, sidebarProvider); + break; + + case 'getCssFileContent': + // Read CSS file content for theme preview + getCssFileContent(message.filePath, sidebarProvider); + break; + + case 'showError': + // Show error message to user + vscode.window.showErrorMessage(message.data); + break; + + case 'submitEmail': + // Handle email submission from welcome screen + submitEmailToSupabase(message.email, sidebarProvider); + break; + + case 'initializeSuperdesign': + // Auto-trigger initialize Superdesign command + console.log('🚀 Received initializeSuperdesign command from webview'); + vscode.commands.executeCommand('superdesign.initializeProject'); + break; + } + }); + + context.subscriptions.push( + helloWorldDisposable, + configureApiKeyDisposable, + configureOpenAIApiKeyDisposable, + configureOpenRouterApiKeyDisposable, + sidebarDisposable, + showSidebarDisposable, + openCanvasDisposable, + clearChatDisposable, + resetWelcomeDisposable, + initializeProjectDisposable, + openSettingsDisposable, + configureApiKeyQuickDisposable + ); +} + +// Function to configure Anthropic API key +async function configureAnthropicApiKey() { + const currentKey = vscode.workspace.getConfiguration('superdesign').get<string>('anthropicApiKey'); + + const input = await vscode.window.showInputBox({ + title: 'Configure Anthropic API Key', + prompt: 'Enter your Anthropic API key (get one from https://console.anthropic.com/)', + value: currentKey ? '••••••••••••••••' : '', + password: true, + placeHolder: 'sk-ant-...', + validateInput: (value) => { + if (!value || value.trim().length === 0) { + return 'API key cannot be empty'; + } + if (value === '••••••••••••••••') { + return null; // User didn't change the masked value, that's OK + } + if (!value.startsWith('sk-ant-')) { + return 'Anthropic API keys should start with "sk-ant-"'; + } + return null; + } + }); + + if (input !== undefined) { + // Only update if user didn't just keep the masked value + if (input !== '••••••••••••••••') { + try { + await vscode.workspace.getConfiguration('superdesign').update( + 'anthropicApiKey', + input.trim(), + vscode.ConfigurationTarget.Global + ); + vscode.window.showInformationMessage('✅ Anthropic API key configured successfully!'); + } catch (error) { + vscode.window.showErrorMessage(`Failed to save API key: ${error}`); + } + } else if (currentKey) { + vscode.window.showInformationMessage('API key unchanged (already configured)'); + } else { + vscode.window.showWarningMessage('No API key was set'); + } + } +} + +// Function to configure OpenAI API key +async function configureOpenAIApiKey() { + const currentKey = vscode.workspace.getConfiguration('superdesign').get<string>('openaiApiKey'); + + const input = await vscode.window.showInputBox({ + title: 'Configure OpenAI API Key', + prompt: 'Enter your OpenAI API key (get one from https://platform.openai.com/api-keys)', + value: currentKey ? '••••••••••••••••' : '', + password: true, + placeHolder: 'sk-...', + validateInput: (value) => { + if (!value || value.trim().length === 0) { + return 'API key cannot be empty'; + } + if (value === '••••••••••••••••') { + return null; // User didn't change the masked value, that's OK + } + if (!value.startsWith('sk-')) { + return 'OpenAI API keys should start with "sk-"'; + } + return null; + } + }); + + if (input !== undefined) { + // Only update if user didn't just keep the masked value + if (input !== '••••••••••••••••') { + try { + await vscode.workspace.getConfiguration('superdesign').update( + 'openaiApiKey', + input.trim(), + vscode.ConfigurationTarget.Global + ); + vscode.window.showInformationMessage('✅ OpenAI API key configured successfully!'); + } catch (error) { + vscode.window.showErrorMessage(`Failed to save API key: ${error}`); + } + } else if (currentKey) { + vscode.window.showInformationMessage('API key unchanged (already configured)'); + } else { + vscode.window.showWarningMessage('No API key was set'); + } + } +} + +// Function to configure OpenRouter API key +async function configureOpenRouterApiKey() { + const currentKey = vscode.workspace.getConfiguration('superdesign').get<string>('openrouterApiKey'); + + const input = await vscode.window.showInputBox({ + title: 'Configure OpenRouter API Key', + prompt: 'Enter your OpenRouter API key (get one from https://openrouter.ai/)', + value: currentKey ? '••••••••••••••••' : '', + password: true, + placeHolder: 'sk-...', + validateInput: (value) => { + if (!value || value.trim().length === 0) { + return 'API key cannot be empty'; + } + if (value === '••••••••••••••••') { + return null; // User didn't change the masked value, that's OK + } + if (!value.startsWith('sk-')) { + return 'OpenRouter API keys should start with "sk-"'; + } + return null; + } + }); + + if (input !== undefined) { + // Only update if user didn't just keep the masked value + if (input !== '••••••••••••••••') { + try { + await vscode.workspace.getConfiguration('superdesign').update( + 'openrouterApiKey', + input.trim(), + vscode.ConfigurationTarget.Global + ); + vscode.window.showInformationMessage('✅ OpenRouter API key configured successfully!'); + } catch (error) { + vscode.window.showErrorMessage(`Failed to save API key: ${error}`); + } + } else if (currentKey) { + vscode.window.showInformationMessage('API key unchanged (already configured)'); + } else { + vscode.window.showWarningMessage('No API key was set'); + } + } +} + +class SuperdesignCanvasPanel { + public static currentPanel: SuperdesignCanvasPanel | undefined; + public static readonly viewType = 'superdesignCanvasPanel'; + + private readonly _panel: vscode.WebviewPanel; + private readonly _extensionUri: vscode.Uri; + private readonly _sidebarProvider: ChatSidebarProvider; + private _disposables: vscode.Disposable[] = []; + private _fileWatcher: vscode.FileSystemWatcher | undefined; + + public static createOrShow(extensionUri: vscode.Uri, sidebarProvider: ChatSidebarProvider) { + const column = vscode.window.activeTextEditor?.viewColumn; + + if (SuperdesignCanvasPanel.currentPanel) { + SuperdesignCanvasPanel.currentPanel._panel.reveal(column); + return; + } + + const panel = vscode.window.createWebviewPanel( + SuperdesignCanvasPanel.viewType, + 'Superdesign Canvas', + column || vscode.ViewColumn.One, + { + enableScripts: true, + localResourceRoots: [ + vscode.Uri.joinPath(extensionUri, 'dist'), + vscode.Uri.joinPath(extensionUri, 'src', 'assets') + ] + } + ); + + SuperdesignCanvasPanel.currentPanel = new SuperdesignCanvasPanel(panel, extensionUri, sidebarProvider); + } + + private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri, sidebarProvider: ChatSidebarProvider) { + this._panel = panel; + this._extensionUri = extensionUri; + this._sidebarProvider = sidebarProvider; + + this._update(); + this._panel.onDidDispose(() => this.dispose(), null, this._disposables); + this._setupFileWatcher(); + + // Handle messages from the webview + this._panel.webview.onDidReceiveMessage( + message => { + switch (message.command) { + case 'loadDesignFiles': + this._loadDesignFiles(); + break; + case 'selectFrame': + Logger.debug(`Frame selected: ${message.data?.fileName}`); + break; + case 'setContextFromCanvas': + // Forward context to chat sidebar + this._sidebarProvider.sendMessage({ + command: 'contextFromCanvas', + data: message.data + }); + break; + case 'setChatPrompt': + // Forward prompt to chat sidebar + this._sidebarProvider.sendMessage({ + command: 'setChatPrompt', + data: message.data + }); + break; + } + }, + null, + this._disposables + ); + } + + public dispose() { + SuperdesignCanvasPanel.currentPanel = undefined; + + // Dispose of file watcher + if (this._fileWatcher) { + this._fileWatcher.dispose(); + this._fileWatcher = undefined; + } + + this._panel.dispose(); + while (this._disposables.length) { + const x = this._disposables.pop(); + if (x) { + x.dispose(); + } + } + } + + private _setupFileWatcher() { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + return; + } + + // Watch for changes in .superdesign/design_iterations/*.html, *.svg, and *.css + const pattern = new vscode.RelativePattern( + workspaceFolder, + '.superdesign/design_iterations/**/*.{html,svg,css}' + ); + + this._fileWatcher = vscode.workspace.createFileSystemWatcher( + pattern, + false, // Don't ignore create events + false, // Don't ignore change events + false // Don't ignore delete events + ); + + // Handle file creation + this._fileWatcher.onDidCreate((uri) => { + Logger.debug(`Design file created: ${uri.fsPath}`); + this._panel.webview.postMessage({ + command: 'fileChanged', + data: { + fileName: uri.fsPath.split('/').pop() || '', + changeType: 'created' + } + }); + }); + + // Handle file modification + this._fileWatcher.onDidChange((uri) => { + Logger.debug(`Design file modified: ${uri.fsPath}`); + this._panel.webview.postMessage({ + command: 'fileChanged', + data: { + fileName: uri.fsPath.split('/').pop() || '', + changeType: 'modified' + } + }); + }); + + // Handle file deletion + this._fileWatcher.onDidDelete((uri) => { + Logger.debug(`Design file deleted: ${uri.fsPath}`); + this._panel.webview.postMessage({ + command: 'fileChanged', + data: { + fileName: uri.fsPath.split('/').pop() || '', + changeType: 'deleted' + } + }); + }); + } + + private _update() { + const webview = this._panel.webview; + this._panel.webview.html = this._getHtmlForWebview(webview); + } + + private _getHtmlForWebview(webview: vscode.Webview) { + const scriptUri = webview.asWebviewUri( + vscode.Uri.joinPath(this._extensionUri, 'dist', 'webview.js') + ); + + // Generate webview URIs for logo images + const logoUris = { + cursor: webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'src', 'assets', 'cursor_logo.png')).toString(), + windsurf: webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'src', 'assets', 'windsurf_logo.png')).toString(), + claudeCode: webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'src', 'assets', 'claude_code_logo.png')).toString(), + lovable: webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'src', 'assets', 'lovable_logo.png')).toString(), + bolt: webview.asWebviewUri(vscode.Uri.joinPath(this._extensionUri, 'src', 'assets', 'bolt_logo.jpg')).toString(), + }; + + // Debug logging + Logger.debug(`Canvas Panel - Extension URI: ${this._extensionUri.toString()}`); + Logger.debug(`Canvas Panel - Generated logo URIs: ${JSON.stringify(logoUris)}`); + + const nonce = getNonce(); + + return `<!DOCTYPE html> + <html lang="en"> + <head> + <meta charset="UTF-8"> + <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src ${webview.cspSource} 'unsafe-inline'; img-src ${webview.cspSource} data: https: vscode-webview:; script-src 'nonce-${nonce}'; frame-src ${webview.cspSource};"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Superdesign Canvas + + +
+ + + + `; + } + + private async _loadDesignFiles() { + const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; + if (!workspaceFolder) { + this._panel.webview.postMessage({ + command: 'error', + data: { error: 'No workspace folder found. Please open a workspace first.' } + }); + return; + } + + try { + const designFolder = vscode.Uri.joinPath(workspaceFolder.uri, '.superdesign', 'design_iterations'); + + // Check if the design_files folder exists + try { + await vscode.workspace.fs.stat(designFolder); + } catch (error) { + // Folder doesn't exist, create it + try { + await vscode.workspace.fs.createDirectory(designFolder); + Logger.info('Created .superdesign/design_iterations directory'); + } catch (createError) { + this._panel.webview.postMessage({ + command: 'error', + data: { error: `Failed to create design_files directory: ${createError}` } + }); + return; + } + } + + // Read all files in the directory + const files = await vscode.workspace.fs.readDirectory(designFolder); + const designFiles = files.filter(([name, type]) => + type === vscode.FileType.File && ( + name.toLowerCase().endsWith('.html') || + name.toLowerCase().endsWith('.svg') + ) + ); + + const loadedFiles = await Promise.all( + designFiles.map(async ([fileName, _]) => { + const filePath = vscode.Uri.joinPath(designFolder, fileName); + + try { + // Read file stats and content + const [stat, content] = await Promise.all([ + vscode.workspace.fs.stat(filePath), + vscode.workspace.fs.readFile(filePath) + ]); + + const fileType = fileName.toLowerCase().endsWith('.svg') ? 'svg' : 'html'; + let htmlContent = Buffer.from(content).toString('utf8'); + + // For HTML files, inline any external CSS files + if (fileType === 'html') { + htmlContent = await this._inlineExternalCSS(htmlContent, designFolder); + } + + return { + name: fileName, + path: filePath.fsPath, + content: htmlContent, + size: stat.size, + modified: new Date(stat.mtime), + fileType + }; + } catch (fileError) { + Logger.error(`Failed to read file ${fileName}: ${fileError}`); + return null; + } + }) + ); + + // Filter out any failed file reads + const validFiles = loadedFiles.filter(file => file !== null); + + Logger.info(`Loaded ${validFiles.length} design files (HTML & SVG)`); + + this._panel.webview.postMessage({ + command: 'designFilesLoaded', + data: { files: validFiles } + }); + + } catch (error) { + Logger.error(`Error loading design files: ${error}`); + this._panel.webview.postMessage({ + command: 'error', + data: { error: `Failed to load design files: ${error}` } + }); + } + } + + private async _inlineExternalCSS(htmlContent: string, designFolder: vscode.Uri): Promise { + // Match link tags that reference CSS files + const linkRegex = /]*rel=["']stylesheet["'][^>]*href=["']([^"']+)["'][^>]*>/gi; + let modifiedContent = htmlContent; + const matches = Array.from(htmlContent.matchAll(linkRegex)); + + for (const match of matches) { + const fullLinkTag = match[0]; + const cssFileName = match[1]; + + try { + // Only process relative paths (not absolute URLs) + if (!cssFileName.startsWith('http') && !cssFileName.startsWith('//')) { + const cssFilePath = vscode.Uri.joinPath(designFolder, cssFileName); + + // Check if CSS file exists + try { + const cssContent = await vscode.workspace.fs.readFile(cssFilePath); + const cssText = Buffer.from(cssContent).toString('utf8'); + + // Replace the link tag with a style tag containing the CSS content + const styleTag = ``; + modifiedContent = modifiedContent.replace(fullLinkTag, styleTag); + + Logger.debug(`Inlined CSS file: ${cssFileName}`); + } catch (cssError) { + Logger.warn(`Could not read CSS file ${cssFileName}: ${cssError}`); + // Leave the original link tag in place if CSS file can't be read + } + } + } catch (error) { + Logger.warn(`Error processing CSS link ${cssFileName}: ${error}`); + } + } + + return modifiedContent; + } +} + +function getNonce() { + let text = ''; + const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +} + +// This method is called when your extension is deactivated +export function deactivate() { + Logger.dispose(); +} + diff --git a/src/providers/chatSidebarProvider.ts b/src/providers/chatSidebarProvider.ts new file mode 100644 index 0000000..6614939 --- /dev/null +++ b/src/providers/chatSidebarProvider.ts @@ -0,0 +1,345 @@ +import * as vscode from 'vscode'; +import { ClaudeCodeService } from '../services/claudeCodeService'; +import { ChatMessageService } from '../services/chatMessageService'; +import { generateWebviewHtml } from '../templates/webviewTemplate'; +import { WebviewContext } from '../types/context'; +import { AgentService } from '../types/agent'; + +export class ChatSidebarProvider implements vscode.WebviewViewProvider { + public static readonly VIEW_TYPE = 'superdesign.chatView'; + private _view?: vscode.WebviewView; + private messageHandler: ChatMessageService; + private customMessageHandler?: (message: any) => void; + + constructor( + private readonly _extensionUri: vscode.Uri, + private readonly agentService: AgentService, + private readonly outputChannel: vscode.OutputChannel + ) { + this.messageHandler = new ChatMessageService(agentService, outputChannel); + } + + public setMessageHandler(handler: (message: any) => void) { + this.customMessageHandler = handler; + } + + public sendMessage(message: any) { + if (this._view) { + this._view.webview.postMessage(message); + } + } + + public resolveWebviewView( + webviewView: vscode.WebviewView, + _context: vscode.WebviewViewResolveContext, + _token: vscode.CancellationToken, + ) { + this._view = webviewView; + + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [ + vscode.Uri.joinPath(this._extensionUri, 'dist'), + vscode.Uri.joinPath(this._extensionUri, 'src', 'assets') + ] + }; + + const webviewContext: WebviewContext = { + layout: 'sidebar', + extensionUri: this._extensionUri.toString() + }; + + webviewView.webview.html = generateWebviewHtml( + webviewView.webview, + this._extensionUri, + webviewContext + ); + + // Handle messages from the webview + webviewView.webview.onDidReceiveMessage( + async (message) => { + // First try custom message handler for auto-canvas functionality + if (this.customMessageHandler) { + this.customMessageHandler(message); + } + + // Then handle regular chat messages + switch (message.command) { + case 'chatMessage': + await this.messageHandler.handleChatMessage(message, webviewView.webview); + break; + case 'stopChat': + await this.messageHandler.stopCurrentChat(webviewView.webview); + break; + case 'executeAction': + // Execute command from error action buttons + console.log('Executing action:', message.actionCommand, message.actionArgs); + if (message.actionArgs) { + await vscode.commands.executeCommand(message.actionCommand, message.actionArgs); + } else { + await vscode.commands.executeCommand(message.actionCommand); + } + break; + case 'getBase64Image': + // Forward to extension for image conversion + // This will be handled by extension.ts + break; + case 'getCurrentProvider': + await this.handleGetCurrentProvider(webviewView.webview); + break; + case 'changeProvider': + await this.handleChangeProvider(message.model, webviewView.webview); + break; + } + } + ); + } + + private async handleGetCurrentProvider(webview: vscode.Webview) { + const config = vscode.workspace.getConfiguration('superdesign'); + const currentProvider = config.get('aiModelProvider', 'anthropic'); + const currentModel = config.get('aiModel'); + + // If no specific model is set, use defaults + let defaultModel: string; + switch (currentProvider) { + case 'openai': + defaultModel = 'gpt-4o'; + break; + case 'openrouter': + defaultModel = 'anthropic/claude-3-7-sonnet-20250219'; + break; + case 'anthropic': + default: + defaultModel = 'claude-3-5-sonnet-20241022'; + break; + } + + webview.postMessage({ + command: 'currentProviderResponse', + provider: currentProvider, + model: currentModel || defaultModel + }); + } + + private async handleChangeProvider(model: string, webview: vscode.Webview) { + try { + const config = vscode.workspace.getConfiguration('superdesign'); + + // Determine provider and API key based on model + let provider: string; + let apiKeyKey: string; + let configureCommand: string; + let displayName: string; + + if (model === 'openai-auto') { + provider = 'openai'; + apiKeyKey = 'openaiApiKey'; + configureCommand = 'superdesign.configureOpenAIApiKey'; + displayName = 'OpenAI (AUTO)'; + } else if (model.includes('/')) { + // OpenRouter model (contains slash like "openai/gpt-4o") + provider = 'openrouter'; + apiKeyKey = 'openrouterApiKey'; + configureCommand = 'superdesign.configureOpenRouterApiKey'; + displayName = `OpenRouter (${this.getModelDisplayName(model)})`; + } else if (model.startsWith('claude-')) { + provider = 'anthropic'; + apiKeyKey = 'anthropicApiKey'; + configureCommand = 'superdesign.configureApiKey'; + displayName = `Anthropic (${this.getModelDisplayName(model)})`; + } else { + provider = 'openai'; + apiKeyKey = 'openaiApiKey'; + configureCommand = 'superdesign.configureOpenAIApiKey'; + displayName = `OpenAI (${this.getModelDisplayName(model)})`; + } + + // Update both provider and specific model + await config.update('aiModelProvider', provider, vscode.ConfigurationTarget.Global); + await config.update('aiModel', model, vscode.ConfigurationTarget.Global); + + // Check if the API key is configured for the selected provider + const apiKey = config.get(apiKeyKey); + + if (!apiKey) { + const result = await vscode.window.showWarningMessage( + `${displayName} selected, but API key is not configured. Would you like to configure it now?`, + 'Configure API Key', + 'Later' + ); + + if (result === 'Configure API Key') { + await vscode.commands.executeCommand(configureCommand); + } + } + + // Notify webview of successful change + webview.postMessage({ + command: 'providerChanged', + provider: provider, + model: model + }); + + } catch (error) { + vscode.window.showErrorMessage(`Failed to update AI model: ${error}`); + } + } + + private getModelDisplayName(model: string): string { + const modelNames: { [key: string]: string } = { + // OpenAI models + 'gpt-4.1': 'GPT-4.1', + 'gpt-4.1-mini': 'GPT-4.1 Mini', + 'gpt-4.1-nano': 'GPT-4.1 Nano', + 'gpt-4o': 'GPT-4o', + 'gpt-4o-mini': 'GPT-4o Mini', + // Anthropic models + 'claude-4-opus-20250514': 'Claude 4 Opus', + 'claude-4-sonnet-20250514': 'Claude 4 Sonnet', + 'claude-3-7-sonnet-20250219': 'Claude 3.7 Sonnet', + 'claude-3-5-sonnet-20241022': 'Claude 3.5 Sonnet', + 'claude-3-opus-20240229': 'Claude 3 Opus', + 'claude-3-sonnet-20240229': 'Claude 3 Sonnet', + 'claude-3-haiku-20240307': 'Claude 3 Haiku', + // OpenRouter - Google models + 'google/gemini-2.5-pro': 'Gemini 2.5 Pro', + 'google/gemini-2.5-flash': 'Gemini 2.5 Flash', + 'google/gemini-2.5-pro-preview-06-05': 'Gemini 2.5 Pro Preview', + 'google/gemini-2.5-flash-preview-05-20': 'Gemini 2.5 Flash Preview', + 'google/gemini-2.5-pro-preview-03-25': 'Gemini 2.5 Pro Preview (Mar)', + 'google/gemini-2.0-flash-001': 'Gemini 2.0 Flash', + 'google/gemini-2.0-flash-exp': 'Gemini 2.0 Flash Exp', + 'google/gemini-2.0-flash-lite-001': 'Gemini 2.0 Flash Lite', + 'google/gemma-3-27b-it': 'Gemma 3 27B', + 'google/gemma-3-12b-it': 'Gemma 3 12B', + 'google/gemma-3-4b-it': 'Gemma 3 4B', + 'google/gemma-2-27b-it': 'Gemma 2 27B', + 'google/gemma-2-9b-it': 'Gemma 2 9B', + 'google/gemini-flash-1.5': 'Gemini Flash 1.5', + 'google/gemini-flash-1.5-8b': 'Gemini Flash 1.5 8B', + 'google/gemini-pro-1.5': 'Gemini Pro 1.5', + // OpenRouter - Meta models + 'meta-llama/llama-4-maverick-17b-128e-instruct': 'Llama 4 Maverick 17B', + 'meta-llama/llama-4-scout-17b-16e-instruct': 'Llama 4 Scout 17B', + 'meta-llama/llama-3.3-70b-instruct': 'Llama 3.3 70B', + 'meta-llama/llama-3.2-90b-vision-instruct': 'Llama 3.2 90B Vision', + 'meta-llama/llama-3.2-11b-vision-instruct': 'Llama 3.2 11B Vision', + 'meta-llama/llama-3.2-3b-instruct': 'Llama 3.2 3B', + 'meta-llama/llama-3.2-1b-instruct': 'Llama 3.2 1B', + 'meta-llama/llama-3.1-405b-instruct': 'Llama 3.1 405B', + 'meta-llama/llama-3.1-70b-instruct': 'Llama 3.1 70B', + 'meta-llama/llama-3.1-8b-instruct': 'Llama 3.1 8B', + 'meta-llama/llama-3-70b-instruct': 'Llama 3 70B', + 'meta-llama/llama-3-8b-instruct': 'Llama 3 8B', + 'meta-llama/llama-guard-4-12b': 'Llama Guard 4 12B', + 'meta-llama/llama-guard-3-8b': 'Llama Guard 3 8B', + 'meta-llama/llama-guard-2-8b': 'Llama Guard 2 8B', + // OpenRouter - DeepSeek models + 'deepseek/deepseek-r1': 'DeepSeek R1', + 'deepseek/deepseek-r1-0528': 'DeepSeek R1 0528', + 'deepseek/deepseek-r1-distill-llama-70b': 'DeepSeek R1 Distill Llama 70B', + 'deepseek/deepseek-r1-distill-llama-8b': 'DeepSeek R1 Distill Llama 8B', + 'deepseek/deepseek-r1-distill-qwen-32b': 'DeepSeek R1 Distill Qwen 32B', + 'deepseek/deepseek-r1-distill-qwen-14b': 'DeepSeek R1 Distill Qwen 14B', + 'deepseek/deepseek-r1-distill-qwen-7b': 'DeepSeek R1 Distill Qwen 7B', + 'deepseek/deepseek-r1-distill-qwen-1.5b': 'DeepSeek R1 Distill Qwen 1.5B', + 'deepseek/deepseek-chat-v3': 'DeepSeek Chat V3', + 'deepseek/deepseek-v3-base': 'DeepSeek V3 Base', + 'deepseek/deepseek-prover-v2': 'DeepSeek Prover V2', + // OpenRouter - Mistral models + 'mistralai/mistral-small-3.2-24b-instruct-2506': 'Mistral Small 3.2 24B', + 'mistralai/magistral-small-2506': 'Magistral Small', + 'mistralai/magistral-medium-2506': 'Magistral Medium', + 'mistralai/devstral-small-2505': 'Devstral Small', + 'mistralai/mistral-medium-3': 'Mistral Medium 3', + 'mistralai/mistral-small-3.1-24b-instruct-2503': 'Mistral Small 3.1 24B', + 'mistralai/mistral-saba-2502': 'Mistral Saba', + 'mistralai/mistral-small-24b-instruct-2501': 'Mistral Small 24B', + 'mistralai/codestral-2501': 'Codestral', + 'mistralai/mistral-large-2411': 'Mistral Large 2411', + 'mistralai/mistral-large-2407': 'Mistral Large 2407', + 'mistralai/pixtral-large-2411': 'Pixtral Large', + 'mistralai/pixtral-12b': 'Pixtral 12B', + 'mistralai/ministral-8b': 'Ministral 8B', + 'mistralai/ministral-3b': 'Ministral 3B', + 'mistralai/mistral-nemo': 'Mistral Nemo', + 'mistralai/mistral-large': 'Mistral Large', + 'mistralai/mixtral-8x22b-instruct': 'Mixtral 8x22B', + 'mistralai/mixtral-8x7b-instruct': 'Mixtral 8x7B', + 'mistralai/mistral-7b-instruct': 'Mistral 7B', + // OpenRouter - xAI models + 'x-ai/grok-3': 'Grok 3', + 'x-ai/grok-3-mini': 'Grok 3 Mini', + 'x-ai/grok-3-beta': 'Grok 3 Beta', + 'x-ai/grok-3-mini-beta': 'Grok 3 Mini Beta', + 'x-ai/grok-2-vision-1212': 'Grok 2 Vision', + 'x-ai/grok-2-1212': 'Grok 2', + 'x-ai/grok-vision-beta': 'Grok Vision Beta', + // OpenRouter - Qwen models + 'qwen/qwen3-235b-a22b-04-28': 'Qwen3 235B', + 'qwen/qwen3-32b-04-28': 'Qwen3 32B', + 'qwen/qwen3-30b-a3b-04-28': 'Qwen3 30B', + 'qwen/qwen3-14b-04-28': 'Qwen3 14B', + 'qwen/qwen3-8b-04-28': 'Qwen3 8B', + 'qwen/qwen2.5-vl-72b-instruct': 'Qwen2.5 VL 72B', + 'qwen/qwen2.5-vl-32b-instruct': 'Qwen2.5 VL 32B', + 'qwen/qwen-2.5-coder-32b-instruct': 'Qwen 2.5 Coder 32B', + 'qwen/qwen-2.5-72b-instruct': 'Qwen 2.5 72B', + 'qwen/qwen-2.5-7b-instruct': 'Qwen 2.5 7B', + 'qwen/qwen-2-72b-instruct': 'Qwen 2 72B', + 'qwen/qwen-2-vl-7b-instruct': 'Qwen 2 VL 7B', + 'qwen/qwq-32b': 'QwQ 32B', + 'qwen/qwq-32b-preview': 'QwQ 32B Preview', + 'qwen/qwen-vl-max-2025-01-25': 'Qwen VL Max', + 'qwen/qwen-vl-plus': 'Qwen VL Plus', + 'qwen/qwen-max-2025-01-25': 'Qwen Max', + 'qwen/qwen-plus-2025-01-25': 'Qwen Plus', + 'qwen/qwen-turbo-2024-11-01': 'Qwen Turbo', + // OpenRouter - Perplexity models + 'perplexity/sonar-reasoning-pro': 'Sonar Reasoning Pro', + 'perplexity/sonar-pro': 'Sonar Pro', + 'perplexity/sonar-deep-research': 'Sonar Deep Research', + 'perplexity/sonar-reasoning': 'Sonar Reasoning', + 'perplexity/sonar': 'Sonar', + 'perplexity/r1-1776': 'R1-1776', + 'perplexity/llama-3.1-sonar-large-128k-online': 'Llama 3.1 Sonar Large Online', + 'perplexity/llama-3.1-sonar-small-128k-online': 'Llama 3.1 Sonar Small Online', + // OpenRouter - Microsoft models + 'microsoft/phi-4-reasoning-plus-04-30': 'Phi-4 Reasoning Plus', + 'microsoft/mai-ds-r1': 'MAI-DS-R1', + 'microsoft/phi-4-multimodal-instruct': 'Phi-4 Multimodal', + 'microsoft/phi-4': 'Phi-4', + 'microsoft/phi-3.5-mini-128k-instruct': 'Phi-3.5 Mini', + 'microsoft/phi-3-medium-128k-instruct': 'Phi-3 Medium', + 'microsoft/phi-3-mini-128k-instruct': 'Phi-3 Mini', + 'microsoft/wizardlm-2-8x22b': 'WizardLM-2 8x22B', + // OpenRouter - NVIDIA models + 'nvidia/llama-3.3-nemotron-super-49b-v1': 'Llama 3.3 Nemotron Super 49B', + 'nvidia/llama-3.1-nemotron-ultra-253b-v1': 'Llama 3.1 Nemotron Ultra 253B', + 'nvidia/llama-3.1-nemotron-70b-instruct': 'Llama 3.1 Nemotron 70B', + // OpenRouter - Other models + 'minimax/minimax-01': 'MiniMax-01', + 'minimax/minimax-m1': 'MiniMax-M1', + 'liquid/lfm-40b': 'LFM 40B', + 'liquid/lfm-7b': 'LFM 7B', + 'liquid/lfm-3b': 'LFM 3B', + 'cohere/command-a-03-2025': 'Command A', + 'cohere/command-r7b-12-2024': 'Command R7B', + 'cohere/command-r-plus': 'Command R Plus', + 'cohere/command-r': 'Command R', + 'amazon/nova-pro-v1': 'Nova Pro', + 'amazon/nova-lite-v1': 'Nova Lite', + 'amazon/nova-micro-v1': 'Nova Micro', + 'ai21/jamba-1.6-large': 'Jamba 1.6 Large', + 'ai21/jamba-1.6-mini': 'Jamba 1.6 Mini', + '01-ai/yi-large': 'Yi Large', + 'inflection/inflection-3-productivity': 'Inflection 3 Productivity', + 'inflection/inflection-3-pi': 'Inflection 3 Pi', + 'rekaai/reka-flash-3': 'Reka Flash 3', + 'openrouter/auto': 'Auto (Best Available)' + }; + + return modelNames[model] || model; + } +} \ No newline at end of file diff --git a/src/services/chatMessageService.ts b/src/services/chatMessageService.ts new file mode 100644 index 0000000..8f9f605 --- /dev/null +++ b/src/services/chatMessageService.ts @@ -0,0 +1,457 @@ +import * as vscode from 'vscode'; +import { ClaudeCodeService } from './claudeCodeService'; +import { AgentService } from '../types/agent'; +import { CoreMessage } from 'ai'; +import { Logger } from './logger'; + +export class ChatMessageService { + private currentRequestController?: AbortController; + + constructor( + private agentService: AgentService, + private outputChannel: vscode.OutputChannel + ) {} + + async handleChatMessage(message: any, webview: vscode.Webview): Promise { + try { + const chatHistory: CoreMessage[] = message.chatHistory || []; + const latestMessage = message.message || ''; + const messageContent = message.messageContent || latestMessage; + + console.log('========chatHistory', chatHistory); + + Logger.info(`Chat message received with ${chatHistory.length} history messages`); + Logger.info(`Latest message: ${latestMessage}`); + + // Debug structured content + if (typeof messageContent !== 'string' && Array.isArray(messageContent)) { + Logger.info(`Structured content: ${messageContent.length} parts`); + messageContent.forEach((part, index) => { + if (part.type === 'text') { + Logger.info(` [${index}] text: "${part.text?.substring(0, 100)}..."`); + } else if (part.type === 'image') { + Logger.info(` [${index}] image: ${part.mimeType || 'unknown type'} (${part.image?.length || 0} chars)`); + } + }); + } else { + Logger.info(`Simple text content: ${String(messageContent).substring(0, 100)}...`); + } + + // Create new AbortController for this request + this.currentRequestController = new AbortController(); + + // Send initial streaming start message + webview.postMessage({ + command: 'chatStreamStart' + }); + + // Debug log chat history with VS Code output channel + this.outputChannel.appendLine('=== CHAT HISTORY DEBUG ==='); + this.outputChannel.appendLine(`📥 Input: ${chatHistory.length} CoreMessage messages`); + + // Log each message + this.outputChannel.appendLine('📋 Chat history:'); + chatHistory.forEach((msg, index) => { + const content = typeof msg.content === 'string' ? msg.content : + Array.isArray(msg.content) ? + msg.content.map(part => + part.type === 'text' ? part.text?.substring(0, 50) + '...' : + part.type === 'tool-call' ? `[tool-call: ${part.toolName}]` : + part.type === 'tool-result' ? `[tool-result: ${part.toolName}]` : + `[${part.type}]` + ).join(', ') : + '[complex content]'; + + this.outputChannel.appendLine(` [${index}] ${msg.role}: "${content.substring(0, 100)}..."`); + }); + + this.outputChannel.appendLine('=== END CHAT HISTORY DEBUG ==='); + + // Use conversation history or single prompt + let response: any[]; + if (chatHistory.length > 0) { + // Use conversation history - CoreMessage format is already compatible + this.outputChannel.appendLine(`Using conversation history with ${chatHistory.length} messages`); + response = await this.agentService.query( + undefined, // no prompt + chatHistory, // use CoreMessage array directly + undefined, + this.currentRequestController, + (streamMessage: any) => { + // Process and send each message as it arrives + this.handleStreamMessage(streamMessage, webview); + } + ); + } else { + // Fallback to single prompt for first message + this.outputChannel.appendLine('No conversation history, using single prompt'); + response = await this.agentService.query( + latestMessage, // use latest message as prompt + undefined, // no messages array + undefined, + this.currentRequestController, + (streamMessage: any) => { + // Process and send each message as it arrives + this.handleStreamMessage(streamMessage, webview); + } + ); + } + + // Check if request was aborted + if (this.currentRequestController.signal.aborted) { + Logger.warn('Request was aborted'); + return; + } + + Logger.info(`Agent response completed with ${response.length} total messages`); + + // Send stream end message + webview.postMessage({ + command: 'chatStreamEnd' + }); + + } catch (error) { + // Check if the error is due to abort + if (this.currentRequestController?.signal.aborted) { + Logger.info('Request was stopped by user'); + webview.postMessage({ + command: 'chatStopped' + }); + return; + } + + Logger.error(`Chat message failed: ${error}`); + Logger.error(`Error type: ${typeof error}, constructor: ${error?.constructor?.name}`); + + // Check if this is an API key authentication error or process failure + const errorMessage = error instanceof Error ? error.message : String(error); + Logger.error(`Processing error message: "${errorMessage}"`); + if (this.agentService.isApiKeyAuthError(errorMessage) || !this.agentService.hasApiKey()) { + // Determine which provider is currently selected to show specific error + const config = vscode.workspace.getConfiguration('superdesign'); + const specificModel = config.get('aiModel'); + const provider = config.get('aiModelProvider', 'anthropic'); + + // Determine provider from model name if specific model is set + let effectiveProvider = provider; + let providerName = 'AI'; + let configureCommand = 'superdesign.configureApiKey'; + + if (specificModel) { + if (specificModel.includes('/')) { + effectiveProvider = 'openrouter'; + } else if (specificModel.startsWith('claude-')) { + effectiveProvider = 'anthropic'; + } else { + effectiveProvider = 'openai'; + } + } + + switch (effectiveProvider) { + case 'openrouter': + providerName = 'OpenRouter'; + configureCommand = 'superdesign.configureOpenRouterApiKey'; + break; + case 'anthropic': + providerName = 'Anthropic'; + configureCommand = 'superdesign.configureApiKey'; + break; + case 'openai': + providerName = 'OpenAI'; + configureCommand = 'superdesign.configureOpenAIApiKey'; + break; + } + + const hasApiKey = this.agentService.hasApiKey(); + const displayMessage = hasApiKey ? + `Invalid ${providerName} API key. Please check your configuration.` : + `${providerName} API key not configured. Please set up your API key to use this AI model.`; + + webview.postMessage({ + command: 'chatErrorWithActions', + error: displayMessage, + actions: [ + { text: `Configure ${providerName} API Key`, command: configureCommand }, + { text: 'Open Settings', command: 'workbench.action.openSettings', args: '@ext:iganbold.superdesign' } + ] + }); + } else { + // Regular error - show standard error message + vscode.window.showErrorMessage(`Chat failed: ${error}`); + webview.postMessage({ + command: 'chatError', + error: errorMessage + }); + } + } finally { + // Clear the controller when done + this.currentRequestController = undefined; + } + } + + private handleStreamMessage(message: CoreMessage, webview: vscode.Webview): void { + Logger.debug(`Handling CoreMessage: ${JSON.stringify(message, null, 2)}`); + + // Check if this is an update to existing message + const isUpdate = (message as any)._isUpdate; + const updateToolId = (message as any)._updateToolId; + + // Handle assistant messages + if (message.role === 'assistant') { + if (typeof message.content === 'string') { + // Simple text content + if (message.content.trim()) { + webview.postMessage({ + command: 'chatResponseChunk', + messageType: 'assistant', + content: message.content, + metadata: {} + }); + } + } else if (Array.isArray(message.content)) { + // Handle assistant content array (text parts, tool calls, etc.) + for (const part of message.content) { + if (part.type === 'text' && (part as any).text) { + // Send text content + webview.postMessage({ + command: 'chatResponseChunk', + messageType: 'assistant', + content: (part as any).text, + metadata: {} + }); + } else if (part.type === 'tool-call') { + // Send tool call or update + const toolPart = part as any; + const command = isUpdate ? 'chatToolUpdate' : 'chatResponseChunk'; + const messageType = isUpdate ? undefined : 'tool-call'; + + if (isUpdate) { + // Send tool parameter update + webview.postMessage({ + command: 'chatToolUpdate', + tool_use_id: toolPart.toolCallId, + tool_input: toolPart.args + }); + } else { + // Send new tool call message + webview.postMessage({ + command: 'chatResponseChunk', + messageType: 'tool-call', + content: '', + metadata: { + tool_name: toolPart.toolName, + tool_id: toolPart.toolCallId, + tool_input: toolPart.args + } + }); + } + } + } + } + } + + // Handle tool messages (CoreToolMessage) + if (message.role === 'tool' && Array.isArray(message.content)) { + for (const toolResultPart of message.content) { + if (toolResultPart.type === 'tool-result') { + const part = toolResultPart as any; + const content = typeof part.result === 'string' ? + part.result : + JSON.stringify(part.result, null, 2); + + Logger.debug(`Tool result for ${part.toolCallId}: "${content.substring(0, 200)}..."`); + + // Send tool result to frontend + webview.postMessage({ + command: 'chatResponseChunk', + messageType: 'tool-result', + content: content, + metadata: { + tool_id: part.toolCallId, + tool_name: part.toolName, + is_error: part.isError || false + } + }); + + // Also send completion signal + webview.postMessage({ + command: 'chatToolResult', + tool_use_id: part.toolCallId, + content: content, + is_error: part.isError || false + }); + } + } + } + + // Handle user messages + if (message.role === 'user') { + if (typeof message.content === 'string' && message.content.trim()) { + webview.postMessage({ + command: 'chatResponseChunk', + messageType: 'user', + content: message.content, + metadata: {} + }); + } + } + + // Skip other message types (system, etc.) + } + + // Legacy handler for backward compatibility + private handleLegacyResultMessage(message: any, webview: vscode.Webview): void { + if (message.type === 'result') { + Logger.debug(`Result message structure: ${JSON.stringify(message, null, 2)}`); + + // Skip error result messages that contain raw API key errors - these are handled by our custom error handler + if (message.is_error) { + // Check if this is an API key related error in any field + const messageStr = JSON.stringify(message).toLowerCase(); + if (messageStr.includes('api key') || messageStr.includes('authentication') || + messageStr.includes('unauthorized') || messageStr.includes('anthropic') || + messageStr.includes('process exited') || messageStr.includes('exit code')) { + Logger.debug('Skipping raw API key error result message - handled by custom error handler'); + return; + } + } + + // Skip final success result messages that are just summaries + if (message.subtype === 'success' && message.result && typeof message.result === 'string') { + const resultText = message.result.toLowerCase(); + // Skip if it looks like a final summary (contains phrases like "successfully created", "perfect", etc.) + if (resultText.includes('successfully') || resultText.includes('perfect') || + resultText.includes('created') || resultText.includes('variations')) { + Logger.debug('Skipping final summary result message'); + return; + } + } + + let content = ''; + let resultType = 'result'; + let isError = false; + + if (typeof message.message === 'string') { + content = message.message; + } else if (message.content) { + content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content); + } else if (message.text) { + content = message.text; + } else if (message.result && typeof message.result === 'string') { + content = message.result; + } else { + // Skip messages that would result in raw JSON dump + Logger.debug('Skipping result message with no readable content'); + return; + } + + // Determine result type and error status + if (message.subtype) { + if (message.subtype.includes('error')) { + isError = true; + resultType = 'error'; + } else if (message.subtype === 'success') { + resultType = 'success'; + } + } + + Logger.debug(`Extracted result content: "${content.substring(0, 200)}..."`); + + if (content.trim()) { + webview.postMessage({ + command: 'chatResponseChunk', + messageType: 'tool-result', + content: content, + metadata: { + session_id: message.session_id, + parent_tool_use_id: message.parent_tool_use_id, + result_type: resultType, + is_error: isError, + duration_ms: message.duration_ms, + total_cost_usd: message.total_cost_usd + } + }); + } + } + + // Log tool activity + if ((message.type === 'assistant' || message.type === 'user') && ('subtype' in message) && (message.subtype === 'tool_use' || message.subtype === 'tool_result')) { + Logger.debug(`Tool activity detected: ${message.subtype}`); + } + } + + async stopCurrentChat(webview: vscode.Webview): Promise { + if (this.currentRequestController) { + Logger.info('Stopping current chat request'); + this.currentRequestController.abort(); + + // Send stopped message back to webview + webview.postMessage({ + command: 'chatStopped' + }); + } else { + Logger.info('No active chat request to stop'); + } + } + + private processClaudeResponse(response: any[]): string { + let fullResponse = ''; + let assistantMessages: string[] = []; + let toolResults: string[] = []; + + for (const msg of response) { + const subtype = 'subtype' in msg ? msg.subtype : undefined; + Logger.debug(`Processing message type: ${msg.type}${subtype ? `, subtype: ${subtype}` : ''}`); + + // Collect assistant messages + if (msg.type === 'assistant' && msg.message) { + let content = ''; + + if (typeof msg.message === 'string') { + content = msg.message; + } else if (msg.message.content && Array.isArray(msg.message.content)) { + content = msg.message.content + .filter((item: any) => item.type === 'text') + .map((item: any) => item.text) + .join('\n'); + } else if (msg.message.content && typeof msg.message.content === 'string') { + content = msg.message.content; + } + + if (content.trim()) { + assistantMessages.push(content); + } + } + + // Collect tool results + if (msg.type === 'result' && msg.subtype === 'success' && msg.result) { + const result = typeof msg.result === 'string' ? msg.result : JSON.stringify(msg.result, null, 2); + toolResults.push(result); + } + + // Handle tool usage messages + if ((msg.type === 'assistant' || msg.type === 'user') && ('subtype' in msg) && (msg.subtype === 'tool_use' || msg.subtype === 'tool_result')) { + Logger.debug(`Tool activity detected: ${msg.subtype}`); + } + } + + // Combine all responses + if (assistantMessages.length > 0) { + fullResponse = assistantMessages.join('\n\n'); + } + + if (toolResults.length > 0 && !fullResponse.includes(toolResults[0])) { + if (fullResponse) { + fullResponse += '\n\n--- Tool Results ---\n' + toolResults.join('\n\n'); + } else { + fullResponse = toolResults.join('\n\n'); + } + } + + if (!fullResponse) { + fullResponse = 'I processed your request but didn\'t generate a visible response. Check the console for details.'; + } + + return fullResponse; + } +} \ No newline at end of file diff --git a/src/services/claudeCodeService.ts b/src/services/claudeCodeService.ts new file mode 100644 index 0000000..d3ae33c --- /dev/null +++ b/src/services/claudeCodeService.ts @@ -0,0 +1,458 @@ +// This is deprecated, use customAgentService instead + +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as fs from 'fs'; +import * as os from 'os'; +import { Logger } from './logger'; + +// Dynamic import types for Claude Code +type SDKMessage = any; // Will be properly typed when imported +type ClaudeCodeOptions = any; // Will be properly typed when imported +type QueryFunction = (params: { + prompt: string; + abortController?: AbortController; + options?: any; +}) => AsyncGenerator; + +export class ClaudeCodeService { + private isInitialized = false; + private initializationPromise: Promise | null = null; + private workingDirectory: string = ''; + private outputChannel: vscode.OutputChannel; + private currentSessionId: string | null = null; + private claudeCodeQuery: QueryFunction | null = null; + + constructor(outputChannel: vscode.OutputChannel) { + this.outputChannel = outputChannel; + // Initialize on construction + this.initializationPromise = this.initialize(); + } + + private async initialize(): Promise { + if (this.isInitialized) { + return; + } + + try { + Logger.info('Starting Claude Code initialization...'); + + if (os.platform() === 'win32') { + throw new Error('Claude Code is not supported on Windows.'); + } + + // Setup working directory first + await this.setupWorkingDirectory(); + + // Check if API key is configured + const config = vscode.workspace.getConfiguration('superdesign'); + const apiKey = config.get('anthropicApiKey'); + + if (!apiKey) { + Logger.warn('No API key found'); + throw new Error('Missing API key'); + } + + // Set the environment variable for Claude Code SDK + process.env.ANTHROPIC_API_KEY = apiKey; + + // Dynamically import Claude Code SDK + Logger.info('Importing Claude Code SDK...'); + // try { + // // Try importing from the copied module location first + // let claudeCodeModule; + // try { + // // Try multiple possible paths for the extension location + // const possiblePaths = [ + // path.resolve(__dirname, '..', 'node_modules', '@anthropic-ai', 'claude-code', 'sdk.mjs'), + // path.resolve(__dirname, 'node_modules', '@anthropic-ai', 'claude-code', 'sdk.mjs'), + // path.join(__dirname, '..', 'node_modules', '@anthropic-ai', 'claude-code', 'sdk.mjs') + // ]; + + // let importSucceeded = false; + // for (const modulePath of possiblePaths) { + // try { + // if (fs.existsSync(modulePath)) { + // claudeCodeModule = await import(`file://${modulePath}`); + // importSucceeded = true; + // break; + // } + // } catch (pathError) { + // continue; + // } + // } + + // if (!importSucceeded) { + // throw new Error('All local import paths failed'); + // } + // } catch (localImportError) { + // // Fallback to standard import + // try { + // // claudeCodeModule = await import('@anthropic-ai/claude-code'); + // } catch (standardImportError) { + // Logger.error(`Claude Code SDK import failed: ${standardImportError}`); + // throw standardImportError; + // } + // } + + // this.claudeCodeQuery = claudeCodeModule.query; + + // if (!this.claudeCodeQuery) { + // throw new Error('Query function not found in Claude Code module'); + // } + + // Logger.info('Claude Code SDK imported successfully'); + // } catch (importError) { + // Logger.error(`Failed to import Claude Code SDK: ${importError}`); + // throw new Error(`Claude Code SDK import failed: ${importError}`); + // } + + this.isInitialized = true; + Logger.info('Claude Code SDK initialized successfully'); + } catch (error) { + Logger.error(`Failed to initialize Claude Code SDK: ${error}`); + + // Check if this is an API key related error (no UI popup needed here as error will be handled in chat) + const errorMessage = error instanceof Error ? error.message : String(error); + if (!this.isApiKeyAuthError(errorMessage)) { + vscode.window.showErrorMessage(`Failed to initialize Claude Code: ${error}`); + } + + // Reset initialization promise so it can be retried + this.initializationPromise = null; + this.isInitialized = false; + throw error; + } + } + + private async setupWorkingDirectory(): Promise { + try { + // Try to get workspace root first + const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + + if (workspaceRoot) { + // Create .superdesign folder in workspace root + const superdesignDir = path.join(workspaceRoot, '.superdesign'); + + // Create directory if it doesn't exist + if (!fs.existsSync(superdesignDir)) { + fs.mkdirSync(superdesignDir, { recursive: true }); + Logger.info(`Created .superdesign directory: ${superdesignDir}`); + } + + this.workingDirectory = superdesignDir; + } else { + Logger.warn('No workspace root found, using temporary directory'); + // Fallback to OS temp directory if no workspace + const tempDir = path.join(os.tmpdir(), 'superdesign-claude'); + + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + Logger.info(`Created temporary directory: ${tempDir}`); + } + + this.workingDirectory = tempDir; + + vscode.window.showWarningMessage( + 'No workspace folder found. Using temporary directory for Claude Code operations.' + ); + } + } catch (error) { + Logger.error(`Failed to setup working directory: ${error}`); + // Final fallback to current working directory + this.workingDirectory = process.cwd(); + Logger.warn(`Using current working directory as fallback: ${this.workingDirectory}`); + } + } + + private async ensureInitialized(): Promise { + if (this.initializationPromise) { + await this.initializationPromise; + } + if (!this.isInitialized || !this.claudeCodeQuery) { + // Try to initialize if not already done + if (!this.initializationPromise) { + this.initializationPromise = this.initialize(); + await this.initializationPromise; + } else { + throw new Error('Claude Code SDK not initialized'); + } + } + } + + async query(prompt?: string, conversationMessages?: any, options?: Partial, abortController?: AbortController, onMessage?: (message: SDKMessage) => void): Promise { + // ClaudeCodeService handles conversation via internal session management + // so we ignore conversationMessages and just use the prompt + + if (!prompt) { + throw new Error('ClaudeCodeService requires a prompt parameter'); + } + + Logger.info('=== QUERY FUNCTION CALLED ==='); + Logger.info(`Query prompt: ${prompt.substring(0, 200)}...`); + Logger.info(`Query options: ${JSON.stringify(options, null, 2)}`); + Logger.info(`Streaming enabled: ${!!onMessage}`); + + if (conversationMessages) { + Logger.info('Note: ClaudeCodeService ignores conversationMessages (uses internal session management)'); + } + + await this.ensureInitialized(); + + const messages: SDKMessage[] = []; + const systemPrompt = `# Role +You are a **senior front-end designer**. +You pay close attention to every pixel, spacing, font, color; +Whenever there are UI implementation task, think deeply of the design style first, and then implement UI bit by bit + +# When asked to create design: +1. You ALWAYS spin up 3 parallel sub agents concurrently to implemeht one design with variations, so it's faster for user to iterate (Unless specifically asked to create only one version) + + +1. Build one single html page of just one screen to build a design based on users' feedback/task +2. You ALWAYS output design files in '.superdesign/design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file +3. If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. + + +## When asked to design UI: +1. Similar process as normal design task, but refer to 'UI design & implementation guidelines' for guidelines + +## When asked to update or iterate design: +1. Don't edit the existing design, just create a new html file with the same name but with _n.html appended to the end, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +2. At default you should spin up 3 parallel sub agents concurrently to try implement the design, so it's faster for user to iterate + +## When asked to design logo or icon: +1. Copy/duplicate existing svg file but name it based on our naming convention in design_ierations folder, and then make edits to the copied svg file (So we can avoid lots of mistakes), like 'original_filename.svg .superdesign/design-iterations/new_filename.svg' +2. Very important sub agent copy first, and Each agent just copy & edit a single svg file with svg code +3. you should focus on the the correctness of the svg code + +## When asked to design a component: +1. Similar process as normal design task, and each agent just create a single html page with component inside; +2. Focus just on just one component itself, and don't add any other elements or text +3. Each HTML just have one component with mock data inside + +## When asked to design wireframes: +1. Focus on minimal line style black and white wireframes, no colors, and never include any images, just try to use css to make some placeholder images. (Don't use service like placehold.co too, we can't render it) +2. Don't add any annotation of styles, just basic wireframes like Balsamiq style +3. Focus on building out the flow of the wireframes + +# When asked to extract design system from images: +Your goal is to extract a generalized and reusable design system from the screenshots provided, **without including specific image content**, so that frontend developers or AI agents can reference the JSON as a style foundation for building consistent UIs. + +1. Analyze the screenshots provided: + * Color palette + * Typography rules + * Spacing guidelines + * Layout structure (grids, cards, containers, etc.) + * UI components (buttons, inputs, tables, etc.) + * Border radius, shadows, and other visual styling patterns +2. Create a design-system.json file in 'design_system' folder that clearly defines these rules and can be used to replicate the visual language in a consistent way. +3. if design-system.json already exist, then create a new file with the name design-system_{n}.json (Where n needs to be unique like design-system_1.json, design-system_2.json, etc.) + +**Constraints** + +* Do **not** extract specific content from the screenshots (no text, logos, icons). +* Focus purely on *design principles*, *structure*, and *styles*. + +-------- + +# UI design & implementation guidelines: + +## Design Style +- A **perfect balance** between **elegant minimalism** and **functional design**. +- **Soft, refreshing gradient colors** that seamlessly integrate with the brand palette. +- **Well-proportioned white space** for a clean layout. +- **Light and immersive** user experience. +- **Clear information hierarchy** using **subtle shadows and modular card layouts**. +- **Natural focus on core functionalities**. +- **Refined rounded corners**. +- **Delicate micro-interactions**. +- **Comfortable visual proportions**. +- **Responsive design** You only output responsive design, it needs to look perfect on both mobile, tablet and desktop. + - If its a mobile app, also make sure you have responsive design OR make the center the mobile UI + +## Technical Specifications +1. **Images**: do NEVER include any images, we can't render images in webview,just try to use css to make some placeholder images. (Don't use service like placehold.co too, we can't render it) +2. **Styles**: Use **Tailwind CSS** via **CDN** for styling. (Use !important declarations for critical design tokens that must not be overridden, Load order management - ensure custom styles load after framework CSS, CSS-in-JS or scoped styles to avoid global conflicts, Use utility-first approach - define styles using Tailwind classes instead of custom CSS when possible) +3. **Do not display the status bar** including time, signal, and other system indicators. +4. **All text should be only black or white**. +5. Choose a **4 pt or 8 pt spacing system**—all margins, padding, line-heights, and element sizes must be exact multiples. +6. Use **consistent spacing tokens** (e.g., 4, 8, 16, 24, 32px) — never arbitrary values like 5 px or 13 px. +7. Apply **visual grouping** ("spacing friendship"): tighter gaps (4–8px) for related items, larger gaps (16–24px) for distinct groups. +8. Ensure **typographic rhythm**: font‑sizes, line‑heights, and spacing aligned to the grid (e.g., 16 px text with 24 px line-height). +9. Maintain **touch-area accessibility**: buttons and controls should meet or exceed 48×48 px, padded using grid units. + +## 🎨 Color Style +* Use a **minimal palette**: default to **black, white, and neutrals**—no flashy gradients or mismatched hues . +* Follow a **60‑30‑10 ratio**: \~60% background (white/light gray), \~30% surface (white/medium gray), \~10% accents (charcoal/black) . +* Accent colors limited to **one subtle tint** (e.g., charcoal black or very soft beige). Interactive elements like links or buttons use this tone sparingly. +* Always check **contrast** for text vs background via WCAG (≥4.5:1) + +## ✍️ Typography & Hierarchy + +### 1. 🎯 Hierarchy Levels & Structure +* Always define at least **three typographic levels**: **Heading (H1)**, **Subheading (H2)**, and **Body**. +* Use **size, weight, color**, and **spacing** to create clear differences between them ([toptal.com][1], [skyryedesign.com][2]). +* H1 should stand out clearly (largest & boldest), H2 should be distinctly smaller/medium-weight, and body remains readable and lighter. + +### 2. 📏 Size & Scale +* Follow a modular scale: e.g., **H1: 36px**, **H2: 28px**, **Body: 16px** (min). Adjust for mobile if needed . +* Maintain strong contrast—don't use size differences of only 2px; aim for at least **6–8px difference** between levels . + +### 3. 🧠 Weight, Style & Color +* Use **bold or medium weight** for headings, **regular** for body. +* Utilize **color contrast** (e.g., darker headings, neutral body) to support hierarchy ([mews.design][3], [toptal.com][1]). +* Avoid excessive styles like italics or uppercase—unless used sparingly for emphasis or subheadings. + +### 4. ✂️ Spacing & Rhythm +* Add **0.8×–1.5× line-height** for body and headings to improve legibility ([skyryedesign.com][2]). +* Use consistent **margin spacing above/below headings** (e.g., margin-top: 1.2× line-height) . + +`; + + try { + const finalOptions: Partial = { + maxTurns: 10, + allowedTools: [ + 'Read', 'Write', 'Edit', 'MultiEdit', 'Bash', 'LS', 'Grep', 'Glob' + ], + permissionMode: 'acceptEdits' as const, + cwd: this.workingDirectory, + customSystemPrompt: systemPrompt, + ...options + }; + + if (this.currentSessionId) { + finalOptions.resume = this.currentSessionId; + } + + const queryParams = { + prompt: prompt!, // Non-null assertion since we checked above + abortController: abortController || new AbortController(), + options: finalOptions + }; + + if (!this.claudeCodeQuery) { + throw new Error('Claude Code SDK not properly initialized - query function not available'); + } + + for await (const message of this.claudeCodeQuery(queryParams)) { + messages.push(message as SDKMessage); + + // Call the streaming callback if provided + if (onMessage) { + try { + onMessage(message as SDKMessage); + } catch (callbackError) { + Logger.error(`Streaming callback error: ${callbackError}`); + // Don't break the loop if callback fails + } + } + } + + const lastMessageWithSessionId = [...messages].reverse().find(m => 'session_id' in m && m.session_id); + if (lastMessageWithSessionId && 'session_id' in lastMessageWithSessionId && lastMessageWithSessionId.session_id) { + this.currentSessionId = lastMessageWithSessionId.session_id; + } + + Logger.info(`Query completed successfully. Received ${messages.length} messages`); + return messages; + } catch (error) { + Logger.error(`Claude Code query failed: ${error}`); + + // Check if this is an API key authentication error (handled in chat interface) + const errorMessage = error instanceof Error ? error.message : String(error); + if (!this.isApiKeyAuthError(errorMessage)) { + vscode.window.showErrorMessage(`Claude Code query failed: ${error}`); + } + throw error; + } + } + + get isReady(): boolean { + return this.isInitialized; + } + + async waitForInitialization(): Promise { + try { + await this.ensureInitialized(); + return true; + } catch (error) { + Logger.error(`Initialization failed: ${error}`); + return false; + } + } + + getWorkingDirectory(): string { + return this.workingDirectory; + } + + // Method to refresh API key from settings and reinitialize if needed + async refreshApiKey(): Promise { + try { + const config = vscode.workspace.getConfiguration('superdesign'); + const apiKey = config.get('anthropicApiKey'); + + if (!apiKey) { + Logger.warn('No API key found during refresh'); + return false; + } + + // Update environment variable + process.env.ANTHROPIC_API_KEY = apiKey; + Logger.info('API key refreshed from settings'); + + // If not initialized yet, try to initialize + if (!this.isInitialized) { + try { + await this.initialize(); + return true; + } catch (error) { + Logger.error(`Failed to initialize after API key refresh: ${error}`); + return false; + } + } + + return true; + } catch (error) { + Logger.error(`Failed to refresh API key: ${error}`); + return false; + } + } + + // Method to check if API key is configured + hasApiKey(): boolean { + const config = vscode.workspace.getConfiguration('superdesign'); + const apiKey = config.get('anthropicApiKey'); + return !!apiKey && apiKey.trim().length > 0; + } + + // Method to detect if an error is related to API key authentication + public isApiKeyAuthError(errorMessage: string): boolean { + const authErrorPatterns = [ + 'authentication failed', + 'invalid api key', + 'unauthorized', + 'api key', + 'authentication error', + 'invalid token', + 'access denied', + '401', + 'ANTHROPIC_API_KEY', + 'process exited with code 1', + 'claude code process exited', + 'exit code 1' + ]; + + const lowercaseMessage = errorMessage.toLowerCase(); + const isAuthError = authErrorPatterns.some(pattern => lowercaseMessage.includes(pattern)); + + Logger.info(`Checking if error is auth-related: "${errorMessage}" -> ${isAuthError}`); + if (isAuthError) { + const matchedPattern = authErrorPatterns.find(pattern => lowercaseMessage.includes(pattern)); + Logger.info(`Matched pattern: "${matchedPattern}"`); + } + + return isAuthError; + } +} \ No newline at end of file diff --git a/src/services/customAgentService.ts b/src/services/customAgentService.ts new file mode 100644 index 0000000..80309c1 --- /dev/null +++ b/src/services/customAgentService.ts @@ -0,0 +1,931 @@ +import { streamText, CoreMessage } from 'ai'; +import { createOpenAI } from '@ai-sdk/openai'; +import { createAnthropic } from '@ai-sdk/anthropic'; +import { createOpenRouter } from '@openrouter/ai-sdk-provider'; +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as fs from 'fs'; +import * as os from 'os'; +import { AgentService, ExecutionContext } from '../types/agent'; +import { createReadTool } from '../tools/read-tool'; +import { createWriteTool } from '../tools/write-tool'; +import { createBashTool } from '../tools/bash-tool'; +import { createEditTool } from '../tools/edit-tool'; +import { createGlobTool } from '../tools/glob-tool'; +import { createGrepTool } from '../tools/grep-tool'; +import { createThemeTool } from '../tools/theme-tool'; +import { createLsTool } from '../tools/ls-tool'; +import { createMultieditTool } from '../tools/multiedit-tool'; + +export class CustomAgentService implements AgentService { + private workingDirectory: string = ''; + private outputChannel: vscode.OutputChannel; + private isInitialized = false; + + constructor(outputChannel: vscode.OutputChannel) { + this.outputChannel = outputChannel; + this.outputChannel.appendLine('CustomAgentService constructor called'); + this.setupWorkingDirectory(); + } + + private async setupWorkingDirectory(): Promise { + try { + // Try to get workspace root first + const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + this.outputChannel.appendLine(`Workspace root detected: ${workspaceRoot}`); + + if (workspaceRoot) { + // Create .superdesign folder in workspace root + const superdesignDir = path.join(workspaceRoot, '.superdesign'); + this.outputChannel.appendLine(`Setting up .superdesign directory at: ${superdesignDir}`); + + // Create directory if it doesn't exist + if (!fs.existsSync(superdesignDir)) { + fs.mkdirSync(superdesignDir, { recursive: true }); + this.outputChannel.appendLine(`Created .superdesign directory: ${superdesignDir}`); + } else { + this.outputChannel.appendLine(`.superdesign directory already exists: ${superdesignDir}`); + } + + this.workingDirectory = superdesignDir; + this.outputChannel.appendLine(`Working directory set to: ${this.workingDirectory}`); + } else { + this.outputChannel.appendLine('No workspace root found, using fallback'); + // Fallback to OS temp directory if no workspace + const tempDir = path.join(os.tmpdir(), 'superdesign-custom'); + + if (!fs.existsSync(tempDir)) { + fs.mkdirSync(tempDir, { recursive: true }); + this.outputChannel.appendLine(`Created temporary superdesign directory: ${tempDir}`); + } + + this.workingDirectory = tempDir; + this.outputChannel.appendLine(`Working directory set to (fallback): ${this.workingDirectory}`); + + vscode.window.showWarningMessage( + 'No workspace folder found. Using temporary directory for Custom Agent operations.' + ); + } + + this.isInitialized = true; + } catch (error) { + this.outputChannel.appendLine(`Failed to setup working directory: ${error}`); + // Final fallback to current working directory + this.workingDirectory = process.cwd(); + this.outputChannel.appendLine(`Working directory set to (final fallback): ${this.workingDirectory}`); + this.isInitialized = true; + } + } + + private getModel() { + const config = vscode.workspace.getConfiguration('superdesign'); + const specificModel = config.get('aiModel'); + const provider = config.get('aiModelProvider', 'anthropic'); + + this.outputChannel.appendLine(`Using AI provider: ${provider}`); + if (specificModel) { + this.outputChannel.appendLine(`Using specific AI model: ${specificModel}`); + } + + // Determine provider from model name if specific model is set + let effectiveProvider = provider; + if (specificModel) { + if (specificModel.includes('/')) { + effectiveProvider = 'openrouter'; + } else if (specificModel.startsWith('claude-')) { + effectiveProvider = 'anthropic'; + } else { + effectiveProvider = 'openai'; + } + } + + switch (effectiveProvider) { + case 'openrouter': + const openrouterKey = config.get('openrouterApiKey'); + if (!openrouterKey) { + throw new Error('OpenRouter API key not configured. Please run "Configure OpenRouter API Key" command.'); + } + + this.outputChannel.appendLine(`OpenRouter API key found: ${openrouterKey.substring(0, 12)}...`); + + const openrouterBaseURL = config.get('openrouterBaseURL'); + const openrouter = createOpenRouter({ + apiKey: openrouterKey, + baseURL: openrouterBaseURL + }); + + // Use specific model if available, otherwise default to Claude 3.7 Sonnet via OpenRouter + const openrouterModel = specificModel || 'anthropic/claude-3-7-sonnet-20250219'; + this.outputChannel.appendLine(`Using OpenRouter model: ${openrouterModel}`); + return openrouter.chat(openrouterModel); + + case 'anthropic': + const anthropicKey = config.get('anthropicApiKey'); + if (!anthropicKey) { + throw new Error('Anthropic API key not configured. Please run "Configure Anthropic API Key" command.'); + } + + this.outputChannel.appendLine(`Anthropic API key found: ${anthropicKey.substring(0, 12)}...`); + + const anthropicBaseURL = config.get('anthropicBaseURL'); + const anthropic = createAnthropic({ + apiKey: anthropicKey, + baseURL: anthropicBaseURL, + }); + + // Use specific model if available, otherwise default to claude-3-5-sonnet + const anthropicModel = specificModel || 'claude-3-5-sonnet-20241022'; + this.outputChannel.appendLine(`Using Anthropic model: ${anthropicModel}`); + return anthropic(anthropicModel); + + case 'openai': + default: + const openaiKey = config.get('openaiApiKey'); + if (!openaiKey) { + throw new Error('OpenAI API key not configured. Please run "Configure OpenAI API Key" command.'); + } + + this.outputChannel.appendLine(`OpenAI API key found: ${openaiKey.substring(0, 7)}...`); + + const openaiBaseURL = config.get('openaiBaseURL'); + + const openai = createOpenAI({ + apiKey: openaiKey, + baseURL: openaiBaseURL, + }); + + // Use specific model if available, otherwise default to gpt-4o + let openaiModel = specificModel || 'gpt-4o'; + if (openaiModel === 'openai-auto') { + openaiModel = config.get('aiModelAuto') || 'gpt-4o'; + this.outputChannel.appendLine(`AUTO model detected, using configured model: ${openaiModel}`); + } + this.outputChannel.appendLine(`Using OpenAI model: ${openaiModel}`); + return openai(openaiModel); + } + } + + private getSystemPrompt(): string { + const config = vscode.workspace.getConfiguration('superdesign'); + const specificModel = config.get('aiModel'); + const provider = config.get('aiModelProvider', 'anthropic'); + + // Determine the actual model name being used + let modelName: string; + if (specificModel) { + modelName = specificModel; + } else { + // Use defaults based on provider + switch (provider) { + case 'openai': + modelName = 'gpt-4o'; + break; + case 'openrouter': + modelName = 'anthropic/claude-3-7-sonnet-20250219'; + break; + case 'anthropic': + default: + modelName = 'claude-3-5-sonnet-20241022'; + break; + } + } + + return `# Role +You are superdesign, a senior frontend designer integrated into VS Code as part of the Super Design extension. +Your goal is to help user generate amazing design using code + +# Current Context +- Extension: Super Design (Design Agent for VS Code) +- AI Model: ${modelName} +- Working directory: ${this.workingDirectory} + +# Instructions +- Use the available tools when needed to help with file operations and code analysis +- When creating design file: + - Build one single html page of just one screen to build a design based on users' feedback/task + - You ALWAYS output design files in 'design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file + - If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +- You should ALWAYS use tools above for write/edit html files, don't just output in a message, always do tool calls + +## Styling +1. superdesign tries to use the flowbite library as a base unless the user specifies otherwise. +2. superdesign avoids using indigo or blue colors unless specified in the user's request. +3. superdesign MUST generate responsive designs. +4. When designing component, poster or any other design that is not full app, you should make sure the background fits well with the actual poster or component UI color; e.g. if component is light then background should be dark, vice versa. +5. Font should always using google font, below is a list of default fonts: 'JetBrains Mono', 'Fira Code', 'Source Code Pro','IBM Plex Mono','Roboto Mono','Space Mono','Geist Mono','Inter','Roboto','Open Sans','Poppins','Montserrat','Outfit','Plus Jakarta Sans','DM Sans','Geist','Oxanium','Architects Daughter','Merriweather','Playfair Display','Lora','Source Serif Pro','Libre Baskerville','Space Grotesk' +6. When creating CSS, make sure you include !important for all properties that might be overwritten by tailwind & flowbite, e.g. h1, body, etc. +7. Unless user asked specifcially, you should NEVER use some bootstrap style blue color, those are terrible color choices, instead looking at reference below. +8. Example theme patterns: +Ney-brutalism style that feels like 90s web design + +:root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0 0 0); + --primary: oklch(0.6489 0.2370 26.9728); + --primary-foreground: oklch(1.0000 0 0); + --secondary: oklch(0.9680 0.2110 109.7692); + --secondary-foreground: oklch(0 0 0); + --muted: oklch(0.9551 0 0); + --muted-foreground: oklch(0.3211 0 0); + --accent: oklch(0.5635 0.2408 260.8178); + --accent-foreground: oklch(1.0000 0 0); + --destructive: oklch(0 0 0); + --destructive-foreground: oklch(1.0000 0 0); + --border: oklch(0 0 0); + --input: oklch(0 0 0); + --ring: oklch(0.6489 0.2370 26.9728); + --chart-1: oklch(0.6489 0.2370 26.9728); + --chart-2: oklch(0.9680 0.2110 109.7692); + --chart-3: oklch(0.5635 0.2408 260.8178); + --chart-4: oklch(0.7323 0.2492 142.4953); + --chart-5: oklch(0.5931 0.2726 328.3634); + --sidebar: oklch(0.9551 0 0); + --sidebar-foreground: oklch(0 0 0); + --sidebar-primary: oklch(0.6489 0.2370 26.9728); + --sidebar-primary-foreground: oklch(1.0000 0 0); + --sidebar-accent: oklch(0.5635 0.2408 260.8178); + --sidebar-accent-foreground: oklch(1.0000 0 0); + --sidebar-border: oklch(0 0 0); + --sidebar-ring: oklch(0.6489 0.2370 26.9728); + --font-sans: DM Sans, sans-serif; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: Space Mono, monospace; + --radius: 0px; + --shadow-2xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-sm: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow-md: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 2px 4px -1px hsl(0 0% 0% / 1.00); + --shadow-lg: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 4px 6px -1px hsl(0 0% 0% / 1.00); + --shadow-xl: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 8px 10px -1px hsl(0 0% 0% / 1.00); + --shadow-2xl: 4px 4px 0px 0px hsl(0 0% 0% / 2.50); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + + +Modern dark mode style like vercel, linear + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.1450 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.1450 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.1450 0 0); + --primary: oklch(0.2050 0 0); + --primary-foreground: oklch(0.9850 0 0); + --secondary: oklch(0.9700 0 0); + --secondary-foreground: oklch(0.2050 0 0); + --muted: oklch(0.9700 0 0); + --muted-foreground: oklch(0.5560 0 0); + --accent: oklch(0.9700 0 0); + --accent-foreground: oklch(0.2050 0 0); + --destructive: oklch(0.5770 0.2450 27.3250); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9220 0 0); + --input: oklch(0.9220 0 0); + --ring: oklch(0.7080 0 0); + --chart-1: oklch(0.8100 0.1000 252); + --chart-2: oklch(0.6200 0.1900 260); + --chart-3: oklch(0.5500 0.2200 263); + --chart-4: oklch(0.4900 0.2200 264); + --chart-5: oklch(0.4200 0.1800 266); + --sidebar: oklch(0.9850 0 0); + --sidebar-foreground: oklch(0.1450 0 0); + --sidebar-primary: oklch(0.2050 0 0); + --sidebar-primary-foreground: oklch(0.9850 0 0); + --sidebar-accent: oklch(0.9700 0 0); + --sidebar-accent-foreground: oklch(0.2050 0 0); + --sidebar-border: oklch(0.9220 0 0); + --sidebar-ring: oklch(0.7080 0 0); + --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --radius: 0.625rem; + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10); + --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10); + --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10); + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + + +## Images & icons +1. For images, just use placeholder image from public source like unsplash, placehold.co or others that you already know exact image url; Don't make up urls +2. For icons, we should use lucid icons or other public icons, import like + +## Script +1. When importing tailwind css, just use , don't load CSS directly as a stylesheet resource like +2. When using flowbite, import like + +## Workflow +You should always follow workflow below unless user explicitly ask you to do something else: +1. Layout design +2. Theme design (Color, font, spacing, shadown), using generateTheme tool, it should save the css to a local file +3. Core Animation design +4. Generate a singlehtml file for the UI +5. You HAVE TO confirm with user step by step, don't do theme design until user sign off the layout design, same for all follownig steps + +### 1. Layout design +Think through how should the layout of interface look like, what are different UI components +And present the layout in ASCII wireframe format, here are the guidelines of good ASCII wireframe, you can do ASCII art too for more custom layout or graphic design + +### 2. Theme design +Think through what are the colors, fonts, spacing, etc. + +### 3. Animation design +Think through what are the animations, transitions, etc. + +### 4. Generate html file for each UI component and then combine them together to form a single html file +Generate html file for each UI component and then combine them together to form a single html file +Make sure to reference the theme css file you created in step 2, and add custom ones that doesn't exist yet in html file + + +design an AI chat UI + + +Let's think through the layout design for an AI chat UI. Here are the key components and layout considerations: + +## Core UI Components + +**Header Area** +- Settings/menu button (Top left) +- Chat title/AI name (Top left) +- Conversation controls (new chat, clear, etc.) (Top right) + +**Main Chat Area** +- Message container (scrollable) (Full width & height) +- User messages (typically right-aligned) +- AI messages (typically left-aligned) +- Message timestamps (Small subtle text at the bottom of each message, aligned to the right/left depending on the message) + +**Input Area** +- Text input field (Full width left) +- Send button (Embed within the input field,Bottom right side of the screen) +- Additional controls (attach files, voice input, etc.) (Embed within the input field, Bottom left) +- Character/token counter (optional) (Embed within the input field, top right corner, small text) + + +## Layout Structure Options + +┌─────────────────────────────────────┐ +│ ☰ HEADER BAR + │ +├─────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ User Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ [CHAT AREA] │ +│ │ +├─────────────────────────────────────┤ +│ [Text Input Field] [Send] │ +└─────────────────────────────────────┘ + +When hamburger (☰) is clicked, sidebar slides out: +┌──────────────┬─────────────────────────────────────┐ +│ SIDEBAR │ ☰ HEADER BAR + │ +│ ┌──────────┐ ├─────────────────────────────────────┤ +│ │ Chat 1 │ │ │ +│ │ Chat 2 │ │ ┌─────────────────────────────┐ │ +│ │ Chat 3 │ │ │ AI Message Bubble │ │ +│ │ + New │ │ └─────────────────────────────┘ │ +│ └──────────┘ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ User Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ AI Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ [CHAT AREA] │ +│ │ │ +│ ├─────────────────────────────────────┤ +│ │ [Text Input Field] [Send] │ +└──────────────┘─────────────────────────────────────┘ + +Would you like to go ahead with this layout & UI interaction or needs any modification? + + + +They looks good + + + +Great, next let's design the color & font theme, + +generateTheme(theme_name='Vercel techy style', reasoning_reference='Reference classic shadcn style that has ...', cssFilePath='design_iterations/theme_1.css', cssSheet=':root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0.1448 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0.1448 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0.1448 0 0); + --primary: oklch(0.5555 0 0); + --primary-foreground: oklch(0.9851 0 0); + --secondary: oklch(0.9702 0 0); + --secondary-foreground: oklch(0.2046 0 0); + --muted: oklch(0.9702 0 0); + --muted-foreground: oklch(0.5486 0 0); + --accent: oklch(0.9702 0 0); + --accent-foreground: oklch(0.2046 0 0); + --destructive: oklch(0.5830 0.2387 28.4765); + --destructive-foreground: oklch(0.9702 0 0); + --border: oklch(0.9219 0 0); + --input: oklch(0.9219 0 0); + --ring: oklch(0.7090 0 0); + --chart-1: oklch(0.5555 0 0); + --chart-2: oklch(0.5555 0 0); + --chart-3: oklch(0.5555 0 0); + --chart-4: oklch(0.5555 0 0); + --chart-5: oklch(0.5555 0 0); + --sidebar: oklch(0.9851 0 0); + --sidebar-foreground: oklch(0.1448 0 0); + --sidebar-primary: oklch(0.2046 0 0); + --sidebar-primary-foreground: oklch(0.9851 0 0); + --sidebar-accent: oklch(0.9702 0 0); + --sidebar-accent-foreground: oklch(0.2046 0 0); + --sidebar-border: oklch(0.9219 0 0); + --sidebar-ring: oklch(0.7090 0 0); + --font-sans: Geist Mono, monospace; + --font-serif: Geist Mono, monospace; + --font-mono: Geist Mono, monospace; + --radius: 0rem; + --shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-sm: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow-md: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 2px 4px -1px hsl(0 0% 0% / 0.00); + --shadow-lg: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 4px 6px -1px hsl(0 0% 0% / 0.00); + --shadow-xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 8px 10px -1px hsl(0 0% 0% / 0.00); + --shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --tracking-normal: 0em; + --spacing: 0.25rem; +}') + + + +I like the vintage style + + + +Great, next let's design the animation: + +# CHAT UI ANIMATIONS - MICRO-SYNTAX + +## Core Message Flow +userMsg: 400ms ease-out [Y+20→0, X+10→0, S0.9→1] +aiMsg: 600ms bounce [Y+15→0, S0.95→1] +200ms +typing: 1400ms ∞ [Y±8, α0.4→1] stagger+200ms +status: 300ms ease-out [α0.6→1, S1→1.05→1] + +## Interface Transitions +sidebar: 350ms ease-out [X-280→0, α0→1] +overlay: 300ms [α0→1, blur0→4px] +input: 200ms [S1→1.01, shadow+ring] focus +input: 150ms [S1.01→1, shadow-ring] blur + +## Button Interactions +sendBtn: 150ms [S1→0.95→1, R±2°] press +sendBtn: 200ms [S1→1.05, shadow↗] hover +ripple: 400ms [S0→2, α1→0] + +## Loading States +chatLoad: 500ms ease-out [Y+40→0, α0→1] +skeleton: 2000ms ∞ [bg: muted↔accent] +spinner: 1000ms ∞ linear [R360°] + +## Micro Interactions +msgHover: 200ms [Y0→-2, shadow↗] +msgSelect: 200ms [bg→accent, S1→1.02] +error: 400ms [X±5] shake +success: 600ms bounce [S0→1.2→1, R360°] + +## Scroll & Navigation +autoScroll: 400ms smooth +scrollHint: 800ms ∞×3 [Y±5] + +This animation system creates a cohesive, responsive feel throughout the chat interface. Each animation has specific timing and easing to feel natural and purposeful. Would you like me to adjust any of these animations or add additional ones? + + + + +This looks great, lets do it + + + +Great, I will generate the html file for each UI component and then combine them together to form a single html file + +write(file_path='design_iterations/chat_ui.css', content='...') +write(file_path='design_iterations/chat_ui.html', content='...') + +I've created the html design, please reveiw and let me know if you need any changes + + + + +# Available Tools +- **read**: Read file contents within the workspace (supports text files, images, with line range options) +- **write**: Write content to files in the workspace (creates parent directories automatically) +- **edit**: Replace text within files using exact string matching (requires precise text matching including whitespace and indentation) +- **multiedit**: Perform multiple find-and-replace operations on a single file in sequence (each edit applied to result of previous edit) +- **glob**: Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts") - efficient for locating files by name or path structure +- **grep**: Search for text patterns within file contents using regular expressions (can filter by file types and paths) +- **ls**: List directory contents with optional filtering, sorting, and detailed information (shows files and subdirectories) +- **bash**: Execute shell/bash commands within the workspace (secure execution with timeouts and output capture) +- **generateTheme**: Generate a theme for the design +`;} + + async query( + prompt?: string, + conversationHistory?: CoreMessage[], + options?: any, + abortController?: AbortController, + onMessage?: (message: any) => void + ): Promise { + this.outputChannel.appendLine('=== CUSTOM AGENT QUERY CALLED ==='); + + // Determine which input format we're using + const usingConversationHistory = !!conversationHistory && conversationHistory.length > 0; + + if (usingConversationHistory) { + this.outputChannel.appendLine(`Query using conversation history: ${conversationHistory!.length} messages`); + } else if (prompt) { + this.outputChannel.appendLine(`Query prompt: ${prompt.substring(0, 200)}...`); + } else { + throw new Error('Either prompt or conversationHistory must be provided'); + } + + this.outputChannel.appendLine(`Query options: ${JSON.stringify(options, null, 2)}`); + this.outputChannel.appendLine(`Streaming enabled: ${!!onMessage}`); + + if (!this.isInitialized) { + await this.setupWorkingDirectory(); + } + + const responseMessages: any[] = []; + const sessionId = `session_${Date.now()}`; + let messageBuffer = ''; + + // Tool call streaming state + let currentToolCall: any = null; + let toolCallBuffer = ''; + + try { + this.outputChannel.appendLine('Starting AI SDK streamText...'); + + // Create execution context for tools + const executionContext: ExecutionContext = { + workingDirectory: this.workingDirectory, + sessionId: sessionId, + outputChannel: this.outputChannel, + abortController: abortController, + }; + + // Create tools with context + const tools = { + read: createReadTool(executionContext), + write: createWriteTool(executionContext), + edit: createEditTool(executionContext), + multiedit: createMultieditTool(executionContext), + glob: createGlobTool(executionContext), + grep: createGrepTool(executionContext), + ls: createLsTool(executionContext), + bash: createBashTool(executionContext), + generateTheme: createThemeTool(executionContext) + }; + + // Prepare AI SDK input based on available data + const streamTextConfig: any = { + model: this.getModel(), + system: this.getSystemPrompt(), + tools: tools, + toolCallStreaming: true, + maxSteps: 10, // Enable multi-step reasoning with tools + maxTokens: 8192 // Increase token limit to prevent truncation + }; + + if (usingConversationHistory) { + // Use conversation messages + streamTextConfig.messages = conversationHistory; + this.outputChannel.appendLine(`Using conversation history with ${conversationHistory!.length} messages`); + + // Debug: Log the actual messages being sent to AI SDK + this.outputChannel.appendLine('=== AI SDK MESSAGES DEBUG ==='); + conversationHistory!.forEach((msg, index) => { + const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content); + this.outputChannel.appendLine(` [${index}] ${msg.role}: "${content.substring(0, 150)}..."`); + }); + this.outputChannel.appendLine('=== END AI SDK MESSAGES DEBUG ==='); + } else { + // Use single prompt + streamTextConfig.prompt = prompt; + this.outputChannel.appendLine(`Using single prompt: ${prompt!.substring(0, 100)}...`); + } + + console.log('========streamTextConfig', streamTextConfig); + + const result = streamText(streamTextConfig); + + this.outputChannel.appendLine('AI SDK streamText created, starting to process chunks...'); + + + + for await (const chunk of result.fullStream) { + // Check for abort signal + if (abortController?.signal.aborted) { + this.outputChannel.appendLine('Operation aborted by user'); + throw new Error('Operation cancelled'); + } + + this.outputChannel.appendLine(`Received chunk type: ${chunk.type}`); + + switch (chunk.type) { + case 'text-delta': + // Handle streaming text (assistant message chunks) - CoreMessage format + messageBuffer += chunk.textDelta; + + const textMessage: CoreMessage = { + role: 'assistant', + content: chunk.textDelta + }; + + onMessage?.(textMessage); + responseMessages.push(textMessage); + break; + + case 'finish': + // Final result message - CoreMessage format + this.outputChannel.appendLine(`===Stream finished with reason: ${chunk.finishReason}`); + this.outputChannel.appendLine(`${JSON.stringify(chunk)}`); + this.outputChannel.appendLine(`========================================`); + + const resultMessage: CoreMessage = { + role: 'assistant', + content: chunk.finishReason === 'stop' ? 'Response completed successfully' : 'Response completed' + }; + + onMessage?.(resultMessage); + responseMessages.push(resultMessage); + break; + + case 'error': + // Error handling - CoreMessage format + const errorMsg = (chunk as any).error?.message || 'Unknown error occurred'; + this.outputChannel.appendLine(`Stream error: ${errorMsg}`); + + const errorMessage: CoreMessage = { + role: 'assistant', + content: `Error: ${errorMsg}` + }; + + onMessage?.(errorMessage); + responseMessages.push(errorMessage); + break; + + case 'tool-call-streaming-start': + // Tool call streaming started - CoreAssistantMessage format + const streamStart = chunk as any; + currentToolCall = { + toolCallId: streamStart.toolCallId, + toolName: streamStart.toolName, + args: {} + }; + toolCallBuffer = ''; + + this.outputChannel.appendLine(`Tool call streaming started: ${streamStart.toolName} (ID: ${streamStart.toolCallId})`); + + // Send initial tool call message in CoreAssistantMessage format + const toolCallStartMessage: CoreMessage = { + role: 'assistant', + content: [{ + type: 'tool-call', + toolCallId: streamStart.toolCallId, + toolName: streamStart.toolName, + args: {} // Empty initially, will be updated with deltas + }] + }; + + onMessage?.(toolCallStartMessage); + responseMessages.push(toolCallStartMessage); + break; + + case 'tool-call-delta': + // Streaming tool call parameters - update existing message + const delta = chunk as any; + if (currentToolCall && delta.argsTextDelta) { + toolCallBuffer += delta.argsTextDelta; + + // Try to parse current buffer as JSON and send update + try { + const parsedArgs = JSON.parse(toolCallBuffer); + + // Send UPDATE signal (not new message) with special marker + const updateMessage: CoreMessage & { _isUpdate?: boolean, _updateToolId?: string } = { + role: 'assistant', + content: [{ + type: 'tool-call', + toolCallId: currentToolCall.toolCallId, + toolName: currentToolCall.toolName, + args: parsedArgs + }], + _isUpdate: true, + _updateToolId: currentToolCall.toolCallId + }; + + onMessage?.(updateMessage); + + } catch (parseError) { + // JSON not complete yet, continue buffering + if (toolCallBuffer.length % 100 === 0) { + this.outputChannel.appendLine(`Tool call progress: ${toolCallBuffer.length} characters received (parsing...)`); + } + } + } + break; + + case 'tool-call': + // Handle final complete tool call - CoreAssistantMessage format + const toolCall = chunk as any; + this.outputChannel.appendLine(`=====Tool call complete: ${JSON.stringify(toolCall)}`); + this.outputChannel.appendLine(`========================================`); + + // Skip sending duplicate tool call message if we already sent streaming start + if (!currentToolCall) { + // Only send if we didn't already send a streaming start message + const toolCallMessage: CoreMessage = { + role: 'assistant', + content: [{ + type: 'tool-call', + toolCallId: toolCall.toolCallId, + toolName: toolCall.toolName, + args: toolCall.args + }] + }; + + onMessage?.(toolCallMessage); + responseMessages.push(toolCallMessage); + } else { + this.outputChannel.appendLine(`Skipping duplicate tool call message - already sent streaming start for ID: ${toolCall.toolCallId}`); + } + + // Reset tool call streaming state + currentToolCall = null; + toolCallBuffer = ''; + break; + + case 'step-start': + // Log step start with details + const stepStart = chunk as any; + this.outputChannel.appendLine(`====Step ${stepStart.step || 'unknown'} started: ${stepStart.stepType || 'reasoning'}`); + this.outputChannel.appendLine(`${JSON.stringify(chunk)}`); + this.outputChannel.appendLine(`========================================`); + break; + + case 'step-finish': + // Log step completion with details + const stepFinish = chunk as any; + this.outputChannel.appendLine(`====Step ${stepFinish.step || 'unknown'} finished: ${stepFinish.stepType || 'reasoning'} (${stepFinish.finishReason || 'completed'})`); + this.outputChannel.appendLine(`${JSON.stringify(chunk)}`); + this.outputChannel.appendLine(`========================================`); + break; + + default: + // Handle tool results and other unknown chunk types + if ((chunk as any).type === 'tool-result') { + const toolResult = chunk as any; + this.outputChannel.appendLine(`Tool result received for ID: ${toolResult.toolCallId}: ${JSON.stringify(toolResult.result).substring(0, 200)}...`); + + // Send tool result in CoreToolMessage format + const toolResultMessage: CoreMessage = { + role: 'tool', + content: [{ + type: 'tool-result', + toolCallId: toolResult.toolCallId, + toolName: toolResult.toolName, + result: toolResult.result, + isError: toolResult.isError || false + }] + }; + + onMessage?.(toolResultMessage); + responseMessages.push(toolResultMessage); + } else { + this.outputChannel.appendLine(`Unknown chunk type: ${chunk.type}`); + } + break; + } + } + + this.outputChannel.appendLine(`Query completed successfully. Total messages: ${responseMessages.length}`); + this.outputChannel.appendLine(`Complete response: "${messageBuffer}"`); + + return responseMessages; + + } catch (error) { + this.outputChannel.appendLine(`Custom Agent query failed: ${error}`); + this.outputChannel.appendLine(`Error stack: ${error instanceof Error ? error.stack : 'No stack trace'}`); + + // Send error message if streaming callback is available + if (onMessage) { + const errorMessage = { + type: 'result', + subtype: 'error', + result: error instanceof Error ? error.message : String(error), + session_id: sessionId, + is_error: true + }; + onMessage(errorMessage); + } + + throw error; + } + } + + get isReady(): boolean { + return this.isInitialized; + } + + async waitForInitialization(): Promise { + if (!this.isInitialized) { + await this.setupWorkingDirectory(); + } + return this.isInitialized; + } + + getWorkingDirectory(): string { + return this.workingDirectory; + } + + hasApiKey(): boolean { + const config = vscode.workspace.getConfiguration('superdesign'); + const specificModel = config.get('aiModel'); + const provider = config.get('aiModelProvider', 'anthropic'); + + // Determine provider from model name if specific model is set + let effectiveProvider = provider; + if (specificModel) { + if (specificModel.includes('/')) { + effectiveProvider = 'openrouter'; + } else if (specificModel.startsWith('claude-')) { + effectiveProvider = 'anthropic'; + } else { + effectiveProvider = 'openai'; + } + } + + switch (effectiveProvider) { + case 'openrouter': + return !!config.get('openrouterApiKey'); + case 'anthropic': + return !!config.get('anthropicApiKey'); + case 'openai': + default: + return !!config.get('openaiApiKey'); + } + } + + isApiKeyAuthError(errorMessage: string): boolean { + if (!errorMessage) { + return false; + } + + const lowerError = errorMessage.toLowerCase(); + return lowerError.includes('api key') || + lowerError.includes('authentication') || + lowerError.includes('unauthorized') || + lowerError.includes('invalid_api_key') || + lowerError.includes('permission_denied') || + lowerError.includes('api_key_invalid') || + lowerError.includes('unauthenticated'); + } +} \ No newline at end of file diff --git a/src/services/logger.ts b/src/services/logger.ts new file mode 100644 index 0000000..fc0a9df --- /dev/null +++ b/src/services/logger.ts @@ -0,0 +1,80 @@ +import * as vscode from 'vscode'; + +export enum LogLevel { + DEBUG, + INFO, + WARN, + ERROR, +} + +export class Logger { + private static outputChannel: vscode.OutputChannel; + private static currentLevel: LogLevel = LogLevel.INFO; + + public static initialize() { + if (!this.outputChannel) { + this.outputChannel = vscode.window.createOutputChannel('Superdesign'); + } + } + + public static setLevel(level: LogLevel) { + this.currentLevel = level; + } + + private static log(level: LogLevel, label: string, message: string, showNotification: boolean = false) { + if (level < this.currentLevel) { + return; + } + + this.initialize(); + const timestamp = new Date().toISOString(); + this.outputChannel.appendLine(`[${timestamp}] [${label}] ${message}`); + + if (showNotification) { + switch (level) { + case LogLevel.ERROR: + vscode.window.showErrorMessage(message); + break; + case LogLevel.WARN: + vscode.window.showWarningMessage(message); + break; + case LogLevel.INFO: + vscode.window.showInformationMessage(message); + break; + default: + // No notification for debug + break; + } + } + } + + public static debug(message: string, showNotification: boolean = false) { + this.log(LogLevel.DEBUG, 'DEBUG', message, showNotification); + } + + public static info(message: string, showNotification: boolean = false) { + this.log(LogLevel.INFO, 'INFO', message, showNotification); + } + + public static warn(message: string, showNotification: boolean = false) { + this.log(LogLevel.WARN, 'WARN', message, showNotification); + } + + public static error(message: string, showNotification: boolean = false) { + this.log(LogLevel.ERROR, 'ERROR', message, showNotification); + } + + public static dispose() { + if (this.outputChannel) { + this.outputChannel.dispose(); + } + } + + /** + * Get the output channel for direct access if needed + */ + public static getOutputChannel(): vscode.OutputChannel { + this.initialize(); + return this.outputChannel; + } +} \ No newline at end of file diff --git a/src/templates/webviewTemplate.ts b/src/templates/webviewTemplate.ts new file mode 100644 index 0000000..dde591d --- /dev/null +++ b/src/templates/webviewTemplate.ts @@ -0,0 +1,81 @@ +import * as vscode from 'vscode'; +import { WebviewContext } from '../types/context'; + +export function generateWebviewHtml( + webview: vscode.Webview, + extensionUri: vscode.Uri, + context: WebviewContext +): string { + const scriptUri = webview.asWebviewUri( + vscode.Uri.joinPath(extensionUri, 'dist', 'webview.js') + ); + + // Generate webview URIs for logo images + const logoUris = { + cursor: webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'src', 'assets', 'cursor_logo.png')).toString(), + windsurf: webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'src', 'assets', 'windsurf_logo.png')).toString(), + claudeCode: webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'src', 'assets', 'claude_code_logo.png')).toString(), + lovable: webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'src', 'assets', 'lovable_logo.png')).toString(), + bolt: webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'src', 'assets', 'bolt_logo.jpg')).toString(), + }; + + // Debug logging + console.log('Extension URI:', extensionUri.toString()); + console.log('Generated logo URIs:', logoUris); + + // Check if files exist + const fs = require('fs'); + const path = require('path'); + Object.entries(logoUris).forEach(([name, uri]) => { + const filePath = path.join(extensionUri.fsPath, 'src', 'assets', name === 'bolt' ? 'bolt_logo.jpg' : `${name === 'claudeCode' ? 'claude_code' : name}_logo.png`); + const exists = fs.existsSync(filePath); + console.log(`${name} logo exists at ${filePath}:`, exists); + }); + + return ` + + + + + + Superdesign Chat + + + +
+ + + + `; +} + + \ No newline at end of file diff --git a/src/tools/bash-tool.ts b/src/tools/bash-tool.ts new file mode 100644 index 0000000..c25fd1c --- /dev/null +++ b/src/tools/bash-tool.ts @@ -0,0 +1,263 @@ +import { z } from 'zod'; +import { tool } from 'ai'; +import { spawn, ChildProcess } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import * as os from 'os'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateDirectoryExists, + ToolResponse +} from './tool-utils'; + +const bashParametersSchema = z.object({ + command: z.string().describe('Shell command to execute (e.g., "npm install", "ls -la", "git status")'), + description: z.string().optional().describe('Brief description of what the command does for logging purposes'), + directory: z.string().optional().describe('Directory to run command in (relative to workspace root). Defaults to workspace root.'), + timeout: z.number().optional().describe('Timeout in milliseconds (default: 30000ms = 30 seconds)'), + capture_output: z.boolean().optional().describe('Whether to capture and return command output (default: true)'), + env: z.record(z.string()).optional().describe('Environment variables to set for the command execution') +}); + +interface CommandResult { + command: string; + directory: string; + stdout: string; + stderr: string; + exitCode: number | null; + signal: string | null; + duration: number; + timedOut: boolean; + processId?: number; +} + +/** + * Check for potentially unsafe commands + */ +function hasUnsafeCommand(command: string): boolean { + const unsafePatterns = [ + // System modification + /\brm\s+(-[rf]*\s+)?\/\s*$/i, + /\brm\s+-[rf]*\s+\/$/i, + /\b(format|fdisk|mkfs)\b/i, + // Network operations that could be dangerous + /\b(curl|wget)\s+.*\|\s*(bash|sh|python|ruby|perl)/i, + // Process manipulation + /\b(kill|killall|pkill)\s+(-9\s+)?1\b/i, + // System shutdown/reboot + /\b(shutdown|reboot|halt|init\s+0)\b/i, + // Privilege escalation + /\b(sudo\s+su|sudo.*passwd|chmod\s+777)/i, + // Directory traversal attempts + /\.\.(\/|\\)/, + // Dangerous redirections + />\s*(\/dev\/|\/proc\/|\/sys\/)/i, + ]; + + return unsafePatterns.some(pattern => pattern.test(command)); +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Execute command with proper process management + */ +async function executeCommand( + command: string, + options: { + cwd: string; + env: NodeJS.ProcessEnv; + timeout: number; + captureOutput: boolean; + } +): Promise { + const startTime = Date.now(); + const isWindows = os.platform() === 'win32'; + + // Choose shell based on platform + const shell = isWindows ? 'cmd.exe' : 'bash'; + const shellArgs = isWindows ? ['/c', command] : ['-c', command]; + + const child: ChildProcess = spawn(shell, shellArgs, { + cwd: options.cwd, + env: options.env, + stdio: options.captureOutput ? ['ignore', 'pipe', 'pipe'] : 'inherit', + detached: !isWindows, // Create process group on Unix systems + }); + + let stdout = ''; + let stderr = ''; + let timedOut = false; + + // Capture output if requested + if (options.captureOutput && child.stdout && child.stderr) { + child.stdout.on('data', (data: Buffer) => { + stdout += data.toString(); + }); + + child.stderr.on('data', (data: Buffer) => { + stderr += data.toString(); + }); + } + + // Set up timeout + const timeoutHandle = setTimeout(() => { + timedOut = true; + if (child.pid) { + try { + if (isWindows) { + // On Windows, use taskkill to terminate process tree + spawn('taskkill', ['/pid', child.pid.toString(), '/f', '/t']); + } else { + // On Unix, kill the process group + process.kill(-child.pid, 'SIGTERM'); + // Force kill after 1 second if still running + setTimeout(() => { + if (child.pid && !child.killed) { + try { + process.kill(-child.pid, 'SIGKILL'); + } catch (e) { + // Process might already be dead + } + } + }, 1000); + } + } catch (error) { + // Process might already be dead + } + } + }, options.timeout); + + // Wait for process to complete + const exitPromise = new Promise<{ code: number | null; signal: string | null }>((resolve) => { + child.on('exit', (code, signal) => { + clearTimeout(timeoutHandle); + resolve({ code, signal }); + }); + }); + + const { code, signal } = await exitPromise; + const duration = Date.now() - startTime; + + return { + command, + directory: path.relative(options.cwd, options.cwd) || '.', + stdout: stdout.trim(), + stderr: stderr.trim(), + exitCode: code, + signal: signal, + duration, + timedOut, + processId: child.pid + }; +} + +export function createBashTool(context: ExecutionContext) { + return tool({ + description: 'Execute shell/bash commands within the SuperDesign workspace. Supports timeouts, output capture, and secure execution.', + parameters: bashParametersSchema, + execute: async (params): Promise => { + try { + const { command, description, directory, timeout = 30000, capture_output = true, env } = params; + + // Security checks + if (hasUnsafeCommand(command)) { + return handleToolError('Command contains potentially unsafe operations', 'Security check', 'security'); + } + + // Resolve execution directory + const workingDir = directory || '.'; + + // Security check for workspace boundary + const pathError = validateWorkspacePath(workingDir, context); + if (pathError) { + return pathError; + } + + const absolutePath = resolveWorkspacePath(workingDir, context); + + // Check if directory exists + const dirError = validateDirectoryExists(absolutePath, workingDir); + if (dirError) { + return dirError; + } + + console.log(`Executing command: ${command}${description ? ` (${description})` : ''}`); + console.log(`Working directory: ${workingDir}`); + + // Prepare environment + const processEnv = { + ...process.env, + ...env + }; + + // Execute the command + const result = await executeCommand(command, { + cwd: absolutePath, + env: processEnv, + timeout, + captureOutput: capture_output + }); + + // Log results + if (result.timedOut) { + console.log(`Command timed out after ${timeout}ms`); + } else if (result.exitCode === 0) { + console.log(`Command completed successfully in ${result.duration}ms`); + } else { + console.log(`Command failed with exit code ${result.exitCode} in ${result.duration}ms`); + } + + // Create summary for display + let summary = `Command: ${command}\n`; + summary += `Directory: ${result.directory}\n`; + summary += `Exit Code: ${result.exitCode}\n`; + summary += `Duration: ${result.duration}ms\n`; + + if (result.timedOut) { + summary += `Status: TIMED OUT (${timeout}ms)\n`; + } else if (result.signal) { + summary += `Signal: ${result.signal}\n`; + } + + if (capture_output) { + if (result.stdout) { + summary += `\nStdout:\n${result.stdout}\n`; + } + if (result.stderr) { + summary += `\nStderr:\n${result.stderr}\n`; + } + } + + if (result.timedOut) { + return handleToolError(`Command timed out after ${timeout}ms`, 'Command execution', 'execution'); + } + + if (result.exitCode !== 0) { + return handleToolError( + `Command failed with exit code ${result.exitCode}${result.stderr ? `\nStderr: ${result.stderr}` : ''}`, + 'Command execution', + 'execution' + ); + } + + return createSuccessResponse({ + command, + directory: workingDir, + exitCode: result.exitCode, + duration: result.duration, + stdout: result.stdout, + stderr: result.stderr, + summary + }); + + } catch (error) { + return handleToolError(error, 'Bash tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/edit-tool.ts b/src/tools/edit-tool.ts new file mode 100644 index 0000000..8f3bb53 --- /dev/null +++ b/src/tools/edit-tool.ts @@ -0,0 +1,197 @@ +import { z } from 'zod'; +import { tool } from 'ai'; +import * as fs from 'fs'; +import * as path from 'path'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateFileExists, + ToolResponse +} from './tool-utils'; + +const editParametersSchema = z.object({ + file_path: z.string().describe('Path to the file to edit (relative to workspace root, or absolute path within workspace)'), + old_string: z.string().describe('The exact text to find and replace. Must match exactly including whitespace, indentation, and context. For single replacements, include 3+ lines of context before and after the target text.'), + new_string: z.string().describe('The text to replace old_string with. Should maintain proper indentation and formatting.'), + expected_replacements: z.number().min(1).optional().describe('Number of replacements expected (default: 1). Use when replacing multiple occurrences.') +}); + +interface CalculatedEdit { + currentContent: string; + newContent: string; + occurrences: number; + isNewFile: boolean; + error?: string; +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Escape special regex characters + */ +function escapeRegExp(string: string): string { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** + * Calculate the edit operation without executing it + */ +function calculateEdit( + file_path: string, + old_string: string, + new_string: string, + expected_replacements: number, + context: ExecutionContext +): CalculatedEdit { + // Use the utility function to resolve paths + const absolutePath = resolveWorkspacePath(file_path, context); + + // Check if file exists + if (!fs.existsSync(absolutePath)) { + if (old_string === '') { + // Creating a new file + return { + currentContent: '', + newContent: new_string, + occurrences: 1, + isNewFile: true + }; + } else { + return { + currentContent: '', + newContent: '', + occurrences: 0, + isNewFile: false, + error: `File not found: ${file_path}. Cannot apply edit. Use empty old_string to create a new file.` + }; + } + } + + // Read current content + let currentContent: string; + try { + currentContent = fs.readFileSync(absolutePath, 'utf8'); + // Normalize line endings to LF + currentContent = currentContent.replace(/\r\n/g, '\n'); + } catch (error) { + return { + currentContent: '', + newContent: '', + occurrences: 0, + isNewFile: false, + error: `Failed to read file: ${error instanceof Error ? error.message : String(error)}` + }; + } + + // Handle creating file that already exists + if (old_string === '') { + return { + currentContent, + newContent: '', + occurrences: 0, + isNewFile: false, + error: `File already exists, cannot create: ${file_path}` + }; + } + + // Count occurrences + const occurrences = (currentContent.match(new RegExp(escapeRegExp(old_string), 'g')) || []).length; + + // Validate occurrence count + if (occurrences === 0) { + return { + currentContent, + newContent: currentContent, + occurrences: 0, + isNewFile: false, + error: `Text not found in file. 0 occurrences of old_string found. Ensure exact text match including whitespace and indentation.` + }; + } + + if (occurrences !== expected_replacements) { + return { + currentContent, + newContent: currentContent, + occurrences, + isNewFile: false, + error: `Expected ${expected_replacements} replacement(s) but found ${occurrences} occurrence(s).` + }; + } + + // Apply replacement + const newContent = currentContent.split(old_string).join(new_string); + + return { + currentContent, + newContent, + occurrences, + isNewFile: false + }; +} + +export function createEditTool(context: ExecutionContext) { + return tool({ + description: 'Replace text within a file using exact string matching. Accepts both relative and absolute file paths within the workspace.', + parameters: editParametersSchema, + execute: async (params): Promise => { + try { + const { file_path, old_string, new_string, expected_replacements = 1 } = params; + + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(file_path, context); + if (pathError) { + return pathError; + } + + console.log(`Editing file: ${file_path}`); + + // Calculate the edit + const editResult = calculateEdit(file_path, old_string, new_string, expected_replacements, context); + + if (editResult.error) { + return handleToolError(editResult.error, 'Edit operation', 'execution'); + } + + const absolutePath = resolveWorkspacePath(file_path, context); + + // Create parent directories if needed (for new files) + if (editResult.isNewFile) { + const dirName = path.dirname(absolutePath); + if (!fs.existsSync(dirName)) { + fs.mkdirSync(dirName, { recursive: true }); + console.log(`Created parent directories for: ${file_path}`); + } + } + + // Write the updated content + fs.writeFileSync(absolutePath, editResult.newContent, 'utf8'); + + const newLines = editResult.newContent.split('\n').length; + const newSize = Buffer.byteLength(editResult.newContent, 'utf8'); + + if (editResult.isNewFile) { + console.log(`Created new file: ${file_path} (${newLines} lines)`); + } else { + console.log(`Applied ${editResult.occurrences} replacement(s) to: ${file_path} (${newLines} lines)`); + } + + return createSuccessResponse({ + file_path, + absolute_path: absolutePath, + is_new_file: editResult.isNewFile, + replacements_made: editResult.occurrences, + lines_total: newLines, + bytes_total: newSize, + old_string_length: old_string.length, + new_string_length: new_string.length + }); + + } catch (error) { + return handleToolError(error, 'Edit tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/glob-tool.ts b/src/tools/glob-tool.ts new file mode 100644 index 0000000..e1ec401 --- /dev/null +++ b/src/tools/glob-tool.ts @@ -0,0 +1,294 @@ +import { z } from 'zod'; +import { tool } from 'ai'; +import * as fs from 'fs'; +import * as path from 'path'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateDirectoryExists, + ToolResponse +} from './tool-utils'; + +const globParametersSchema = z.object({ + pattern: z.string().describe('Glob pattern to match (e.g., "*.js", "src/**/*.ts", "**/*.{js,ts}")'), + path: z.string().optional().describe('Directory to search in (relative to workspace root, or absolute path within workspace). Defaults to workspace root.'), + case_sensitive: z.boolean().optional().describe('Whether the search should be case-sensitive (default: false)'), + include_dirs: z.boolean().optional().describe('Whether to include directories in results (default: false)'), + show_hidden: z.boolean().optional().describe('Whether to include hidden files/directories (starting with .)'), + max_results: z.number().min(1).optional().describe('Maximum number of results to return (default: 500)'), + sort_by_time: z.boolean().optional().describe('Whether to sort results by modification time, newest first (default: false)') +}); + +interface GlobFileEntry { + path: string; + absolutePath: string; + isDirectory: boolean; + size: number; + modifiedTime: Date; + extension?: string; +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Convert glob pattern to regex pattern + */ +function globToRegex(pattern: string, caseSensitive: boolean = false): RegExp { + // Handle special cases for braces {js,ts} + let regexPattern = pattern; + + // Handle brace expansion like {js,ts,jsx} + const braceRegex = /\{([^}]+)\}/g; + regexPattern = regexPattern.replace(braceRegex, (match, content) => { + const options = content.split(',').map((s: string) => s.trim()); + return `(${options.join('|')})`; + }); + + // Escape regex special characters except glob chars + regexPattern = regexPattern + .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape special regex chars except *, ?, and already handled {} + .replace(/\\\{/g, '{') // Restore { that we want to keep + .replace(/\\\}/g, '}') // Restore } that we want to keep + .replace(/\\\|/g, '|') // Restore | that we want to keep + .replace(/\\\(/g, '(') // Restore ( that we want to keep + .replace(/\\\)/g, ')'); // Restore ) that we want to keep + + // Handle glob patterns + regexPattern = regexPattern + .replace(/\*\*/g, '###DOUBLESTAR###') // Temporarily replace ** + .replace(/\*/g, '[^/]*') // * becomes [^/]* (match any chars except path separator) + .replace(/###DOUBLESTAR###/g, '.*') // ** becomes .* (match any chars including path separator) + .replace(/\?/g, '[^/]'); // ? becomes [^/] (match single char except path separator) + + const flags = caseSensitive ? '' : 'i'; + return new RegExp(`^${regexPattern}$`, flags); +} + +/** + * Check if a file should be skipped based on common patterns + */ +function shouldSkipPath(relativePath: string, showHidden: boolean): boolean { + // Skip hidden files unless requested + if (!showHidden && relativePath.split('/').some(part => part.startsWith('.'))) { + return true; + } + + // Skip common directories that should never be searched + const skipPatterns = [ + /node_modules/, + /\.git$/, + /\.svn$/, + /\.hg$/, + /\.vscode$/, + /dist$/, + /build$/, + /coverage$/, + /\.nyc_output$/, + /\.next$/, + /\.cache$/ + ]; + + return skipPatterns.some(pattern => pattern.test(relativePath)); +} + +/** + * Recursively find files matching the pattern + */ +async function findMatches( + searchDir: string, + pattern: RegExp, + options: { + includeDirs: boolean; + showHidden: boolean; + maxResults: number; + } +): Promise { + const results: GlobFileEntry[] = []; + + const scanDirectory = async (currentDir: string): Promise => { + if (results.length >= options.maxResults) { + return; + } + + try { + const entries = await fs.promises.readdir(currentDir, { withFileTypes: true }); + + for (const entry of entries) { + if (results.length >= options.maxResults) { + break; + } + + const fullPath = path.join(currentDir, entry.name); + const relativePath = path.relative(searchDir, fullPath); + + // Skip paths that should be ignored + if (shouldSkipPath(relativePath, options.showHidden)) { + continue; + } + + const isDirectory = entry.isDirectory(); + + // Check if this path matches the pattern + const matches = pattern.test(relativePath); + + if (matches && (options.includeDirs || !isDirectory)) { + try { + const stats = await fs.promises.stat(fullPath); + + results.push({ + path: relativePath, + absolutePath: fullPath, + isDirectory, + size: isDirectory ? 0 : stats.size, + modifiedTime: stats.mtime, + extension: isDirectory ? undefined : path.extname(entry.name).slice(1) + }); + } catch (error) { + // Ignore stat errors and continue + } + } + + // Recursively scan subdirectories + if (isDirectory) { + await scanDirectory(fullPath); + } + } + } catch (error) { + // Ignore permission errors and continue + } + }; + + await scanDirectory(searchDir); + return results; +} + +/** + * Sort results by modification time (newest first) or alphabetically + */ +function sortResults(results: GlobFileEntry[], sortByTime: boolean): GlobFileEntry[] { + if (!sortByTime) { + // Sort alphabetically with directories first + return results.sort((a, b) => { + if (a.isDirectory && !b.isDirectory) { + return -1; + } + if (!a.isDirectory && b.isDirectory) { + return 1; + } + return a.path.localeCompare(b.path); + }); + } + + // Sort by modification time (newest first) with recent files prioritized + const oneDayAgo = new Date().getTime() - (24 * 60 * 60 * 1000); + + return results.sort((a, b) => { + const aTime = a.modifiedTime.getTime(); + const bTime = b.modifiedTime.getTime(); + const aIsRecent = aTime > oneDayAgo; + const bIsRecent = bTime > oneDayAgo; + + // Both recent: newest first + if (aIsRecent && bIsRecent) { + return bTime - aTime; + } + + // One recent: recent first + if (aIsRecent) { + return -1; + } + if (bIsRecent) { + return 1; + } + + // Both old: alphabetical + return a.path.localeCompare(b.path); + }); +} + +export function createGlobTool(context: ExecutionContext) { + return tool({ + description: 'Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts"). Efficient for locating files by name or path structure.', + parameters: globParametersSchema, + execute: async (params): Promise => { + try { + const { + pattern, + path: searchPath = '.', + case_sensitive = false, + include_dirs = false, + show_hidden = false, + max_results = 500, + sort_by_time = false + } = params; + + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(searchPath, context); + if (pathError) { + return pathError; + } + + // Resolve search directory + const absolutePath = resolveWorkspacePath(searchPath, context); + + // Check if path exists and is a directory + const dirError = validateDirectoryExists(absolutePath, searchPath); + if (dirError) { + return dirError; + } + + console.log(`Finding files matching pattern "${pattern}" in ${searchPath}`); + + // Convert glob pattern to regex + const regex = globToRegex(pattern, case_sensitive); + + // Find matching files + const matches = await findMatches(absolutePath, regex, { + includeDirs: include_dirs, + showHidden: show_hidden, + maxResults: max_results + }); + + // Sort results + const sortedMatches = sortResults(matches, sort_by_time); + + // Create summary + const fileCount = sortedMatches.filter(m => !m.isDirectory).length; + const dirCount = sortedMatches.filter(m => m.isDirectory).length; + + let summary = `Found ${sortedMatches.length} match(es) for pattern "${pattern}"`; + if (fileCount > 0 && dirCount > 0) { + summary += ` (${fileCount} files, ${dirCount} directories)`; + } else if (fileCount > 0) { + summary += ` (${fileCount} files)`; + } else if (dirCount > 0) { + summary += ` (${dirCount} directories)`; + } + + if (sortedMatches.length >= max_results) { + summary += ` - results truncated at ${max_results}`; + } + + console.log(summary); + + return createSuccessResponse({ + pattern, + search_path: searchPath, + matches: sortedMatches, + total_matches: sortedMatches.length, + file_count: fileCount, + directory_count: dirCount, + summary, + truncated: sortedMatches.length >= max_results, + sorted_by_time: sort_by_time + }); + + } catch (error) { + return handleToolError(error, 'Glob tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/grep-tool.ts b/src/tools/grep-tool.ts new file mode 100644 index 0000000..2af5b08 --- /dev/null +++ b/src/tools/grep-tool.ts @@ -0,0 +1,315 @@ +import { z } from 'zod'; +import { tool } from 'ai'; +import * as fs from 'fs'; +import * as path from 'path'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateDirectoryExists, + ToolResponse +} from './tool-utils'; + +const grepParametersSchema = z.object({ + pattern: z.string().describe('Regular expression pattern to search for (e.g., "function\\s+\\w+", "import.*from")'), + path: z.string().optional().describe('Directory to search in (relative to workspace root, or absolute path within workspace). Defaults to workspace root.'), + include: z.string().optional().describe('File pattern to include (e.g., "*.js", "*.{ts,tsx}", "src/**/*.ts")'), + case_sensitive: z.boolean().optional().describe('Whether the search should be case-sensitive (default: false)'), + max_files: z.number().min(1).optional().describe('Maximum number of files to search (default: 1000)'), + max_matches: z.number().min(1).optional().describe('Maximum number of matches to return (default: 100)') +}); + +interface GrepMatch { + filePath: string; + lineNumber: number; + line: string; + matchStart: number; + matchEnd: number; +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Check if a file path matches the include pattern + */ +function matchesIncludePattern(filePath: string, includePattern?: string): boolean { + if (!includePattern) { + return true; + } + + // Convert glob pattern to regex (simplified) + const regexPattern = includePattern + .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape special regex chars + .replace(/\*\*/g, '###DOUBLESTAR###') // Temporarily replace ** + .replace(/\*/g, '[^/]*') // * becomes [^/]* (no directory separators) + .replace(/###DOUBLESTAR###/g, '.*') // ** becomes .* (any characters) + .replace(/\?/g, '[^/]'); // ? becomes [^/] (single char, no dir sep) + + const regex = new RegExp(`^${regexPattern}$`); + return regex.test(filePath); +} + +/** + * Check if a file should be skipped based on common patterns + */ +function shouldSkipFile(filePath: string): boolean { + const skipPatterns = [ + /node_modules/, + /\.git/, + /\.vscode/, + /dist/, + /build/, + /coverage/, + /\.nyc_output/, + /\.next/, + /\.cache/, + /\.DS_Store/, + /Thumbs\.db/, + /\.log$/, + /\.tmp$/, + /\.temp$/ + ]; + + return skipPatterns.some(pattern => pattern.test(filePath)); +} + +/** + * Simple check if file is likely a text file + */ +function isTextFile(filePath: string): boolean { + const textExtensions = [ + '.js', '.ts', '.jsx', '.tsx', '.json', '.html', '.htm', '.css', '.scss', '.sass', + '.py', '.java', '.cpp', '.c', '.h', '.hpp', '.cs', '.php', '.rb', '.go', + '.rs', '.swift', '.kt', '.scala', '.clj', '.hs', '.elm', '.ml', '.f', + '.txt', '.md', '.rst', '.asciidoc', '.xml', '.yaml', '.yml', '.toml', + '.ini', '.cfg', '.conf', '.properties', '.env', '.gitignore', '.gitattributes', + '.dockerfile', '.makefile', '.sh', '.bat', '.ps1', '.sql', '.graphql', + '.vue', '.svelte', '.astro', '.prisma', '.proto' + ]; + + const ext = path.extname(filePath).toLowerCase(); + return textExtensions.includes(ext) || !ext; // Include extensionless files +} + +/** + * Recursively find files to search + */ +async function findFilesToSearch( + dirPath: string, + includePattern?: string, + maxFiles: number = 1000 +): Promise { + const files: string[] = []; + + const scanDirectory = async (currentPath: string): Promise => { + if (files.length >= maxFiles) { + return; + } + + try { + const entries = await fs.promises.readdir(currentPath, { withFileTypes: true }); + + for (const entry of entries) { + if (files.length >= maxFiles) { + break; + } + + const fullPath = path.join(currentPath, entry.name); + const relativePath = path.relative(dirPath, fullPath); + + // Skip common directories and files + if (shouldSkipFile(relativePath)) { + continue; + } + + if (entry.isDirectory()) { + await scanDirectory(fullPath); + } else if (entry.isFile()) { + // Check if file matches include pattern + if (matchesIncludePattern(relativePath, includePattern)) { + // Only include text files (basic check) + if (isTextFile(fullPath)) { + files.push(fullPath); + } + } + } + } + } catch (error) { + // Ignore permission errors and continue + } + }; + + await scanDirectory(dirPath); + return files; +} + +/** + * Search for pattern in a single file + */ +async function searchInFile(filePath: string, regex: RegExp, maxMatches: number): Promise { + const matches: GrepMatch[] = []; + + try { + const content = await fs.promises.readFile(filePath, 'utf8'); + const lines = content.split(/\r?\n/); + + for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) { + if (matches.length >= maxMatches) { + break; + } + + const line = lines[lineIndex]; + let match; + regex.lastIndex = 0; // Reset regex state + + while ((match = regex.exec(line)) !== null) { + matches.push({ + filePath, + lineNumber: lineIndex + 1, + line: line, + matchStart: match.index, + matchEnd: match.index + match[0].length + }); + + if (matches.length >= maxMatches) { + break; + } + + // Prevent infinite loop on zero-length matches + if (match.index === regex.lastIndex) { + regex.lastIndex++; + } + } + } + } catch (error) { + // Ignore files that can't be read (binary files, permission issues, etc.) + } + + return matches; +} + +export function createGrepTool(context: ExecutionContext) { + return tool({ + description: 'Search for text patterns within file contents using regular expressions. Can filter by file types and paths.', + parameters: grepParametersSchema, + execute: async (params): Promise => { + try { + const { + pattern, + path: searchPath = '.', + include, + case_sensitive = false, + max_files = 1000, + max_matches = 100 + } = params; + + // Pattern validation (test if it's a valid regex) + try { + new RegExp(pattern); + } catch (error) { + return handleToolError( + `Invalid regular expression pattern: ${error instanceof Error ? error.message : String(error)}`, + 'Pattern validation', + 'validation' + ); + } + + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(searchPath, context); + if (pathError) { + return pathError; + } + + // Resolve search directory + const absolutePath = resolveWorkspacePath(searchPath, context); + + // Check if path exists and is a directory + const dirError = validateDirectoryExists(absolutePath, searchPath); + if (dirError) { + return dirError; + } + + console.log(`Searching for pattern "${pattern}" in ${searchPath}`); + + // Create regex pattern + const regexFlags = case_sensitive ? 'g' : 'gi'; + const regex = new RegExp(pattern, regexFlags); + + // Find files to search + const filesToSearch = await findFilesToSearch(absolutePath, include, max_files); + + if (filesToSearch.length === 0) { + const message = `No files found to search in ${searchPath}${include ? ` matching ${include}` : ''}`; + return createSuccessResponse({ + pattern, + search_path: searchPath, + include_pattern: include, + files_searched: 0, + matches: [], + total_matches: 0, + message + }); + } + + // Search in files + const allMatches: GrepMatch[] = []; + let filesSearched = 0; + let filesWithMatches = 0; + + for (const file of filesToSearch) { + if (allMatches.length >= max_matches) { + break; + } + + const fileMatches = await searchInFile(file, regex, max_matches - allMatches.length); + if (fileMatches.length > 0) { + // Convert absolute paths to relative paths for output + const relativePath = path.relative(absolutePath, file); + fileMatches.forEach(match => { + match.filePath = relativePath; + }); + + allMatches.push(...fileMatches); + filesWithMatches++; + } + filesSearched++; + } + + // Format results + let summary = `Found ${allMatches.length} match(es) for "${pattern}" in ${filesWithMatches} file(s)`; + if (filesSearched < filesToSearch.length) { + summary += ` (searched ${filesSearched}/${filesToSearch.length} files)`; + } + + // Group matches by file for better readability + const matchesByFile: Record = {}; + allMatches.forEach(match => { + if (!matchesByFile[match.filePath]) { + matchesByFile[match.filePath] = []; + } + matchesByFile[match.filePath].push(match); + }); + + console.log(summary); + + return createSuccessResponse({ + pattern, + search_path: searchPath, + include_pattern: include, + files_searched: filesSearched, + files_with_matches: filesWithMatches, + matches: allMatches, + matches_by_file: matchesByFile, + total_matches: allMatches.length, + summary, + truncated: allMatches.length >= max_matches + }); + + } catch (error) { + return handleToolError(error, 'Grep tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/ls-tool.ts b/src/tools/ls-tool.ts new file mode 100644 index 0000000..4a3e477 --- /dev/null +++ b/src/tools/ls-tool.ts @@ -0,0 +1,227 @@ +import { z } from 'zod'; +import { tool } from 'ai'; +import * as fs from 'fs'; +import * as path from 'path'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateDirectoryExists, + ToolResponse +} from './tool-utils'; + +const lsParametersSchema = z.object({ + path: z.string().optional().describe('Path to the directory to list (relative to workspace root, or absolute path within workspace). Defaults to workspace root.'), + show_hidden: z.boolean().optional().describe('Whether to show hidden files and directories (starting with .)'), + ignore: z.array(z.string()).optional().describe('Array of glob patterns to ignore (e.g., ["*.log", "temp*"])'), + detailed: z.boolean().optional().describe('Whether to show detailed file information (size, modified time)') +}); + +interface FileEntry { + name: string; + isDirectory: boolean; + size: number; + modifiedTime: Date; + extension?: string; +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Check if a filename should be ignored based on patterns + */ +function shouldIgnore(filename: string, patterns?: string[]): boolean { + if (!patterns || patterns.length === 0) { + return false; + } + + for (const pattern of patterns) { + // Convert glob pattern to RegExp (simplified version) + const regexPattern = pattern + .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape special regex chars + .replace(/\*/g, '.*') // * becomes .* + .replace(/\?/g, '.'); // ? becomes . + + const regex = new RegExp(`^${regexPattern}$`); + if (regex.test(filename)) { + return true; + } + } + + return false; +} + +/** + * Format file size in human-readable format + */ +function formatFileSize(bytes: number): string { + if (bytes === 0) { + return '0 B'; + } + + const units = ['B', 'KB', 'MB', 'GB', 'TB']; + const k = 1024; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${units[i]}`; +} + +/** + * Format modified time in relative format + */ +function formatModifiedTime(date: Date): string { + const now = new Date(); + const diffMs = now.getTime() - date.getTime(); + const diffMinutes = Math.floor(diffMs / 60000); + const diffHours = Math.floor(diffMs / 3600000); + const diffDays = Math.floor(diffMs / 86400000); + + if (diffMinutes < 1) { + return 'just now'; + } + if (diffMinutes < 60) { + return `${diffMinutes}m ago`; + } + if (diffHours < 24) { + return `${diffHours}h ago`; + } + if (diffDays < 7) { + return `${diffDays}d ago`; + } + + return date.toLocaleDateString(); +} + +export function createLsTool(context: ExecutionContext) { + return tool({ + description: 'List the contents of a directory in the SuperDesign workspace. Shows files and subdirectories with optional filtering.', + parameters: lsParametersSchema, + execute: async (params): Promise => { + try { + const { path: targetPath = '.', show_hidden = false, ignore, detailed = false } = params; + + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(targetPath, context); + if (pathError) { + return pathError; + } + + // Resolve target directory + const absolutePath = resolveWorkspacePath(targetPath, context); + + console.log(`Listing directory: ${targetPath}`); + + // Check if path exists and is a directory + const dirError = validateDirectoryExists(absolutePath, targetPath); + if (dirError) { + return dirError; + } + + // Read directory contents + const files = fs.readdirSync(absolutePath); + + if (files.length === 0) { + console.log(`Directory is empty: ${targetPath}`); + return createSuccessResponse({ + path: targetPath, + absolute_path: absolutePath, + entries: [], + total_count: 0 + }); + } + + const entries: FileEntry[] = []; + let hiddenCount = 0; + let ignoredCount = 0; + + // Process each file/directory + for (const file of files) { + // Skip hidden files unless requested + if (!show_hidden && file.startsWith('.')) { + hiddenCount++; + continue; + } + + // Check ignore patterns + if (shouldIgnore(file, ignore)) { + ignoredCount++; + continue; + } + + const fullPath = path.join(absolutePath, file); + + try { + const fileStats = fs.statSync(fullPath); + const isDir = fileStats.isDirectory(); + + const entry: FileEntry = { + name: file, + isDirectory: isDir, + size: isDir ? 0 : fileStats.size, + modifiedTime: fileStats.mtime, + extension: isDir ? undefined : path.extname(file).slice(1) + }; + + entries.push(entry); + } catch (error) { + // Log error but continue with other files + console.log(`Error accessing ${file}: ${error instanceof Error ? error.message : String(error)}`); + } + } + + // Sort entries (directories first, then alphabetically) + entries.sort((a, b) => { + if (a.isDirectory && !b.isDirectory) { + return -1; + } + if (!a.isDirectory && b.isDirectory) { + return 1; + } + return a.name.localeCompare(b.name); + }); + + // Create formatted output + let summary = `Listed ${entries.length} item(s) in ${targetPath}`; + if (hiddenCount > 0) { + summary += ` (${hiddenCount} hidden)`; + } + if (ignoredCount > 0) { + summary += ` (${ignoredCount} ignored)`; + } + + // Create detailed listing if requested + let detailedListing = ''; + if (detailed && entries.length > 0) { + detailedListing = '\n\nDetailed listing:\n'; + detailedListing += entries.map(entry => { + const type = entry.isDirectory ? '[DIR]' : '[FILE]'; + const size = entry.isDirectory ? '' : ` ${formatFileSize(entry.size)}`; + const modified = ` ${formatModifiedTime(entry.modifiedTime)}`; + const ext = entry.extension ? ` .${entry.extension}` : ''; + return `${type} ${entry.name}${size}${modified}${ext}`; + }).join('\n'); + } + + console.log(`${summary}${detailedListing}`); + + return createSuccessResponse({ + path: targetPath, + absolute_path: absolutePath, + entries, + total_count: entries.length, + hidden_count: hiddenCount, + ignored_count: ignoredCount, + directories: entries.filter(e => e.isDirectory).length, + files: entries.filter(e => !e.isDirectory).length, + summary, + detailed_listing: detailed ? detailedListing : undefined + }); + + } catch (error) { + return handleToolError(error, 'Ls tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/multiedit-tool.ts b/src/tools/multiedit-tool.ts new file mode 100644 index 0000000..ede24a6 --- /dev/null +++ b/src/tools/multiedit-tool.ts @@ -0,0 +1,183 @@ +import { z } from 'zod'; +import { tool } from 'ai'; +import * as fs from 'fs'; +import * as path from 'path'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateFileExists, + ToolResponse +} from './tool-utils'; + +const singleEditSchema = z.object({ + old_string: z.string().describe('The exact text to find and replace. Must match exactly including whitespace.'), + new_string: z.string().describe('The text to replace old_string with.'), + expected_replacements: z.number().min(1).optional().describe('Number of replacements expected (default: 1)') +}); + +const multieditParametersSchema = z.object({ + file_path: z.string().describe('Path to the file to edit (relative to workspace root, or absolute path within workspace)'), + edits: z.array(singleEditSchema).min(1).describe('Array of edit operations to perform in sequence'), + fail_fast: z.boolean().optional().describe('Whether to stop on first error (true) or continue with remaining edits (false, default)') +}); + +interface SingleEdit { + old_string: string; + new_string: string; + expected_replacements?: number; +} + +interface EditResult { + edit: SingleEdit; + success: boolean; + occurrences: number; + error?: string; +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Escape special regex characters + */ +function escapeRegExp(string: string): string { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** + * Apply a single edit to content + */ +function applySingleEdit(content: string, edit: SingleEdit): EditResult { + const expectedReplacements = edit.expected_replacements ?? 1; + + // Count occurrences + const regex = new RegExp(escapeRegExp(edit.old_string), 'g'); + const matches = content.match(regex) || []; + const occurrences = matches.length; + + // Validate occurrence count + if (occurrences === 0) { + return { + edit, + success: false, + occurrences: 0, + error: `Text not found: "${edit.old_string.substring(0, 50)}${edit.old_string.length > 50 ? '...' : ''}"` + }; + } + + if (occurrences !== expectedReplacements) { + return { + edit, + success: false, + occurrences, + error: `Expected ${expectedReplacements} replacement(s) but found ${occurrences} occurrence(s)` + }; + } + + return { + edit, + success: true, + occurrences + }; +} + +export function createMultieditTool(context: ExecutionContext) { + return tool({ + description: 'Perform multiple find-and-replace operations on a single file in sequence. Each edit is applied to the result of the previous edit. Accepts both relative and absolute file paths within the workspace.', + parameters: multieditParametersSchema, + execute: async (params): Promise => { + try { + const { file_path, edits, fail_fast = true } = params; + + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(file_path, context); + if (pathError) { + return pathError; + } + + // Resolve path + const absolutePath = resolveWorkspacePath(file_path, context); + + // Check if file exists + const fileError = validateFileExists(absolutePath, file_path); + if (fileError) { + return fileError; + } + + console.log(`Performing ${edits.length} edit(s) on: ${file_path}`); + + // Read current content + let currentContent: string; + try { + currentContent = fs.readFileSync(absolutePath, 'utf8'); + // Normalize line endings to LF + currentContent = currentContent.replace(/\r\n/g, '\n'); + } catch (error) { + return handleToolError(error, 'Failed to read file', 'permission'); + } + + const originalContent = currentContent; + const editResults: EditResult[] = []; + let successCount = 0; + let totalReplacements = 0; + + // Apply edits sequentially + for (let i = 0; i < edits.length; i++) { + const edit = edits[i]; + + console.log(`Applying edit ${i + 1}/${edits.length}: "${edit.old_string.substring(0, 30)}..." => "${edit.new_string.substring(0, 30)}..."`); + + const editResult = applySingleEdit(currentContent, edit); + editResults.push(editResult); + + if (editResult.success) { + // Apply the edit + currentContent = currentContent.split(edit.old_string).join(edit.new_string); + successCount++; + totalReplacements += editResult.occurrences; + console.log(`✓ Edit ${i + 1} successful: ${editResult.occurrences} replacement(s)`); + } else { + console.log(`✗ Edit ${i + 1} failed: ${editResult.error}`); + + if (fail_fast) { + return handleToolError( + `Edit operation failed at step ${i + 1}: ${editResult.error}`, + 'Edit sequence', + 'execution' + ); + } + } + } + + // Write the updated content if any edits were successful + if (successCount > 0) { + fs.writeFileSync(absolutePath, currentContent, 'utf8'); + } + + const newLines = currentContent.split('\n').length; + const newSize = Buffer.byteLength(currentContent, 'utf8'); + const hasErrors = editResults.some(r => !r.success); + + console.log(`Multi-edit completed: ${successCount}/${edits.length} edits successful, ${totalReplacements} total replacements`); + + return createSuccessResponse({ + file_path, + absolute_path: absolutePath, + edits_total: edits.length, + edits_successful: successCount, + edits_failed: edits.length - successCount, + total_replacements: totalReplacements, + lines_total: newLines, + bytes_total: newSize, + content_changed: currentContent !== originalContent, + edit_results: editResults + }); + + } catch (error) { + return handleToolError(error, 'Multiedit tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/read-tool.ts b/src/tools/read-tool.ts new file mode 100644 index 0000000..8dd9eb3 --- /dev/null +++ b/src/tools/read-tool.ts @@ -0,0 +1,301 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as mime from 'mime-types'; +import { tool } from 'ai'; +import { z } from 'zod'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateFileExists, + ToolResponse +} from './tool-utils'; + +/** + * File read result with metadata + */ +export interface FileReadResult { + content: string; + filePath: string; + fileType: 'text' | 'image' | 'pdf' | 'binary'; + mimeType?: string; + lineCount?: number; + isTruncated?: boolean; + linesShown?: [number, number]; // [startLine, endLine] + size: number; +} + +// Constants for file processing +const DEFAULT_MAX_LINES = 1000; +const MAX_LINE_LENGTH = 2000; +const MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB + +// Path validation is now handled by validateWorkspacePath in tool-utils + + /** + * Check if a file is likely binary by sampling content + */ +function isBinaryFile(filePath: string): boolean { + try { + const fd = fs.openSync(filePath, 'r'); + const fileSize = fs.fstatSync(fd).size; + + if (fileSize === 0) { + fs.closeSync(fd); + return false; + } + + const bufferSize = Math.min(4096, fileSize); + const buffer = Buffer.alloc(bufferSize); + const bytesRead = fs.readSync(fd, buffer, 0, buffer.length, 0); + fs.closeSync(fd); + + if (bytesRead === 0) {return false;} + + // Check for null bytes (strong binary indicator) + for (let i = 0; i < bytesRead; i++) { + if (buffer[i] === 0) { + return true; + } + } + + // Count non-printable characters + let nonPrintableCount = 0; + for (let i = 0; i < bytesRead; i++) { + if (buffer[i] < 9 || (buffer[i] > 13 && buffer[i] < 32)) { + nonPrintableCount++; + } + } + + // If >30% non-printable characters, consider binary + return nonPrintableCount / bytesRead > 0.3; + } catch { + return false; + } + } + + /** + * Detect file type based on extension and content + */ +function detectFileType(filePath: string): 'text' | 'image' | 'pdf' | 'binary' { + const ext = path.extname(filePath).toLowerCase(); + const mimeType = mime.lookup(filePath); + + // Check for images + if (mimeType && mimeType.startsWith('image/')) { + return 'image'; + } + + // Check for PDF + if (mimeType === 'application/pdf') { + return 'pdf'; + } + + // Known binary extensions + const binaryExtensions = [ + '.exe', '.dll', '.so', '.dylib', '.zip', '.tar', '.gz', '.7z', + '.bin', '.dat', '.class', '.jar', '.war', '.pyc', '.pyo', + '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', + '.odt', '.ods', '.odp', '.wasm', '.obj', '.o', '.a', '.lib' + ]; + + if (binaryExtensions.includes(ext)) { + return 'binary'; + } + + // Content-based binary detection + if (isBinaryFile(filePath)) { + return 'binary'; + } + + return 'text'; + } + + /** + * Process text file content with line range support + */ +async function processTextFile( + filePath: string, + startLine?: number, + lineCount?: number, + encoding: string = 'utf-8' + ): Promise<{ content: string; metadata: Partial }> { + const content = await fs.promises.readFile(filePath, encoding as BufferEncoding); + const lines = content.split('\n'); + const originalLineCount = lines.length; + + // Handle line range + const actualStartLine = Math.max((startLine || 1) - 1, 0); // Convert to 0-based + const actualLineCount = lineCount || Math.min(DEFAULT_MAX_LINES, originalLineCount); + const endLine = Math.min(actualStartLine + actualLineCount, originalLineCount); + + const selectedLines = lines.slice(actualStartLine, endLine); + + // Truncate long lines + let linesWereTruncated = false; + const processedLines = selectedLines.map(line => { + if (line.length > MAX_LINE_LENGTH) { + linesWereTruncated = true; + return line.substring(0, MAX_LINE_LENGTH) + '... [line truncated]'; + } + return line; + }); + + const contentWasTruncated = endLine < originalLineCount; + const isTruncated = contentWasTruncated || linesWereTruncated; + + let processedContent = processedLines.join('\n'); + + // Add truncation notice + if (contentWasTruncated) { + processedContent = `[Content truncated: showing lines ${actualStartLine + 1}-${endLine} of ${originalLineCount} total lines]\n\n` + processedContent; + } else if (linesWereTruncated) { + processedContent = `[Some lines truncated due to length (max ${MAX_LINE_LENGTH} chars)]\n\n` + processedContent; + } + + return { + content: processedContent, + metadata: { + lineCount: originalLineCount, + isTruncated, + linesShown: [actualStartLine + 1, endLine] + } + }; + } + + /** + * Process image or PDF file + */ +async function processMediaFile( + filePath: string, + fileType: 'image' | 'pdf' + ): Promise<{ content: string; metadata: Partial }> { + const buffer = await fs.promises.readFile(filePath); + const base64Data = buffer.toString('base64'); + const mimeType = mime.lookup(filePath) || 'application/octet-stream'; + + // For SuperDesign, we'll return a descriptive message rather than raw base64 + // The actual file handling would be done by the VS Code webview + const fileName = path.basename(filePath); + const fileSize = (buffer.length / 1024).toFixed(1); + + return { + content: `[${fileType.toUpperCase()} FILE: ${fileName}]\nFile size: ${fileSize} KB\nMIME type: ${mimeType}\nBase64 data available for webview display.`, + metadata: { + mimeType + } + }; + } + + /** + * Create SuperDesign read tool with execution context + */ +export function createReadTool(context: ExecutionContext) { + return tool({ + description: 'Read the contents of a file within the SuperDesign workspace. Supports text files, images (PNG, JPG, SVG, etc.), and handles large files with line-range reading.', + parameters: z.object({ + filePath: z.string().describe('Path to the file to read, relative to the workspace root or absolute path within workspace'), + startLine: z.number().optional().describe('Optional: Starting line number to read from (1-based). Use with lineCount for large files.'), + lineCount: z.number().optional().describe('Optional: Number of lines to read. Use with startLine to read specific sections.'), + encoding: z.string().optional().describe('Optional: File encoding (utf-8, ascii, etc.). Defaults to utf-8.') + }), + execute: async ({ filePath, startLine, lineCount, encoding }): Promise => { + const startTime = Date.now(); + + try { + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(filePath, context); + if (pathError) { + return pathError; + } + + // Resolve file path + const absolutePath = resolveWorkspacePath(filePath, context); + + // Check file existence + const fileError = validateFileExists(absolutePath, filePath); + if (fileError) { + return fileError; + } + + // Check if it's a directory + const stats = fs.statSync(absolutePath); + if (stats.isDirectory()) { + return handleToolError(`Path is a directory, not a file: ${filePath}`, 'Path validation', 'validation'); + } + + // Check file size + if (stats.size > MAX_FILE_SIZE_BYTES) { + const sizeMB = (stats.size / 1024 / 1024).toFixed(1); + return handleToolError( + `File too large (${sizeMB}MB). Maximum size: ${MAX_FILE_SIZE_BYTES / 1024 / 1024}MB`, + 'File size check', + 'validation' + ); + } + + // Detect file type + const fileType = detectFileType(absolutePath); + context.outputChannel.appendLine(`[read] Reading ${fileType} file: ${filePath} (${(stats.size / 1024).toFixed(1)} KB)`); + + let content: string; + let metadata: Partial = {}; + + // Process based on file type + switch (fileType) { + case 'text': { + const result = await processTextFile( + absolutePath, + startLine, + lineCount, + encoding + ); + content = result.content; + metadata = result.metadata; + break; + } + + case 'image': + case 'pdf': { + const result = await processMediaFile(absolutePath, fileType); + content = result.content; + metadata = result.metadata; + break; + } + + case 'binary': { + const fileName = path.basename(absolutePath); + const fileSize = (stats.size / 1024).toFixed(1); + content = `[BINARY FILE: ${fileName}]\nFile size: ${fileSize} KB\nCannot display binary content as text.`; + break; + } + + default: + return handleToolError(`Unsupported file type: ${fileType}`, 'File type detection', 'validation'); + } + + // Create result + const fileReadResult: FileReadResult = { + content, + filePath, + fileType, + mimeType: mime.lookup(absolutePath) || undefined, + size: stats.size, + ...metadata + }; + + const duration = Date.now() - startTime; + context.outputChannel.appendLine(`[read] File read completed in ${duration}ms`); + + return createSuccessResponse(fileReadResult); + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + context.outputChannel.appendLine(`[read] Read failed: ${errorMessage}`); + return handleToolError(error, 'Read tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/theme-tool.ts b/src/tools/theme-tool.ts new file mode 100644 index 0000000..265b1ee --- /dev/null +++ b/src/tools/theme-tool.ts @@ -0,0 +1,90 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { tool } from 'ai'; +import { z } from 'zod'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + validateFileExists, + ToolResponse +} from './tool-utils'; + + + +const themePrompt = `Design a perfect theme that including color, font, spacing, shadown, etc. +`; + +const cssSheetDescription = `The full css sheet content, has to include below classes: +:root selector - Must contain CSS custom properties +CSS custom properties format - --variable-name: value; +Semicolon-terminated - Each property must end with ; +--background, --foreground (basic colors) +--primary, --primary-foreground (brand colors) +--secondary, --muted, --accent (semantic colors) +--destructive, --border, --input, --ring (UI elements) +--card, --popover + their foreground variants +--chart-1 through --chart-5 (data visualization) +--sidebar-* variables for navigation +--font-sans, --font-serif, --font-mono +--radius, --spacing +--shadow-* variables (xs, sm, md, lg, xl, etc.) + +You can add more relevant ones based on use cases, but make sure to include all the above classes.`; + + /** + * Create SuperDesign read tool with execution context + */ +export function createThemeTool(context: ExecutionContext) { + return tool({ + description: themePrompt, + parameters: z.object({ + theme_name: z.string().describe('The name of the theme'), + reasoning_reference: z.string().describe('Think through the theme design to make it coherent and what reference you used'), + cssSheet: z.string().describe(cssSheetDescription), + cssFilePath: z.string().describe('Path to the css file to write to (relative to workspace root, or absolute path within workspace)'), + create_dirs: z.boolean().optional().default(true).describe('Whether to create parent directories if they don\'t exist (default: true)') + }), + execute: async ({ cssSheet, theme_name, reasoning_reference, cssFilePath, create_dirs = true}): Promise => { + + try { + // Validate and resolve the CSS file path + const validationError = validateWorkspacePath(cssFilePath, context); + if (validationError) { + return validationError; + } + + const resolvedPath = resolveWorkspacePath(cssFilePath, context); + + // Create parent directories if needed + if (create_dirs) { + const dirPath = path.dirname(resolvedPath); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + context.outputChannel.appendLine(`[theme] Created directory: ${dirPath}`); + } + } + + // Write the CSS content to file + fs.writeFileSync(resolvedPath, cssSheet, 'utf8'); + + context.outputChannel.appendLine(`[theme] Successfully created theme "${theme_name}" at: ${resolvedPath}`); + + return createSuccessResponse({ + success: true, + message: `Theme "${theme_name}" saved successfully`, + filePath: resolvedPath, + theme_name, + reasoning_reference, + cssSheet + }); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + context.outputChannel.appendLine(`[theme] Theme creation failed: ${errorMessage}`); + return handleToolError(error, 'Theme tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/tools/tool-utils.ts b/src/tools/tool-utils.ts new file mode 100644 index 0000000..d2bb317 --- /dev/null +++ b/src/tools/tool-utils.ts @@ -0,0 +1,181 @@ +import * as path from 'path'; +import { ExecutionContext } from '../types/agent'; + +/** + * Standard error response structure for all tools + */ +export interface ToolErrorResponse { + success: false; + error: string; + error_type?: 'validation' | 'security' | 'file_not_found' | 'permission' | 'execution' | 'unknown'; + details?: any; +} + +/** + * Standard success response structure for all tools + */ +export interface ToolSuccessResponse { + success: true; + [key: string]: any; +} + +export type ToolResponse = ToolSuccessResponse | ToolErrorResponse; + +/** + * Generic error handler that converts exceptions/errors to standardized error responses + */ +export function handleToolError( + error: unknown, + context?: string, + errorType: ToolErrorResponse['error_type'] = 'unknown' +): ToolErrorResponse { + let errorMessage: string; + let details: any; + + if (error instanceof Error) { + errorMessage = error.message; + details = { + name: error.name, + stack: error.stack?.split('\n').slice(0, 3) // Truncated stack trace + }; + } else if (typeof error === 'string') { + errorMessage = error; + } else { + errorMessage = 'An unknown error occurred'; + details = { originalError: error }; + } + + // Add context if provided + if (context) { + errorMessage = `${context}: ${errorMessage}`; + } + + console.error(`Tool error (${errorType}): ${errorMessage}`); + + return { + success: false, + error: errorMessage, + error_type: errorType, + details + }; +} + +/** + * Validate if a path is within the workspace directory (supports both absolute and relative paths) + */ +export function validateWorkspacePath(filePath: string, context: ExecutionContext): ToolErrorResponse | null { + try { + // Prevent directory traversal attacks + if (filePath.includes('..')) { + return handleToolError('Path cannot contain ".." for security reasons', 'Path validation', 'security'); + } + + const normalizedWorkspace = path.normalize(context.workingDirectory); + + // Handle both absolute and relative paths + let resolvedPath: string; + if (path.isAbsolute(filePath)) { + resolvedPath = path.normalize(filePath); + } else { + resolvedPath = path.resolve(context.workingDirectory, filePath); + } + + // Check if path is within workspace boundary + if (!resolvedPath.startsWith(normalizedWorkspace)) { + return handleToolError( + `Path must be within workspace directory: ${filePath}`, + 'Security check', + 'security' + ); + } + + return null; // No error + } catch (error) { + return handleToolError(error, 'Path validation', 'validation'); + } +} + +/** + * Safely resolve a file path (supports both absolute and relative paths) + */ +export function resolveWorkspacePath(filePath: string, context: ExecutionContext): string { + if (path.isAbsolute(filePath)) { + return path.normalize(filePath); + } else { + return path.resolve(context.workingDirectory, filePath); + } +} + +/** + * Create a success response + */ +export function createSuccessResponse(data: Record): ToolSuccessResponse { + return { + success: true, + ...data + }; +} + +/** + * Validation helper for required string parameters + */ +export function validateRequiredString(value: any, paramName: string): ToolErrorResponse | null { + if (!value || typeof value !== 'string' || value.trim() === '') { + return handleToolError( + `${paramName} is required and must be a non-empty string`, + 'Parameter validation', + 'validation' + ); + } + return null; +} + +/** + * Validation helper for file existence + */ +export function validateFileExists(absolutePath: string, filePath: string): ToolErrorResponse | null { + const fs = require('fs'); + + try { + if (!fs.existsSync(absolutePath)) { + return handleToolError( + `File not found: ${filePath}`, + 'File existence check', + 'file_not_found' + ); + } + return null; + } catch (error) { + return handleToolError(error, 'File existence check', 'permission'); + } +} + +/** + * Validation helper for directory existence + */ +export function validateDirectoryExists(absolutePath: string, dirPath: string): ToolErrorResponse | null { + const fs = require('fs'); + + try { + if (!fs.existsSync(absolutePath)) { + return handleToolError( + `Directory not found: ${dirPath}`, + 'Directory existence check', + 'file_not_found' + ); + } + + const stats = fs.statSync(absolutePath); + if (!stats.isDirectory()) { + return handleToolError( + `Path is not a directory: ${dirPath}`, + 'Directory validation', + 'validation' + ); + } + + return null; + } catch (error) { + return handleToolError(error, 'Directory validation', 'permission'); + } +} \ No newline at end of file diff --git a/src/tools/write-tool.ts b/src/tools/write-tool.ts new file mode 100644 index 0000000..dd6fbac --- /dev/null +++ b/src/tools/write-tool.ts @@ -0,0 +1,101 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { tool } from 'ai'; +import { z } from 'zod'; +import { ExecutionContext } from '../types/agent'; +import { + handleToolError, + validateWorkspacePath, + resolveWorkspacePath, + createSuccessResponse, + ToolResponse +} from './tool-utils'; + +/** + * Write tool result with metadata + */ +export interface WriteToolResult { + file_path: string; + absolute_path: string; + is_new_file: boolean; + lines_written: number; + bytes_written: number; +} + +// Path validation is now handled by validateWorkspacePath in tool-utils + +/** + * Create SuperDesign write tool with execution context + */ +export function createWriteTool(context: ExecutionContext) { + return tool({ + description: 'Write content to a file in the SuperDesign workspace. Creates parent directories if needed.', + parameters: z.object({ + file_path: z.string().describe('Path to the file to write to (relative to workspace root, or absolute path within workspace)'), + content: z.string().describe('Content to write to the file'), + create_dirs: z.boolean().optional().default(true).describe('Whether to create parent directories if they don\'t exist (default: true)') + }), + execute: async ({ file_path, content, create_dirs = true }): Promise => { + const startTime = Date.now(); + + try { + // Validate workspace path (handles both absolute and relative paths) + const pathError = validateWorkspacePath(file_path, context); + if (pathError) { + return pathError; + } + + // Resolve absolute path within workspace + const absolutePath = resolveWorkspacePath(file_path, context); + + context.outputChannel.appendLine(`[write] Writing to file: ${file_path}`); + + // Check if target is a directory + if (fs.existsSync(absolutePath)) { + const stats = fs.lstatSync(absolutePath); + if (stats.isDirectory()) { + return handleToolError(`Target path is a directory, not a file: ${file_path}`, 'Path validation', 'validation'); + } + } + + // Create parent directories if needed and requested + if (create_dirs) { + const dirName = path.dirname(absolutePath); + if (!fs.existsSync(dirName)) { + fs.mkdirSync(dirName, { recursive: true }); + context.outputChannel.appendLine(`[write] Created parent directories for: ${file_path}`); + } + } + + // Determine if this is a new file or overwrite + const isNewFile = !fs.existsSync(absolutePath); + + // Write the file + fs.writeFileSync(absolutePath, content, 'utf8'); + + const duration = Date.now() - startTime; + const lines = content.split('\n').length; + const size = Buffer.byteLength(content, 'utf8'); + + context.outputChannel.appendLine(`[write] ${isNewFile ? 'Created' : 'Updated'} file: ${file_path} (${lines} lines, ${size} bytes) in ${duration}ms`); + + const result: WriteToolResult = { + file_path, + absolute_path: absolutePath, + is_new_file: isNewFile, + lines_written: lines, + bytes_written: size + }; + + return createSuccessResponse(result); + + } catch (error) { + const duration = Date.now() - startTime; + const errorMessage = error instanceof Error ? error.message : String(error); + + context.outputChannel.appendLine(`[write] Error writing file: ${errorMessage} (${duration}ms)`); + return handleToolError(error, 'Write tool execution', 'execution'); + } + } + }); +} \ No newline at end of file diff --git a/src/types/agent.ts b/src/types/agent.ts new file mode 100644 index 0000000..4b6b509 --- /dev/null +++ b/src/types/agent.ts @@ -0,0 +1,22 @@ +import * as vscode from 'vscode'; +import { CoreMessage } from 'ai'; + +export interface AgentService { + query( + prompt?: string, + messages?: CoreMessage[], + options?: any, + abortController?: AbortController, + onMessage?: (message: any) => void + ): Promise; + + hasApiKey(): boolean; + isApiKeyAuthError(errorMessage: string): boolean; +} + +export interface ExecutionContext { + workingDirectory: string; + sessionId: string; + outputChannel: vscode.OutputChannel; + abortController?: AbortController; +} \ No newline at end of file diff --git a/src/types/context.ts b/src/types/context.ts new file mode 100644 index 0000000..dacf037 --- /dev/null +++ b/src/types/context.ts @@ -0,0 +1,46 @@ +export type WebviewLayout = 'sidebar' | 'panel'; + +export interface WebviewContext { + layout: WebviewLayout; + extensionUri: string; + logoUris?: { + cursor: string; + windsurf: string; + claudeCode: string; + lovable: string; + bolt: string; + }; +} + +export interface WebviewMessage { + command: string; + [key: string]: any; +} + +export interface ChatCommand extends WebviewMessage { + command: 'chatMessage'; + message: string; +} + +export interface ChatResponse extends WebviewMessage { + command: 'chatResponse'; + response: string; +} + +export interface ChatError extends WebviewMessage { + command: 'chatError'; + error: string; +} + +export interface StopChatCommand extends WebviewMessage { + command: 'stopChat'; +} + +export interface ChatStopped extends WebviewMessage { + command: 'chatStopped'; +} + +export interface InitContext extends WebviewMessage { + command: 'initContext'; + context: WebviewContext; +} \ No newline at end of file diff --git a/src/webview/App.css b/src/webview/App.css new file mode 100644 index 0000000..a814f74 --- /dev/null +++ b/src/webview/App.css @@ -0,0 +1,1586 @@ +/* Main App Container */ +.superdesign-app { + width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + background: var(--vscode-sideBar-background); + color: var(--vscode-sideBar-foreground); + border-right: 1px solid var(--vscode-sideBar-border); + font-family: var(--vscode-font-family); + overflow: hidden; + padding: 0; + margin: 0; +} + +/* App container variants for different contexts */ +.superdesign-app.chat-view { + background: var(--vscode-sideBar-background); + color: var(--vscode-sideBar-foreground); + border-right: 1px solid var(--vscode-sideBar-border); +} + +.superdesign-app.chat-view.panel-layout { + background: var(--vscode-panel-background); + color: var(--vscode-panel-foreground); + border-right: 1px solid var(--vscode-panel-border); +} + +.superdesign-app.canvas-view { + background: var(--vscode-panel-background); + color: var(--vscode-panel-foreground); + border-right: 1px solid var(--vscode-panel-border); +} + +/* App Header */ +.app-header { + padding: 20px 24px 16px 24px; + border-bottom: 1px solid var(--vscode-panel-border); + background: var(--vscode-sideBar-background); +} + +.app-header h1 { + margin: 0 0 8px 0; + font-size: 1.5rem; + font-weight: 600; + color: var(--vscode-foreground); +} + +.app-header p { + margin: 0; + color: var(--vscode-descriptionForeground); + font-size: 0.9rem; +} + +/* Chat Panel */ +.chat-panel { + flex: 1; + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; +} + +.chat-header { + padding: 24px 24px 16px 24px; + border-bottom: 1px solid var(--vscode-panel-border); +} + +.chat-header h2 { + margin: 0 0 8px 0; + font-size: 1.2rem; + font-weight: 500; + color: var(--vscode-foreground); +} + +.chat-header p { + margin: 0; + color: var(--vscode-descriptionForeground); + font-size: 0.9rem; +} + +/* Chat Container */ +.chat-container { + flex: 1; + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; +} + +/* Chat History */ +.chat-history { + flex: 1; + overflow-y: auto; + padding: 20px 24px; + display: flex; + flex-direction: column; + gap: 16px; + scroll-behavior: smooth; +} + +.chat-placeholder { + text-align: center; + padding: 40px 20px; + color: var(--vscode-descriptionForeground); +} + +.chat-placeholder p { + margin: 0 0 16px 0; + font-size: 1rem; +} + +.chat-placeholder p:first-child { + font-size: 1.1rem; + font-weight: 500; + color: var(--vscode-foreground); +} + +.chat-placeholder ul { + text-align: left; + max-width: 300px; + margin: 0 auto; + padding-left: 20px; +} + +.chat-placeholder li { + margin: 8px 0; + line-height: 1.4; +} + +/* Chat Messages */ +.chat-message { + max-width: 85%; + margin-bottom: 4px; +} + +.chat-message.user { + align-self: flex-end; +} + +.chat-message.assistant { + align-self: flex-start; +} + +.message-header { + margin-bottom: 6px; +} + +.message-header strong { + font-size: 0.85rem; + color: var(--vscode-descriptionForeground); + font-weight: 500; +} + +.message-content { + padding: 12px 16px; + border-radius: 12px; + line-height: 1.5; + font-size: 0.95rem; + word-wrap: break-word; + white-space: pre-wrap; +} + +.chat-message.user .message-content { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border-bottom-right-radius: 4px; +} + +.chat-message.assistant .message-content { + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + color: var(--vscode-foreground); + border-bottom-left-radius: 4px; +} + +.message-content.typing { + font-style: italic; + opacity: 0.8; +} + +.typing-indicator { + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { opacity: 0.4; } + 50% { opacity: 1; } +} + +/* Chat Input Container */ +.chat-input-container { + border-top: 1px solid var(--vscode-panel-border); + background: var(--vscode-sideBar-background); + padding: 16px 24px 24px 24px; +} + +/* Quick Suggestions */ +.quick-suggestions { + display: flex; + gap: 8px; + margin-bottom: 16px; + flex-wrap: wrap; +} + +.suggestion-btn { + background: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border: 1px solid var(--vscode-input-border); + padding: 8px 12px; + border-radius: 20px; + cursor: pointer; + font-size: 0.8rem; + font-weight: 500; + transition: all 0.2s ease; + white-space: nowrap; +} + +.suggestion-btn:hover:not(:disabled) { + background: var(--vscode-button-secondaryHoverBackground); + border-color: var(--vscode-focusBorder); + transform: translateY(-1px); +} + +.suggestion-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +/* Chat Input */ +.chat-input { + display: flex; + gap: 12px; + align-items: flex-end; +} + +.message-input { + flex: 1; + padding: 12px 16px; + background: var(--vscode-input-background); + border: 2px solid var(--vscode-input-border); + border-radius: 24px; + color: var(--vscode-input-foreground); + font-family: var(--vscode-font-family); + font-size: 0.95rem; + resize: none; + outline: none; + transition: border-color 0.2s ease; +} + +.message-input:focus { + border-color: var(--vscode-focusBorder); +} + +.message-input::placeholder { + color: var(--vscode-input-placeholderForeground); +} + +.send-btn { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + padding: 12px 16px; + border-radius: 50%; + cursor: pointer; + font-size: 1rem; + transition: all 0.2s ease; + min-width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; +} + +.send-btn:hover:not(:disabled) { + background: var(--vscode-button-hoverBackground); + transform: scale(1.05); +} + +.send-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +/* Scrollbar Styling */ +.chat-history::-webkit-scrollbar { + width: 8px; +} + +.chat-history::-webkit-scrollbar-track { + background: var(--vscode-scrollbarSlider-background); + border-radius: 4px; +} + +.chat-history::-webkit-scrollbar-thumb { + background: var(--vscode-scrollbarSlider-hoverBackground); + border-radius: 4px; +} + +.chat-history::-webkit-scrollbar-thumb:hover { + background: var(--vscode-scrollbarSlider-activeBackground); +} + +/* Responsive Design */ +@media (max-width: 768px) { + .chat-history { + padding: 16px; + } + + .chat-input-container { + padding: 12px 16px; + } + + .chat-message { + max-width: 95%; + } +} + +/* Colors Panel */ +.colors-panel h3 { + margin: 0 0 20px 0; + color: var(--vscode-foreground); +} + +.chat-header p { + margin: 0; + color: var(--vscode-descriptionForeground); + font-size: 0.9rem; +} + +.control-btn, .viewport-btn { + background-color: transparent; + border: none; + color: #ffffff; + padding: 0; + border-radius: 5px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + transition: background-color 0.15s ease; +} + +.control-btn:hover, .viewport-btn:hover { + background-color: #3f3f3f; +} + +.control-btn:disabled, .viewport-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + background-color: transparent; +} + +.control-btn.active, +.viewport-btn.active, +.viewport-toggle.active { + background-color: #4f4f4f; +} + +.viewport-divider { + width: 1px; + height: 24px; + background-color: #4a4a4a; + margin: 0 4px; +} + +.zoom-indicator { + padding: 0 10px; + background-color: transparent; + border-radius: 4px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + min-width: 45px; + font-weight: 500; +} + +.viewport-controls { + display: flex; + align-items: center; + background-color: #1e1e1e; + border-radius: 5px; + padding: 2px; +} + +.viewport-controls .control-btn { + width: 30px; + height: 30px; +} + +.canvas-info { + position: absolute; + top: 12px; + right: 12px; + background-color: #2c2c2c; + color: #ffffff; + padding: 8px 14px; + border-radius: 8px; + font-size: 12px; + z-index: 100; + white-space: nowrap; + box-shadow: 0 4px 12px rgba(0,0,0,0.25); +} + +/* Transform Wrapper */ +.canvas-transform-wrapper { + flex: 1; + overflow: hidden; + cursor: grab; +} + +.canvas-transform-wrapper:active { + cursor: grabbing; +} + +.canvas-transform-content { + position: relative; + /* Grid background is handled by canvas-grid */ +} + +/* Canvas Grid */ +.canvas-grid { + position: relative; + min-width: 10000px; + min-height: 10000px; + user-select: none; + /* Always show subtle grid background */ + background-image: + linear-gradient(90deg, rgba(var(--vscode-panel-border-rgb, 128, 128, 128), 0.3) 1px, transparent 1px), + linear-gradient(rgba(var(--vscode-panel-border-rgb, 128, 128, 128), 0.3) 1px, transparent 1px); + background-size: 50px 50px; + background-position: 0 0, 0 0; + /* Fallback for browsers that don't support CSS custom property RGB values */ + background: + linear-gradient(90deg, var(--vscode-panel-border) 1px, transparent 1px), + linear-gradient(var(--vscode-panel-border) 1px, transparent 1px); + background-size: 50px 50px; +} + +.canvas-grid.dragging { + /* Enhance grid visibility during dragging with smaller, more visible grid */ + background-image: + linear-gradient(90deg, var(--vscode-focusBorder) 1px, transparent 1px), + linear-gradient(var(--vscode-focusBorder) 1px, transparent 1px); + background-size: 25px 25px; + background-position: 0 0, 0 0; +} + +/* Design Frames */ +.design-frame { + background: var(--vscode-editor-background); + border: 2px solid var(--vscode-input-border); + border-radius: 8px; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.design-frame:hover { + border-color: var(--vscode-focusBorder); + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); +} + +.design-frame.selected { + border-color: var(--vscode-button-background); + box-shadow: 0 0 0 2px var(--vscode-button-background); +} + +.design-frame.dragging { + border-color: var(--vscode-focusBorder); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); + transform: scale(1.02); + transition: none; +} + +.frame-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px; + background: var(--vscode-sideBar-background); + border-bottom: 1px solid var(--vscode-panel-border); + border-radius: 6px 6px 0 0; + height: 50px; + box-sizing: border-box; + gap: 8px; + user-select: none; +} + +.frame-title { + font-size: 12px; + font-weight: 500; + color: var(--vscode-foreground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; +} + +.frame-meta { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; +} + +.frame-size { + font-size: 10px; + color: var(--vscode-descriptionForeground); + background: var(--vscode-badge-background); + color: var(--vscode-badge-foreground); + padding: 2px 6px; + border-radius: 10px; + font-weight: 500; +} + +.frame-dimensions { + font-size: 9px; + color: var(--vscode-descriptionForeground); + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + padding: 1px 4px; + border-radius: 3px; + font-family: var(--vscode-editor-font-family); +} + +/* Frame Viewport Controls */ +.frame-viewport-controls { + display: flex; + align-items: center; + gap: 2px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + padding: 1px; +} + +.frame-viewport-btn { + background: transparent; + border: none; + padding: 2px 4px; + border-radius: 3px; + cursor: pointer; + font-size: 10px; + transition: background-color 0.2s ease; + color: var(--vscode-foreground); + line-height: 1; +} + +.frame-viewport-btn:hover { + background: var(--vscode-list-hoverBackground); +} + +.frame-viewport-btn.active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +/* Frame Viewport Indicator */ +.frame-viewport-indicator { + display: flex; + align-items: center; + gap: 4px; + font-size: 10px; + color: var(--vscode-descriptionForeground); +} + +.global-indicator { + font-size: 8px; + opacity: 0.7; +} + +.viewport-icon { + font-size: 10px; +} + +.frame-status { + font-size: 8px; + line-height: 1; +} + +.frame-status.loading { + color: var(--vscode-progressBar-background); + animation: pulse 1.5s ease-in-out infinite; +} + +.frame-status.error { + color: var(--vscode-errorForeground); +} + +.frame-status.loaded { + color: var(--vscode-charts-green); +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +/* Viewport Controls */ +.viewport-toggle.active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +.frame-content { + position: relative; + height: calc(100% - 50px); + padding: 0; + overflow: hidden; + background: white; +} + +.frame-placeholder { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: #ffffff; + color: #333; + padding: 20px; + text-align: center; + border-radius: 0 0 6px 6px; +} + +.placeholder-icon { + font-size: 32px; + margin-bottom: 12px; + opacity: 0.6; +} + +.placeholder-name { + margin: 0 0 8px 0; + font-size: 13px; + font-weight: 500; + color: var(--vscode-foreground); +} + +.placeholder-meta { + display: flex; + flex-direction: column; + gap: 2px; + margin-bottom: 8px; +} + +.placeholder-meta span { + font-size: 11px; + color: var(--vscode-descriptionForeground); +} + +.placeholder-meta .file-type { + font-size: 9px; + background: var(--vscode-badge-background); + color: var(--vscode-badge-foreground); + padding: 2px 6px; + border-radius: 10px; + font-weight: 500; + text-transform: uppercase; +} + +.placeholder-hint { + font-size: 10px; + color: var(--vscode-descriptionForeground); + font-style: italic; + opacity: 0.8; +} + +/* Frame Loading & Error Overlays */ +.frame-loading-overlay, +.frame-error-overlay, +.frame-drag-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10; +} + +.frame-loading-overlay, +.frame-error-overlay { + display: flex; + justify-content: center; + align-items: center; + backdrop-filter: blur(2px); +} + +.frame-loading-overlay, +.frame-error-overlay { + background: rgba(255, 255, 255, 0.9); +} + +.frame-drag-overlay { + position: absolute; + top: 0; + left: 0; + background: transparent; + cursor: grab; + z-index: 5; /* Lower than loading/error overlays but higher than iframe */ +} + +.design-frame.dragging .frame-drag-overlay { + cursor: grabbing; +} + +.drag-ready-hint { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: var(--vscode-editor-background); + border: 2px solid var(--vscode-focusBorder); + border-radius: 8px; + padding: 8px 12px; + text-align: center; + color: var(--vscode-foreground); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + opacity: 0; + animation: dragHint 0.3s ease-out forwards; + pointer-events: none; +} + +.drag-ready-hint span { + font-size: 16px; + display: block; + margin-bottom: 4px; +} + +.drag-ready-hint p { + margin: 0; + font-size: 10px; + font-weight: 500; +} + +@keyframes dragHint { + 0% { + opacity: 0; + transform: translate(-50%, -50%) scale(0.8); + } + 100% { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +} + +.design-frame:hover .frame-drag-overlay { + cursor: grabbing; +} + +.frame-loading-spinner { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + color: var(--vscode-foreground); +} + +.font-sample { + padding: 12px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); +} + +.frame-error-content span { + font-size: 24px; + display: block; + margin-bottom: 8px; +} + +.frame-error-content p { + margin: 0 0 4px 0; + font-size: 12px; + font-weight: 500; +} + +.font-sample.body { + font-size: 1rem; +} + +.suggestion-btn { + background: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border: 1px solid var(--vscode-input-border); + padding: 8px 12px; + border-radius: 20px; + cursor: pointer; + font-size: 0.8rem; + font-weight: 500; + transition: all 0.2s ease; + white-space: nowrap; +} + +.suggestion-btn:hover:not(:disabled) { + background: var(--vscode-button-secondaryHoverBackground); + border-color: var(--vscode-focusBorder); + transform: translateY(-1px); +} + +/* Loading States */ +.canvas-loading { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: var(--vscode-editor-background); +} + +.loading-spinner { + text-align: center; + color: var(--vscode-foreground); +} + +.spinner { + width: 32px; + height: 32px; + border: 3px solid var(--vscode-input-border); + border-top: 3px solid var(--vscode-button-background); + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 16px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Error States */ +.canvas-error { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: var(--vscode-editor-background); +} + +.error-message { + text-align: center; + padding: 32px; + background: var(--vscode-sideBar-background); + border-radius: 8px; + border: 1px solid var(--vscode-panel-border); + max-width: 400px; +} + +.error-message h3 { + margin: 0 0 12px 0; + color: var(--vscode-errorForeground); +} + +.error-message p { + margin: 0 0 20px 0; + color: var(--vscode-foreground); +} + +.error-message button { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; +} + +/* Empty States */ +.canvas-empty { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: var(--vscode-editor-background); +} + +.empty-state { + text-align: center; + color: var(--vscode-descriptionForeground); +} + +.empty-state h3 { + margin: 0 0 12px 0; + color: var(--vscode-foreground); +} + +.empty-state code { + background: var(--vscode-textCodeBlock-background); + padding: 2px 6px; + border-radius: 3px; + font-family: var(--vscode-editor-font-family); +} + +/* Design Panel Styles */ +.design-panel { + flex: 1; + display: flex; + flex-direction: column; + height: 100%; +} + +.tab-nav { + display: flex; + background: var(--vscode-sideBar-background); + border-bottom: 1px solid var(--vscode-panel-border); +} + +.tab { + flex: 1; + padding: 12px 16px; + background: transparent; + border: none; + color: var(--vscode-foreground); + cursor: pointer; + font-size: 0.9rem; + transition: background-color 0.2s ease; +} + +.tab:hover { + background: var(--vscode-list-hoverBackground); +} + +.tab.active { + background: var(--vscode-tab-activeBackground); + border-bottom: 2px solid var(--vscode-button-background); +} + +.tab-content { + flex: 1; + padding: 24px; + overflow-y: auto; +} + +.colors-panel h3, +.typography-panel h3, +.components-panel h3 { + margin: 0 0 20px 0; + color: var(--vscode-foreground); +} + +.color-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 16px; +} + +.color-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: 6px; +} + +.color-swatch { + width: 40px; + height: 40px; + border-radius: 4px; + border: 1px solid var(--vscode-input-border); +} + +.color-info { + display: flex; + flex-direction: column; + gap: 4px; +} + +.color-name { + font-weight: 500; + color: var(--vscode-foreground); +} + +.color-value { + font-size: 0.85rem; + color: var(--vscode-descriptionForeground); + font-family: var(--vscode-editor-font-family); +} + +.font-samples { + display: flex; + flex-direction: column; + gap: 16px; +} + +.font-sample { + padding: 12px; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: 6px; +} + +.font-sample.h1 { + font-size: 2rem; + font-weight: 700; +} + +.font-sample.h2 { + font-size: 1.5rem; + font-weight: 600; +} + +.font-sample.body { + font-size: 1rem; +} + +.font-sample.caption { + font-size: 0.85rem; + opacity: 0.8; +} + +.actions { + padding: 16px 24px; + border-top: 1px solid var(--vscode-panel-border); + background: var(--vscode-sideBar-background); +} + +.export-btn { + width: 100%; + padding: 12px 16px; + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 0.95rem; + font-weight: 500; + transition: background-color 0.2s ease; +} + +.export-btn:hover { + background: var(--vscode-button-hoverBackground); +} + +.export-btn:active { + background: var(--vscode-button-activeBackground); +} + +/* Canvas View Styles */ +.canvas-container { + display: flex; + flex-direction: column; + height: 100vh; + background: var(--vscode-editor-background); + position: relative; +} + +.canvas-toolbar { + position: absolute; + top: 16px; + left: 16px; + z-index: 1000; + + display: flex; + align-items: stretch; + background: var(--vscode-titleBar-activeBackground); + border: 1px solid var(--vscode-titleBar-border, var(--vscode-contrastBorder)); + border-radius: 6px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.16); + backdrop-filter: blur(8px); + font-size: 12px; + min-height: 32px; + max-width: calc(100vw - 32px); + overflow: hidden; + transition: all 0.2s ease; +} + +.canvas-toolbar:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + border-color: var(--vscode-focusBorder, var(--vscode-titleBar-border)); +} + +.toolbar-section { + display: flex; + align-items: center; + padding: 0 12px; + border-right: 1px solid var(--vscode-titleBar-border, var(--vscode-contrastBorder)); + position: relative; + min-height: 32px; +} + +.toolbar-section:last-child { + border-right: none; +} + +.toolbar-section:hover { + background: var(--vscode-titleBar-hoverBackground, rgba(255, 255, 255, 0.05)); +} + +.control-group { + display: flex; + align-items: center; + gap: 2px; +} + +/* Toolbar Buttons */ +.toolbar-btn { + background: transparent; + border: none; + color: var(--vscode-titleBar-activeForeground); + padding: 4px 6px; + border-radius: 3px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + min-width: 24px; + height: 24px; + transition: all 0.15s ease; + font-size: 12px; +} + +.toolbar-btn:hover { + background: var(--vscode-toolbar-hoverBackground, rgba(255, 255, 255, 0.1)); + color: var(--vscode-titleBar-activeForeground); +} + +.toolbar-btn:active { + background: var(--vscode-toolbar-activeBackground, rgba(255, 255, 255, 0.15)); +} + +.toolbar-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + background: transparent; +} + +.toolbar-btn.active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +.toolbar-btn.active:hover { + background: var(--vscode-button-hoverBackground); +} + +/* Specific Button Types */ +.zoom-btn { + width: 28px; +} + +.layout-toggle { + display: flex; + background: var(--vscode-dropdown-background); + border: 1px solid var(--vscode-dropdown-border); + border-radius: 4px; + overflow: hidden; + margin-left: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* Ensure no individual button radius */ +.layout-toggle .toggle-btn { + border-radius: 0 !important; +} + +.layout-toggle .toggle-btn:first-child { + border-radius: 0 !important; +} + +.layout-toggle .toggle-btn:last-child { + border-radius: 0 !important; +} + +.toggle-btn { + background: transparent; + border: none; + border-radius: 0 !important; + color: var(--vscode-dropdown-foreground); + padding: 5px 8px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + min-width: 32px; + height: 26px; + transition: all 0.2s ease; + border-right: 1px solid var(--vscode-dropdown-border); + position: relative; +} + +.toggle-btn:last-child { + border-right: none; +} + +.toggle-btn:hover { + background: var(--vscode-list-hoverBackground); + color: var(--vscode-list-hoverForeground); + transform: translateY(-1px); +} + +.toggle-btn.active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.toggle-btn.active:hover { + background: var(--vscode-button-hoverBackground); + transform: none; +} + +/* Enhanced icon styling for layout buttons */ +.toggle-btn svg { + transition: transform 0.2s ease; +} + +.toggle-btn:hover svg { + transform: scale(1.1); +} + +.toggle-btn.active svg { + transform: scale(1.05); +} + +/* Toolbar Dividers and Displays */ +.toolbar-divider { + width: 1px; + height: 16px; + background: var(--vscode-titleBar-border, var(--vscode-contrastBorder)); + margin: 0 4px; +} + +.zoom-display { + display: flex; + align-items: center; + padding: 0 6px; + margin: 0 2px; +} + +.zoom-value { + font-size: 11px; + font-weight: 500; + color: var(--vscode-titleBar-activeForeground); + min-width: 32px; + text-align: center; +} + +/* Viewport Controls - Segmented Control Style */ +.viewport-selector { + display: flex; + background: var(--vscode-dropdown-background); + border: 1px solid var(--vscode-dropdown-border); + border-radius: 4px; + overflow: hidden; + margin-left: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* Ensure no individual button radius */ +.viewport-selector .viewport-btn { + border-radius: 0 !important; +} + +.viewport-selector .viewport-btn:first-child { + border-radius: 0 !important; +} + +.viewport-selector .viewport-btn:last-child { + border-radius: 0 !important; +} + +.viewport-btn { + background: transparent; + border: none; + border-radius: 0 !important; + color: var(--vscode-dropdown-foreground); + padding: 5px 8px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + min-width: 32px; + height: 26px; + transition: all 0.2s ease; + border-right: 1px solid var(--vscode-dropdown-border); + position: relative; +} + +.viewport-btn:last-child { + border-right: none; +} + +.viewport-btn:hover:not(:disabled) { + background: var(--vscode-list-hoverBackground); + color: var(--vscode-list-hoverForeground); +} + +.viewport-btn:disabled { + opacity: 0.3; + cursor: not-allowed; + background: var(--vscode-input-background); + color: var(--vscode-disabledForeground); +} + +.viewport-btn.active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.viewport-btn.active:hover { + background: var(--vscode-button-hoverBackground); +} + +/* Enhanced icon styling for viewport buttons */ +.viewport-btn svg { + transition: transform 0.2s ease; +} + +.viewport-btn:hover:not(:disabled) svg { + transform: scale(1.1); +} + +.viewport-btn.active svg { + transform: scale(1.05); +} + +/* Additional Button Styles */ +.connection-btn { + margin-left: 6px; +} + +.viewport-mode-btn { + margin-right: 6px; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .canvas-toolbar { + left: 8px; + top: 8px; + flex-wrap: wrap; + max-width: calc(100vw - 16px); + } + + .toolbar-section { + padding: 0 8px; + } +} + +/* Floating Action Buttons */ +.floating-action-buttons { + position: absolute; + top: 8px; + right: -190px; + display: flex; + flex-direction: column; + gap: 6px; + z-index: 200; + animation: fadeInFromRight 0.3s ease forwards; +} + +.floating-action-btn { + background: white; + color: #333; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 8px; + padding: 10px 14px; + font-size: 0.8rem; + font-weight: 500; + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15); + transition: all 0.2s ease; + white-space: nowrap; + min-width: 150px; + justify-content: flex-start; +} + +.floating-action-btn:hover { + background: #f8f9fa; + transform: translateY(-1px); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); + border-color: rgba(0, 0, 0, 0.2); +} + +.floating-action-btn:active { + transform: translateY(0); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} + +.floating-action-btn .btn-icon { + width: 16px; + height: 16px; + flex-shrink: 0; + color: #666; +} + +.floating-action-btn:hover .btn-icon { + color: #333; +} + +.floating-action-btn .btn-text { + font-size: 0.8rem; + font-weight: 500; + color: #333; +} + +@keyframes fadeInFromRight { + from { + opacity: 0; + transform: translateX(20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +/* Copied Notification */ +.copied-notification { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: var(--vscode-notifications-background); + color: var(--vscode-notifications-foreground); + border: 1px solid var(--vscode-notifications-border); + border-radius: 6px; + padding: 12px 16px; + display: flex; + align-items: center; + gap: 8px; + font-size: 0.85rem; + font-weight: 500; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + z-index: 300; + animation: fadeInOut 2s ease forwards; + pointer-events: none; +} + +.copied-notification .copied-icon { + font-size: 1rem; +} + +.copied-notification .copied-text { + white-space: nowrap; +} + +@keyframes fadeInOut { + 0% { + opacity: 0; + transform: translate(-50%, -50%) scale(0.8); + } + 15% { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + 85% { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + 100% { + opacity: 0; + transform: translate(-50%, -50%) scale(0.8); + } +} + +/* Copy Prompt Dropdown */ +.copy-prompt-dropdown { + position: relative; + display: inline-block; +} + +.copy-prompt-main-btn { + position: relative; + padding-right: 40px !important; /* Make room for dropdown arrow */ +} + +.copy-prompt-main-btn.success { + background: #1a1a1a !important; + color: white !important; + border-color: #1a1a1a !important; +} + +.copy-prompt-main-btn.success .btn-icon, +.copy-prompt-main-btn.success .dropdown-arrow { + color: white !important; +} + +.copy-prompt-main-btn.success .btn-text { + color: white !important; +} + +.copy-prompt-main-btn.success .btn-icon { + display: none; +} + +.copy-prompt-main-btn.success::before { + content: "✓"; + font-size: 16px; + margin-right: 8px; + color: white !important; +} + +.dropdown-arrow { + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + width: 12px; + height: 12px; + color: #666; + transition: transform 0.2s ease; +} + +.copy-prompt-main-btn:hover .dropdown-arrow { + color: #333; +} + +.copy-dropdown-menu { + position: absolute; + top: 100%; + left: 0; + right: 0; + background: white; + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); + z-index: 300; + margin-top: 4px; + overflow: hidden; + animation: dropdownFadeIn 0.2s ease forwards; +} + +@keyframes dropdownFadeIn { + from { + opacity: 0; + transform: translateY(-8px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.copy-dropdown-item { + width: 100%; + background: none; + border: none; + padding: 10px 14px; + display: flex; + align-items: center; + gap: 10px; + cursor: pointer; + font-size: 0.8rem; + font-weight: 500; + color: #333; + text-align: left; + transition: background-color 0.2s ease; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.copy-dropdown-item:last-child { + border-bottom: none; +} + +.copy-dropdown-item:hover { + background: #f8f9fa; +} + +.copy-dropdown-item:active { + background: #e9ecef; +} + +.platform-logo { + width: 20px; + height: 20px; + object-fit: contain; + flex-shrink: 0; +} + +.copy-dropdown-item span { + flex: 1; + white-space: nowrap; +} \ No newline at end of file diff --git a/src/webview/App.tsx b/src/webview/App.tsx new file mode 100644 index 0000000..805286a --- /dev/null +++ b/src/webview/App.tsx @@ -0,0 +1,113 @@ +import React, { useState, useEffect } from 'react'; +import ChatInterface from './components/Chat/ChatInterface'; +import CanvasView from './components/CanvasView'; +import { WebviewContext } from '../types/context'; + +// Import CSS as string for esbuild +import styles from './App.css'; + +const App: React.FC = () => { + console.log('🚀 App component starting...'); + + const [vscode] = useState(() => { + console.log('📞 Acquiring vscode API...'); + return acquireVsCodeApi(); + }); + + const [context, setContext] = useState(null); + const [currentView, setCurrentView] = useState<'chat' | 'canvas'>('chat'); + const [nonce, setNonce] = useState(null); + + useEffect(() => { + console.log('🔄 App useEffect running...'); + + // Detect which view to render based on data-view attribute + const rootElement = document.getElementById('root'); + console.log('📍 Root element:', rootElement); + + const viewType = rootElement?.getAttribute('data-view'); + const nonceValue = rootElement?.getAttribute('data-nonce'); + + console.log('🎯 View type detected:', viewType); + console.log('🔐 Nonce value:', nonceValue); + + if (nonceValue) { + setNonce(nonceValue); + console.log('✅ Nonce set:', nonceValue); + } + + if (viewType === 'canvas') { + setCurrentView('canvas'); + console.log('🎨 Switching to canvas view'); + } else { + setCurrentView('chat'); + console.log('💬 Switching to chat view'); + } + + // Inject CSS styles + const styleElement = document.createElement('style'); + styleElement.textContent = styles; + document.head.appendChild(styleElement); + console.log('🎨 CSS styles injected'); + + // Get context from window (only needed for chat interface) + const webviewContext = (window as any).__WEBVIEW_CONTEXT__; + console.log('🌐 Webview context from window:', webviewContext); + + if (webviewContext) { + setContext(webviewContext); + console.log('✅ Context set:', webviewContext); + } else { + console.log('⚠️ No webview context found in window'); + } + + return () => { + document.head.removeChild(styleElement); + }; + }, []); + + const renderView = () => { + console.log('🖼️ Rendering view, currentView:', currentView); + + switch (currentView) { + case 'canvas': + console.log('🎨 Rendering CanvasView with vscode:', !!vscode, 'nonce:', nonce); + try { + // Canvas view doesn't need context - it gets data from extension directly + return ; + } catch (error) { + console.error('❌ Error rendering CanvasView:', error); + return
Error rendering canvas: {String(error)}
; + } + case 'chat': + default: + console.log('💬 Rendering ChatInterface, context:', !!context); + // Chat interface needs context + if (!context) { + console.log('⏳ Context not ready, showing loading...'); + return
Loading...
; + } + try { + return ( + + ); + } catch (error) { + console.error('❌ Error rendering ChatInterface:', error); + return
Error rendering chat: {String(error)}
; + } + } + }; + + console.log('🔄 App rendering, currentView:', currentView); + + return ( +
+ {renderView()} +
+ ); +}; + +export default App; \ No newline at end of file diff --git a/src/webview/components/CanvasView.tsx b/src/webview/components/CanvasView.tsx new file mode 100644 index 0000000..20607ff --- /dev/null +++ b/src/webview/components/CanvasView.tsx @@ -0,0 +1,860 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { TransformWrapper, TransformComponent, ReactZoomPanPinchRef } from 'react-zoom-pan-pinch'; +import DesignFrame from './DesignFrame'; +import { calculateGridPosition, calculateFitToView, getGridMetrics, generateResponsiveConfig, buildHierarchyTree, calculateHierarchyPositions, getHierarchicalPosition, detectDesignRelationships } from '../utils/gridLayout'; +import { + DesignFile, + CanvasState, + WebviewMessage, + ExtensionToWebviewMessage, + CanvasConfig, + ViewportMode, + FrameViewportState, + FramePositionState, + DragState, + GridPosition, + LayoutMode, + HierarchyTree, + ConnectionLine +} from '../types/canvas.types'; +import ConnectionLines from './ConnectionLines'; +import { + ZoomInIcon, + ZoomOutIcon, + HomeIcon, + ScaleIcon, + RefreshIcon, + GlobeIcon, + MobileIcon, + TabletIcon, + DesktopIcon, + TreeIcon, + LinkIcon +} from './Icons'; + +interface CanvasViewProps { + vscode: any; + nonce: string | null; +} + +const CANVAS_CONFIG: CanvasConfig = { + frameSize: { width: 320, height: 400 }, // Smaller default frame size for better density + gridSpacing: 50, // Much tighter spacing between frames + framesPerRow: 4, // Fit 4 frames per row by default + minZoom: 0.1, + maxZoom: 5, + responsive: { + enableScaling: true, + minFrameSize: { width: 160, height: 200 }, // Reduced minimum size + maxFrameSize: { width: 400, height: 500 }, // Reduced maximum size + scaleWithZoom: false + }, + viewports: { + desktop: { width: 1000, height: 600 }, // More compact desktop view + tablet: { width: 640, height: 800 }, // Smaller tablet view + mobile: { width: 320, height: 550 } // More compact mobile view + }, + hierarchy: { + horizontalSpacing: 180, // Reduced horizontal spacing for hierarchy + verticalSpacing: 120, // Reduced vertical spacing for hierarchy + connectionLineWidth: 2, + connectionLineColor: 'var(--vscode-textLink-foreground)', + showConnections: true + } +}; + +const CanvasView: React.FC = ({ vscode, nonce }) => { + console.log('🎨 CanvasView component starting...'); + console.log('📞 CanvasView props - vscode:', !!vscode, 'nonce:', nonce); + + const [designFiles, setDesignFiles] = useState([]); + const [selectedFrames, setSelectedFrames] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [currentZoom, setCurrentZoom] = useState(1); + const [currentConfig, setCurrentConfig] = useState(CANVAS_CONFIG); + const [globalViewportMode, setGlobalViewportMode] = useState('tablet'); + const [frameViewports, setFrameViewports] = useState({}); + const [useGlobalViewport, setUseGlobalViewport] = useState(true); + const [customPositions, setCustomPositions] = useState({}); + const [dragState, setDragState] = useState({ + isDragging: false, + draggedFrame: null, + startPosition: { x: 0, y: 0 }, + currentPosition: { x: 0, y: 0 }, + offset: { x: 0, y: 0 } + }); + const [layoutMode, setLayoutMode] = useState('grid'); + const [hierarchyTree, setHierarchyTree] = useState(null); + const [showConnections, setShowConnections] = useState(true); + const transformRef = useRef(null); + + console.log('✅ CanvasView state initialized successfully'); + + // Performance optimization: Switch render modes based on zoom level + const getOptimalRenderMode = (_zoom: number): 'placeholder' | 'iframe' => { + // Always render iframe as requested by the user + return 'iframe'; + }; + + // Helper function to transform mouse coordinates to canvas space + const transformMouseToCanvasSpace = (clientX: number, clientY: number, canvasRect: DOMRect): GridPosition => { + // Get current transform state from the TransformWrapper + const transformState = transformRef.current?.instance?.transformState; + const currentScale = transformState?.scale || 1; + const currentTranslateX = transformState?.positionX || 0; + const currentTranslateY = transformState?.positionY || 0; + + // Calculate mouse position relative to canvas, then adjust for zoom and pan + const rawMouseX = clientX - canvasRect.left; + const rawMouseY = clientY - canvasRect.top; + + // Transform mouse coordinates to canvas space (inverse of current transform) + return { + x: (rawMouseX - currentTranslateX) / currentScale, + y: (rawMouseY - currentTranslateY) / currentScale + }; + }; + + // Viewport management functions + const getFrameViewport = (fileName: string): ViewportMode => { + if (useGlobalViewport) { + return globalViewportMode; + } + return frameViewports[fileName] || 'desktop'; + }; + + const handleFrameViewportChange = (fileName: string, viewport: ViewportMode) => { + setFrameViewports(prev => ({ + ...prev, + [fileName]: viewport + })); + }; + + const handleGlobalViewportChange = (viewport: ViewportMode) => { + setGlobalViewportMode(viewport); + if (useGlobalViewport) { + // Update all frames to the new global viewport + const newFrameViewports: FrameViewportState = {}; + designFiles.forEach(file => { + newFrameViewports[file.name] = viewport; + }); + setFrameViewports(newFrameViewports); + + // Update hierarchy positioning when viewport changes to adjust connection spacing + if (hierarchyTree && designFiles.length > 0) { + // Recalculate frame dimensions for new viewport + let totalWidth = 0; + let totalHeight = 0; + let frameCount = 0; + + designFiles.forEach(file => { + const viewportDimensions = currentConfig.viewports[viewport]; + totalWidth += viewportDimensions.width; + totalHeight += viewportDimensions.height + 50; // Add header space + frameCount++; + }); + + const avgFrameDimensions = frameCount > 0 ? { + width: Math.round(totalWidth / frameCount), + height: Math.round(totalHeight / frameCount) + } : { width: 400, height: 550 }; + + const updatedTree = calculateHierarchyPositions(hierarchyTree, currentConfig, avgFrameDimensions); + setHierarchyTree(updatedTree); + } + } + }; + + const toggleGlobalViewport = () => { + const newUseGlobal = !useGlobalViewport; + setUseGlobalViewport(newUseGlobal); + + if (newUseGlobal) { + // Set all frames to current global viewport + const newFrameViewports: FrameViewportState = {}; + designFiles.forEach(file => { + newFrameViewports[file.name] = globalViewportMode; + }); + setFrameViewports(newFrameViewports); + } + }; + + // Responsive config update + useEffect(() => { + const updateConfig = () => { + const responsive = generateResponsiveConfig(CANVAS_CONFIG, window.innerWidth); + setCurrentConfig(responsive); + }; + + updateConfig(); + window.addEventListener('resize', updateConfig); + return () => window.removeEventListener('resize', updateConfig); + }, []); + + useEffect(() => { + // Request design files from extension + const loadMessage: WebviewMessage = { + command: 'loadDesignFiles' + }; + vscode.postMessage(loadMessage); + + // Listen for messages from extension + const messageHandler = (event: MessageEvent) => { + const message: ExtensionToWebviewMessage = event.data; + + switch (message.command) { + case 'designFilesLoaded': + // Convert date strings back to Date objects + const filesWithDates = message.data.files.map(file => ({ + ...file, + modified: new Date(file.modified) + })); + + // Detect design relationships and build hierarchy + const filesWithRelationships = detectDesignRelationships(filesWithDates); + setDesignFiles(filesWithRelationships); + + // Build hierarchy tree + const tree = buildHierarchyTree(filesWithRelationships); + + // Calculate average frame dimensions based on viewport usage + let totalWidth = 0; + let totalHeight = 0; + let frameCount = 0; + + filesWithRelationships.forEach(file => { + const frameViewport = getFrameViewport(file.name); + const viewportDimensions = currentConfig.viewports[frameViewport]; + totalWidth += viewportDimensions.width; + totalHeight += viewportDimensions.height + 50; // Add header space + frameCount++; + }); + + const avgFrameDimensions = frameCount > 0 ? { + width: Math.round(totalWidth / frameCount), + height: Math.round(totalHeight / frameCount) + } : { width: 400, height: 550 }; + + const positionedTree = calculateHierarchyPositions(tree, currentConfig, avgFrameDimensions); + setHierarchyTree(positionedTree); + + setIsLoading(false); + + // Auto-center view after files are loaded + setTimeout(() => { + if (transformRef.current) { + transformRef.current.resetTransform(); + } + }, 100); + break; + + case 'error': + setError(message.data.error); + setIsLoading(false); + break; + + case 'fileChanged': + // Handle file system changes (will implement in Task 2.3) + console.log('File changed:', message.data); + // Re-request files when changes occur + vscode.postMessage({ command: 'loadDesignFiles' }); + break; + } + }; + + window.addEventListener('message', messageHandler); + return () => window.removeEventListener('message', messageHandler); + }, [vscode]); // Removed currentConfig dependency to prevent constant re-renders + + const handleFrameSelect = (fileName: string) => { + setSelectedFrames([fileName]); // Single selection for now + + // Find the selected file to get its full path + const selectedFile = designFiles.find(file => file.name === fileName); + const filePath = selectedFile ? selectedFile.path : fileName; + + const selectMessage: WebviewMessage = { + command: 'selectFrame', + data: { fileName } + }; + vscode.postMessage(selectMessage); + + // Also send context to chat interface with full path + const contextMessage: WebviewMessage = { + command: 'setContextFromCanvas', + data: { fileName: filePath, type: 'frame' } + }; + vscode.postMessage(contextMessage); + }; + + const handleSendToChat = (fileName: string, prompt: string) => { + // Find the selected file to get its full path + const selectedFile = designFiles.find(file => file.name === fileName); + const filePath = selectedFile ? selectedFile.path : fileName; + + // Set context first + const contextMessage: WebviewMessage = { + command: 'setContextFromCanvas', + data: { fileName: filePath, type: 'frame' } + }; + vscode.postMessage(contextMessage); + + // Then send the prompt to the chat input + const promptMessage: WebviewMessage = { + command: 'setChatPrompt', + data: { prompt } + }; + vscode.postMessage(promptMessage); + }; + + // Canvas control functions + const handleZoomIn = () => { + if (transformRef.current) { + const currentState = transformRef.current.instance?.transformState; + console.log('🔍 ZOOM IN - Before:', { + scale: currentState?.scale, + positionX: currentState?.positionX, + positionY: currentState?.positionY, + step: 0.05, + minScale: 0.1, + maxScale: 3, + smooth: false + }); + + transformRef.current.zoomIn(0.05); + + // Log after zoom (with small delay to capture the change) + setTimeout(() => { + const newState = transformRef.current?.instance?.transformState; + console.log('🔍 ZOOM IN - After:', { + scale: newState?.scale, + positionX: newState?.positionX, + positionY: newState?.positionY, + scaleDiff: newState?.scale ? (newState.scale - (currentState?.scale || 1)) : 0, + positionXDiff: newState?.positionX ? (newState.positionX - (currentState?.positionX || 0)) : 0, + positionYDiff: newState?.positionY ? (newState.positionY - (currentState?.positionY || 0)) : 0 + }); + }, 50); + } + }; + + const handleZoomOut = () => { + if (transformRef.current) { + const currentState = transformRef.current.instance?.transformState; + console.log('🔍 ZOOM OUT - Before:', { + scale: currentState?.scale, + positionX: currentState?.positionX, + positionY: currentState?.positionY, + step: 0.05 + }); + + transformRef.current.zoomOut(0.05); + + // Log after zoom (with small delay to capture the change) + setTimeout(() => { + const newState = transformRef.current?.instance?.transformState; + console.log('🔍 ZOOM OUT - After:', { + scale: newState?.scale, + positionX: newState?.positionX, + positionY: newState?.positionY, + scaleDiff: newState?.scale ? (newState.scale - (currentState?.scale || 1)) : 0, + positionXDiff: newState?.positionX ? (newState.positionX - (currentState?.positionX || 0)) : 0, + positionYDiff: newState?.positionY ? (newState.positionY - (currentState?.positionY || 0)) : 0 + }); + }, 50); + } + }; + + const handleResetZoom = () => { + if (transformRef.current) { + const currentState = transformRef.current.instance?.transformState; + console.log('🔍 RESET ZOOM - Before:', { + scale: currentState?.scale, + positionX: currentState?.positionX, + positionY: currentState?.positionY + }); + + transformRef.current.resetTransform(); + + setTimeout(() => { + const newState = transformRef.current?.instance?.transformState; + console.log('🔍 RESET ZOOM - After:', { + scale: newState?.scale, + positionX: newState?.positionX, + positionY: newState?.positionY + }); + }, 50); + } + }; + + const handleTransformChange = (ref: ReactZoomPanPinchRef) => { + const state = ref.state; + + // Prevent negative or zero scales + if (state.scale <= 0) { + console.error('🚨 INVALID SCALE DETECTED:', state.scale, '- Resetting to minimum'); + ref.setTransform(state.positionX, state.positionY, 0.1); + return; + } + + console.log('🔄 TRANSFORM CHANGE:', { + scale: state.scale, + positionX: state.positionX, + positionY: state.positionY, + previousScale: currentZoom + }); + setCurrentZoom(state.scale); + }; + + // Get frame position (custom, hierarchy, or default grid position) + const getFramePosition = (fileName: string, index: number): GridPosition => { + if (customPositions[fileName]) { + return customPositions[fileName]; + } + + // Use hierarchy layout if in hierarchy mode and tree is available + if (layoutMode === 'hierarchy' && hierarchyTree) { + return getHierarchicalPosition(fileName, hierarchyTree); + } + + // Default grid position calculation + const viewportMode = getFrameViewport(fileName); + const viewportDimensions = currentConfig.viewports[viewportMode]; + const actualWidth = viewportDimensions.width; + const actualHeight = viewportDimensions.height + 50; + + const col = index % currentConfig.framesPerRow; + const row = Math.floor(index / currentConfig.framesPerRow); + + const x = col * (Math.max(actualWidth, currentConfig.frameSize.width) + currentConfig.gridSpacing); + const y = row * (Math.max(actualHeight, currentConfig.frameSize.height) + currentConfig.gridSpacing); + + return { x, y }; + }; + + // Drag handlers + const handleDragStart = (fileName: string, startPos: GridPosition, mouseEvent: React.MouseEvent) => { + // Get canvas grid element for proper coordinate calculation + const canvasGrid = document.querySelector('.canvas-grid') as HTMLElement; + if (!canvasGrid) return; + + const canvasRect = canvasGrid.getBoundingClientRect(); + const canvasMousePos = transformMouseToCanvasSpace(mouseEvent.clientX, mouseEvent.clientY, canvasRect); + + // Also ensure this frame is selected + if (!selectedFrames.includes(fileName)) { + setSelectedFrames([fileName]); + } + + setDragState({ + isDragging: true, + draggedFrame: fileName, + startPosition: startPos, + currentPosition: startPos, + offset: { + x: canvasMousePos.x - startPos.x, + y: canvasMousePos.y - startPos.y + } + }); + }; + + const handleDragMove = (mousePos: GridPosition) => { + if (!dragState.isDragging || !dragState.draggedFrame) return; + + const newPosition = { + x: mousePos.x - dragState.offset.x, + y: mousePos.y - dragState.offset.y + }; + + setDragState(prev => ({ + ...prev, + currentPosition: newPosition + })); + }; + + const handleDragEnd = () => { + if (!dragState.isDragging || !dragState.draggedFrame) return; + + // Snap to grid (optional - makes positioning cleaner) + const gridSize = 25; + const snappedPosition = { + x: Math.round(dragState.currentPosition.x / gridSize) * gridSize, + y: Math.round(dragState.currentPosition.y / gridSize) * gridSize + }; + + // Save the new position + setCustomPositions(prev => ({ + ...prev, + [dragState.draggedFrame!]: snappedPosition + })); + + // Reset drag state + setDragState({ + isDragging: false, + draggedFrame: null, + startPosition: { x: 0, y: 0 }, + currentPosition: { x: 0, y: 0 }, + offset: { x: 0, y: 0 } + }); + }; + + // Reset positions to grid + const handleResetPositions = () => { + setCustomPositions({}); + }; + + // Update connection positions based on current frame positions + const updateConnectionPositions = (connections: ConnectionLine[], files: DesignFile[]): ConnectionLine[] => { + return connections.map(connection => { + const fromIndex = files.findIndex(f => f.name === connection.fromFrame); + const toIndex = files.findIndex(f => f.name === connection.toFrame); + + if (fromIndex === -1 || toIndex === -1) { + return connection; // Keep original if frame not found + } + + // Get current positions (custom or calculated) + const fromPosition = getFramePosition(connection.fromFrame, fromIndex); + const toPosition = getFramePosition(connection.toFrame, toIndex); + + // Get frame dimensions for connection point calculation + const fromViewport = getFrameViewport(connection.fromFrame); + const toViewport = getFrameViewport(connection.toFrame); + const fromDimensions = currentConfig.viewports[fromViewport]; + const toDimensions = currentConfig.viewports[toViewport]; + + // Calculate connection points (center-right of from frame to center-left of to frame) + const fromConnectionPoint = { + x: fromPosition.x + fromDimensions.width, + y: fromPosition.y + (fromDimensions.height + 50) / 2 // +50 for header + }; + + const toConnectionPoint = { + x: toPosition.x, + y: toPosition.y + (toDimensions.height + 50) / 2 // +50 for header + }; + + return { + ...connection, + fromPosition: fromConnectionPoint, + toPosition: toConnectionPoint + }; + }); + }; + + // Keyboard shortcuts for zoom + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if ((e.metaKey || e.ctrlKey) && !e.shiftKey) { + switch (e.key) { + case '=': + case '+': + e.preventDefault(); + handleZoomIn(); + break; + case '-': + e.preventDefault(); + handleZoomOut(); + break; + case '0': + e.preventDefault(); + handleResetZoom(); + break; + } + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, []); + + if (isLoading) { + return ( +
+
+
+

Loading design files...

+
+
+ ); + } + + if (error) { + return ( +
+
+

Error loading canvas

+

{error}

+ +
+
+ ); + } + + if (designFiles.length === 0) { + return ( +
+
+

No design files found in .superdesign/design_iterations/

+

Prompt Superdesign OR Cursor/Windsurf/Claude Code to design UI like Help me design a calculator UI and preview the UI here

+
+
+ ); + } + + return ( +
+ {/* Canvas Controls - Clean Minimal Design */} +
+ {/* Navigation Section */} +
+
+ +
+ {Math.round(currentZoom * 100)}% +
+ +
+ + +
+
+ + {/* Layout Section */} +
+
+
+ + +
+ {layoutMode === 'hierarchy' && ( + + )} +
+
+ + {/* Viewport Section */} +
+
+ +
+ + + +
+
+
+
+ + {/* Infinite Canvas */} + handleTransformChange(ref)} + onZoom={(ref) => { + const state = ref.state; + + // Check for invalid scale and fix it + if (state.scale <= 0) { + console.error('🚨 ZOOM EVENT - Invalid scale:', state.scale, '- Fixing...'); + ref.setTransform(state.positionX, state.positionY, 0.1); + return; + } + + console.log('📏 ZOOM EVENT:', { + scale: state.scale, + positionX: state.positionX, + positionY: state.positionY, + event: 'onZoom' + }); + }} + onPanning={(ref) => { + console.log('👆 PAN EVENT:', { + scale: ref.state.scale, + positionX: ref.state.positionX, + positionY: ref.state.positionY, + event: 'onPanning' + }); + }} + onZoomStart={(ref) => { + console.log('🔍 ZOOM START:', { + scale: ref.state.scale, + positionX: ref.state.positionX, + positionY: ref.state.positionY, + event: 'onZoomStart' + }); + }} + onZoomStop={(ref) => { + console.log('🔍 ZOOM STOP:', { + scale: ref.state.scale, + positionX: ref.state.positionX, + positionY: ref.state.positionY, + event: 'onZoomStop' + }); + }} + > + +
{ + if (dragState.isDragging) { + const rect = e.currentTarget.getBoundingClientRect(); + const mousePos = transformMouseToCanvasSpace(e.clientX, e.clientY, rect); + handleDragMove(mousePos); + } + }} + onMouseUp={handleDragEnd} + onMouseLeave={handleDragEnd} + onClick={(e) => { + // Clear selection when clicking on empty space + if (e.target === e.currentTarget) { + setSelectedFrames([]); + + // Also clear context in chat + const clearContextMessage: WebviewMessage = { + command: 'setContextFromCanvas', + data: { fileName: '', type: 'clear' } + }; + vscode.postMessage(clearContextMessage); + } + }} + > + {/* Connection Lines (render behind frames) */} + {layoutMode === 'hierarchy' && hierarchyTree && showConnections && ( + + )} + {designFiles.map((file, index) => { + const frameViewport = getFrameViewport(file.name); + const viewportDimensions = currentConfig.viewports[frameViewport]; + + // Use actual viewport dimensions (add frame border/header space) + const actualWidth = viewportDimensions.width; + const actualHeight = viewportDimensions.height + 50; // Add space for header + + // Get position (custom or default grid) + const position = getFramePosition(file.name, index); + + // If this frame is being dragged, use current drag position + const finalPosition = dragState.isDragging && dragState.draggedFrame === file.name + ? dragState.currentPosition + : position; + + return ( + + ); + })} +
+
+
+
+ ); +}; + +export default CanvasView; \ No newline at end of file diff --git a/src/webview/components/Chat/ChatInterface.css b/src/webview/components/Chat/ChatInterface.css new file mode 100644 index 0000000..47c27d9 --- /dev/null +++ b/src/webview/components/Chat/ChatInterface.css @@ -0,0 +1,2285 @@ +/* Base chat interface styles */ +.chat-interface { + display: flex; + flex-direction: column; + height: 100vh; + width: 100%; + background: var(--vscode-sideBar-background); + color: var(--vscode-sideBar-foreground); + position: relative; + overflow: hidden; +} + +.chat-interface--panel { + max-width: 100%; + background: var(--vscode-panel-background); + color: var(--vscode-panel-foreground); +} + +.chat-interface--sidebar { + font-size: 12px; + background: var(--vscode-sideBar-background); + color: var(--vscode-sideBar-foreground); +} + +/* Header styles (panel only) */ +.chat-header { + padding: 0; + border-bottom: 1px solid var(--vscode-panel-border); + margin-bottom: 0; + position: relative; +} + +.chat-header h2 { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: 600; +} + +.chat-header p { + margin: 0; + color: var(--vscode-descriptionForeground); + font-size: 14px; +} + +/* New Conversation Button */ +.new-conversation-btn { + position: absolute; + top: 0; + right: 0; + background: transparent; + border: none; + color: var(--vscode-descriptionForeground); + cursor: pointer; + padding: 8px; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + opacity: 0.7; +} + +.new-conversation-btn:hover { + background: var(--vscode-list-hoverBackground); + color: var(--vscode-foreground); + opacity: 1; +} + +.new-conversation-btn:active { + background: var(--vscode-list-activeSelectionBackground); + transform: scale(0.95); +} + +.new-conversation-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + background: transparent; + transform: none; +} + +/* Chat container */ +.chat-container { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; +} + +.chat-history { + flex: 1; + overflow-y: auto; + padding: 0 12px 8px 12px; + margin-bottom: 0; + scroll-behavior: smooth; +} + +.chat-history::-webkit-scrollbar { + width: 6px; +} + +.chat-history::-webkit-scrollbar-track { + background: transparent; +} + +.chat-history::-webkit-scrollbar-thumb { + background: var(--vscode-scrollbarSlider-background); + border-radius: 3px; +} + +.chat-history::-webkit-scrollbar-thumb:hover { + background: var(--vscode-scrollbarSlider-hoverBackground); +} + +/* Chat messages */ +.chat-message { + margin-bottom: 16px; + padding: 14px 16px; + border-radius: 12px; + line-height: 1.5; + border: 1px solid transparent; + transition: all 0.2s ease; + position: relative; +} + +.chat-message--panel { + padding: 18px 20px; + margin-bottom: 20px; + font-size: 14px; + border-radius: 16px; +} + +.chat-message--sidebar { + padding: 10px 12px; + margin-bottom: 12px; + font-size: 12px; + border-radius: 10px; +} + +/* User message specific overrides for compact styling */ +.chat-message--user.chat-message--panel { + padding: 12px 14px; + margin-bottom: 16px; + border-radius: 8px; +} + +.chat-message--user.chat-message--sidebar { + padding: 8px 10px; + margin-bottom: 10px; + border-radius: 6px; +} + +.chat-message--user { + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + margin-left: 0; + margin-right: 0; + max-width: 100%; + padding: 10px 12px; + border-radius: 8px; + margin-bottom: 12px; +} + +/* SDK User messages (from Claude Code SDK) */ +.chat-message--user-sdk { + background: var(--vscode-input-background); + border: 1px solid var(--vscode-textLink-foreground); + border-left: 3px solid var(--vscode-textLink-foreground); + margin-left: 0; + margin-right: 0; + max-width: 100%; + padding: 10px 12px; + border-radius: 8px; + margin-bottom: 12px; + opacity: 0.9; +} + +.chat-message--assistant { + background: transparent; + border: none; + border-left: none; + margin-left: 0; + margin-right: 0; + max-width: 100%; + padding-left: 0; + border-radius: 0; +} + +/* Result messages */ +.chat-message--result { + background: var(--vscode-editorWidget-background); + border: 1px solid var(--vscode-editorWidget-border); + border-left: 3px solid var(--vscode-charts-green); + margin-left: 0; + margin-right: 0; + max-width: 100%; + padding: 10px 12px; + border-radius: 8px; + margin-bottom: 12px; + font-family: var(--vscode-editor-font-family); + font-size: 13px; +} + +/* Error result messages */ +.chat-message--result-error { + background: var(--vscode-inputValidation-errorBackground); + border: 1px solid var(--vscode-inputValidation-errorBorder); + border-left: 3px solid var(--vscode-errorForeground); + margin-left: 0; + margin-right: 0; + max-width: 100%; + padding: 10px 12px; + border-radius: 8px; + margin-bottom: 12px; + font-family: var(--vscode-editor-font-family); + font-size: 13px; +} + +.chat-message__header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-bottom: 8px; + font-weight: 600; + opacity: 0.8; + font-size: 11px; +} + +.chat-message--sidebar .chat-message__header { + margin-bottom: 6px; + font-size: 10px; +} + +.chat-message__label { + font-size: 11px; + color: var(--vscode-descriptionForeground); + font-weight: 500; +} + +/* Metadata display */ +.chat-message__metadata { + display: flex; + align-items: center; + gap: 8px; + font-size: 10px; + color: var(--vscode-descriptionForeground); + opacity: 0.7; +} + +.metadata-item { + background: var(--vscode-badge-background); + color: var(--vscode-badge-foreground); + padding: 2px 4px; + border-radius: 3px; + font-size: 9px; + font-weight: 500; +} + +.chat-message__content { + white-space: pre-line; + word-wrap: break-word; + line-height: 1.3; + color: var(--vscode-editor-foreground); +} + +/* Override white-space for markdown content to prevent excessive spacing */ +.chat-message__content .markdown-content { + white-space: normal; +} + +.chat-message--user .chat-message__content { + line-height: 1.3; + font-size: 13px; +} + +.chat-message--user:hover { + border-color: var(--vscode-input-border); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +/* Typing indicator */ +.typing .typing-indicator { + animation: typing 1.4s infinite ease-in-out; + color: var(--vscode-descriptionForeground); + font-style: italic; +} + +.typing .typing-indicator::before { + content: ''; + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--vscode-textLink-foreground); + margin-right: 8px; + animation: pulse 1.5s infinite ease-in-out; +} + +@keyframes typing { + 0%, 80%, 100% { opacity: 0.3; } + 40% { opacity: 1; } +} + +@keyframes pulse { + 0%, 100% { opacity: 0.4; transform: scale(0.8); } + 50% { opacity: 1; transform: scale(1.1); } +} + +/* Generating content layout */ +.generating-content { + display: flex; + align-items: center; + justify-content: space-between; + gap: 6px; + line-height: 1.3; + margin-top: 4px; + padding: 4px 0; + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; +} + +.generating-text { + color: var(--vscode-descriptionForeground); + font-size: 11px; + flex: 1; + animation: generating-pulse 1.8s ease-in-out infinite; + opacity: 0.8; +} + +.generating-text::after { + content: ''; + animation: generating-dots 1.5s ease-in-out infinite; + margin-left: 2px; +} + +@keyframes generating-pulse { + 0%, 100% { opacity: 0.6; } + 50% { opacity: 1; } +} + +@keyframes generating-dots { + 0%, 20% { content: ''; } + 25%, 45% { content: '.'; } + 50%, 70% { content: '..'; } + 75%, 100% { content: '...'; } +} + +.generating-stop-btn { + background: transparent; + border: 1px solid var(--vscode-input-border); + color: var(--vscode-descriptionForeground); + font-size: 10px; + cursor: pointer; + padding: 2px 6px; + font-family: inherit; + transition: all 0.2s ease; + border-radius: 4px; + font-weight: normal; +} + +.generating-stop-btn:hover { + background: var(--vscode-list-hoverBackground); + color: var(--vscode-foreground); + border-color: var(--vscode-focusBorder); +} + +/* Responsive generating content for different layouts - simplified */ +.chat-message--panel .generating-content, +.chat-message--sidebar .generating-content { + margin-left: 0; + margin-right: 0; + padding-left: 0; + padding-right: 0; +} + + + +/* Chat placeholder */ +.chat-placeholder { + text-align: center; + color: var(--vscode-descriptionForeground); + padding: 0 20px 20px 20px; +} + +.chat-placeholder--panel { + padding: 0 20px 32px 20px; + font-size: 14px; +} + +.chat-placeholder--sidebar { + padding: 0 8px 16px 8px; + font-size: 11px; +} + +.chat-placeholder__features { + margin-top: 16px; +} + +.chat-placeholder__features ul { + text-align: left; + max-width: 300px; + margin: 12px auto; +} + +.chat-placeholder__features li { + margin: 8px 0; +} + +/* Empty state styles */ +.chat-placeholder__content { + margin-top: 20px; + max-width: 500px; + margin-left: auto; + margin-right: auto; +} + +.empty-state-message { + display: flex; + flex-direction: column; + gap: 16px; + align-items: center; + text-align: center; +} + +.empty-state-message p { + margin: 0; + line-height: 1.5; + color: var(--vscode-foreground); +} + +.empty-state-message strong { + color: var(--vscode-textLink-foreground); + font-weight: 600; +} + +.empty-state-message kbd { + background: var(--vscode-keybindingLabel-background); + border: 1px solid var(--vscode-keybindingLabel-border); + border-bottom: 2px solid var(--vscode-keybindingLabel-bottomBorder); + color: var(--vscode-keybindingLabel-foreground); + padding: 2px 6px; + border-radius: 3px; + font-size: 11px; + font-family: var(--vscode-editor-font-family); + white-space: nowrap; +} + +.empty-state-message code { + background: var(--vscode-textCodeBlock-background); + color: var(--vscode-textPreformat-foreground); + padding: 2px 4px; + border-radius: 3px; + font-size: 12px; + font-family: var(--vscode-editor-font-family); +} + +.empty-state-divider { + color: var(--vscode-descriptionForeground); + font-weight: 500; + font-size: 13px; + margin: 8px 0; + position: relative; +} + +.empty-state-divider::before, +.empty-state-divider::after { + content: ''; + position: absolute; + top: 50%; + width: 40px; + height: 1px; + background: var(--vscode-separator-foreground); + opacity: 0.3; +} + +.empty-state-divider::before { + right: calc(100% + 10px); +} + +.empty-state-divider::after { + left: calc(100% + 10px); +} + +.empty-state-message em { + color: var(--vscode-descriptionForeground); + font-style: italic; +} + +/* Sidebar layout adjustments */ +.chat-placeholder--sidebar .chat-placeholder__content { + margin-top: 16px; + max-width: 100%; + padding: 0 8px; +} + +.chat-placeholder--sidebar .empty-state-message { + gap: 12px; +} + +.chat-placeholder--sidebar .empty-state-message p { + font-size: 12px; + line-height: 1.4; +} + +.chat-placeholder--sidebar .empty-state-message kbd { + font-size: 10px; + padding: 1px 4px; +} + +.chat-placeholder--sidebar .empty-state-message code { + font-size: 10px; + padding: 1px 3px; +} + +.chat-placeholder--sidebar .empty-state-divider { + font-size: 11px; +} + +.chat-placeholder--sidebar .empty-state-divider::before, +.chat-placeholder--sidebar .empty-state-divider::after { + width: 20px; +} + +/* Responsive adjustments for empty state */ +@media (max-width: 600px) { + .chat-placeholder__content { + max-width: 90%; + margin-top: 16px; + } + + .empty-state-message { + gap: 12px; + } + + .empty-state-message p { + font-size: 13px; + } + + .empty-state-divider::before, + .empty-state-divider::after { + width: 20px; + } +} + +/* Input container - Cursor style - REMOVED */ + +/* Add Context Button */ +.add-context-btn { + display: flex; + align-items: center; + justify-content: flex-start; + gap: 4px; + background: transparent; + color: var(--vscode-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 6px; + padding: 4px 4px; + margin: 6px 6px 6px 6px; + cursor: pointer; + font-size: 11px; + font-family: inherit; + transition: all 0.2s ease; + width: fit-content; + line-height: 1; +} + +.add-context-btn:hover:not(:disabled) { + background: var(--vscode-button-hoverBackground); + border-color: var(--vscode-focusBorder); +} + +.add-context-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.add-context-icon { + font-weight: normal; + font-size: 11px; + line-height: 1; + display: inline-block; +} + +/* Message context display in user bubbles */ +.message-context-display { + display: inline-flex; + align-items: center; + justify-content: flex-start; + gap: 4px; + background: transparent; + color: var(--vscode-foreground); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + padding: 4px 8px; + margin-bottom: 8px; + font-size: 11px; + font-family: inherit; + width: fit-content; + line-height: 1; +} + +.message-context-display .context-icon { + font-weight: normal; + font-size: 11px; + line-height: 1; + display: inline-block; +} + +.message-context-display .context-text { + font-size: 11px; + line-height: 1; + color: var(--vscode-foreground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 200px; +} + +.message-text { + margin: 0; +} + +/* Main Input Wrapper */ +.chat-input-wrapper { + background: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border); + border-radius: 12px; + overflow: hidden; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); + transition: all 0.2s ease; + margin: 6px 6px 12px 6px; + margin-top: auto; + flex-shrink: 0; +} + +/* Remove focus highlight from chat input wrapper */ + +/* Input Controls */ +.input-controls { + display: flex; + align-items: center; + justify-content: space-between; + padding: 4px 8px; + gap: 6px; +} + +.selectors-group { + display: flex; + align-items: center; + gap: 4px; + flex-shrink: 1; + min-width: 0; +} + +.selector-wrapper { + position: relative; + display: inline-block; +} + +/* Selector icon styles removed - handled by ModelSelector component */ + +.agent-selector { + background: transparent; + color: var(--vscode-foreground); + border: none; + outline: none; + font-size: 11px; + font-family: inherit; + cursor: pointer; + padding: 2px 8px 2px 18px; + border-radius: 4px; + transition: background-color 0.2s ease; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 12 4-4 4 4'/%3E%3C/svg%3E"); + background-position: right 6px center; + background-repeat: no-repeat; + background-size: 12px; + min-width: 120px; + white-space: nowrap; + font-weight: 500; +} + +.agent-selector:hover { + background: var(--vscode-list-hoverBackground); +} + +/* Chat input */ +.chat-input { + padding: 6px 8px 4px 8px; + position: relative; +} + +.message-input { + width: 100%; + padding: 0; + background: transparent; + color: var(--vscode-input-foreground); + border: none; + outline: none; + font-size: 14px; + font-family: inherit; + resize: none; + min-height: 24px; + max-height: 120px; + line-height: 1.5; + overflow-y: auto; + box-shadow: none; + transition: all 0.2s ease; +} + +.message-input:focus { + outline: none; + box-shadow: none; + border: none; +} + +.message-input::selection { + background: var(--vscode-editor-selectionBackground); +} + +.message-input::placeholder { + color: var(--vscode-input-placeholderForeground); + font-size: 14px; +} + +.chat-interface--sidebar .message-input { + font-size: 12px; +} + +.chat-interface--sidebar .message-input::placeholder { + font-size: 12px; +} + +/* Input Actions */ +.input-actions { + display: flex; + align-items: center; + gap: 4px; + flex-shrink: 0; +} + +.attach-btn, +.send-btn { + width: 24px; + height: 24px; + border: none; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + flex-shrink: 0; + position: relative; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.attach-btn { + background: transparent; + color: var(--vscode-descriptionForeground); + box-shadow: none; + opacity: 0.6; + border-radius: 0; +} + +.attach-btn:hover:not(:disabled) { + background: var(--vscode-list-hoverBackground); + color: var(--vscode-foreground); + opacity: 1; + border-radius: 50%; +} + +.send-btn { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +.send-btn:hover:not(:disabled) { + background: var(--vscode-button-hoverBackground); + transform: scale(1.05); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} + +.send-btn:disabled, +.attach-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.stop-btn { + background: var(--vscode-input-background) !important; + color: var(--vscode-foreground) !important; + border: 1px solid var(--vscode-input-border) !important; +} + +.stop-btn:hover:not(:disabled) { + background: var(--vscode-list-hoverBackground) !important; + border-color: var(--vscode-focusBorder) !important; + transform: scale(1.05); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} + +.attach-btn svg { + width: 12px; + height: 12px; +} + +.send-btn svg { + width: 14px; + height: 14px; +} + +.chat-interface--sidebar .attach-btn, +.chat-interface--sidebar .send-btn { + width: 28px; + height: 28px; + font-size: 12px; +} + +/* Responsive adjustments */ +@media (max-width: 480px) { + .input-controls { + padding: 4px 6px; + gap: 4px; + } + + .selectors-group { + gap: 2px; + flex-shrink: 1; + min-width: 0; + } + + .agent-selector { + min-width: 80px; + font-size: 10px; + padding: 2px 6px 2px 16px; + background-size: 10px; + background-position: right 4px center; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 12 4-4 4 4'/%3E%3C/svg%3E"); + } + + /* Selector icon responsive styles removed - handled by ModelSelector component */ + + .attach-btn, + .send-btn { + width: 20px; + height: 20px; + flex-shrink: 0; + } + + .attach-btn svg { + width: 10px; + height: 10px; + } + + .send-btn svg { + width: 12px; + height: 12px; + } + + .chat-input { + padding: 6px 8px 4px 8px; + } + + .message-input { + font-size: 13px; + } +} + +/* Streaming cursor animation - simplified */ +.streaming-cursor { + color: var(--vscode-descriptionForeground); + font-weight: normal; + animation: blink 1.2s ease-in-out infinite; + margin-left: 1px; +} + +@keyframes blink { + 0%, 50% { opacity: 1; } + 51%, 100% { opacity: 0.3; } +} + +/* Tool message styles - compact */ +.tool-message { + margin-bottom: 4px; + padding: 6px 8px; + border: 1px solid var(--vscode-input-border); + border-radius: 6px; + background: var(--vscode-input-background); + line-height: 1.2; + transition: all 0.2s ease; + position: relative; +} + +.tool-message:hover { + border-color: var(--vscode-focusBorder); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.tool-message--panel { + margin-bottom: 6px; + padding: 8px 10px; + border-radius: 8px; + font-size: 12px; +} + +.tool-message--sidebar { + margin-bottom: 3px; + padding: 6px 8px; + border-radius: 6px; + font-size: 11px; +} + +.tool-message--success { + border-left: 3px solid var(--vscode-charts-green); +} + +.tool-message--error { + background: var(--vscode-inputValidation-errorBackground); + border: 1px solid var(--vscode-inputValidation-errorBorder); + border-left: 3px solid var(--vscode-errorForeground); +} + +.tool-message--loading { + border-left: 3px solid var(--vscode-progressBar-background); +} + +.tool-message--complete { + border-left: 3px solid var(--vscode-charts-green); +} + +.tool-message__header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-bottom: 0; + font-weight: 600; + opacity: 0.8; + font-size: 11px; +} + +.chat-interface--sidebar .tool-message__header { + margin-bottom: 0; + font-size: 10px; +} + +/* Only add bottom margin when details are showing */ +.tool-message__header:has(+ .tool-message__details) { + margin-bottom: 8px; +} + +.chat-interface--sidebar .tool-message__header:has(+ .tool-message__details) { + margin-bottom: 6px; +} + +.tool-message__main { + display: flex; + align-items: center; + gap: 6px; + flex: 1; + min-width: 0; +} + +.tool-icon { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 14px; + height: 14px; + color: var(--vscode-descriptionForeground); +} + +/* Tool icon state-specific colors */ +.tool-message--success .tool-icon { + color: var(--vscode-charts-green); +} + +.tool-message--complete .tool-icon { + color: var(--vscode-charts-green); +} + +.tool-message--error .tool-icon { + color: var(--vscode-errorForeground); +} + +.tool-info { + display: flex; + flex-direction: column; + gap: 0; + flex: 1; + min-width: 0; +} + +.tool-name { + font-weight: 500; + color: var(--vscode-foreground); + flex-shrink: 0; + font-size: 11px; + line-height: 1.2; +} + +.tool-description { + color: var(--vscode-descriptionForeground); + font-size: 10px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.2; +} + +.tool-actions { + display: flex; + align-items: center; + gap: 2px; + flex-shrink: 0; +} + +.tool-status { + display: flex; + align-items: center; + justify-content: center; + width: 12px; + height: 12px; + flex-shrink: 0; + color: var(--vscode-charts-green); +} + +.tool-status--success { + color: var(--vscode-charts-green); +} + +.tool-status--complete { + color: var(--vscode-charts-green); +} + +.tool-status--error { + color: var(--vscode-errorForeground); +} + +.tool-expand-btn { + background: transparent; + border: none; + color: var(--vscode-descriptionForeground); + cursor: pointer; + padding: 1px; + border-radius: 2px; + transition: all 0.2s ease; + flex-shrink: 0; + width: 14px; + height: 14px; + display: flex; + align-items: center; + justify-content: center; +} + +.tool-expand-btn:hover { + background: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); +} + +.tool-expand-btn.expanded { + transform: rotate(45deg); + color: var(--vscode-foreground); +} + +.tool-message__details { + margin-top: 6px; + padding-top: 6px; + border-top: 1px solid var(--vscode-input-border); +} + +.tool-detail { + margin-bottom: 8px; +} + +.tool-detail:last-child { + margin-bottom: 0; +} + +.tool-detail__label { + display: block; + font-weight: 600; + color: var(--vscode-descriptionForeground); + font-size: 9px; + margin-bottom: 2px; + text-transform: uppercase; + letter-spacing: 0.3px; + line-height: 1.2; +} + +.tool-detail__value { + display: block; + color: var(--vscode-editor-foreground); + font-size: 10px; + line-height: 1.3; +} + +.tool-detail__value--text { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 3px; + padding: 4px 6px; + white-space: pre-wrap; + word-wrap: break-word; +} + +.tool-detail__value--json { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 3px; + padding: 4px 6px; + font-family: var(--vscode-editor-font-family); + font-size: 9px; + overflow-x: auto; + max-height: 150px; + overflow-y: auto; +} + +/* Details element styling */ +.tool-detail details { + margin: 0; +} + +.tool-detail details summary { + cursor: pointer; + padding: 2px 0; + font-weight: 600; + color: var(--vscode-descriptionForeground); + font-size: 9px; + text-transform: uppercase; + letter-spacing: 0.3px; + transition: color 0.2s ease; +} + +.tool-detail details summary:hover { + color: var(--vscode-foreground); +} + +.tool-detail details[open] summary { + margin-bottom: 4px; +} + +.tool-detail__value--result { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 3px; + padding: 0; + overflow: hidden; +} + +.tool-detail__value--error { + border-color: var(--vscode-errorForeground); + background: var(--vscode-inputValidation-errorBackground); +} + +.tool-result-content { + padding: 6px 8px; + margin: 0; + font-family: var(--vscode-editor-font-family); + font-size: 9px; + line-height: 1.3; + white-space: pre-wrap; + word-wrap: break-word; + max-height: 200px; + overflow-y: auto; + background: transparent; + border: none; +} + +.tool-result__show-more { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-top: 1px solid var(--vscode-widget-border); + width: 100%; + padding: 4px 8px; + font-size: 9px; + cursor: pointer; + transition: background-color 0.15s ease; +} + +.tool-result__show-more:hover { + background: var(--vscode-button-hoverBackground); +} + +.tool-result__show-more:active { + background: var(--vscode-button-background); +} + +/* Tool result styles */ +.tool-result { + margin-bottom: 6px; + border: 1px solid var(--vscode-widget-border); + border-radius: 4px; + background: var(--vscode-editor-background); + overflow: hidden; +} + +.tool-result--panel { + margin-bottom: 8px; +} + +.tool-result--sidebar { + margin-bottom: 4px; +} + +.tool-result--success { + border-left: 2px solid var(--vscode-charts-green); +} + +.tool-result--error { + border-left: 2px solid var(--vscode-errorForeground); +} + +.tool-result__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 4px 6px; + cursor: pointer; + background: transparent; + border-bottom: 1px solid transparent; + transition: background-color 0.15s ease; +} + +.tool-result__header:hover { + background: var(--vscode-list-hoverBackground); +} + +.tool-result__main { + display: flex; + align-items: center; + gap: 4px; + flex: 1; + min-width: 0; +} + +.tool-result-icon { + font-size: 10px; + flex-shrink: 0; +} + +.tool-result-label { + font-weight: 600; + color: var(--vscode-foreground); + flex-shrink: 0; + font-size: 9px; +} + +.tool-result-meta { + color: var(--vscode-descriptionForeground); + font-size: 8px; + background: var(--vscode-badge-background); + color: var(--vscode-badge-foreground); + padding: 1px 3px; + border-radius: 6px; + flex-shrink: 0; +} + +.tool-result__content { + padding: 6px 8px; + border-top: 1px solid var(--vscode-widget-border); + background: var(--vscode-editor-background); +} + +.tool-result__text { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 3px; + padding: 6px 8px; + font-family: var(--vscode-editor-font-family); + font-size: 9px; + line-height: 1.3; + white-space: pre-wrap; + word-wrap: break-word; + margin: 0; + max-height: 250px; + overflow-y: auto; +} + +.tool-result__show-more { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: none; + border-radius: 3px; + padding: 3px 6px; + font-size: 9px; + cursor: pointer; + margin-top: 4px; + transition: background-color 0.15s ease; +} + +.tool-result__show-more:hover { + background: var(--vscode-button-hoverBackground); +} + +.tool-result__show-more:active { + background: var(--vscode-button-background); +} + +.loading-spinner { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +/* Tool group styles - compact */ +.tool-group { + margin-bottom: 8px; + padding: 6px 8px; + border: 1px solid var(--vscode-input-border); + border-radius: 6px; + background: var(--vscode-input-background); + line-height: 1.2; + transition: all 0.2s ease; + position: relative; +} + +.tool-group:hover { + border-color: var(--vscode-focusBorder); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.tool-group--panel { + margin-bottom: 10px; + padding: 8px 10px; + border-radius: 8px; + font-size: 12px; +} + +.tool-group--sidebar { + margin-bottom: 6px; + padding: 6px 8px; + border-radius: 6px; + font-size: 11px; +} + +.tool-group--success { + border-left: 3px solid var(--vscode-charts-green); +} + +.tool-group--error { + background: var(--vscode-inputValidation-errorBackground); + border: 1px solid var(--vscode-inputValidation-errorBorder); + border-left: 3px solid var(--vscode-errorForeground); +} + +.tool-group--loading { + border-left: 3px solid var(--vscode-progressBar-background); +} + +.tool-group--complete { + border-left: 3px solid var(--vscode-charts-green); +} + +.tool-group__header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-bottom: 0; + font-weight: 600; + opacity: 0.8; + font-size: 11px; +} + +.chat-interface--sidebar .tool-group__header { + margin-bottom: 0; + font-size: 10px; +} + +/* Only add bottom margin when children are showing */ +.tool-group__header:has(+ .tool-group__children) { + margin-bottom: 8px; +} + +.chat-interface--sidebar .tool-group__header:has(+ .tool-group__children) { + margin-bottom: 6px; +} + +.tool-group__main { + display: flex; + align-items: center; + gap: 6px; + flex: 1; + min-width: 0; +} + +.tool-group-icon { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: 14px; + height: 14px; + color: var(--vscode-descriptionForeground); +} + +/* Tool group icon state-specific colors */ +.tool-group--success .tool-group-icon { + color: var(--vscode-charts-green); +} + +.tool-group--complete .tool-group-icon { + color: var(--vscode-charts-green); +} + +.tool-group--error .tool-group-icon { + color: var(--vscode-errorForeground); +} + +.tool-group-info { + display: flex; + flex-direction: column; + gap: 0; + flex: 1; + min-width: 0; +} + +.tool-group-name { + font-weight: 500; + color: var(--vscode-foreground); + flex-shrink: 0; + font-size: 11px; + line-height: 1.2; +} + +.tool-time-remaining { + display: flex; + align-items: center; + gap: 2px; + font-size: 10px; + color: var(--vscode-descriptionForeground); + font-weight: normal; + line-height: 1.2; +} + +.tool-group-actions { + display: flex; + align-items: center; + gap: 2px; + flex-shrink: 0; +} + +.tool-group-count { + background: var(--vscode-badge-background); + color: var(--vscode-badge-foreground); + font-size: 9px; + padding: 1px 3px; + border-radius: 2px; + font-weight: 500; + flex-shrink: 0; +} + +/* Simple loading icon */ +.loading-icon-simple { + position: relative; + width: 16px; + height: 16px; + display: flex; + align-items: center; + justify-content: center; +} + +.loading-ring { + width: 12px; + height: 12px; + border: 1px solid var(--vscode-list-inactiveSelectionBackground); + border-top: 1px solid var(--vscode-progressBar-background); + border-radius: 50%; + animation: spin-simple 1s linear infinite; +} + +@keyframes spin-simple { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.tool-group__children { + margin-top: 6px; + padding-top: 6px; + border-top: 1px solid var(--vscode-input-border); +} + +.tool-group__children .tool-message { + margin-bottom: 6px; + margin-left: 8px; + border-left: 2px solid var(--vscode-input-border); + padding-left: 6px; + background: transparent; + border-radius: 4px; + padding: 4px 6px; +} + +.tool-group__children .tool-message:last-child { + margin-bottom: 0; +} + +/* Context Display */ +.context-display { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 8px; + background: transparent; + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + font-size: 11px; + margin-left: 6px; + margin-top: 6px; + width: fit-content; +} + +.context-icon { + font-size: 12px; + opacity: 0.8; +} + +.context-text { + color: var(--vscode-descriptionForeground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 200px; +} + +.context-clear-btn { + background: none; + border: none; + color: var(--vscode-descriptionForeground); + cursor: pointer; + font-size: 14px; + padding: 0; + margin-left: 4px; + opacity: 0.6; + transition: opacity 0.2s; +} + +.context-clear-btn:hover { + opacity: 1; +} + +/* Upload Progress */ +.upload-progress { + margin-left: 6px; + margin-top: 6px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.upload-summary { + font-size: 11px; + color: var(--vscode-button-background); + font-weight: 600; + margin-bottom: 2px; + padding-left: 2px; +} + +.uploading-item { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 8px; + background: var(--vscode-editor-hoverHighlightBackground); + border: 1px solid var(--vscode-input-border); + border-radius: 4px; + font-size: 11px; + width: fit-content; + max-width: 300px; +} + +.upload-icon { + font-size: 12px; + opacity: 0.8; +} + +.upload-text { + color: var(--vscode-descriptionForeground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; +} + +.upload-spinner { + width: 12px; + height: 12px; + border: 1px solid var(--vscode-input-border); + border-top: 1px solid var(--vscode-button-background); + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Loading Tips */ +.tool-loading-tips { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-input-border); + border-radius: 6px; + padding: 12px; + margin-bottom: 12px; +} + +.loading-tip { + display: flex; + align-items: flex-start; + gap: 8px; +} + +.tip-icon { + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: var(--vscode-descriptionForeground); + opacity: 0.8; +} + +.tip-text { + font-size: 12px; + line-height: 1.4; + color: var(--vscode-foreground); + font-style: italic; + animation: tipFadeIn 0.5s ease-in; +} + +@keyframes tipFadeIn { + 0% { opacity: 0; transform: translateY(5px); } + 100% { opacity: 1; transform: translateY(0); } +} + +/* Enhanced tool message states */ +.tool-message--loading .tool-icon { + color: var(--vscode-progressBar-background); + animation: pulse-loading 2s ease-in-out infinite; +} + +/* Enhanced tool group states */ +.tool-group--loading .tool-group-icon { + color: var(--vscode-progressBar-background); + animation: pulse-loading 2s ease-in-out infinite; +} + +/* Tool status enhancements - simplified */ +.tool-status--loading { + color: var(--vscode-descriptionForeground); + animation: rotate 2s linear infinite; +} + +@keyframes rotate { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@keyframes pulse-loading { + 0%, 100% { opacity: 0.5; } + 50% { opacity: 1; } +} + +/* Responsive adjustments for mobile */ +@media (max-width: 768px) { + .tip-text { + font-size: 11px; + } + + .tool-group-info { + gap: 1px; + } + + .tool-time-remaining { + font-size: 10px; + } +} + +/* Sidebar Action Bar - VS Code style action buttons */ +.sidebar-action-bar { + position: absolute; + top: 8px; + right: 12px; + z-index: 100; + display: flex; + gap: 4px; + align-items: center; +} + +.sidebar-action-btn { + background: transparent; + border: none; + color: var(--vscode-icon-foreground); + cursor: pointer; + padding: 2px; + border-radius: 3px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + opacity: 0.7; + width: 22px; + height: 22px; +} + +.sidebar-action-btn:hover:not(:disabled) { + background: var(--vscode-toolbar-hoverBackground); + opacity: 1; +} + +.sidebar-action-btn:active { + background: var(--vscode-toolbar-activeBackground); +} + +.sidebar-action-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + background: transparent; +} + +/* Panel Action Bar */ +.chat-action-bar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 6px 12px; + background: var(--vscode-titleBar-activeBackground); + border-bottom: 1px solid var(--vscode-panel-border); + min-height: 32px; + flex-shrink: 0; +} + +.open-canvas-btn { + display: flex; + align-items: center; + gap: 6px; + background: transparent; + border: none; + color: var(--vscode-titleBar-activeForeground); + cursor: pointer; + padding: 4px 8px; + border-radius: 4px; + font-size: 12px; + font-weight: 500; + transition: all 0.2s ease; +} + +.open-canvas-btn:hover { + background: var(--vscode-titleBar-hoverBackground); + color: var(--vscode-titleBar-hoverForeground); +} + +.open-canvas-btn svg { + flex-shrink: 0; +} + +.clear-chat-icon-btn { + background: transparent; + border: none; + color: var(--vscode-titleBar-activeForeground); + cursor: pointer; + padding: 4px; + border-radius: 3px; + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + transition: all 0.2s ease; + opacity: 0.8; +} + +.clear-chat-icon-btn:hover:not(:disabled) { + background: var(--vscode-titleBar-hoverBackground); + color: var(--vscode-titleBar-hoverForeground); + opacity: 1; +} + +.clear-chat-icon-btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.chat-interface { +} + +/* Markdown content styles */ +.markdown-content { + line-height: 1.3; + word-wrap: break-word; + overflow-wrap: break-word; +} + +.markdown-content h1, +.markdown-content h2, +.markdown-content h3, +.markdown-content h4, +.markdown-content h5, +.markdown-content h6 { + margin: 16px 0 8px 0; + font-weight: 600; + line-height: 1.2; + color: var(--vscode-editor-foreground); +} + +.markdown-content h1:first-child, +.markdown-content h2:first-child, +.markdown-content h3:first-child, +.markdown-content h4:first-child, +.markdown-content h5:first-child, +.markdown-content h6:first-child { + margin-top: 0; +} + +.markdown-content h1 { + font-size: 1.8em; +} + +.markdown-content h2 { + font-size: 1.5em; +} + +.markdown-content h3 { + font-size: 1.25em; +} + +.markdown-content h4 { + font-size: 1.1em; +} + +.markdown-content p { + margin: 8px 0; + line-height: 1.5; +} + +.markdown-content p:first-child { + margin-top: 0; +} + +.markdown-content p:last-child { + margin-bottom: 0; +} + +.markdown-content ul, +.markdown-content ol { + margin: 8px 0; + padding-left: 24px; +} + +.markdown-content ul:first-child, +.markdown-content ol:first-child { + margin-top: 0; +} + +.markdown-content ul:last-child, +.markdown-content ol:last-child { + margin-bottom: 0; +} + +.markdown-content li { + margin: 2px 0; + line-height: 1.4; +} + +.markdown-content li p { + margin: 2px 0; +} + +/* Nested lists */ +.markdown-content li ul, +.markdown-content li ol { + margin: 4px 0; + padding-left: 20px; +} + +.markdown-content pre { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 6px; + padding: 8px; + margin: 4px 0; + overflow-x: auto; + font-family: var(--vscode-editor-font-family); + font-size: 13px; + line-height: 1.3; +} + +.markdown-content pre code { + background: transparent; + padding: 0; + border: none; + border-radius: 0; + font-size: inherit; +} + +.markdown-content .inline-code { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 3px; + padding: 2px 4px; + font-family: var(--vscode-editor-font-family); + font-size: 0.9em; + color: var(--vscode-textPreformat-foreground); +} + +.markdown-content a { + color: var(--vscode-textLink-foreground); + text-decoration: none; +} + +.markdown-content a:hover { + color: var(--vscode-textLink-activeForeground); + text-decoration: underline; +} + +.markdown-content .table-wrapper { + overflow-x: auto; + margin: 8px 0; +} + +.markdown-content table { + border-collapse: collapse; + width: 100%; + border: 1px solid var(--vscode-panel-border); +} + +.markdown-content th, +.markdown-content td { + border: 1px solid var(--vscode-panel-border); + padding: 6px 10px; + text-align: left; +} + +.markdown-content th { + background: var(--vscode-editorWidget-background); + font-weight: 600; +} + +.markdown-content .markdown-blockquote { + border-left: 4px solid var(--vscode-textLink-foreground); + margin: 8px 0; + padding: 6px 12px; + background: var(--vscode-textBlockQuote-background); + font-style: italic; + color: var(--vscode-textBlockQuote-foreground); +} + +.markdown-content hr { + border: none; + border-top: 1px solid var(--vscode-panel-border); + margin: 12px 0; +} + +.markdown-content strong { + font-weight: 600; + color: var(--vscode-editor-foreground); +} + +.markdown-content em { + font-style: italic; +} + +/* Syntax highlighting styles for VS Code theme compatibility */ +.markdown-content .hljs { + background: transparent; + color: var(--vscode-editor-foreground); +} + +.markdown-content .hljs-keyword, +.markdown-content .hljs-built_in { + color: var(--vscode-symbolIcon-keywordForeground, #569cd6); +} + +.markdown-content .hljs-string, +.markdown-content .hljs-title { + color: var(--vscode-symbolIcon-stringForeground, #ce9178); +} + +.markdown-content .hljs-comment { + color: var(--vscode-symbolIcon-colorForeground, #6a9955); + font-style: italic; +} + +.markdown-content .hljs-number { + color: var(--vscode-symbolIcon-numberForeground, #b5cea8); +} + +.markdown-content .hljs-function { + color: var(--vscode-symbolIcon-functionForeground, #dcdcaa); +} + +.markdown-content .hljs-variable { + color: var(--vscode-symbolIcon-variableForeground, #9cdcfe); +} + +/* Responsive adjustments for sidebar */ +.chat-interface--sidebar .markdown-content h1 { + font-size: 1.4em; + margin: 12px 0 6px 0; +} + +.chat-interface--sidebar .markdown-content h2 { + font-size: 1.2em; + margin: 12px 0 6px 0; +} + +.chat-interface--sidebar .markdown-content h3 { + font-size: 1.1em; + margin: 10px 0 4px 0; +} + +.chat-interface--sidebar .markdown-content h4 { + margin: 8px 0 4px 0; +} + +.chat-interface--sidebar .markdown-content p { + margin: 6px 0; + line-height: 1.4; +} + +.chat-interface--sidebar .markdown-content ul, +.chat-interface--sidebar .markdown-content ol { + margin: 6px 0; + padding-left: 20px; +} + +.chat-interface--sidebar .markdown-content li { + margin: 1px 0; + line-height: 1.3; +} + +.chat-interface--sidebar .markdown-content pre { + padding: 6px; + font-size: 11px; + margin: 6px 0; +} + +.chat-interface--sidebar .markdown-content .inline-code { + font-size: 0.85em; +} + +.chat-interface--sidebar .markdown-content table { + font-size: 11px; +} + +.chat-interface--sidebar .markdown-content th, +.chat-interface--sidebar .markdown-content td { + padding: 3px 5px; +} + +/* Drag & Drop Overlay */ + +/* Error message with action buttons */ +.error-message-content { + margin-bottom: 8px; + line-height: 1.4; + position: relative; + padding-right: 24px; /* Add space for close button in sidebar mode */ + color: var(--vscode-errorForeground); +} + +.error-actions { + display: flex; + gap: 8px; + margin-top: 8px; +} + +.error-action-btn { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border: 1px solid var(--vscode-button-border); + border-radius: 4px; + padding: 6px 12px; + font-size: 12px; + cursor: pointer; + transition: all 0.2s ease; + font-family: inherit; +} + +.error-action-btn:hover { + background: var(--vscode-button-hoverBackground); + border-color: var(--vscode-button-hoverBackground); +} + +.error-action-btn:active { + background: var(--vscode-button-activeBackground); + transform: scale(0.98); +} + +.error-action-btn:focus { + outline: 2px solid var(--vscode-focusBorder); + outline-offset: 2px; +} + +.error-close-btn { + background: none; + border: none; + color: var(--vscode-descriptionForeground); + cursor: pointer; + font-size: 18px; + font-weight: bold; + padding: 0; + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 3px; + transition: all 0.15s ease; + opacity: 0.6; + flex-shrink: 0; +} + +.error-close-btn:hover { + background: var(--vscode-toolbar-hoverBackground); + opacity: 1; + color: var(--vscode-foreground); +} + +.error-close-btn:active { + background: var(--vscode-toolbar-activeBackground); +} + +.error-close-btn--sidebar { + position: absolute; + top: 8px; + right: 8px; + font-size: 16px; + width: 18px; + height: 18px; +} + +/* Panel specific styling */ +.chat-interface--panel .error-actions { + gap: 10px; +} + +.chat-interface--panel .error-action-btn { + padding: 8px 16px; + font-size: 13px; +} + +/* Theme Tool Message Styles - Added for generateTheme tool calls */ +.theme-tool-message { + margin-bottom: 4px; + padding: 0; + border: none; + border-radius: 0; + background: transparent; + transition: all 0.2s ease; + position: relative; +} + +.theme-tool-message--panel { + margin-bottom: 4px; + padding: 0; +} + +.theme-tool-message--sidebar { + margin-bottom: 4px; + padding: 0; +} + +.theme-error-notice { + margin: 0.5rem 0; + padding: 0.75rem; + background-color: var(--vscode-inputValidation-errorBackground); + color: var(--vscode-inputValidation-errorForeground); + border: 1px solid var(--vscode-inputValidation-errorBorder); + border-left: 3px solid var(--vscode-errorForeground); + border-radius: 0.375rem; + font-size: 0.875rem; + font-family: var(--vscode-editor-font-family); +} + +/* Ensure theme preview cards use proper VSCode CSS variables */ +.theme-tool-message .theme-preview-card { + /* Override any hardcoded colors with VSCode theme variables */ + --background: var(--vscode-editor-background); + --foreground: var(--vscode-editor-foreground); + --muted: var(--vscode-input-background); + --muted-foreground: var(--vscode-descriptionForeground); + --border: var(--vscode-input-border); + --card: var(--vscode-editorWidget-background); + --card-foreground: var(--vscode-editorWidget-foreground); + --primary: var(--vscode-textLink-foreground); + --primary-foreground: var(--vscode-button-foreground); + --secondary: var(--vscode-button-secondaryBackground); + --secondary-foreground: var(--vscode-button-secondaryForeground); + --accent: var(--vscode-list-hoverBackground); + --accent-foreground: var(--vscode-list-hoverForeground); + --destructive: var(--vscode-errorForeground); + --destructive-foreground: var(--vscode-button-foreground); + --ring: var(--vscode-focusBorder); + --input: var(--vscode-input-background); + --font-mono: var(--vscode-editor-font-family); +} + +/* Responsive theme tool message styling */ +@media (max-width: 768px) { + .theme-tool-message--panel { + margin-bottom: 16px; + } + + .theme-tool-message--sidebar { + margin-bottom: 10px; + } +} + +/* Tool result content */ + +/* Remove double margins when chat-message contains tool messages */ +.chat-message--tool-container { + margin-bottom: 0 !important; + padding: 0 !important; + background: transparent !important; + border: none !important; +} + +.chat-message--tool-container .chat-message__header { + display: none !important; +} + +.chat-message--tool-container .chat-message__content { + padding: 0 !important; +} + +/* Mixed content messages (text + tool calls) */ +.chat-message--mixed-content { + background: transparent; + border: none; + margin-bottom: 12px; + padding: 0; +} + +.chat-message--mixed-content .chat-message__content { + margin-bottom: 6px; +} + +.chat-message--mixed-content .chat-message__tools { + margin-top: 4px; +} + +.chat-message--mixed-content .chat-message__tools .tool-message { + margin-bottom: 4px; +} + +.chat-message--mixed-content .chat-message__tools .theme-tool-message { + margin-bottom: 4px; +} + +/* Multiple tool calls container */ +.tool-calls-container { + display: flex; + flex-direction: column; + gap: 4px; +} + +.tool-calls-container .tool-message { + margin-bottom: 0; +} + +.tool-calls-container .theme-tool-message { + margin-bottom: 0; +} + +/* Theme copy button styling */ +.theme-copy-btn:hover { + background: var(--vscode-list-hoverBackground) !important; + color: var(--vscode-foreground) !important; +} + + + \ No newline at end of file diff --git a/src/webview/components/Chat/ChatInterface.tsx b/src/webview/components/Chat/ChatInterface.tsx new file mode 100644 index 0000000..1ede6e6 --- /dev/null +++ b/src/webview/components/Chat/ChatInterface.tsx @@ -0,0 +1,1517 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { useChat, ChatMessage } from '../../hooks/useChat'; +import { useFirstTimeUser } from '../../hooks/useFirstTimeUser'; +import { WebviewLayout } from '../../../types/context'; +import MarkdownRenderer from '../MarkdownRenderer'; +import { TaskIcon, ClockIcon, CheckIcon, LightBulbIcon, GroupIcon, BrainIcon } from '../Icons'; +import Welcome from '../Welcome'; +import ThemePreviewCard from './ThemePreviewCard'; +import ModelSelector from './ModelSelector'; +import chatStyles from './ChatInterface.css'; +import welcomeStyles from '../Welcome/Welcome.css'; + +interface ChatInterfaceProps { + layout: WebviewLayout; + vscode: any; +} + +const ChatInterface: React.FC = ({ layout, vscode }) => { + const { chatHistory, isLoading, sendMessage, clearHistory, setChatHistory } = useChat(vscode); + const { isFirstTime, isLoading: isCheckingFirstTime, markAsReturningUser, resetFirstTimeUser } = useFirstTimeUser(); + const [inputMessage, setInputMessage] = useState(''); + const [selectedModel, setSelectedModel] = useState('claude-3-5-sonnet-20241022'); + const [expandedTools, setExpandedTools] = useState>({}); + const [showFullContent, setShowFullContent] = useState<{[key: string]: boolean}>({}); + const [currentContext, setCurrentContext] = useState<{fileName: string; type: string} | null>(null); + const [showWelcome, setShowWelcome] = useState(false); + + // Drag and drop state + const [uploadingImages, setUploadingImages] = useState([]); + const [pendingImages, setPendingImages] = useState<{fileName: string; originalName: string; fullPath: string}[]>([]); + const [toolTimers, setToolTimers] = useState>({}); + const timerIntervals = useRef>({}); + + // Helper function to check if we have meaningful conversation messages + const hasConversationMessages = () => { + return chatHistory.some(msg => + msg.role === 'user' || + (msg.role === 'assistant' && typeof msg.content === 'string' && msg.content.trim().length > 0) || + (msg.role === 'assistant' && Array.isArray(msg.content) && msg.content.some(part => part.type === 'text' && (part as any).text?.trim().length > 0)) + ); + }; + + // Request current provider on mount + useEffect(() => { + vscode.postMessage({ + command: 'getCurrentProvider' + }); + + const handleMessage = (event: MessageEvent) => { + const message = event.data; + if (message.command === 'currentProviderResponse') { + let fallbackModel: string; + switch (message.provider) { + case 'openai': + fallbackModel = 'gpt-4o'; + break; + case 'openrouter': + fallbackModel = 'anthropic/claude-3-7-sonnet-20250219'; + break; + case 'anthropic': + default: + fallbackModel = 'claude-3-5-sonnet-20241022'; + break; + } + setSelectedModel(message.model || fallbackModel); + } else if (message.command === 'providerChanged') { + setSelectedModel(message.model); + } + }; + + window.addEventListener('message', handleMessage); + return () => window.removeEventListener('message', handleMessage); + }, []); + + const handleModelChange = (model: string) => { + // Send model change request to extension + vscode.postMessage({ + command: 'changeProvider', + model: model + }); + }; + + useEffect(() => { + // Inject ChatInterface CSS styles + const styleId = 'chat-interface-styles'; + let styleElement = document.getElementById(styleId) as HTMLStyleElement; + + if (!styleElement) { + styleElement = document.createElement('style'); + styleElement.id = styleId; + styleElement.textContent = chatStyles; + document.head.appendChild(styleElement); + } + + // Inject Welcome CSS styles + const welcomeStyleId = 'welcome-styles'; + let welcomeStyleElement = document.getElementById(welcomeStyleId) as HTMLStyleElement; + + if (!welcomeStyleElement) { + welcomeStyleElement = document.createElement('style'); + welcomeStyleElement.id = welcomeStyleId; + welcomeStyleElement.textContent = welcomeStyles; + document.head.appendChild(welcomeStyleElement); + } + + // Auto-open canvas if not already open + const autoOpenCanvas = () => { + // Check if canvas panel is already open by looking for the canvas webview + vscode.postMessage({ + command: 'checkCanvasStatus' + }); + + // Listen for canvas status response and context messages + const handleMessage = (event: MessageEvent) => { + const message = event.data; + if (message.command === 'canvasStatusResponse') { + if (!message.isOpen) { + // Canvas is not open, auto-open it + console.log('🎨 Auto-opening canvas view...'); + vscode.postMessage({ + command: 'autoOpenCanvas' + }); + } + } else if (message.command === 'contextFromCanvas') { + // Handle context from canvas + console.log('📄 Received context from canvas:', message.data); + console.log('📄 Current context before setting:', currentContext); + if (message.data.type === 'clear' || !message.data.fileName) { + setCurrentContext(null); + console.log('📄 Context cleared'); + } else { + setCurrentContext(message.data); + console.log('📄 Context set to:', message.data); + } + } else if (message.command === 'imageSavedToMoodboard') { + // Handle successful image save with full path + console.log('📎 Image saved with full path:', message.data); + setPendingImages(prev => [...prev, { + fileName: message.data.fileName, + originalName: message.data.originalName, + fullPath: message.data.fullPath + }]); + // Remove from uploading state + setUploadingImages(prev => prev.filter(name => name !== message.data.originalName)); + } else if (message.command === 'imageSaveError') { + // Handle image save error + console.error('📎 Image save error:', message.data); + setUploadingImages(prev => prev.filter(name => name !== message.data.originalName)); + } else if (message.command === 'clearChat') { + // Handle clear chat command from toolbar + handleNewConversation(); + } else if (message.command === 'resetWelcome') { + // Handle reset welcome command from command palette + resetFirstTimeUser(); + setShowWelcome(true); + console.log('👋 Welcome screen reset and shown'); + } else if (message.command === 'setChatPrompt') { + // Handle prompt from canvas floating buttons + console.log('📝 Received prompt from canvas:', message.data.prompt); + setInputMessage(message.data.prompt); + } + }; + + window.addEventListener('message', handleMessage); + + // Cleanup listener + return () => { + window.removeEventListener('message', handleMessage); + }; + }; + + // Delay the check slightly to ensure chat is fully loaded + const timeoutId = setTimeout(autoOpenCanvas, 500); + + return () => { + clearTimeout(timeoutId); + // Clean up on unmount + const existingStyle = document.getElementById(styleId); + if (existingStyle) { + document.head.removeChild(existingStyle); + } + const existingWelcomeStyle = document.getElementById(welcomeStyleId); + if (existingWelcomeStyle) { + document.head.removeChild(existingWelcomeStyle); + } + }; + }, [vscode]); + + // Handle first-time user welcome display + useEffect(() => { + if (!isCheckingFirstTime && isFirstTime && !hasConversationMessages()) { + setShowWelcome(true); + console.log('👋 Showing welcome for first-time user'); + } + }, [isCheckingFirstTime, isFirstTime, chatHistory]); + + // Auto-collapse tools when new messages arrive + useEffect(() => { + const handleAutoCollapse = () => { + setExpandedTools(prev => { + const newState = { ...prev }; + const toolIndices = chatHistory + .map((msg, index) => ({ msg, index })) + .filter(({ msg }) => msg.role === 'tool') + .map(({ index }) => index); + + // Keep only the last tool/tool-result expanded + if (toolIndices.length > 1) { + const lastToolIndex = toolIndices[toolIndices.length - 1]; + toolIndices.forEach(index => { + if (index !== lastToolIndex) { + newState[index] = false; + } + }); + } + + return newState; + }); + }; + + window.addEventListener('autoCollapseTools', handleAutoCollapse); + return () => window.removeEventListener('autoCollapseTools', handleAutoCollapse); + }, [chatHistory]); + + const handleSendMessage = async () => { + if (inputMessage.trim()) { + let messageContent: any; + + console.log('📤 Sending message with context:', currentContext); + console.log('📤 Input message:', inputMessage); + + // Check if we have image context to include + if (currentContext && (currentContext.type === 'image' || currentContext.type === 'images')) { + try { + // Create structured content with text and images + const contentParts: any[] = [ + { + type: 'text', + text: inputMessage + } + ]; + + // Process image context + const imagePaths = currentContext.type === 'images' + ? currentContext.fileName.split(', ') + : [currentContext.fileName]; + + // Convert each image to base64 + for (const imagePath of imagePaths) { + try { + // Request base64 data from the extension + const base64Data = await new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + reject(new Error('Timeout waiting for base64 data')); + }, 10000); + + const handler = (event: MessageEvent) => { + const message = event.data; + if (message.command === 'base64ImageResponse' && message.filePath === imagePath) { + clearTimeout(timeoutId); + window.removeEventListener('message', handler); + if (message.error) { + reject(new Error(message.error)); + } else { + resolve(message.base64Data); + } + } + }; + + window.addEventListener('message', handler); + + // Request base64 data from extension + vscode.postMessage({ + command: 'getBase64Image', + filePath: imagePath + }); + }); + + // Extract MIME type from base64 data URL + const mimeMatch = base64Data.match(/^data:([^;]+);base64,/); + const mimeType = mimeMatch ? mimeMatch[1] : 'image/png'; + const base64Content = base64Data.replace(/^data:[^;]+;base64,/, ''); + + contentParts.push({ + type: 'image', + image: base64Content, + mimeType: mimeType + }); + + console.log('📎 Added image to message:', imagePath, 'MIME:', mimeType); + } catch (error) { + console.error('Failed to load image:', imagePath, error); + // Add error note to text content instead + contentParts[0].text += `\n\n[Note: Could not load image ${imagePath}: ${error}]`; + } + } + + messageContent = contentParts; + console.log('📤 Final structured message content:', contentParts.length, 'parts'); + } catch (error) { + console.error('Error processing images:', error); + // Fallback to text-only message with context info + messageContent = currentContext.type === 'images' + ? `Context: Multiple images in moodboard\n\nMessage: ${inputMessage}` + : `Context: ${currentContext.fileName}\n\nMessage: ${inputMessage}`; + } + } else if (currentContext) { + // Non-image context - use simple text format + messageContent = `Context: ${currentContext.fileName}\n\nMessage: ${inputMessage}`; + console.log('📤 Final message with non-image context:', messageContent); + } else { + // No context - just the message text + messageContent = inputMessage; + console.log('📤 No context available, sending message as-is'); + } + + sendMessage(messageContent); + setInputMessage(''); + } + }; + + const handleKeyPress = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSendMessage(); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + setInputMessage(e.target.value); + resizeTextarea(e.target); + }; + + const resizeTextarea = (textarea: HTMLTextAreaElement) => { + // Auto-resize textarea + textarea.style.height = 'auto'; // Reset height to calculate new height + + // Set height based on scroll height, with max height of 120px (about 6 lines) + const maxHeight = 120; + const newHeight = Math.min(textarea.scrollHeight, maxHeight); + textarea.style.height = `${newHeight}px`; + }; + + // Reset textarea height when input is cleared (e.g., after sending message) + useEffect(() => { + if (!inputMessage.trim()) { + const textarea = document.querySelector('.message-input') as HTMLTextAreaElement; + if (textarea) { + textarea.style.height = 'auto'; + } + } + }, [inputMessage]); + + const handleAddContext = () => { + // TODO: Implement context addition functionality + console.log('Add Context clicked'); + }; + + const handleNewConversation = () => { + clearHistory(); + setInputMessage(''); + setCurrentContext(null); + setUploadingImages([]); + setPendingImages([]); + setToolTimers({}); // Clear all tool timers + + // Clear all timer intervals + Object.values(timerIntervals.current).forEach(timer => clearInterval(timer)); + timerIntervals.current = {}; + + markAsReturningUser(); + }; + + const handleWelcomeGetStarted = () => { + setShowWelcome(false); + markAsReturningUser(); + console.log('👋 User clicked Get Started, welcome dismissed'); + + // Auto-trigger initialize Superdesign command + vscode.postMessage({ + command: 'initializeSuperdesign' + }); + console.log('🚀 Auto-triggering Initialize Superdesign command'); + }; + + // Drag and drop handlers + const handleDragEnter = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // Check if dragged items contain files + if (e.dataTransfer.types.includes('Files')) { + e.dataTransfer.effectAllowed = 'copy'; + e.dataTransfer.dropEffect = 'copy'; + } + }; + + const handleDragLeave = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // Essential: Must prevent default and set dropEffect for drop to work + if (e.dataTransfer.types.includes('Files')) { + e.dataTransfer.dropEffect = 'copy'; + } + }; + + const handleDrop = async (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (isLoading) { + return; + } + + const files = Array.from(e.dataTransfer.files); + const imageFiles = files.filter(file => file.type.startsWith('image/')); + + if (imageFiles.length === 0) { + return; + } + + // Process each image file + for (const file of imageFiles) { + try { + await handleImageUpload(file); + } catch (error) { + console.error('Error processing dropped image:', error); + } + } + }; + + const handleImageUpload = async (file: File): Promise => { + const maxSize = 10 * 1024 * 1024; // 10MB limit + if (file.size > maxSize) { + const displayName = file.name || 'clipboard image'; + console.error('Image too large:', displayName); + vscode.postMessage({ + command: 'showError', + data: `Image "${displayName}" is too large. Maximum size is 10MB.` + }); + return; + } + + // Create a unique filename - handle clipboard images without names + const timestamp = Date.now(); + const originalName = file.name || `clipboard-image-${timestamp}`; + const extension = file.type.split('/')[1] || 'png'; + const safeName = originalName.replace(/[^a-zA-Z0-9.-]/g, '_'); + const fileName = safeName.includes('.') ? `${timestamp}_${safeName}` : `${timestamp}_${safeName}.${extension}`; + + // Add to uploading state + setUploadingImages(prev => [...prev, originalName]); + + // Convert to base64 for sending to extension + const reader = new FileReader(); + reader.onload = () => { + const base64Data = reader.result as string; + + // Send to extension to save in moodboard + vscode.postMessage({ + command: 'saveImageToMoodboard', + data: { + fileName, + originalName, + base64Data, + mimeType: file.type, + size: file.size + } + }); + + console.log('📎 Image sent to extension for saving:', fileName); + }; + + reader.onerror = () => { + console.error('Error reading file:', file.name); + setUploadingImages(prev => prev.filter(name => name !== file.name)); + vscode.postMessage({ + command: 'showError', + data: `Failed to read image "${file.name}"` + }); + }; + + reader.readAsDataURL(file); + }; + + // Auto-set context when images finish uploading + useEffect(() => { + if (uploadingImages.length === 0 && pendingImages.length > 0) { + if (pendingImages.length === 1) { + // Single image - set as context with full path + setCurrentContext({ + fileName: pendingImages[0].fullPath, + type: 'image' + }); + } else { + // Multiple images - create a combined context with all full paths + const fullPaths = pendingImages.map(img => img.fullPath).join(', '); + setCurrentContext({ + fileName: fullPaths, + type: 'images' + }); + } + // Clear pending images after setting context + setPendingImages([]); + } + }, [uploadingImages.length, pendingImages.length]); + + // Helper function to check if tool is loading + const isToolLoading = (toolCallPart: any, msgIndex: number) => { + const toolCallId = toolCallPart.toolCallId; + const hasResult = chatHistory.slice(msgIndex + 1).some(laterMsg => + laterMsg.role === 'tool' && + Array.isArray(laterMsg.content) && + laterMsg.content.some(resultPart => + resultPart.type === 'tool-result' && + (resultPart as any).toolCallId === toolCallId + ) + ); + return !hasResult || toolCallPart.metadata?.is_loading || false; + }; + + // Manage countdown timers for tool calls + useEffect(() => { + const activeTimers = new Set(); + + // Process each message to find tool calls + chatHistory.forEach((msg, msgIndex) => { + if (msg.role === 'assistant' && Array.isArray(msg.content)) { + // Find tool call parts and use same indexing as UI + const toolCallParts = msg.content.filter(part => part.type === 'tool-call') as any[]; + + toolCallParts.forEach((toolCallPart, toolCallIndex) => { + const uniqueKey = `${msgIndex}_${toolCallIndex}`; // Use tool call index, not content index + const isLoading = isToolLoading(toolCallPart, msgIndex); + + activeTimers.add(uniqueKey); + + if (isLoading) { + // Initialize timer if doesn't exist + setToolTimers(prev => { + if (!(uniqueKey in prev)) { + const estimatedDuration = toolCallPart.metadata?.estimated_duration || 90; + const elapsedTime = toolCallPart.metadata?.elapsed_time || 0; + const initialRemaining = Math.max(0, estimatedDuration - elapsedTime); + + return { + ...prev, + [uniqueKey]: initialRemaining + }; + } + return prev; + }); + + // Start interval if not already running + if (!timerIntervals.current[uniqueKey]) { + timerIntervals.current[uniqueKey] = setInterval(() => { + setToolTimers(current => { + const newTime = Math.max(0, (current[uniqueKey] || 0) - 1); + return { + ...current, + [uniqueKey]: newTime + }; + }); + }, 1000); + } + } else { + // Tool completed, clean up + if (timerIntervals.current[uniqueKey]) { + clearInterval(timerIntervals.current[uniqueKey]); + delete timerIntervals.current[uniqueKey]; + } + setToolTimers(prev => { + const { [uniqueKey]: removed, ...rest } = prev; + return rest; + }); + } + }); + } + }); + + // Clean up orphaned timers + Object.keys(timerIntervals.current).forEach(key => { + if (!activeTimers.has(key)) { + clearInterval(timerIntervals.current[key]); + delete timerIntervals.current[key]; + } + }); + + // Cleanup on unmount + return () => { + Object.values(timerIntervals.current).forEach(timer => clearInterval(timer)); + }; + }, [chatHistory]); + + // Global drag & drop fallback for VS Code webview + useEffect(() => { + const handleGlobalDragOver = (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + if (e.dataTransfer && e.dataTransfer.types.includes('Files')) { + e.dataTransfer.dropEffect = 'copy'; + } + }; + + const handleGlobalDrop = async (e: DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + console.log('🎯 Global drop detected!', e.dataTransfer?.files.length, 'files'); + + if (!e.dataTransfer?.files) return; + + const files = Array.from(e.dataTransfer.files); + console.log('🎯 Global files from drop:', files.map(f => `${f.name} (${f.type})`)); + + const imageFiles = files.filter(file => file.type.startsWith('image/')); + console.log('🎯 Global image files:', imageFiles.map(f => f.name)); + + if (imageFiles.length > 0 && !isLoading) { + console.log('📎 Processing images from global drop:', imageFiles.map(f => f.name)); + + for (const file of imageFiles) { + try { + await handleImageUpload(file); + } catch (error) { + console.error('Error processing dropped image:', error); + } + } + } + }; + + const handleGlobalPaste = async (e: ClipboardEvent) => { + // Only handle paste if we're focused on the chat and not loading + if (isLoading || showWelcome) return; + + const clipboardItems = e.clipboardData?.items; + if (!clipboardItems) return; + + console.log('📋 Paste detected, checking for images...'); + + // Look for image items in clipboard + const imageItems = Array.from(clipboardItems).filter(item => + item.type.startsWith('image/') + ); + + if (imageItems.length > 0) { + e.preventDefault(); + console.log('📋 Found', imageItems.length, 'image(s) in clipboard'); + + for (const item of imageItems) { + const file = item.getAsFile(); + if (file) { + try { + console.log('📋 Processing pasted image:', file.name || 'clipboard-image', file.type); + await handleImageUpload(file); + } catch (error) { + console.error('Error processing pasted image:', error); + vscode.postMessage({ + command: 'showError', + data: `Failed to process pasted image: ${error instanceof Error ? error.message : String(error)}` + }); + } + } + } + } + }; + + // Add global listeners + document.addEventListener('dragover', handleGlobalDragOver); + document.addEventListener('drop', handleGlobalDrop); + document.addEventListener('paste', handleGlobalPaste); + + return () => { + document.removeEventListener('dragover', handleGlobalDragOver); + document.removeEventListener('drop', handleGlobalDrop); + document.removeEventListener('paste', handleGlobalPaste); + }; + }, [isLoading, handleImageUpload, showWelcome]); + + const renderChatMessage = (msg: ChatMessage, index: number) => { + // Helper function to extract text content from CoreMessage + const getMessageText = (msg: ChatMessage): string => { + if (typeof msg.content === 'string') { + return msg.content; + } else if (Array.isArray(msg.content)) { + // Find text parts and concatenate them + return msg.content + .filter(part => part.type === 'text') + .map(part => (part as any).text) + .join('\n'); + } + return ''; + }; + + // Check if message has tool calls + const hasToolCalls = Array.isArray(msg.content) && + msg.content.some(part => part.type === 'tool-call'); + + // Helper function to find tool result for a tool call + const findToolResult = (toolCallId: string) => { + // Look for a tool message with matching toolCallId + for (let i = index + 1; i < chatHistory.length; i++) { + const laterMsg = chatHistory[i]; + if (laterMsg.role === 'tool' && Array.isArray(laterMsg.content)) { + const toolResultPart = laterMsg.content.find( + part => part.type === 'tool-result' && (part as any).toolCallId === toolCallId + ); + if (toolResultPart) { + return toolResultPart as any; + } + } + } + return null; + }; + + // Check if message has tool results + const hasToolResults = Array.isArray(msg.content) && + msg.content.some(part => part.type === 'tool-result'); + + const isLastUserMessage = msg.role === 'user' && index === chatHistory.length - 1 && isLoading; + const isLastStreamingMessage = (msg.role === 'assistant' || hasToolResults) && index === chatHistory.length - 1; + const isStreaming = isLastStreamingMessage && isLoading; + const messageText = getMessageText(msg); + + // Handle tool call messages specially - but for mixed content, we need to show both text AND tools + if (msg.role === 'assistant' && hasToolCalls) { + // Check if there's also text content + const hasTextContent = messageText.trim().length > 0; + + if (hasTextContent) { + // Mixed content: show both text and tool calls + return ( +
+ {layout === 'panel' && ( +
+ Claude + {msg.metadata && ( + + {msg.metadata.duration_ms && ( + {msg.metadata.duration_ms}ms + )} + {msg.metadata.total_cost_usd && ( + ${msg.metadata.total_cost_usd.toFixed(4)} + )} + + )} +
+ )} +
+ + {isStreaming && } +
+
+ {renderToolCalls(msg, index, findToolResult)} +
+
+ ); + } else { + // Only tool calls, no text content - use original tool-only rendering + return renderToolCalls(msg, index, findToolResult); + } + } + + // Handle error messages with actions specially + if (msg.role === 'assistant' && msg.metadata?.is_error && msg.metadata?.actions) { + return renderErrorMessage(msg, index, setChatHistory); + } + + // Determine message label and styling + let messageLabel = ''; + let messageClass = ''; + + switch (msg.role) { + case 'user': + messageLabel = 'You'; + messageClass = 'user'; + break; + case 'assistant': + messageLabel = 'Claude'; + messageClass = 'assistant'; + break; + case 'system': + messageLabel = 'System'; + messageClass = 'system'; + break; + case 'tool': + messageLabel = 'Tool Result'; + messageClass = 'tool-result'; + break; + } + + const hasToolCall = hasToolCalls || hasToolResults; + + return ( +
+ {layout === 'panel' && ( +
+ + {messageLabel} + + {msg.metadata && ( + + {msg.metadata.duration_ms && ( + {msg.metadata.duration_ms}ms + )} + {msg.metadata.total_cost_usd && ( + ${msg.metadata.total_cost_usd.toFixed(4)} + )} + + )} +
+ )} +
+ {(msg.role === 'assistant') ? ( + + ) : ( + (() => { + // Check if this is a user message with context + if (messageText.startsWith('Context: ') && messageText.includes('\n\nMessage: ')) { + const contextMatch = messageText.match(/^Context: (.+)\n\nMessage: (.+)$/s); + if (contextMatch) { + const contextFile = contextMatch[1]; + const actualMessage = contextMatch[2]; + + // Handle display for multiple images or single image + let displayFileName; + if (contextFile.includes(', ')) { + // Multiple images - show count + const paths = contextFile.split(', '); + displayFileName = `${paths.length} images in moodboard`; + } else { + // Single image - show just filename + displayFileName = contextFile.includes('.superdesign') + ? contextFile.split('.superdesign/')[1] || contextFile.split('/').pop() || contextFile + : contextFile.split('/').pop() || contextFile; + } + + return ( + <> +
+ @ + {displayFileName} +
+
{actualMessage}
+ + ); + } + } + return messageText; + })() + )} + {isStreaming && } +
+ {isLastUserMessage && ( +
+ Generating +
+ )} +
+ ); + }; + + // New function to handle multiple tool calls in a single message + const renderToolCalls = (msg: ChatMessage, index: number, findToolResult: (toolCallId: string) => any) => { + if (!Array.isArray(msg.content)) { + return
Invalid tool message content
; + } + + // Find ALL tool call parts + const toolCallParts = msg.content.filter(part => part.type === 'tool-call') as any[]; + + if (toolCallParts.length === 0) { + return
No tool calls found
; + } + + // Render each tool call separately + return ( +
+ {toolCallParts.map((toolCallPart, subIndex) => + renderSingleToolCall(toolCallPart, index, subIndex, findToolResult) + )} +
+ ); + }; + + // Updated function to render a single tool call with unique subIndex for state management + const renderSingleToolCall = (toolCallPart: any, messageIndex: number, subIndex: number, findToolResult: (toolCallId: string) => any) => { + try { + const toolName = toolCallPart.toolName || 'Unknown Tool'; + const toolInput = toolCallPart.args || {}; + const uniqueKey = `${messageIndex}_${subIndex}`; + + // Special handling for generateTheme tool calls + if (toolName === 'generateTheme') { + // For generateTheme, check if we have a tool result to determine completion + const toolCallId = toolCallPart.toolCallId; + const toolResultPart = findToolResult(toolCallId); + const hasResult = !!toolResultPart; + const resultIsError = toolResultPart?.isError || false; + + // Tool is loading if we don't have a result yet, or if metadata indicates loading + const isLoading = !hasResult || toolCallPart.metadata?.is_loading || false; + + // Extract theme data from tool input + const themeName = toolInput.theme_name || 'Untitled Theme'; + const reasoning = toolInput.reasoning_reference || ''; + const cssSheet = toolInput.cssSheet || ''; + + // Try to get CSS file path from metadata or result + let cssFilePath = null; + if (hasResult && !resultIsError) { + // Check both input and result for cssFilePath + cssFilePath = toolInput.cssFilePath || toolResultPart?.result?.cssFilePath; + } + + return ( +
+ + {resultIsError && ( +
+ ⚠️ Theme generation encountered an error. The preview above shows the input data. +
+ )} +
+ ); + } + + // Continue with existing generic tool rendering for other tools + const isExpanded = expandedTools[uniqueKey] || false; + const showFullResult = showFullContent[uniqueKey] || false; + const showFullInput = showFullContent[`${uniqueKey}_input`] || false; + const showFullPrompt = showFullContent[`${uniqueKey}_prompt`] || false; + + const description = toolInput.description || ''; + const command = toolInput.command || ''; + const prompt = toolInput.prompt || ''; + + // Tool result data - find from separate tool message + const toolCallId = toolCallPart.toolCallId; + const toolResultPart = findToolResult(toolCallId); + const hasResult = !!toolResultPart; + const resultIsError = toolResultPart?.isError || false; + + // Tool is loading if we don't have a result yet, or if metadata indicates loading + const isLoading = !hasResult || toolCallPart.metadata?.is_loading || false; + + const toolResult = toolResultPart ? + (typeof toolResultPart.result === 'string' ? toolResultPart.result : JSON.stringify(toolResultPart.result, null, 2)) : + ''; + + // Tool is complete when it has finished (regardless of errors) + const toolComplete = hasResult && !isLoading; + + // Get the countdown timer for this specific tool + const timerRemaining = toolTimers[uniqueKey] || 0; + + // Enhanced loading data + const estimatedDuration = toolCallPart.metadata?.estimated_duration || 90; + const elapsedTime = toolCallPart.metadata?.elapsed_time || 0; + const progressPercentage = toolCallPart.metadata?.progress_percentage || 0; + // Use timer state for remaining time, fallback to calculated if timer not started yet + const remainingTime = isLoading ? (timerRemaining > 0 ? timerRemaining : Math.max(0, estimatedDuration - elapsedTime)) : 0; + + // Format time display + const formatTime = (seconds: number): string => { + const mins = Math.floor(seconds / 60); + const secs = Math.floor(seconds % 60); + return `${mins}:${secs.toString().padStart(2, '0')}`; + }; + + // Get friendly tool name for display + const getFriendlyToolName = (name: string): string => { + const friendlyNames: { [key: string]: string } = { + 'mcp_taskmaster-ai_parse_prd': 'Parsing Requirements Document', + 'mcp_taskmaster-ai_analyze_project_complexity': 'Analyzing Project Complexity', + 'mcp_taskmaster-ai_expand_task': 'Expanding Task', + 'mcp_taskmaster-ai_expand_all': 'Expanding All Tasks', + 'mcp_taskmaster-ai_research': 'Researching Information', + 'codebase_search': 'Searching Codebase', + 'read_file': 'Reading File', + 'edit_file': 'Editing File', + 'run_terminal_cmd': 'Running Command' + }; + return friendlyNames[name] || name.replace(/mcp_|_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); + }; + + // Get helpful loading tips based on tool and progress + const getLoadingTip = (toolName: string, progress: number): string => { + const progressStage = progress < 25 ? 'early' : progress < 50 ? 'mid' : progress < 75 ? 'late' : 'final'; + + const tipsByTool: { [key: string]: { [stage: string]: string[] } } = { + 'mcp_taskmaster-ai_parse_prd': { + early: ['Analyzing requirements and identifying key features...', 'Breaking down complex requirements into manageable tasks...'], + mid: ['Structuring tasks based on dependencies and priorities...', 'Defining implementation details for each component...'], + late: ['Finalizing task relationships and estimates...', 'Optimizing task breakdown for efficient development...'], + final: ['Completing task generation and validation...', 'Almost ready with your project roadmap!'] + }, + 'mcp_taskmaster-ai_research': { + early: ['Gathering the latest information from multiple sources...', 'Searching for best practices and recent developments...'], + mid: ['Analyzing findings and filtering relevant information...', 'Cross-referencing multiple sources for accuracy...'], + late: ['Synthesizing research into actionable insights...', 'Preparing comprehensive research summary...'], + final: ['Finalizing research report with recommendations...', 'Almost done with your research!'] + }, + 'mcp_taskmaster-ai_expand_task': { + early: ['Breaking down the task into detailed subtasks...', 'Analyzing task complexity and dependencies...'], + mid: ['Defining implementation steps and requirements...', 'Creating detailed subtask specifications...'], + late: ['Optimizing subtask flow and dependencies...', 'Adding implementation details and strategies...'], + final: ['Finalizing subtask breakdown...', 'Your detailed implementation plan is almost ready!'] + } + }; + + const generalTips = { + early: ['AI is working hard to process your request...', 'Analyzing your requirements in detail...', 'Loading the best approach for your needs...'], + mid: ['Making good progress on your request...', 'Processing complex logic and relationships...', 'Halfway there! Building your solution...'], + late: ['Finalizing details and optimizations...', 'Almost finished with the heavy lifting...', 'Putting the finishing touches on your request...'], + final: ['Just a few more seconds...', 'Completing final validations...', 'Almost ready with your results!'] + }; + + const toolTips = tipsByTool[toolName] || generalTips; + const stageTips = toolTips[progressStage] || generalTips[progressStage]; + const randomIndex = Math.floor((progress / 10)) % stageTips.length; + + return stageTips[randomIndex]; + }; + + const toggleExpanded = () => { + setExpandedTools(prev => ({ + ...prev, + [uniqueKey]: !prev[uniqueKey] + })); + }; + + const toggleShowFullResult = () => { + setShowFullContent(prev => ({ + ...prev, + [uniqueKey]: !prev[uniqueKey] + })); + }; + + const toggleShowFullInput = () => { + setShowFullContent(prev => ({ + ...prev, + [`${uniqueKey}_input`]: !prev[`${uniqueKey}_input`] + })); + }; + + const toggleShowFullPrompt = () => { + setShowFullContent(prev => ({ + ...prev, + [`${uniqueKey}_prompt`]: !prev[`${uniqueKey}_prompt`] + })); + }; + + // Determine if content needs truncation + const MAX_PREVIEW = 300; + + // Result truncation + const resultNeedsTruncation = toolResult.length > MAX_PREVIEW; + const displayResult = resultNeedsTruncation && !showFullResult + ? toolResult.substring(0, MAX_PREVIEW) + '...' + : toolResult; + + // Input truncation + const inputString = JSON.stringify(toolInput, null, 2); + const inputNeedsTruncation = inputString.length > MAX_PREVIEW; + const displayInput = inputNeedsTruncation && !showFullInput + ? inputString.substring(0, MAX_PREVIEW) + '...' + : inputString; + + // Prompt truncation + const promptNeedsTruncation = prompt.length > MAX_PREVIEW; + const displayPrompt = promptNeedsTruncation && !showFullPrompt + ? prompt.substring(0, MAX_PREVIEW) + '...' + : prompt; + + return ( +
+
+
+ + {isLoading ? ( +
+
+
+ ) : ( + + )} +
+
+ {getFriendlyToolName(toolName)} + {description && ( + {description} + )} + {isLoading && ( + + {formatTime(remainingTime)} remaining + + )} +
+
+
+ {toolComplete && ( + + + + )} + +
+
+ {isExpanded && ( +
+ {isLoading && ( +
+
+ + + {getLoadingTip(toolName, Math.floor((estimatedDuration - remainingTime) / estimatedDuration * 100))} + +
+
+ )} + {command && ( +
+ Command: + {command} +
+ )} + {Object.keys(toolInput).length > 0 && ( +
+ Input: +
+
+                                            {displayInput}
+                                        
+ {inputNeedsTruncation && ( + + )} +
+
+ )} + {prompt && ( +
+ Prompt: +
+
+                                            {displayPrompt}
+                                        
+ {promptNeedsTruncation && ( + + )} +
+
+ )} + {hasResult && ( +
+ + {resultIsError ? 'Error Result:' : 'Result:'} + +
+
+                                            {displayResult}
+                                        
+ {resultNeedsTruncation && ( + + )} +
+
+ )} +
+ )} +
+ ); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return ( +
+
+
+ ⚠️ +
+ Error rendering tool: {toolCallPart.toolName || 'Unknown'} + {errorMessage} +
+
+
+
+ ); + } + }; + + const renderErrorMessage = (msg: ChatMessage, index: number, setChatHistory: React.Dispatch>) => { + const handleActionClick = (action: { text: string; command: string; args?: string }) => { + console.log('Action clicked:', action); + vscode.postMessage({ + command: 'executeAction', + actionCommand: action.command, + actionArgs: action.args + }); + }; + + const handleCloseError = () => { + // Remove this error message from chat history + setChatHistory((prev: ChatMessage[]) => prev.filter((_, i: number) => i !== index)); + }; + + return ( +
+ {layout === 'panel' && ( +
+ Error + +
+ )} +
+
+ {typeof msg.content === 'string' ? msg.content : 'Error occurred'} +
+ {msg.metadata?.actions && msg.metadata.actions.length > 0 && ( +
+ {msg.metadata.actions.map((action, actionIndex) => ( + + ))} +
+ )} + {layout === 'sidebar' && ( + + )} +
+
+ ); + }; + + const renderPlaceholder = () => ( +
+
+
+

+ Cursor/Windsurf/Claude Code rules already added, prompt Cursor/Windsurf/Claude Code to design UI like Help me design a calculator UI and preview the UI in Superdesign canvas by Cmd+Shift+P 'Superdesign: Open canvas view' +

+
OR
+

+ You can start with native superdesign agent chat below (We have better UX) +

+
+
+
+ ); + + return ( +
+ + {layout === 'panel' && ( +
+

💬 Chat with Claude

+

Ask Claude anything about code, design, or development!

+ +
+ )} + +
+
+ {showWelcome ? ( + + ) : hasConversationMessages() ? ( + <> + {chatHistory + .filter(msg => { + // All messages are now displayed since we use CoreMessage format + return true; + }) + .map(renderChatMessage) + } + + ) : renderPlaceholder()} +
+ + {!showWelcome && ( +
+ {/* Context Display */} + {currentContext ? ( +
+ + {currentContext.type === 'image' ? '🖼️' : currentContext.type === 'images' ? '🖼️' : '📄'} + + + {currentContext.type === 'image' ? 'Image: ' : currentContext.type === 'images' ? 'Images: ' : 'Context: '} + {currentContext.type === 'images' ? + `${currentContext.fileName.split(', ').length} images in moodboard` : + (currentContext.fileName.includes('.superdesign') + ? currentContext.fileName.split('.superdesign/')[1] || currentContext.fileName.split('/').pop() || currentContext.fileName + : currentContext.fileName.split('/').pop() || currentContext.fileName + ) + } + + +
+ ) : null} + + {/* Upload Progress */} + {uploadingImages.length > 0 && ( +
+ {uploadingImages.length > 1 && ( +
+ Uploading {uploadingImages.length} images... +
+ )} + {uploadingImages.map((fileName, index) => ( +
+ 📎 + Uploading {fileName}... +
+
+ ))} +
+ )} + + {/* Add Context Button */} + {!currentContext && uploadingImages.length === 0 && ( + + )} + + {/* Input Area */} +
+ +
+ + +
+
+ `; + + return ( +
+
+
+
+
+ ); +}; + +export default ThemePreview; \ No newline at end of file diff --git a/src/webview/components/Chat/ThemePreviewCard.tsx b/src/webview/components/Chat/ThemePreviewCard.tsx new file mode 100644 index 0000000..5c21ad5 --- /dev/null +++ b/src/webview/components/Chat/ThemePreviewCard.tsx @@ -0,0 +1,419 @@ +import React, { useState, useEffect } from 'react'; +import ThemePreviewHeader from './ThemePreviewHeader'; +import ColorPalette from './ColorPalette'; +import ThemePreview from './ThemePreview'; +import ModeToggle from './ModeToggle'; +import { parseThemeCSS, extractColorPalette, type ParsedTheme } from '../../utils/themeParser'; + +interface ThemePreviewCardProps { + themeName: string; + reasoning?: string; + cssSheet?: string | null; + cssFilePath?: string | null; + isLoading?: boolean; + vscode?: any; +} + +const ThemePreviewCard: React.FC = ({ + themeName, + reasoning, + cssSheet, + cssFilePath, + isLoading = false, + vscode +}) => { + const [isExpanded, setIsExpanded] = useState(false); + const [parsedTheme, setParsedTheme] = useState(null); + const [activeTab, setActiveTab] = useState<'theme' | 'components'>('theme'); + const [isDarkMode, setIsDarkMode] = useState(false); + const [currentCssContent, setCurrentCssContent] = useState(''); + const [isLoadingCss, setIsLoadingCss] = useState(false); + const [cssLoadError, setCssLoadError] = useState(null); + + // Pre-inject minimal CSS to avoid FOUC (Flash of Unstyled Content) + useEffect(() => { + const minimalCssId = 'theme-preview-minimal-css'; + let existingStyle = document.getElementById(minimalCssId); + + if (!existingStyle) { + const minimalStyle = document.createElement('style'); + minimalStyle.id = minimalCssId; + minimalStyle.textContent = ` + .theme-preview-live { + background: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + font-family: var(--vscode-font-family); + border-radius: 4px; + overflow: hidden; + min-height: 400px; + border: 1px solid var(--vscode-panel-border); + } + `; + document.head.appendChild(minimalStyle); + } + + // Cleanup on unmount + return () => { + const styleToRemove = document.getElementById(minimalCssId); + if (styleToRemove) { + document.head.removeChild(styleToRemove); + } + }; + }, []); + + // Set initial loading state immediately when cssFilePath is provided + useEffect(() => { + if (cssFilePath && vscode) { + setIsLoadingCss(true); + setIsExpanded(true); // Auto-expand to show loading state + } + }, [cssFilePath, vscode]); + + // Load CSS from file if cssFilePath is provided + useEffect(() => { + const loadCssFromFile = async () => { + // Reset states + setCssLoadError(null); + + if (cssFilePath && vscode) { + try { + // Request CSS file content from extension + const response = await new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + reject(new Error('Timeout loading CSS file')); + }, 3000); // Reduced timeout + + const handler = (event: MessageEvent) => { + const message = event.data; + if (message.command === 'cssFileContentResponse' && message.filePath === cssFilePath) { + clearTimeout(timeoutId); + window.removeEventListener('message', handler); + if (message.error) { + reject(new Error(message.error)); + } else { + resolve(message.content); + } + } + }; + + window.addEventListener('message', handler); + + // Request CSS file content + vscode.postMessage({ + command: 'getCssFileContent', + filePath: cssFilePath + }); + }); + + setCurrentCssContent(response); + setIsExpanded(true); // Auto-expand when CSS loads successfully + } catch (error) { + console.warn('Failed to load CSS from file, falling back to cssSheet:', error); + setCssLoadError(error instanceof Error ? error.message : 'Failed to load CSS'); + setCurrentCssContent(cssSheet || ''); + } finally { + setIsLoadingCss(false); + } + } else if (cssSheet) { + setCurrentCssContent(cssSheet); + setIsExpanded(true); // Auto-expand when CSS is available + } + }; + + loadCssFromFile(); + }, [cssFilePath, cssSheet, vscode]); + + // Parse CSS when content is available + useEffect(() => { + if (currentCssContent && !isLoadingCss) { + try { + const theme = parseThemeCSS(currentCssContent); + setParsedTheme(theme); + } catch (error) { + console.error('Failed to parse theme:', error); + setCssLoadError('Failed to parse theme CSS'); + } + } + }, [currentCssContent, isLoadingCss]); + + const handleCopyCSS = () => { + if (currentCssContent) { + navigator.clipboard.writeText(currentCssContent); + } + }; + + const handleToggleExpanded = () => { + setIsExpanded(!isExpanded); + }; + + // Convert parsed theme to grouped colors format + const getGroupedColors = (theme: ParsedTheme) => { + const palette = extractColorPalette(theme); + return palette.reduce((acc, color) => { + if (!acc[color.category]) { + acc[color.category] = {}; + } + acc[color.category][color.name] = color.value; + return acc; + }, {} as Record>); + }; + + // Show component if we're loading, have a theme, or have an error to display + if (!parsedTheme && !isLoading && !isLoadingCss && !cssLoadError) { + return null; + } + + return ( + <> + +
+ + + {isExpanded && ( + <> + {/* Loading State */} + {isLoadingCss && ( +
+
+
+
+
+ Loading theme CSS... +
+
+ )} + + {/* Error State */} + {cssLoadError && !isLoadingCss && ( +
+
+ ⚠️ {cssLoadError} +
+
+ )} + + {/* Normal Content */} + {!isLoadingCss && !cssLoadError && parsedTheme && ( + <> +
+ + +
+ +
+ {activeTab === 'theme' && ( + <> + {/* CSS File Name - Subtle Display */} + {cssFilePath && ( +
+ {cssFilePath.split('/').pop()} +
+ )} + + {/* Typography Preview */} +
+
+
+
+ Sans +
+
+ {parsedTheme.fonts?.sans?.split(',')[0]?.trim() || 'Default'} +
+
+ +
+
+ Serif +
+
+ {parsedTheme.fonts?.serif?.split(',')[0]?.trim() || 'Default'} +
+
+ +
+
+ Mono +
+
+ {parsedTheme.fonts?.mono?.split(',')[0]?.trim() || 'Default'} +
+
+
+
+ + {/* Color Palette */} + + + )} + + {activeTab === 'components' && ( +
+
+

Component Preview

+ +
+ +
+ )} +
+ + )} + + )} +
+ + ); +}; + +export default ThemePreviewCard; \ No newline at end of file diff --git a/src/webview/components/Chat/ThemePreviewHeader.tsx b/src/webview/components/Chat/ThemePreviewHeader.tsx new file mode 100644 index 0000000..5625697 --- /dev/null +++ b/src/webview/components/Chat/ThemePreviewHeader.tsx @@ -0,0 +1,82 @@ +import React from 'react'; + +interface ThemePreviewHeaderProps { + themeName: string; + isExpanded: boolean; + onToggleExpanded: () => void; + isLoading: boolean; + onCopyCSS: () => void; +} + +const ThemePreviewHeader: React.FC = ({ + themeName, + isExpanded, + onToggleExpanded, + isLoading, + onCopyCSS +}) => { + const handleActionClick = (e: React.MouseEvent, action: () => void) => { + e.stopPropagation(); + action(); + }; + + return ( +
+
+ + {isLoading ? ( +
+
+
+ ) : ( + '⚙️' + )} +
+
+ + Generate Theme - {themeName} + + {isLoading && ( + + Generating theme... + + )} +
+
+
+ {!isLoading && ( + + )} + +
+
+ ); +}; + +export default ThemePreviewHeader; \ No newline at end of file diff --git a/src/webview/components/ConnectionLines.tsx b/src/webview/components/ConnectionLines.tsx new file mode 100644 index 0000000..302a96a --- /dev/null +++ b/src/webview/components/ConnectionLines.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { ConnectionLine } from '../types/canvas.types'; + +interface ConnectionLinesProps { + connections: ConnectionLine[]; + containerBounds: { width: number; height: number }; + isVisible: boolean; + zoomLevel: number; +} + +const ConnectionLines: React.FC = ({ + connections, + containerBounds, + isVisible, + zoomLevel +}) => { + if (!isVisible || connections.length === 0) { + return null; + } + + // Adjust line styling based on zoom level + const getLineStyle = (connection: ConnectionLine) => ({ + stroke: connection.color || 'var(--vscode-textLink-foreground)', + strokeWidth: (connection.width || 2) / zoomLevel, // Thinner lines when zoomed out + strokeDasharray: zoomLevel < 0.5 ? '5,5' : 'none', // Dashed when very zoomed out + opacity: Math.max(0.3, Math.min(1, zoomLevel)), // More transparent when zoomed out + markerEnd: 'url(#arrowhead)' + }); + + // Calculate curve path for organic looking connections + const createCurvePath = (from: { x: number; y: number }, to: { x: number; y: number }) => { + const dx = to.x - from.x; + const dy = to.y - from.y; + + // Create a smooth curve with control points + const cp1x = from.x + dx * 0.6; + const cp1y = from.y; + const cp2x = to.x - dx * 0.6; + const cp2y = to.y; + + return `M ${from.x} ${from.y} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${to.x} ${to.y}`; + }; + + return ( + + {/* Arrow marker definition */} + + + + + + + {/* Render all connection lines */} + {connections.map((connection) => ( + + {/* Main connection line */} + + + {/* Optional: Add a thicker invisible line for easier hover detection */} + + {`${connection.fromFrame} → ${connection.toFrame}`} + + + ))} + + ); +}; + +export default ConnectionLines; \ No newline at end of file diff --git a/src/webview/components/DesignFrame.tsx b/src/webview/components/DesignFrame.tsx new file mode 100644 index 0000000..d64a607 --- /dev/null +++ b/src/webview/components/DesignFrame.tsx @@ -0,0 +1,838 @@ +import React from 'react'; +import { DesignFile, GridPosition, FrameDimensions, ViewportMode, WebviewMessage } from '../types/canvas.types'; +import { MobileIcon, TabletIcon, DesktopIcon, GlobeIcon } from './Icons'; + +// Import logo images +import cursorLogo from '../../assets/cursor_logo.png'; +import windsurfLogo from '../../assets/windsurf_logo.png'; +import claudeCodeLogo from '../../assets/claude_code_logo.png'; +import lovableLogo from '../../assets/lovable_logo.png'; +import boltLogo from '../../assets/bolt_logo.jpg'; + +interface DesignFrameProps { + file: DesignFile; + position: GridPosition; + dimensions: FrameDimensions; + isSelected: boolean; + onSelect: (fileName: string) => void; + renderMode?: 'placeholder' | 'iframe' | 'html'; + showMetadata?: boolean; + viewport?: ViewportMode; + viewportDimensions?: FrameDimensions; + onViewportChange?: (fileName: string, viewport: ViewportMode) => void; + useGlobalViewport?: boolean; + onDragStart?: (fileName: string, startPos: GridPosition, mouseEvent: React.MouseEvent) => void; + isDragging?: boolean; + nonce?: string | null; + onSendToChat?: (fileName: string, prompt: string) => void; +} + +const DesignFrame: React.FC = ({ + file, + position, + dimensions, + isSelected, + onSelect, + renderMode = 'placeholder', + showMetadata = true, + viewport = 'desktop', + viewportDimensions, + onViewportChange, + useGlobalViewport = false, + onDragStart, + isDragging = false, + nonce = null, + onSendToChat +}) => { + const [isLoading, setIsLoading] = React.useState(renderMode === 'iframe'); + const [hasError, setHasError] = React.useState(false); + const [dragPreventOverlay, setDragPreventOverlay] = React.useState(false); + const [showCopyDropdown, setShowCopyDropdown] = React.useState(false); + const [copyButtonState, setCopyButtonState] = React.useState<{ text: string; isSuccess: boolean }>({ text: 'Copy prompt', isSuccess: false }); + const [copyPathButtonState, setCopyPathButtonState] = React.useState<{ text: string; isSuccess: boolean }>({ text: 'Copy design path', isSuccess: false }); + + const handleClick = () => { + onSelect(file.name); + }; + + const handleMouseDown = (e: React.MouseEvent) => { + if (onDragStart && e.button === 0) { // Left mouse button only + e.preventDefault(); + e.stopPropagation(); + + // Show overlay to prevent iframe interaction during potential drag + setDragPreventOverlay(true); + + onDragStart(file.name, position, e); + } + }; + + // Clear drag prevention overlay when dragging ends + React.useEffect(() => { + if (!isDragging) { + setDragPreventOverlay(false); + } + }, [isDragging]); + + // Close dropdown when clicking outside + React.useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (showCopyDropdown) { + const target = event.target as Element; + const dropdownElement = target.closest('.copy-prompt-dropdown'); + if (!dropdownElement) { + setShowCopyDropdown(false); + } + } + }; + + if (showCopyDropdown) { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + } + }, [showCopyDropdown]); + + const handleViewportToggle = (newViewport: ViewportMode) => { + if (onViewportChange && !useGlobalViewport) { + onViewportChange(file.name, newViewport); + } + }; + + const handleCopyPrompt = async (e: React.MouseEvent, platform?: string) => { + e.preventDefault(); + e.stopPropagation(); + + let promptText = ''; + let platformName = ''; + + switch (platform) { + case 'cursor': + promptText = `${file.content}\n\nAbove is the design implementation, please use that as a reference to build a similar UI component. Make sure to follow modern React and TypeScript best practices.`; + platformName = 'Cursor'; + break; + case 'windsurf': + promptText = `${file.content}\n\nAbove is the design implementation. Please analyze this design and create a similar UI component using modern web technologies and best practices.`; + platformName = 'Windsurf'; + break; + case 'claude-code': + promptText = `${file.content}\n\nAbove is the design implementation. Please use this as a reference to create a similar component. Focus on clean, maintainable code structure.`; + platformName = 'Claude Code'; + break; + case 'lovable': + promptText = `${file.content}\n\nAbove is the design implementation. Please recreate this design as a responsive React component with modern styling.`; + platformName = 'Lovable'; + break; + case 'bolt': + promptText = `${file.content}\n\nAbove is the design implementation. Please create a similar UI using this as reference. Make it production-ready with proper styling.`; + platformName = 'Bolt'; + break; + default: + promptText = `${file.content}\n\nAbove is the design implementation, please use that as a reference`; + platformName = ''; + } + + try { + await navigator.clipboard.writeText(promptText); + console.log(`✅ Copied ${platformName} prompt to clipboard for:`, file.name); + + // Show success state on button + setCopyButtonState({ text: `Copied for ${platformName}!`, isSuccess: true }); + setTimeout(() => { + setCopyButtonState({ text: 'Copy prompt', isSuccess: false }); + }, 2000); + + // Hide dropdown + setShowCopyDropdown(false); + } catch (err) { + console.error('❌ Failed to copy to clipboard:', err); + + // Fallback: create a temporary textarea and copy + const textarea = document.createElement('textarea'); + textarea.value = promptText; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + + console.log(`✅ Copied ${platformName} prompt using fallback method for:`, file.name); + + // Show success state on button + setCopyButtonState({ text: `Copied for ${platformName}!`, isSuccess: true }); + setTimeout(() => { + setCopyButtonState({ text: 'Copy prompt', isSuccess: false }); + }, 2000); + + // Hide dropdown + setShowCopyDropdown(false); + } + }; + + const handleCopyDropdownToggle = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + console.log('Dropdown toggle clicked. Current context:', (window as any).__WEBVIEW_CONTEXT__); + console.log('Logo URIs available:', (window as any).__WEBVIEW_CONTEXT__?.logoUris); + setShowCopyDropdown(!showCopyDropdown); + }; + + const handleCopyDesignPath = async (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + const designPath = `Design file: ${file.path}`; + + try { + await navigator.clipboard.writeText(designPath); + console.log(`✅ Copied design path to clipboard:`, designPath); + + // Show success state on button + setCopyPathButtonState({ text: 'Copied!', isSuccess: true }); + setTimeout(() => { + setCopyPathButtonState({ text: 'Copy design path', isSuccess: false }); + }, 2000); + + } catch (err) { + console.error('❌ Failed to copy design path to clipboard:', err); + + // Fallback: create a temporary textarea and copy + const textarea = document.createElement('textarea'); + textarea.value = designPath; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + + console.log(`✅ Copied design path using fallback method:`, designPath); + + // Show success state on button + setCopyPathButtonState({ text: 'Copied!', isSuccess: true }); + setTimeout(() => { + setCopyPathButtonState({ text: 'Copy design path', isSuccess: false }); + }, 2000); + } + }; + + const handleCreateVariations = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (onSendToChat) { + onSendToChat(file.name, 'Create more variations based on this style'); + } + }; + + const handleIterateWithFeedback = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + if (onSendToChat) { + onSendToChat(file.name, 'Please create a few variations with this feedback: '); + } + }; + + const getViewportIcon = (mode: ViewportMode): React.ReactElement => { + switch (mode) { + case 'mobile': return ; + case 'tablet': return ; + case 'desktop': return ; + default: return ; + } + }; + + const getViewportLabel = (mode: ViewportMode): string => { + switch (mode) { + case 'mobile': return 'Mobile'; + case 'tablet': return 'Tablet'; + case 'desktop': return 'Desktop'; + default: return 'Desktop'; + } + }; + + const renderContent = () => { + switch (renderMode) { + case 'iframe': + // Handle SVG files differently than HTML files + if (file.fileType === 'svg') { + // For SVG files, wrap in HTML with proper viewport + const svgHtml = ` + + + + + + ${viewportDimensions ? `` : ''} + + + + ${file.content} + + + + `; + + return ( +