├── transcribe ├── .gitignore ├── transcribe.sh └── SKILL.md ├── .gitignore ├── brave-search ├── .gitignore ├── package.json ├── SKILL.md ├── content.js ├── search.js └── package-lock.json ├── browser-tools ├── .gitignore ├── package.json ├── browser-screenshot.js ├── browser-cookies.js ├── browser-nav.js ├── browser-eval.js ├── browser-start.js ├── SKILL.md ├── browser-hn-scraper.js ├── browser-content.js ├── browser-pick.js └── package-lock.json ├── youtube-transcript ├── package.json ├── SKILL.md └── transcript.js ├── LICENSE ├── vscode └── SKILL.md ├── gmcli └── SKILL.md ├── gccli └── SKILL.md ├── subagent └── SKILL.md ├── gdcli └── SKILL.md └── README.md /transcribe/.gitignore: -------------------------------------------------------------------------------- 1 | config 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /brave-search/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /browser-tools/.gitignore: -------------------------------------------------------------------------------- 1 | # Headless Chrome profile (copy of user's Chrome profile) 2 | .headless-profile/ 3 | 4 | # Node modules 5 | node_modules/ 6 | 7 | # Debug files 8 | debug-*.png 9 | -------------------------------------------------------------------------------- /youtube-transcript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "youtube-transcript", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "dependencies": { 6 | "youtube-transcript-plus": "^1.0.4" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /brave-search/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brave-search", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "description": "Headless web search via Brave Search - no browser required", 6 | "author": "Mario Zechner", 7 | "license": "MIT", 8 | "dependencies": { 9 | "@mozilla/readability": "^0.6.0", 10 | "jsdom": "^27.0.1", 11 | "turndown": "^7.2.2", 12 | "turndown-plugin-gfm": "^1.0.2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /browser-tools/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "browser-tools", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "description": "Minimal CDP tools for collaborative site exploration", 6 | "author": "Mario Zechner", 7 | "license": "MIT", 8 | "dependencies": { 9 | "@mozilla/readability": "^0.6.0", 10 | "cheerio": "^1.1.2", 11 | "jsdom": "^27.0.1", 12 | "puppeteer": "^24.31.0", 13 | "puppeteer-core": "^23.11.1", 14 | "puppeteer-extra": "^3.3.6", 15 | "puppeteer-extra-plugin-stealth": "^2.11.2", 16 | "turndown": "^7.2.2", 17 | "turndown-plugin-gfm": "^1.0.2" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /transcribe/transcribe.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 4 | 5 | # Source config if available 6 | if [ -f "$SCRIPT_DIR/config" ]; then 7 | source "$SCRIPT_DIR/config" 8 | fi 9 | 10 | if [ -z "$1" ]; then 11 | echo "Usage: transcribe.sh " 12 | exit 1 13 | fi 14 | 15 | if [ -z "$GROQ_API_KEY" ]; then 16 | echo "Error: GROQ_API_KEY not set. Create config file with: echo 'GROQ_API_KEY=\"your-key\"' > $SCRIPT_DIR/config" 17 | exit 1 18 | fi 19 | 20 | AUDIO_FILE="$1" 21 | 22 | if [ ! -f "$AUDIO_FILE" ]; then 23 | echo "Error: File not found: $AUDIO_FILE" 24 | exit 1 25 | fi 26 | 27 | curl -s -X POST "https://api.groq.com/openai/v1/audio/transcriptions" \ 28 | -H "Authorization: Bearer $GROQ_API_KEY" \ 29 | -F "file=@${AUDIO_FILE}" \ 30 | -F "model=whisper-large-v3-turbo" \ 31 | -F "response_format=text" 32 | -------------------------------------------------------------------------------- /youtube-transcript/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: youtube-transcript 3 | description: Fetch transcripts from YouTube videos for summarization and analysis. 4 | --- 5 | 6 | # YouTube Transcript 7 | 8 | Fetch transcripts from YouTube videos. 9 | 10 | ## Setup 11 | 12 | ```bash 13 | cd {baseDir} 14 | npm install 15 | ``` 16 | 17 | ## Usage 18 | 19 | ```bash 20 | {baseDir}/transcript.js 21 | ``` 22 | 23 | Accepts video ID or full URL: 24 | - `EBw7gsDPAYQ` 25 | - `https://www.youtube.com/watch?v=EBw7gsDPAYQ` 26 | - `https://youtu.be/EBw7gsDPAYQ` 27 | 28 | ## Output 29 | 30 | Timestamped transcript entries: 31 | 32 | ``` 33 | [0:00] All right. So, I got this UniFi Theta 34 | [0:15] I took the camera out, painted it 35 | [1:23] And here's the final result 36 | ``` 37 | 38 | ## Notes 39 | 40 | - Requires the video to have captions/transcripts available 41 | - Works with auto-generated and manual transcripts 42 | -------------------------------------------------------------------------------- /browser-tools/browser-screenshot.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { tmpdir } from "node:os"; 4 | import { join } from "node:path"; 5 | import puppeteer from "puppeteer-core"; 6 | 7 | const b = await Promise.race([ 8 | puppeteer.connect({ 9 | browserURL: "http://localhost:9222", 10 | defaultViewport: null, 11 | }), 12 | new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)), 13 | ]).catch((e) => { 14 | console.error("✗ Could not connect to browser:", e.message); 15 | console.error(" Run: browser-start.js"); 16 | process.exit(1); 17 | }); 18 | 19 | const p = (await b.pages()).at(-1); 20 | 21 | if (!p) { 22 | console.error("✗ No active tab found"); 23 | process.exit(1); 24 | } 25 | 26 | const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); 27 | const filename = `screenshot-${timestamp}.png`; 28 | const filepath = join(tmpdir(), filename); 29 | 30 | await p.screenshot({ path: filepath }); 31 | 32 | console.log(filepath); 33 | 34 | await b.disconnect(); 35 | -------------------------------------------------------------------------------- /browser-tools/browser-cookies.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import puppeteer from "puppeteer-core"; 4 | 5 | const b = await Promise.race([ 6 | puppeteer.connect({ 7 | browserURL: "http://localhost:9222", 8 | defaultViewport: null, 9 | }), 10 | new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)), 11 | ]).catch((e) => { 12 | console.error("✗ Could not connect to browser:", e.message); 13 | console.error(" Run: browser-start.js"); 14 | process.exit(1); 15 | }); 16 | 17 | const p = (await b.pages()).at(-1); 18 | 19 | if (!p) { 20 | console.error("✗ No active tab found"); 21 | process.exit(1); 22 | } 23 | 24 | const cookies = await p.cookies(); 25 | 26 | for (const cookie of cookies) { 27 | console.log(`${cookie.name}: ${cookie.value}`); 28 | console.log(` domain: ${cookie.domain}`); 29 | console.log(` path: ${cookie.path}`); 30 | console.log(` httpOnly: ${cookie.httpOnly}`); 31 | console.log(` secure: ${cookie.secure}`); 32 | console.log(""); 33 | } 34 | 35 | await b.disconnect(); 36 | -------------------------------------------------------------------------------- /transcribe/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: transcribe 3 | description: Speech-to-text transcription using Groq Whisper API. Supports m4a, mp3, wav, ogg, flac, webm. 4 | --- 5 | 6 | # Transcribe 7 | 8 | Speech-to-text using Groq Whisper API. 9 | 10 | ## Setup 11 | 12 | The script needs `GROQ_API_KEY` environment variable. Check if already set: 13 | ```bash 14 | echo $GROQ_API_KEY 15 | ``` 16 | 17 | If not set, guide the user through setup: 18 | 1. Ask if they have a Groq API key 19 | 2. If not, have them sign up at https://console.groq.com/ and create an API key 20 | 3. Have them add to their shell profile (~/.zshrc or ~/.bashrc): 21 | ```bash 22 | export GROQ_API_KEY="" 23 | ``` 24 | 4. Then run `source ~/.zshrc` (or restart terminal) 25 | 26 | ## Usage 27 | 28 | ```bash 29 | {baseDir}/transcribe.sh 30 | ``` 31 | 32 | ## Supported Formats 33 | 34 | - m4a, mp3, wav, ogg, flac, webm 35 | - Max file size: 25MB 36 | 37 | ## Output 38 | 39 | Returns plain text transcription with punctuation and proper capitalization to stdout. 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Mario Zechner 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /browser-tools/browser-nav.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import puppeteer from "puppeteer-core"; 4 | 5 | const url = process.argv[2]; 6 | const newTab = process.argv[3] === "--new"; 7 | 8 | if (!url) { 9 | console.log("Usage: browser-nav.js [--new]"); 10 | console.log("\nExamples:"); 11 | console.log(" browser-nav.js https://example.com # Navigate current tab"); 12 | console.log(" browser-nav.js https://example.com --new # Open in new tab"); 13 | process.exit(1); 14 | } 15 | 16 | const b = await Promise.race([ 17 | puppeteer.connect({ 18 | browserURL: "http://localhost:9222", 19 | defaultViewport: null, 20 | }), 21 | new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)), 22 | ]).catch((e) => { 23 | console.error("✗ Could not connect to browser:", e.message); 24 | console.error(" Run: browser-start.js"); 25 | process.exit(1); 26 | }); 27 | 28 | if (newTab) { 29 | const p = await b.newPage(); 30 | await p.goto(url, { waitUntil: "domcontentloaded" }); 31 | console.log("✓ Opened:", url); 32 | } else { 33 | const p = (await b.pages()).at(-1); 34 | await p.goto(url, { waitUntil: "domcontentloaded" }); 35 | console.log("✓ Navigated to:", url); 36 | } 37 | 38 | await b.disconnect(); 39 | -------------------------------------------------------------------------------- /vscode/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: vscode 3 | description: VS Code integration for viewing diffs and comparing files. Use when showing file differences to the user. 4 | --- 5 | 6 | # VS Code CLI Tools 7 | 8 | Tools for integrating with VS Code, primarily for viewing diffs. 9 | 10 | ## Requirements 11 | 12 | VS Code must be installed with the `code` CLI available in PATH. 13 | 14 | ## Opening a Diff 15 | 16 | Compare two files side by side in VS Code: 17 | 18 | ```bash 19 | code -d 20 | ``` 21 | 22 | ## Git Diffs in VS Code 23 | 24 | ### Simple Approach (no config needed) 25 | 26 | Extract the old version to a temp file, then diff: 27 | 28 | ```bash 29 | # Compare with previous commit 30 | git show HEAD~1:path/to/file > /tmp/old && code -d /tmp/old path/to/file 31 | 32 | # Compare with specific commit 33 | git show abc123:path/to/file > /tmp/old && code -d /tmp/old path/to/file 34 | 35 | # Compare staged version with working tree 36 | git show :path/to/file > /tmp/staged && code -d /tmp/staged path/to/file 37 | ``` 38 | 39 | ### Gotchas 40 | 41 | - File must exist and have changes between the compared revisions 42 | - Use `git log --oneline -5 -- path/to/file` to verify file has history before diffing 43 | 44 | ## When to Use 45 | 46 | - Showing the user what changed in a file 47 | - Comparing two versions of code 48 | - Reviewing git changes visually 49 | -------------------------------------------------------------------------------- /youtube-transcript/transcript.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { YoutubeTranscript } from 'youtube-transcript-plus'; 4 | 5 | const videoId = process.argv[2]; 6 | 7 | if (!videoId) { 8 | console.error('Usage: transcript.js '); 9 | console.error('Example: transcript.js EBw7gsDPAYQ'); 10 | console.error('Example: transcript.js https://www.youtube.com/watch?v=EBw7gsDPAYQ'); 11 | process.exit(1); 12 | } 13 | 14 | // Extract video ID if full URL is provided 15 | let extractedId = videoId; 16 | if (videoId.includes('youtube.com') || videoId.includes('youtu.be')) { 17 | const match = videoId.match(/(?:v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/); 18 | if (match) { 19 | extractedId = match[1]; 20 | } 21 | } 22 | 23 | try { 24 | const transcript = await YoutubeTranscript.fetchTranscript(extractedId); 25 | 26 | for (const entry of transcript) { 27 | const timestamp = formatTimestamp(entry.offset / 1000); 28 | console.log(`[${timestamp}] ${entry.text}`); 29 | } 30 | } catch (error) { 31 | console.error('Error fetching transcript:', error.message); 32 | process.exit(1); 33 | } 34 | 35 | function formatTimestamp(seconds) { 36 | const h = Math.floor(seconds / 3600); 37 | const m = Math.floor((seconds % 3600) / 60); 38 | const s = Math.floor(seconds % 60); 39 | 40 | if (h > 0) { 41 | return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`; 42 | } 43 | return `${m}:${s.toString().padStart(2, '0')}`; 44 | } 45 | -------------------------------------------------------------------------------- /brave-search/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: brave-search 3 | description: Web search and content extraction via Brave Search API. Use for searching documentation, facts, or any web content. Lightweight, no browser required. 4 | --- 5 | 6 | # Brave Search 7 | 8 | Headless web search and content extraction using Brave Search. No browser required. 9 | 10 | ## Setup 11 | 12 | Run once before first use: 13 | 14 | ```bash 15 | cd {baseDir}/brave-search 16 | npm install 17 | ``` 18 | 19 | ## Search 20 | 21 | ```bash 22 | {baseDir}/search.js "query" # Basic search (5 results) 23 | {baseDir}/search.js "query" -n 10 # More results 24 | {baseDir}/search.js "query" --content # Include page content as markdown 25 | {baseDir}/search.js "query" -n 3 --content # Combined 26 | ``` 27 | 28 | ## Extract Page Content 29 | 30 | ```bash 31 | {baseDir}/content.js https://example.com/article 32 | ``` 33 | 34 | Fetches a URL and extracts readable content as markdown. 35 | 36 | ## Output Format 37 | 38 | ``` 39 | --- Result 1 --- 40 | Title: Page Title 41 | Link: https://example.com/page 42 | Snippet: Description from search results 43 | Content: (if --content flag used) 44 | Markdown content extracted from the page... 45 | 46 | --- Result 2 --- 47 | ... 48 | ``` 49 | 50 | ## When to Use 51 | 52 | - Searching for documentation or API references 53 | - Looking up facts or current information 54 | - Fetching content from specific URLs 55 | - Any task requiring web search without interactive browsing 56 | -------------------------------------------------------------------------------- /browser-tools/browser-eval.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import puppeteer from "puppeteer-core"; 4 | 5 | const code = process.argv.slice(2).join(" "); 6 | if (!code) { 7 | console.log("Usage: browser-eval.js 'code'"); 8 | console.log("\nExamples:"); 9 | console.log(' browser-eval.js "document.title"'); 10 | console.log(' browser-eval.js "document.querySelectorAll(\'a\').length"'); 11 | process.exit(1); 12 | } 13 | 14 | const b = await Promise.race([ 15 | puppeteer.connect({ 16 | browserURL: "http://localhost:9222", 17 | defaultViewport: null, 18 | }), 19 | new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)), 20 | ]).catch((e) => { 21 | console.error("✗ Could not connect to browser:", e.message); 22 | console.error(" Run: browser-start.js"); 23 | process.exit(1); 24 | }); 25 | 26 | const p = (await b.pages()).at(-1); 27 | 28 | if (!p) { 29 | console.error("✗ No active tab found"); 30 | process.exit(1); 31 | } 32 | 33 | const result = await p.evaluate((c) => { 34 | const AsyncFunction = (async () => {}).constructor; 35 | return new AsyncFunction(`return (${c})`)(); 36 | }, code); 37 | 38 | if (Array.isArray(result)) { 39 | for (let i = 0; i < result.length; i++) { 40 | if (i > 0) console.log(""); 41 | for (const [key, value] of Object.entries(result[i])) { 42 | console.log(`${key}: ${value}`); 43 | } 44 | } 45 | } else if (typeof result === "object" && result !== null) { 46 | for (const [key, value] of Object.entries(result)) { 47 | console.log(`${key}: ${value}`); 48 | } 49 | } else { 50 | console.log(result); 51 | } 52 | 53 | await b.disconnect(); 54 | -------------------------------------------------------------------------------- /gmcli/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: gmcli 3 | description: Gmail CLI for searching emails, reading threads, sending messages, managing drafts, and handling labels/attachments. 4 | --- 5 | 6 | # Gmail CLI 7 | 8 | Command-line interface for Gmail operations. 9 | 10 | ## Installation 11 | 12 | ```bash 13 | npm install -g @mariozechner/gmcli 14 | ``` 15 | 16 | ## Setup 17 | 18 | ### Google Cloud Console (one-time) 19 | 20 | 1. [Create a new project](https://console.cloud.google.com/projectcreate) (or select existing) 21 | 2. [Enable the Gmail API](https://console.cloud.google.com/apis/api/gmail.googleapis.com) 22 | 3. [Set app name](https://console.cloud.google.com/auth/branding) in OAuth branding 23 | 4. [Add test users](https://console.cloud.google.com/auth/audience) (all Gmail addresses you want to use) 24 | 5. [Create OAuth client](https://console.cloud.google.com/auth/clients): 25 | - Click "Create Client" 26 | - Application type: "Desktop app" 27 | - Download the JSON file 28 | 29 | ### Configure gmcli 30 | 31 | First check if already configured: 32 | ```bash 33 | gmcli accounts list 34 | ``` 35 | 36 | If no accounts, guide the user through setup: 37 | 1. Ask if they have a Google Cloud project with Gmail API enabled 38 | 2. If not, walk them through the Google Cloud Console steps above 39 | 3. Have them download the OAuth credentials JSON 40 | 4. Run: `gmcli accounts credentials ~/path/to/credentials.json` 41 | 5. Run: `gmcli accounts add ` (use `--manual` for browserless OAuth) 42 | 43 | ## Usage 44 | 45 | Run `gmcli --help` for full command reference. 46 | 47 | Common operations: 48 | - `gmcli search ""` - Search emails using Gmail query syntax 49 | - `gmcli thread ` - Read a thread with all messages 50 | - `gmcli send --to --subject --body ` - Send email 51 | - `gmcli labels list` - List all labels 52 | - `gmcli drafts list` - List drafts 53 | 54 | ## Data Storage 55 | 56 | - `~/.gmcli/credentials.json` - OAuth client credentials 57 | - `~/.gmcli/accounts.json` - Account tokens 58 | - `~/.gmcli/attachments/` - Downloaded attachments 59 | -------------------------------------------------------------------------------- /gccli/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: gccli 3 | description: Google Calendar CLI for listing calendars, viewing/creating/updating events, and checking availability. 4 | --- 5 | 6 | # Google Calendar CLI 7 | 8 | Command-line interface for Google Calendar operations. 9 | 10 | ## Installation 11 | 12 | ```bash 13 | npm install -g @mariozechner/gccli 14 | ``` 15 | 16 | ## Setup 17 | 18 | ### Google Cloud Console (one-time) 19 | 20 | 1. [Create a new project](https://console.cloud.google.com/projectcreate) (or select existing) 21 | 2. [Enable the Google Calendar API](https://console.cloud.google.com/apis/api/calendar-json.googleapis.com) 22 | 3. [Set app name](https://console.cloud.google.com/auth/branding) in OAuth branding 23 | 4. [Add test users](https://console.cloud.google.com/auth/audience) (all Gmail addresses you want to use) 24 | 5. [Create OAuth client](https://console.cloud.google.com/auth/clients): 25 | - Click "Create Client" 26 | - Application type: "Desktop app" 27 | - Download the JSON file 28 | 29 | ### Configure gccli 30 | 31 | First check if already configured: 32 | ```bash 33 | gccli accounts list 34 | ``` 35 | 36 | If no accounts, guide the user through setup: 37 | 1. Ask if they have a Google Cloud project with Calendar API enabled 38 | 2. If not, walk them through the Google Cloud Console steps above 39 | 3. Have them download the OAuth credentials JSON 40 | 4. Run: `gccli accounts credentials ~/path/to/credentials.json` 41 | 5. Run: `gccli accounts add ` (use `--manual` for browserless OAuth) 42 | 43 | ## Usage 44 | 45 | Run `gccli --help` for full command reference. 46 | 47 | Common operations: 48 | - `gccli calendars` - List all calendars 49 | - `gccli events [--from
] [--to
]` - List events 50 | - `gccli event ` - Get event details 51 | - `gccli create --summary --start
--end
` - Create event 52 | - `gccli freebusy --from
--to
` - Check availability 53 | 54 | Use `primary` as calendarId for the main calendar. 55 | 56 | ## Date/Time Format 57 | 58 | - Timed events: `YYYY-MM-DDTHH:MM:SSZ` (UTC) or `YYYY-MM-DDTHH:MM:SS` (local) 59 | - All-day events: `YYYY-MM-DD` with `--all-day` flag 60 | 61 | ## Data Storage 62 | 63 | - `~/.gccli/credentials.json` - OAuth client credentials 64 | - `~/.gccli/accounts.json` - Account tokens 65 | -------------------------------------------------------------------------------- /browser-tools/browser-start.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { spawn, execSync } from "node:child_process"; 4 | import puppeteer from "puppeteer-core"; 5 | 6 | const useProfile = process.argv[2] === "--profile"; 7 | 8 | if (process.argv[2] && process.argv[2] !== "--profile") { 9 | console.log("Usage: browser-start.js [--profile]"); 10 | console.log("\nOptions:"); 11 | console.log(" --profile Copy your default Chrome profile (cookies, logins)"); 12 | process.exit(1); 13 | } 14 | 15 | const SCRAPING_DIR = `${process.env.HOME}/.cache/browser-tools`; 16 | 17 | // Check if already running on :9222 18 | try { 19 | const browser = await puppeteer.connect({ 20 | browserURL: "http://localhost:9222", 21 | defaultViewport: null, 22 | }); 23 | await browser.disconnect(); 24 | console.log("✓ Chrome already running on :9222"); 25 | process.exit(0); 26 | } catch {} 27 | 28 | // Setup profile directory 29 | execSync(`mkdir -p "${SCRAPING_DIR}"`, { stdio: "ignore" }); 30 | 31 | // Remove SingletonLock to allow new instance 32 | try { 33 | execSync(`rm -f "${SCRAPING_DIR}/SingletonLock" "${SCRAPING_DIR}/SingletonSocket" "${SCRAPING_DIR}/SingletonCookie"`, { stdio: "ignore" }); 34 | } catch {} 35 | 36 | if (useProfile) { 37 | console.log("Syncing profile..."); 38 | execSync( 39 | `rsync -a --delete \ 40 | --exclude='SingletonLock' \ 41 | --exclude='SingletonSocket' \ 42 | --exclude='SingletonCookie' \ 43 | --exclude='*/Sessions/*' \ 44 | --exclude='*/Current Session' \ 45 | --exclude='*/Current Tabs' \ 46 | --exclude='*/Last Session' \ 47 | --exclude='*/Last Tabs' \ 48 | "${process.env.HOME}/Library/Application Support/Google/Chrome/" "${SCRAPING_DIR}/"`, 49 | { stdio: "pipe" }, 50 | ); 51 | } 52 | 53 | // Start Chrome with flags to force new instance 54 | spawn( 55 | "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", 56 | [ 57 | "--remote-debugging-port=9222", 58 | `--user-data-dir=${SCRAPING_DIR}`, 59 | "--no-first-run", 60 | "--no-default-browser-check", 61 | ], 62 | { detached: true, stdio: "ignore" }, 63 | ).unref(); 64 | 65 | // Wait for Chrome to be ready 66 | let connected = false; 67 | for (let i = 0; i < 30; i++) { 68 | try { 69 | const browser = await puppeteer.connect({ 70 | browserURL: "http://localhost:9222", 71 | defaultViewport: null, 72 | }); 73 | await browser.disconnect(); 74 | connected = true; 75 | break; 76 | } catch { 77 | await new Promise((r) => setTimeout(r, 500)); 78 | } 79 | } 80 | 81 | if (!connected) { 82 | console.error("✗ Failed to connect to Chrome"); 83 | process.exit(1); 84 | } 85 | 86 | console.log(`✓ Chrome started on :9222${useProfile ? " with your profile" : ""}`); 87 | -------------------------------------------------------------------------------- /subagent/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: subagent 3 | description: Spawn a sub-agent to handle tasks independently. Use for delegating subtasks, parallelizing work, or running long analysis in the background. 4 | --- 5 | 6 | # Subagent Skill 7 | 8 | Spawn a sub-agent to handle tasks independently. 9 | 10 | ## BEFORE SPAWNING - MANDATORY CHECKLIST 11 | 12 | **STOP. Do not spawn until you have resolved each item:** 13 | 14 | 1. **Task type: Read-only or Read-write?** 15 | - Read-only (analysis, planning, review): `--tools read,grep,find,ls` 16 | - Read-write (implementation, fixes): `--tools read,bash,edit,write` (default) 17 | - **bash can execute ANY command. It is NOT read-only. Do NOT use bash for read-only tasks.** 18 | 19 | 2. **Ask user if not specified:** 20 | - Model: default or specific? (use `pi --list-models [search]` to find) 21 | - Thinking: off, minimal, low, medium, high, xhigh? 22 | - Execution: sync (wait) or async (background)? 23 | - View result: show subagent session when done? 24 | 25 | **Do NOT assume defaults. Ask first.** 26 | 27 | --- 28 | 29 | ## Usage 30 | 31 | ### Synchronous (wait for result) 32 | ```bash 33 | pi -p --session /tmp/taskname.jsonl "your prompt here" 34 | ``` 35 | 36 | ### Asynchronous (background task) 37 | ```bash 38 | # Start in tmux 39 | tmux new-session -d -s taskname 'pi -p --session /tmp/taskname.jsonl "your prompt here" > /tmp/taskname-result.txt 2>&1' 40 | 41 | # Check if running 42 | tmux has-session -t taskname 2>/dev/null && echo "running" || echo "done" 43 | 44 | # Read result when done 45 | cat /tmp/taskname-result.txt 46 | ``` 47 | 48 | ## Flags 49 | - `-p` / `--print`: Non-interactive mode, outputs final response only 50 | - `--session `: Save session to specified JSONL file 51 | - `--provider `: Provider name (e.g., `anthropic`, `openai`, `google`) 52 | - `--model `: Model ID (e.g., `claude-sonnet-4-5`, `gpt-4o`) 53 | - `--thinking `: Set thinking level: `off`, `minimal`, `low`, `medium`, `high`, `xhigh` 54 | - `--tools `: Comma-separated list of tools (default: `read,bash,edit,write`) 55 | - `--export `: Export session JSONL to HTML 56 | 57 | ## Selecting a model 58 | ```bash 59 | pi --list-models [search] # Lists available models, optional fuzzy search 60 | pi --list-models sonnet # Find sonnet models 61 | pi --list-models gpt # Find GPT models 62 | ``` 63 | Then pass both `--provider` and `--model`: 64 | ```bash 65 | pi -p --session /tmp/task.jsonl --provider anthropic --model claude-sonnet-4-5 "prompt" 66 | ``` 67 | 68 | ## Viewing subagent session 69 | Export and open the session: 70 | ```bash 71 | pi --export /tmp/taskname.jsonl /tmp/taskname.html && open /tmp/taskname.html 72 | ``` 73 | -------------------------------------------------------------------------------- /brave-search/content.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Readability } from "@mozilla/readability"; 4 | import { JSDOM } from "jsdom"; 5 | import TurndownService from "turndown"; 6 | import { gfm } from "turndown-plugin-gfm"; 7 | 8 | const url = process.argv[2]; 9 | 10 | if (!url) { 11 | console.log("Usage: content.js "); 12 | console.log("\nExtracts readable content from a webpage as markdown."); 13 | console.log("\nExamples:"); 14 | console.log(" content.js https://example.com/article"); 15 | console.log(" content.js https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html"); 16 | process.exit(1); 17 | } 18 | 19 | function htmlToMarkdown(html) { 20 | const turndown = new TurndownService({ headingStyle: "atx", codeBlockStyle: "fenced" }); 21 | turndown.use(gfm); 22 | turndown.addRule("removeEmptyLinks", { 23 | filter: (node) => node.nodeName === "A" && !node.textContent?.trim(), 24 | replacement: () => "", 25 | }); 26 | return turndown 27 | .turndown(html) 28 | .replace(/\[\\?\[\s*\\?\]\]\([^)]*\)/g, "") 29 | .replace(/ +/g, " ") 30 | .replace(/\s+,/g, ",") 31 | .replace(/\s+\./g, ".") 32 | .replace(/\n{3,}/g, "\n\n") 33 | .trim(); 34 | } 35 | 36 | try { 37 | const response = await fetch(url, { 38 | headers: { 39 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", 40 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 41 | "Accept-Language": "en-US,en;q=0.9", 42 | }, 43 | signal: AbortSignal.timeout(15000), 44 | }); 45 | 46 | if (!response.ok) { 47 | console.error(`HTTP ${response.status}: ${response.statusText}`); 48 | process.exit(1); 49 | } 50 | 51 | const html = await response.text(); 52 | const dom = new JSDOM(html, { url }); 53 | const reader = new Readability(dom.window.document); 54 | const article = reader.parse(); 55 | 56 | if (article && article.content) { 57 | if (article.title) { 58 | console.log(`# ${article.title}\n`); 59 | } 60 | console.log(htmlToMarkdown(article.content)); 61 | process.exit(0); 62 | } 63 | 64 | // Fallback: try to extract main content 65 | const fallbackDoc = new JSDOM(html, { url }); 66 | const body = fallbackDoc.window.document; 67 | body.querySelectorAll("script, style, noscript, nav, header, footer, aside").forEach(el => el.remove()); 68 | 69 | const title = body.querySelector("title")?.textContent?.trim(); 70 | const main = body.querySelector("main, article, [role='main'], .content, #content") || body.body; 71 | 72 | if (title) { 73 | console.log(`# ${title}\n`); 74 | } 75 | 76 | const text = main?.innerHTML || ""; 77 | if (text.trim().length > 100) { 78 | console.log(htmlToMarkdown(text)); 79 | } else { 80 | console.error("Could not extract readable content from this page."); 81 | process.exit(1); 82 | } 83 | } catch (e) { 84 | console.error(`Error: ${e.message}`); 85 | process.exit(1); 86 | } 87 | -------------------------------------------------------------------------------- /browser-tools/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: browser-tools 3 | description: Interactive browser automation via Chrome DevTools Protocol. Use when you need to interact with web pages, test frontends, or when user interaction with a visible browser is required. 4 | --- 5 | 6 | # Browser Tools 7 | 8 | Chrome DevTools Protocol tools for agent-assisted web automation. These tools connect to Chrome running on `:9222` with remote debugging enabled. 9 | 10 | ## Setup 11 | 12 | Run once before first use: 13 | 14 | ```bash 15 | cd {baseDir}/browser-tools 16 | npm install 17 | ``` 18 | 19 | ## Start Chrome 20 | 21 | ```bash 22 | {baseDir}/browser-start.js # Fresh profile 23 | {baseDir}/browser-start.js --profile # Copy user's profile (cookies, logins) 24 | ``` 25 | 26 | Launch Chrome with remote debugging on `:9222`. Use `--profile` to preserve user's authentication state. 27 | 28 | ## Navigate 29 | 30 | ```bash 31 | {baseDir}/browser-nav.js https://example.com 32 | {baseDir}/browser-nav.js https://example.com --new 33 | ``` 34 | 35 | Navigate to URLs. Use `--new` flag to open in a new tab instead of reusing current tab. 36 | 37 | ## Evaluate JavaScript 38 | 39 | ```bash 40 | {baseDir}/browser-eval.js 'document.title' 41 | {baseDir}/browser-eval.js 'document.querySelectorAll("a").length' 42 | ``` 43 | 44 | Execute JavaScript in the active tab. Code runs in async context. Use this to extract data, inspect page state, or perform DOM operations programmatically. 45 | 46 | ## Screenshot 47 | 48 | ```bash 49 | {baseDir}/browser-screenshot.js 50 | ``` 51 | 52 | Capture current viewport and return temporary file path. Use this to visually inspect page state or verify UI changes. 53 | 54 | ## Pick Elements 55 | 56 | ```bash 57 | {baseDir}/browser-pick.js "Click the submit button" 58 | ``` 59 | 60 | **IMPORTANT**: Use this tool when the user wants to select specific DOM elements on the page. This launches an interactive picker that lets the user click elements to select them. The user can select multiple elements (Cmd/Ctrl+Click) and press Enter when done. The tool returns CSS selectors for the selected elements. 61 | 62 | Common use cases: 63 | - User says "I want to click that button" → Use this tool to let them select it 64 | - User says "extract data from these items" → Use this tool to let them select the elements 65 | - When you need specific selectors but the page structure is complex or ambiguous 66 | 67 | ## Cookies 68 | 69 | ```bash 70 | {baseDir}/browser-cookies.js 71 | ``` 72 | 73 | Display all cookies for the current tab including domain, path, httpOnly, and secure flags. Use this to debug authentication issues or inspect session state. 74 | 75 | ## Extract Page Content 76 | 77 | ```bash 78 | {baseDir}/browser-content.js https://example.com 79 | ``` 80 | 81 | Navigate to a URL and extract readable content as markdown. Uses Mozilla Readability for article extraction and Turndown for HTML-to-markdown conversion. Works on pages with JavaScript content (waits for page to load). 82 | 83 | ## When to Use 84 | 85 | - Testing frontend code in a real browser 86 | - Interacting with pages that require JavaScript 87 | - When user needs to visually see or interact with a page 88 | - Debugging authentication or session issues 89 | - Scraping dynamic content that requires JS execution 90 | -------------------------------------------------------------------------------- /gdcli/SKILL.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: gdcli 3 | description: Google Drive CLI for listing, searching, uploading, downloading, and sharing files and folders. 4 | --- 5 | 6 | # Google Drive CLI 7 | 8 | Command-line interface for Google Drive operations. 9 | 10 | ## Installation 11 | 12 | ```bash 13 | npm install -g @mariozechner/gdcli 14 | ``` 15 | 16 | ## Setup 17 | 18 | ### Google Cloud Console (one-time) 19 | 20 | 1. [Create a new project](https://console.cloud.google.com/projectcreate) (or select existing) 21 | 2. [Enable the Google Drive API](https://console.cloud.google.com/apis/api/drive.googleapis.com) 22 | 3. [Set app name](https://console.cloud.google.com/auth/branding) in OAuth branding 23 | 4. [Add test users](https://console.cloud.google.com/auth/audience) (all Gmail addresses you want to use) 24 | 5. [Create OAuth client](https://console.cloud.google.com/auth/clients): 25 | - Click "Create Client" 26 | - Application type: "Desktop app" 27 | - Download the JSON file 28 | 29 | ### Configure gdcli 30 | 31 | First check if already configured: 32 | ```bash 33 | gdcli accounts list 34 | ``` 35 | 36 | If no accounts, guide the user through setup: 37 | 1. Ask if they have a Google Cloud project with Drive API enabled 38 | 2. If not, walk them through the Google Cloud Console steps above 39 | 3. Have them download the OAuth credentials JSON 40 | 4. Run: `gdcli accounts credentials ~/path/to/credentials.json` 41 | 5. Run: `gdcli accounts add ` (use `--manual` for browserless OAuth) 42 | 43 | ## Usage 44 | 45 | Run `gdcli --help` for full command reference. 46 | 47 | Common operations: 48 | - `gdcli ls [folderId]` - List files/folders 49 | - `gdcli ls --query ""` - List with Drive query filter 50 | - `gdcli search ""` - Full-text content search 51 | - `gdcli download [destPath]` - Download a file 52 | - `gdcli upload [--folder ]` - Upload a file 53 | - `gdcli mkdir ` - Create a folder 54 | - `gdcli share --anyone` - Share publicly 55 | 56 | ## Search 57 | 58 | **Two different commands:** 59 | - `search ""` - Searches inside file contents (fullText) 60 | - `ls --query ""` - Filters by metadata (name, type, date, etc.) 61 | 62 | **Use `ls --query` for filename searches!** 63 | 64 | ## Query Syntax (for ls --query) 65 | 66 | Format: `field operator value`. Combine with `and`/`or`, group with `()`. 67 | 68 | **Operators:** `=`, `!=`, `contains`, `<`, `>`, `<=`, `>=` 69 | 70 | **Examples:** 71 | ```bash 72 | # By filename 73 | ls --query "name = 'report.pdf'" # exact match 74 | ls --query "name contains 'IMG'" # prefix match 75 | 76 | # By type 77 | ls --query "mimeType = 'application/pdf'" 78 | ls --query "mimeType contains 'image/'" 79 | ls --query "mimeType = 'application/vnd.google-apps.folder'" # folders 80 | 81 | # By date 82 | ls --query "modifiedTime > '2024-01-01'" 83 | 84 | # By owner/sharing 85 | ls --query "'me' in owners" 86 | ls --query "sharedWithMe" 87 | 88 | # Exclude trash 89 | ls --query "trashed = false" 90 | 91 | # Combined 92 | ls --query "name contains 'report' and mimeType = 'application/pdf'" 93 | ``` 94 | 95 | Ref: https://developers.google.com/drive/api/guides/ref-search-terms 96 | 97 | ## Data Storage 98 | 99 | - `~/.gdcli/credentials.json` - OAuth client credentials 100 | - `~/.gdcli/accounts.json` - Account tokens 101 | - `~/.gdcli/downloads/` - Default download location 102 | -------------------------------------------------------------------------------- /browser-tools/browser-hn-scraper.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Hacker News Scraper 5 | * 6 | * Fetches and parses submissions from Hacker News front page. 7 | * Usage: node browser-hn-scraper.js [--limit ] 8 | */ 9 | 10 | import * as cheerio from 'cheerio'; 11 | 12 | /** 13 | * Scrapes Hacker News front page 14 | * @param {number} limit - Maximum number of submissions to return (default: 30) 15 | * @returns {Promise} Array of submission objects 16 | */ 17 | async function scrapeHackerNews(limit = 30) { 18 | const url = 'https://news.ycombinator.com'; 19 | 20 | try { 21 | const response = await fetch(url); 22 | if (!response.ok) { 23 | throw new Error(`HTTP error! status: ${response.status}`); 24 | } 25 | 26 | const html = await response.text(); 27 | const $ = cheerio.load(html); 28 | const submissions = []; 29 | 30 | // Each submission has class 'athing' 31 | $('.athing').each((index, element) => { 32 | if (submissions.length >= limit) return false; // Stop when limit reached 33 | 34 | const $element = $(element); 35 | const id = $element.attr('id'); 36 | 37 | // Get title and URL from titleline 38 | const $titleLine = $element.find('.titleline > a').first(); 39 | const title = $titleLine.text().trim(); 40 | const url = $titleLine.attr('href'); 41 | 42 | // Get the next row which contains metadata (points, author, comments) 43 | const $metadataRow = $element.next(); 44 | const $subtext = $metadataRow.find('.subtext'); 45 | 46 | // Get points 47 | const $score = $subtext.find(`#score_${id}`); 48 | const pointsText = $score.text(); 49 | const points = pointsText ? parseInt(pointsText.match(/\d+/)?.[0] || '0') : 0; 50 | 51 | // Get author 52 | const author = $subtext.find('.hnuser').text().trim(); 53 | 54 | // Get time 55 | const time = $subtext.find('.age').attr('title') || $subtext.find('.age').text().trim(); 56 | 57 | // Get comments count 58 | const $commentsLink = $subtext.find('a').last(); 59 | const commentsText = $commentsLink.text(); 60 | let commentsCount = 0; 61 | 62 | if (commentsText.includes('comment')) { 63 | const match = commentsText.match(/(\d+)/); 64 | commentsCount = match ? parseInt(match[0]) : 0; 65 | } 66 | 67 | submissions.push({ 68 | id, 69 | title, 70 | url, 71 | points, 72 | author, 73 | time, 74 | comments: commentsCount, 75 | hnUrl: `https://news.ycombinator.com/item?id=${id}` 76 | }); 77 | }); 78 | 79 | return submissions; 80 | } catch (error) { 81 | console.error('Error scraping Hacker News:', error.message); 82 | throw error; 83 | } 84 | } 85 | 86 | // CLI interface 87 | if (import.meta.url === `file://${process.argv[1]}`) { 88 | const args = process.argv.slice(2); 89 | let limit = 30; 90 | 91 | // Parse --limit argument 92 | const limitIndex = args.indexOf('--limit'); 93 | if (limitIndex !== -1 && args[limitIndex + 1]) { 94 | limit = parseInt(args[limitIndex + 1]); 95 | } 96 | 97 | scrapeHackerNews(limit) 98 | .then(submissions => { 99 | console.log(JSON.stringify(submissions, null, 2)); 100 | console.error(`\n✓ Scraped ${submissions.length} submissions`); 101 | }) 102 | .catch(error => { 103 | console.error('Failed to scrape:', error.message); 104 | process.exit(1); 105 | }); 106 | } 107 | 108 | export { scrapeHackerNews }; 109 | -------------------------------------------------------------------------------- /browser-tools/browser-content.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import puppeteer from "puppeteer-core"; 4 | import { Readability } from "@mozilla/readability"; 5 | import { JSDOM } from "jsdom"; 6 | import TurndownService from "turndown"; 7 | import { gfm } from "turndown-plugin-gfm"; 8 | 9 | // Global timeout - exit if script takes too long 10 | const TIMEOUT = 30000; 11 | const timeoutId = setTimeout(() => { 12 | console.error("✗ Timeout after 30s"); 13 | process.exit(1); 14 | }, TIMEOUT).unref(); 15 | 16 | const url = process.argv[2]; 17 | 18 | if (!url) { 19 | console.log("Usage: browser-content.js "); 20 | console.log("\nExtracts readable content from a URL as markdown."); 21 | console.log("\nExamples:"); 22 | console.log(" browser-content.js https://example.com"); 23 | console.log(" browser-content.js https://en.wikipedia.org/wiki/Rust_(programming_language)"); 24 | process.exit(1); 25 | } 26 | 27 | const b = await Promise.race([ 28 | puppeteer.connect({ 29 | browserURL: "http://localhost:9222", 30 | defaultViewport: null, 31 | }), 32 | new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)), 33 | ]).catch((e) => { 34 | console.error("✗ Could not connect to browser:", e.message); 35 | console.error(" Run: browser-start.js"); 36 | process.exit(1); 37 | }); 38 | 39 | const p = (await b.pages()).at(-1); 40 | if (!p) { 41 | console.error("✗ No active tab found"); 42 | process.exit(1); 43 | } 44 | 45 | await Promise.race([ 46 | p.goto(url, { waitUntil: "networkidle2" }), 47 | new Promise((r) => setTimeout(r, 10000)), 48 | ]).catch(() => {}); 49 | 50 | // Get HTML via CDP (works even with TrustedScriptURL restrictions) 51 | const client = await p.createCDPSession(); 52 | const { root } = await client.send("DOM.getDocument", { depth: -1, pierce: true }); 53 | const { outerHTML } = await client.send("DOM.getOuterHTML", { nodeId: root.nodeId }); 54 | await client.detach(); 55 | 56 | const finalUrl = p.url(); 57 | 58 | // Extract with Readability 59 | const doc = new JSDOM(outerHTML, { url: finalUrl }); 60 | const reader = new Readability(doc.window.document); 61 | const article = reader.parse(); 62 | 63 | // Convert to markdown 64 | function htmlToMarkdown(html) { 65 | const turndown = new TurndownService({ headingStyle: "atx", codeBlockStyle: "fenced" }); 66 | turndown.use(gfm); 67 | turndown.addRule("removeEmptyLinks", { 68 | filter: (node) => node.nodeName === "A" && !node.textContent?.trim(), 69 | replacement: () => "", 70 | }); 71 | return turndown 72 | .turndown(html) 73 | .replace(/\[\\?\[\s*\\?\]\]\([^)]*\)/g, "") 74 | .replace(/ +/g, " ") 75 | .replace(/\s+,/g, ",") 76 | .replace(/\s+\./g, ".") 77 | .replace(/\n{3,}/g, "\n\n") 78 | .trim(); 79 | } 80 | 81 | let content; 82 | if (article && article.content) { 83 | content = htmlToMarkdown(article.content); 84 | } else { 85 | // Fallback 86 | const fallbackDoc = new JSDOM(outerHTML, { url: finalUrl }); 87 | const fallbackBody = fallbackDoc.window.document; 88 | fallbackBody.querySelectorAll("script, style, noscript, nav, header, footer, aside").forEach((el) => el.remove()); 89 | const main = fallbackBody.querySelector("main, article, [role='main'], .content, #content") || fallbackBody.body; 90 | const fallbackHtml = main?.innerHTML || ""; 91 | if (fallbackHtml.trim().length > 100) { 92 | content = htmlToMarkdown(fallbackHtml); 93 | } else { 94 | content = "(Could not extract content)"; 95 | } 96 | } 97 | 98 | console.log(`URL: ${finalUrl}`); 99 | if (article?.title) console.log(`Title: ${article.title}`); 100 | console.log(""); 101 | console.log(content); 102 | 103 | process.exit(0); 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pi-skills 2 | 3 | A collection of skills for [pi-coding-agent](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent), compatible with Claude Code, Codex CLI, Amp, and Droid. 4 | 5 | ## Installation 6 | 7 | ### pi-coding-agent 8 | 9 | ```bash 10 | # User-level (available in all projects) 11 | git clone https://github.com/badlogic/pi-skills ~/.pi/agent/skills/pi-skills 12 | 13 | # Or project-level 14 | git clone https://github.com/badlogic/pi-skills .pi/skills/pi-skills 15 | ``` 16 | 17 | ### Codex CLI 18 | 19 | ```bash 20 | git clone https://github.com/badlogic/pi-skills ~/.codex/skills/pi-skills 21 | ``` 22 | 23 | ### Amp 24 | 25 | Amp finds skills recursively in toolboxes: 26 | 27 | ```bash 28 | git clone https://github.com/badlogic/pi-skills ~/.config/amp/tools/pi-skills 29 | ``` 30 | 31 | ### Droid (Factory) 32 | 33 | ```bash 34 | # User-level 35 | git clone https://github.com/badlogic/pi-skills ~/.factory/skills/pi-skills 36 | 37 | # Or project-level 38 | git clone https://github.com/badlogic/pi-skills .factory/skills/pi-skills 39 | ``` 40 | 41 | ### Claude Code 42 | 43 | Claude Code only looks one level deep for `SKILL.md` files, so each skill folder must be directly under the skills directory. Clone the repo somewhere, then symlink individual skills: 44 | 45 | ```bash 46 | # Clone to a convenient location 47 | git clone https://github.com/badlogic/pi-skills ~/pi-skills 48 | 49 | # Symlink individual skills (user-level) 50 | mkdir -p ~/.claude/skills 51 | ln -s ~/pi-skills/brave-search ~/.claude/skills/brave-search 52 | ln -s ~/pi-skills/browser-tools ~/.claude/skills/browser-tools 53 | ln -s ~/pi-skills/gccli ~/.claude/skills/gccli 54 | ln -s ~/pi-skills/gdcli ~/.claude/skills/gdcli 55 | ln -s ~/pi-skills/gmcli ~/.claude/skills/gmcli 56 | ln -s ~/pi-skills/subagent ~/.claude/skills/subagent 57 | ln -s ~/pi-skills/transcribe ~/.claude/skills/transcribe 58 | ln -s ~/pi-skills/vscode ~/.claude/skills/vscode 59 | ln -s ~/pi-skills/youtube-transcript ~/.claude/skills/youtube-transcript 60 | 61 | # Or project-level 62 | mkdir -p .claude/skills 63 | ln -s ~/pi-skills/brave-search .claude/skills/brave-search 64 | ln -s ~/pi-skills/browser-tools .claude/skills/browser-tools 65 | ln -s ~/pi-skills/gccli .claude/skills/gccli 66 | ln -s ~/pi-skills/gdcli .claude/skills/gdcli 67 | ln -s ~/pi-skills/gmcli .claude/skills/gmcli 68 | ln -s ~/pi-skills/subagent .claude/skills/subagent 69 | ln -s ~/pi-skills/transcribe .claude/skills/transcribe 70 | ln -s ~/pi-skills/vscode .claude/skills/vscode 71 | ln -s ~/pi-skills/youtube-transcript .claude/skills/youtube-transcript 72 | ``` 73 | 74 | ## Available Skills 75 | 76 | | Skill | Description | 77 | |-------|-------------| 78 | | [brave-search](brave-search/SKILL.md) | Web search and content extraction via Brave Search | 79 | | [browser-tools](browser-tools/SKILL.md) | Interactive browser automation via Chrome DevTools Protocol | 80 | | [gccli](gccli/SKILL.md) | Google Calendar CLI for events and availability | 81 | | [gdcli](gdcli/SKILL.md) | Google Drive CLI for file management and sharing | 82 | | [gmcli](gmcli/SKILL.md) | Gmail CLI for email, drafts, and labels | 83 | | [subagent](subagent/SKILL.md) | Spawn sub-agents for parallel or background tasks | 84 | | [transcribe](transcribe/SKILL.md) | Speech-to-text transcription via Groq Whisper API | 85 | | [vscode](vscode/SKILL.md) | VS Code integration for diffs and file comparison | 86 | | [youtube-transcript](youtube-transcript/SKILL.md) | Fetch YouTube video transcripts | 87 | 88 | ## Skill Format 89 | 90 | Each skill follows the pi/Claude Code format: 91 | 92 | ```markdown 93 | --- 94 | name: skill-name 95 | description: Short description shown to agent 96 | --- 97 | 98 | # Instructions 99 | 100 | Detailed instructions here... 101 | Helper files available at: {baseDir}/ 102 | ``` 103 | 104 | The `{baseDir}` placeholder is replaced with the skill's directory path at runtime. 105 | 106 | ## Requirements 107 | 108 | Some skills require additional setup. Generally, the agent will walk you through that. But if not, here you go: 109 | 110 | - **brave-search**: Requires Node.js. Run `npm install` in the skill directory. 111 | - **browser-tools**: Requires Chrome and Node.js. Run `npm install` in the skill directory. 112 | - **gccli**: Requires Node.js. Install globally with `npm install -g @mariozechner/gccli`. 113 | - **gdcli**: Requires Node.js. Install globally with `npm install -g @mariozechner/gdcli`. 114 | - **gmcli**: Requires Node.js. Install globally with `npm install -g @mariozechner/gmcli`. 115 | - **subagent**: Requires pi-coding-agent. Install globally with `npm install -g @mariozechner/pi-coding-agent`. 116 | - **transcribe**: Requires curl and a Groq API key. 117 | - **vscode**: Requires VS Code with `code` CLI in PATH. 118 | - **youtube-transcript**: Requires Node.js. Run `npm install` in the skill directory. 119 | 120 | ## License 121 | 122 | MIT 123 | -------------------------------------------------------------------------------- /browser-tools/browser-pick.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import puppeteer from "puppeteer-core"; 4 | 5 | const message = process.argv.slice(2).join(" "); 6 | if (!message) { 7 | console.log("Usage: browser-pick.js 'message'"); 8 | console.log("\nExample:"); 9 | console.log(' browser-pick.js "Click the submit button"'); 10 | process.exit(1); 11 | } 12 | 13 | const b = await Promise.race([ 14 | puppeteer.connect({ 15 | browserURL: "http://localhost:9222", 16 | defaultViewport: null, 17 | }), 18 | new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 5000)), 19 | ]).catch((e) => { 20 | console.error("✗ Could not connect to browser:", e.message); 21 | console.error(" Run: browser-start.js"); 22 | process.exit(1); 23 | }); 24 | 25 | const p = (await b.pages()).at(-1); 26 | 27 | if (!p) { 28 | console.error("✗ No active tab found"); 29 | process.exit(1); 30 | } 31 | 32 | // Inject pick() helper into current page 33 | await p.evaluate(() => { 34 | if (!window.pick) { 35 | window.pick = async (message) => { 36 | if (!message) { 37 | throw new Error("pick() requires a message parameter"); 38 | } 39 | return new Promise((resolve) => { 40 | const selections = []; 41 | const selectedElements = new Set(); 42 | 43 | const overlay = document.createElement("div"); 44 | overlay.style.cssText = 45 | "position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483647;pointer-events:none"; 46 | 47 | const highlight = document.createElement("div"); 48 | highlight.style.cssText = 49 | "position:absolute;border:2px solid #3b82f6;background:rgba(59,130,246,0.1);transition:all 0.1s"; 50 | overlay.appendChild(highlight); 51 | 52 | const banner = document.createElement("div"); 53 | banner.style.cssText = 54 | "position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:#1f2937;color:white;padding:12px 24px;border-radius:8px;font:14px sans-serif;box-shadow:0 4px 12px rgba(0,0,0,0.3);pointer-events:auto;z-index:2147483647"; 55 | 56 | const updateBanner = () => { 57 | banner.textContent = `${message} (${selections.length} selected, Cmd/Ctrl+click to add, Enter to finish, ESC to cancel)`; 58 | }; 59 | updateBanner(); 60 | 61 | document.body.append(banner, overlay); 62 | 63 | const cleanup = () => { 64 | document.removeEventListener("mousemove", onMove, true); 65 | document.removeEventListener("click", onClick, true); 66 | document.removeEventListener("keydown", onKey, true); 67 | overlay.remove(); 68 | banner.remove(); 69 | selectedElements.forEach((el) => { 70 | el.style.outline = ""; 71 | }); 72 | }; 73 | 74 | const onMove = (e) => { 75 | const el = document.elementFromPoint(e.clientX, e.clientY); 76 | if (!el || overlay.contains(el) || banner.contains(el)) return; 77 | const r = el.getBoundingClientRect(); 78 | highlight.style.cssText = `position:absolute;border:2px solid #3b82f6;background:rgba(59,130,246,0.1);top:${r.top}px;left:${r.left}px;width:${r.width}px;height:${r.height}px`; 79 | }; 80 | 81 | const buildElementInfo = (el) => { 82 | const parents = []; 83 | let current = el.parentElement; 84 | while (current && current !== document.body) { 85 | const parentInfo = current.tagName.toLowerCase(); 86 | const id = current.id ? `#${current.id}` : ""; 87 | const cls = current.className 88 | ? `.${current.className.trim().split(/\s+/).join(".")}` 89 | : ""; 90 | parents.push(parentInfo + id + cls); 91 | current = current.parentElement; 92 | } 93 | 94 | return { 95 | tag: el.tagName.toLowerCase(), 96 | id: el.id || null, 97 | class: el.className || null, 98 | text: el.textContent?.trim().slice(0, 200) || null, 99 | html: el.outerHTML.slice(0, 500), 100 | parents: parents.join(" > "), 101 | }; 102 | }; 103 | 104 | const onClick = (e) => { 105 | if (banner.contains(e.target)) return; 106 | e.preventDefault(); 107 | e.stopPropagation(); 108 | const el = document.elementFromPoint(e.clientX, e.clientY); 109 | if (!el || overlay.contains(el) || banner.contains(el)) return; 110 | 111 | if (e.metaKey || e.ctrlKey) { 112 | if (!selectedElements.has(el)) { 113 | selectedElements.add(el); 114 | el.style.outline = "3px solid #10b981"; 115 | selections.push(buildElementInfo(el)); 116 | updateBanner(); 117 | } 118 | } else { 119 | cleanup(); 120 | const info = buildElementInfo(el); 121 | resolve(selections.length > 0 ? selections : info); 122 | } 123 | }; 124 | 125 | const onKey = (e) => { 126 | if (e.key === "Escape") { 127 | e.preventDefault(); 128 | cleanup(); 129 | resolve(null); 130 | } else if (e.key === "Enter" && selections.length > 0) { 131 | e.preventDefault(); 132 | cleanup(); 133 | resolve(selections); 134 | } 135 | }; 136 | 137 | document.addEventListener("mousemove", onMove, true); 138 | document.addEventListener("click", onClick, true); 139 | document.addEventListener("keydown", onKey, true); 140 | }); 141 | }; 142 | } 143 | }); 144 | 145 | const result = await p.evaluate((msg) => window.pick(msg), message); 146 | 147 | if (Array.isArray(result)) { 148 | for (let i = 0; i < result.length; i++) { 149 | if (i > 0) console.log(""); 150 | for (const [key, value] of Object.entries(result[i])) { 151 | console.log(`${key}: ${value}`); 152 | } 153 | } 154 | } else if (typeof result === "object" && result !== null) { 155 | for (const [key, value] of Object.entries(result)) { 156 | console.log(`${key}: ${value}`); 157 | } 158 | } else { 159 | console.log(result); 160 | } 161 | 162 | await b.disconnect(); 163 | -------------------------------------------------------------------------------- /brave-search/search.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Readability } from "@mozilla/readability"; 4 | import { JSDOM } from "jsdom"; 5 | import TurndownService from "turndown"; 6 | import { gfm } from "turndown-plugin-gfm"; 7 | 8 | const args = process.argv.slice(2); 9 | 10 | const contentIndex = args.indexOf("--content"); 11 | const fetchContent = contentIndex !== -1; 12 | if (fetchContent) args.splice(contentIndex, 1); 13 | 14 | let numResults = 5; 15 | const nIndex = args.indexOf("-n"); 16 | if (nIndex !== -1 && args[nIndex + 1]) { 17 | numResults = parseInt(args[nIndex + 1], 10); 18 | args.splice(nIndex, 2); 19 | } 20 | 21 | const query = args.join(" "); 22 | 23 | if (!query) { 24 | console.log("Usage: search.js [-n ] [--content]"); 25 | console.log("\nOptions:"); 26 | console.log(" -n Number of results (default: 5)"); 27 | console.log(" --content Fetch readable content as markdown"); 28 | console.log("\nExamples:"); 29 | console.log(' search.js "javascript async await"'); 30 | console.log(' search.js "rust programming" -n 10'); 31 | console.log(' search.js "climate change" --content'); 32 | process.exit(1); 33 | } 34 | 35 | async function fetchBraveResults(query, numResults) { 36 | const url = `https://search.brave.com/search?q=${encodeURIComponent(query)}`; 37 | 38 | const response = await fetch(url, { 39 | headers: { 40 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36", 41 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8", 42 | "Accept-Language": "en-US,en;q=0.9", 43 | "sec-ch-ua": '"Chromium";v="142", "Google Chrome";v="142", "Not_A Brand";v="99"', 44 | "sec-ch-ua-mobile": "?0", 45 | "sec-ch-ua-platform": '"macOS"', 46 | "sec-fetch-dest": "document", 47 | "sec-fetch-mode": "navigate", 48 | "sec-fetch-site": "none", 49 | "sec-fetch-user": "?1", 50 | } 51 | }); 52 | 53 | if (!response.ok) { 54 | throw new Error(`HTTP ${response.status}: ${response.statusText}`); 55 | } 56 | 57 | const html = await response.text(); 58 | const dom = new JSDOM(html); 59 | const doc = dom.window.document; 60 | 61 | const results = []; 62 | 63 | // Find all search result snippets with data-type="web" 64 | const snippets = doc.querySelectorAll('div.snippet[data-type="web"]'); 65 | 66 | for (const snippet of snippets) { 67 | if (results.length >= numResults) break; 68 | 69 | // Get the main link and title 70 | const titleLink = snippet.querySelector('a.svelte-14r20fy'); 71 | if (!titleLink) continue; 72 | 73 | const link = titleLink.getAttribute('href'); 74 | if (!link || link.includes('brave.com')) continue; 75 | 76 | const titleEl = titleLink.querySelector('.title'); 77 | const title = titleEl?.textContent?.trim() || titleLink.textContent?.trim() || ''; 78 | 79 | // Get the snippet/description 80 | const descEl = snippet.querySelector('.generic-snippet .content'); 81 | let snippetText = descEl?.textContent?.trim() || ''; 82 | // Remove date prefix if present 83 | snippetText = snippetText.replace(/^[A-Z][a-z]+ \d+, \d{4} -\s*/, ''); 84 | 85 | if (title && link) { 86 | results.push({ title, link, snippet: snippetText }); 87 | } 88 | } 89 | 90 | return results; 91 | } 92 | 93 | function htmlToMarkdown(html) { 94 | const turndown = new TurndownService({ headingStyle: "atx", codeBlockStyle: "fenced" }); 95 | turndown.use(gfm); 96 | turndown.addRule("removeEmptyLinks", { 97 | filter: (node) => node.nodeName === "A" && !node.textContent?.trim(), 98 | replacement: () => "", 99 | }); 100 | return turndown 101 | .turndown(html) 102 | .replace(/\[\\?\[\s*\\?\]\]\([^)]*\)/g, "") 103 | .replace(/ +/g, " ") 104 | .replace(/\s+,/g, ",") 105 | .replace(/\s+\./g, ".") 106 | .replace(/\n{3,}/g, "\n\n") 107 | .trim(); 108 | } 109 | 110 | async function fetchPageContent(url) { 111 | try { 112 | const response = await fetch(url, { 113 | headers: { 114 | "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36", 115 | "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 116 | }, 117 | signal: AbortSignal.timeout(10000), 118 | }); 119 | 120 | if (!response.ok) { 121 | return `(HTTP ${response.status})`; 122 | } 123 | 124 | const html = await response.text(); 125 | const dom = new JSDOM(html, { url }); 126 | const reader = new Readability(dom.window.document); 127 | const article = reader.parse(); 128 | 129 | if (article && article.content) { 130 | return htmlToMarkdown(article.content).substring(0, 5000); 131 | } 132 | 133 | // Fallback: try to get main content 134 | const fallbackDoc = new JSDOM(html, { url }); 135 | const body = fallbackDoc.window.document; 136 | body.querySelectorAll("script, style, noscript, nav, header, footer, aside").forEach(el => el.remove()); 137 | const main = body.querySelector("main, article, [role='main'], .content, #content") || body.body; 138 | const text = main?.textContent || ""; 139 | 140 | if (text.trim().length > 100) { 141 | return text.trim().substring(0, 5000); 142 | } 143 | 144 | return "(Could not extract content)"; 145 | } catch (e) { 146 | return `(Error: ${e.message})`; 147 | } 148 | } 149 | 150 | // Main 151 | try { 152 | const results = await fetchBraveResults(query, numResults); 153 | 154 | if (results.length === 0) { 155 | console.error("No results found."); 156 | process.exit(0); 157 | } 158 | 159 | if (fetchContent) { 160 | for (const result of results) { 161 | result.content = await fetchPageContent(result.link); 162 | } 163 | } 164 | 165 | for (let i = 0; i < results.length; i++) { 166 | const r = results[i]; 167 | console.log(`--- Result ${i + 1} ---`); 168 | console.log(`Title: ${r.title}`); 169 | console.log(`Link: ${r.link}`); 170 | console.log(`Snippet: ${r.snippet}`); 171 | if (r.content) { 172 | console.log(`Content:\n${r.content}`); 173 | } 174 | console.log(""); 175 | } 176 | } catch (e) { 177 | console.error(`Error: ${e.message}`); 178 | process.exit(1); 179 | } 180 | -------------------------------------------------------------------------------- /brave-search/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brave-search", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "brave-search", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@mozilla/readability": "^0.6.0", 13 | "jsdom": "^27.0.1", 14 | "turndown": "^7.2.2", 15 | "turndown-plugin-gfm": "^1.0.2" 16 | } 17 | }, 18 | "node_modules/@asamuzakjp/css-color": { 19 | "version": "4.1.0", 20 | "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.0.tgz", 21 | "integrity": "sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==", 22 | "license": "MIT", 23 | "dependencies": { 24 | "@csstools/css-calc": "^2.1.4", 25 | "@csstools/css-color-parser": "^3.1.0", 26 | "@csstools/css-parser-algorithms": "^3.0.5", 27 | "@csstools/css-tokenizer": "^3.0.4", 28 | "lru-cache": "^11.2.2" 29 | } 30 | }, 31 | "node_modules/@asamuzakjp/dom-selector": { 32 | "version": "6.7.5", 33 | "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.5.tgz", 34 | "integrity": "sha512-Eks6dY8zau4m4wNRQjRVaKQRTalNcPcBvU1ZQ35w5kKRk1gUeNCkVLsRiATurjASTp3TKM4H10wsI50nx3NZdw==", 35 | "license": "MIT", 36 | "dependencies": { 37 | "@asamuzakjp/nwsapi": "^2.3.9", 38 | "bidi-js": "^1.0.3", 39 | "css-tree": "^3.1.0", 40 | "is-potential-custom-element-name": "^1.0.1", 41 | "lru-cache": "^11.2.2" 42 | } 43 | }, 44 | "node_modules/@asamuzakjp/nwsapi": { 45 | "version": "2.3.9", 46 | "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", 47 | "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", 48 | "license": "MIT" 49 | }, 50 | "node_modules/@csstools/color-helpers": { 51 | "version": "5.1.0", 52 | "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", 53 | "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", 54 | "funding": [ 55 | { 56 | "type": "github", 57 | "url": "https://github.com/sponsors/csstools" 58 | }, 59 | { 60 | "type": "opencollective", 61 | "url": "https://opencollective.com/csstools" 62 | } 63 | ], 64 | "license": "MIT-0", 65 | "engines": { 66 | "node": ">=18" 67 | } 68 | }, 69 | "node_modules/@csstools/css-calc": { 70 | "version": "2.1.4", 71 | "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", 72 | "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", 73 | "funding": [ 74 | { 75 | "type": "github", 76 | "url": "https://github.com/sponsors/csstools" 77 | }, 78 | { 79 | "type": "opencollective", 80 | "url": "https://opencollective.com/csstools" 81 | } 82 | ], 83 | "license": "MIT", 84 | "engines": { 85 | "node": ">=18" 86 | }, 87 | "peerDependencies": { 88 | "@csstools/css-parser-algorithms": "^3.0.5", 89 | "@csstools/css-tokenizer": "^3.0.4" 90 | } 91 | }, 92 | "node_modules/@csstools/css-color-parser": { 93 | "version": "3.1.0", 94 | "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", 95 | "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", 96 | "funding": [ 97 | { 98 | "type": "github", 99 | "url": "https://github.com/sponsors/csstools" 100 | }, 101 | { 102 | "type": "opencollective", 103 | "url": "https://opencollective.com/csstools" 104 | } 105 | ], 106 | "license": "MIT", 107 | "dependencies": { 108 | "@csstools/color-helpers": "^5.1.0", 109 | "@csstools/css-calc": "^2.1.4" 110 | }, 111 | "engines": { 112 | "node": ">=18" 113 | }, 114 | "peerDependencies": { 115 | "@csstools/css-parser-algorithms": "^3.0.5", 116 | "@csstools/css-tokenizer": "^3.0.4" 117 | } 118 | }, 119 | "node_modules/@csstools/css-parser-algorithms": { 120 | "version": "3.0.5", 121 | "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", 122 | "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", 123 | "funding": [ 124 | { 125 | "type": "github", 126 | "url": "https://github.com/sponsors/csstools" 127 | }, 128 | { 129 | "type": "opencollective", 130 | "url": "https://opencollective.com/csstools" 131 | } 132 | ], 133 | "license": "MIT", 134 | "engines": { 135 | "node": ">=18" 136 | }, 137 | "peerDependencies": { 138 | "@csstools/css-tokenizer": "^3.0.4" 139 | } 140 | }, 141 | "node_modules/@csstools/css-syntax-patches-for-csstree": { 142 | "version": "1.0.20", 143 | "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.20.tgz", 144 | "integrity": "sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==", 145 | "funding": [ 146 | { 147 | "type": "github", 148 | "url": "https://github.com/sponsors/csstools" 149 | }, 150 | { 151 | "type": "opencollective", 152 | "url": "https://opencollective.com/csstools" 153 | } 154 | ], 155 | "license": "MIT-0", 156 | "engines": { 157 | "node": ">=18" 158 | } 159 | }, 160 | "node_modules/@csstools/css-tokenizer": { 161 | "version": "3.0.4", 162 | "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", 163 | "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", 164 | "funding": [ 165 | { 166 | "type": "github", 167 | "url": "https://github.com/sponsors/csstools" 168 | }, 169 | { 170 | "type": "opencollective", 171 | "url": "https://opencollective.com/csstools" 172 | } 173 | ], 174 | "license": "MIT", 175 | "engines": { 176 | "node": ">=18" 177 | } 178 | }, 179 | "node_modules/@mixmark-io/domino": { 180 | "version": "2.2.0", 181 | "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", 182 | "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", 183 | "license": "BSD-2-Clause" 184 | }, 185 | "node_modules/@mozilla/readability": { 186 | "version": "0.6.0", 187 | "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.6.0.tgz", 188 | "integrity": "sha512-juG5VWh4qAivzTAeMzvY9xs9HY5rAcr2E4I7tiSSCokRFi7XIZCAu92ZkSTsIj1OPceCifL3cpfteP3pDT9/QQ==", 189 | "license": "Apache-2.0", 190 | "engines": { 191 | "node": ">=14.0.0" 192 | } 193 | }, 194 | "node_modules/agent-base": { 195 | "version": "7.1.4", 196 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 197 | "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 198 | "license": "MIT", 199 | "engines": { 200 | "node": ">= 14" 201 | } 202 | }, 203 | "node_modules/bidi-js": { 204 | "version": "1.0.3", 205 | "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", 206 | "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", 207 | "license": "MIT", 208 | "dependencies": { 209 | "require-from-string": "^2.0.2" 210 | } 211 | }, 212 | "node_modules/css-tree": { 213 | "version": "3.1.0", 214 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 215 | "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 216 | "license": "MIT", 217 | "dependencies": { 218 | "mdn-data": "2.12.2", 219 | "source-map-js": "^1.0.1" 220 | }, 221 | "engines": { 222 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 223 | } 224 | }, 225 | "node_modules/cssstyle": { 226 | "version": "5.3.3", 227 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.3.tgz", 228 | "integrity": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==", 229 | "license": "MIT", 230 | "dependencies": { 231 | "@asamuzakjp/css-color": "^4.0.3", 232 | "@csstools/css-syntax-patches-for-csstree": "^1.0.14", 233 | "css-tree": "^3.1.0" 234 | }, 235 | "engines": { 236 | "node": ">=20" 237 | } 238 | }, 239 | "node_modules/data-urls": { 240 | "version": "6.0.0", 241 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", 242 | "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==", 243 | "license": "MIT", 244 | "dependencies": { 245 | "whatwg-mimetype": "^4.0.0", 246 | "whatwg-url": "^15.0.0" 247 | }, 248 | "engines": { 249 | "node": ">=20" 250 | } 251 | }, 252 | "node_modules/debug": { 253 | "version": "4.4.3", 254 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 255 | "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 256 | "license": "MIT", 257 | "dependencies": { 258 | "ms": "^2.1.3" 259 | }, 260 | "engines": { 261 | "node": ">=6.0" 262 | }, 263 | "peerDependenciesMeta": { 264 | "supports-color": { 265 | "optional": true 266 | } 267 | } 268 | }, 269 | "node_modules/decimal.js": { 270 | "version": "10.6.0", 271 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", 272 | "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", 273 | "license": "MIT" 274 | }, 275 | "node_modules/entities": { 276 | "version": "6.0.1", 277 | "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 278 | "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 279 | "license": "BSD-2-Clause", 280 | "engines": { 281 | "node": ">=0.12" 282 | }, 283 | "funding": { 284 | "url": "https://github.com/fb55/entities?sponsor=1" 285 | } 286 | }, 287 | "node_modules/html-encoding-sniffer": { 288 | "version": "4.0.0", 289 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", 290 | "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", 291 | "license": "MIT", 292 | "dependencies": { 293 | "whatwg-encoding": "^3.1.1" 294 | }, 295 | "engines": { 296 | "node": ">=18" 297 | } 298 | }, 299 | "node_modules/http-proxy-agent": { 300 | "version": "7.0.2", 301 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 302 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 303 | "license": "MIT", 304 | "dependencies": { 305 | "agent-base": "^7.1.0", 306 | "debug": "^4.3.4" 307 | }, 308 | "engines": { 309 | "node": ">= 14" 310 | } 311 | }, 312 | "node_modules/https-proxy-agent": { 313 | "version": "7.0.6", 314 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 315 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 316 | "license": "MIT", 317 | "dependencies": { 318 | "agent-base": "^7.1.2", 319 | "debug": "4" 320 | }, 321 | "engines": { 322 | "node": ">= 14" 323 | } 324 | }, 325 | "node_modules/iconv-lite": { 326 | "version": "0.6.3", 327 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 328 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 329 | "license": "MIT", 330 | "dependencies": { 331 | "safer-buffer": ">= 2.1.2 < 3.0.0" 332 | }, 333 | "engines": { 334 | "node": ">=0.10.0" 335 | } 336 | }, 337 | "node_modules/is-potential-custom-element-name": { 338 | "version": "1.0.1", 339 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 340 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 341 | "license": "MIT" 342 | }, 343 | "node_modules/jsdom": { 344 | "version": "27.0.1", 345 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.1.tgz", 346 | "integrity": "sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==", 347 | "license": "MIT", 348 | "dependencies": { 349 | "@asamuzakjp/dom-selector": "^6.7.2", 350 | "cssstyle": "^5.3.1", 351 | "data-urls": "^6.0.0", 352 | "decimal.js": "^10.6.0", 353 | "html-encoding-sniffer": "^4.0.0", 354 | "http-proxy-agent": "^7.0.2", 355 | "https-proxy-agent": "^7.0.6", 356 | "is-potential-custom-element-name": "^1.0.1", 357 | "parse5": "^8.0.0", 358 | "rrweb-cssom": "^0.8.0", 359 | "saxes": "^6.0.0", 360 | "symbol-tree": "^3.2.4", 361 | "tough-cookie": "^6.0.0", 362 | "w3c-xmlserializer": "^5.0.0", 363 | "webidl-conversions": "^8.0.0", 364 | "whatwg-encoding": "^3.1.1", 365 | "whatwg-mimetype": "^4.0.0", 366 | "whatwg-url": "^15.1.0", 367 | "ws": "^8.18.3", 368 | "xml-name-validator": "^5.0.0" 369 | }, 370 | "engines": { 371 | "node": ">=20" 372 | }, 373 | "peerDependencies": { 374 | "canvas": "^3.0.0" 375 | }, 376 | "peerDependenciesMeta": { 377 | "canvas": { 378 | "optional": true 379 | } 380 | } 381 | }, 382 | "node_modules/lru-cache": { 383 | "version": "11.2.4", 384 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", 385 | "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", 386 | "license": "BlueOak-1.0.0", 387 | "engines": { 388 | "node": "20 || >=22" 389 | } 390 | }, 391 | "node_modules/mdn-data": { 392 | "version": "2.12.2", 393 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 394 | "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", 395 | "license": "CC0-1.0" 396 | }, 397 | "node_modules/ms": { 398 | "version": "2.1.3", 399 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 400 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 401 | "license": "MIT" 402 | }, 403 | "node_modules/parse5": { 404 | "version": "8.0.0", 405 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", 406 | "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", 407 | "license": "MIT", 408 | "dependencies": { 409 | "entities": "^6.0.0" 410 | }, 411 | "funding": { 412 | "url": "https://github.com/inikulin/parse5?sponsor=1" 413 | } 414 | }, 415 | "node_modules/punycode": { 416 | "version": "2.3.1", 417 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 418 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 419 | "license": "MIT", 420 | "engines": { 421 | "node": ">=6" 422 | } 423 | }, 424 | "node_modules/require-from-string": { 425 | "version": "2.0.2", 426 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 427 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 428 | "license": "MIT", 429 | "engines": { 430 | "node": ">=0.10.0" 431 | } 432 | }, 433 | "node_modules/rrweb-cssom": { 434 | "version": "0.8.0", 435 | "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", 436 | "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", 437 | "license": "MIT" 438 | }, 439 | "node_modules/safer-buffer": { 440 | "version": "2.1.2", 441 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 442 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 443 | "license": "MIT" 444 | }, 445 | "node_modules/saxes": { 446 | "version": "6.0.0", 447 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", 448 | "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", 449 | "license": "ISC", 450 | "dependencies": { 451 | "xmlchars": "^2.2.0" 452 | }, 453 | "engines": { 454 | "node": ">=v12.22.7" 455 | } 456 | }, 457 | "node_modules/source-map-js": { 458 | "version": "1.2.1", 459 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 460 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 461 | "license": "BSD-3-Clause", 462 | "engines": { 463 | "node": ">=0.10.0" 464 | } 465 | }, 466 | "node_modules/symbol-tree": { 467 | "version": "3.2.4", 468 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 469 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 470 | "license": "MIT" 471 | }, 472 | "node_modules/tldts": { 473 | "version": "7.0.19", 474 | "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.19.tgz", 475 | "integrity": "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==", 476 | "license": "MIT", 477 | "dependencies": { 478 | "tldts-core": "^7.0.19" 479 | }, 480 | "bin": { 481 | "tldts": "bin/cli.js" 482 | } 483 | }, 484 | "node_modules/tldts-core": { 485 | "version": "7.0.19", 486 | "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.19.tgz", 487 | "integrity": "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==", 488 | "license": "MIT" 489 | }, 490 | "node_modules/tough-cookie": { 491 | "version": "6.0.0", 492 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", 493 | "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", 494 | "license": "BSD-3-Clause", 495 | "dependencies": { 496 | "tldts": "^7.0.5" 497 | }, 498 | "engines": { 499 | "node": ">=16" 500 | } 501 | }, 502 | "node_modules/tr46": { 503 | "version": "6.0.0", 504 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", 505 | "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", 506 | "license": "MIT", 507 | "dependencies": { 508 | "punycode": "^2.3.1" 509 | }, 510 | "engines": { 511 | "node": ">=20" 512 | } 513 | }, 514 | "node_modules/turndown": { 515 | "version": "7.2.2", 516 | "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", 517 | "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==", 518 | "license": "MIT", 519 | "dependencies": { 520 | "@mixmark-io/domino": "^2.2.0" 521 | } 522 | }, 523 | "node_modules/turndown-plugin-gfm": { 524 | "version": "1.0.2", 525 | "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", 526 | "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", 527 | "license": "MIT" 528 | }, 529 | "node_modules/w3c-xmlserializer": { 530 | "version": "5.0.0", 531 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", 532 | "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", 533 | "license": "MIT", 534 | "dependencies": { 535 | "xml-name-validator": "^5.0.0" 536 | }, 537 | "engines": { 538 | "node": ">=18" 539 | } 540 | }, 541 | "node_modules/webidl-conversions": { 542 | "version": "8.0.0", 543 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz", 544 | "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==", 545 | "license": "BSD-2-Clause", 546 | "engines": { 547 | "node": ">=20" 548 | } 549 | }, 550 | "node_modules/whatwg-encoding": { 551 | "version": "3.1.1", 552 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", 553 | "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", 554 | "license": "MIT", 555 | "dependencies": { 556 | "iconv-lite": "0.6.3" 557 | }, 558 | "engines": { 559 | "node": ">=18" 560 | } 561 | }, 562 | "node_modules/whatwg-mimetype": { 563 | "version": "4.0.0", 564 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", 565 | "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", 566 | "license": "MIT", 567 | "engines": { 568 | "node": ">=18" 569 | } 570 | }, 571 | "node_modules/whatwg-url": { 572 | "version": "15.1.0", 573 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", 574 | "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", 575 | "license": "MIT", 576 | "dependencies": { 577 | "tr46": "^6.0.0", 578 | "webidl-conversions": "^8.0.0" 579 | }, 580 | "engines": { 581 | "node": ">=20" 582 | } 583 | }, 584 | "node_modules/ws": { 585 | "version": "8.18.3", 586 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", 587 | "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", 588 | "license": "MIT", 589 | "engines": { 590 | "node": ">=10.0.0" 591 | }, 592 | "peerDependencies": { 593 | "bufferutil": "^4.0.1", 594 | "utf-8-validate": ">=5.0.2" 595 | }, 596 | "peerDependenciesMeta": { 597 | "bufferutil": { 598 | "optional": true 599 | }, 600 | "utf-8-validate": { 601 | "optional": true 602 | } 603 | } 604 | }, 605 | "node_modules/xml-name-validator": { 606 | "version": "5.0.0", 607 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", 608 | "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", 609 | "license": "Apache-2.0", 610 | "engines": { 611 | "node": ">=18" 612 | } 613 | }, 614 | "node_modules/xmlchars": { 615 | "version": "2.2.0", 616 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 617 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 618 | "license": "MIT" 619 | } 620 | } 621 | } 622 | -------------------------------------------------------------------------------- /browser-tools/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "browser-tools", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "browser-tools", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@mozilla/readability": "^0.6.0", 13 | "cheerio": "^1.1.2", 14 | "jsdom": "^27.0.1", 15 | "puppeteer": "^24.31.0", 16 | "puppeteer-core": "^23.11.1", 17 | "puppeteer-extra": "^3.3.6", 18 | "puppeteer-extra-plugin-stealth": "^2.11.2", 19 | "turndown": "^7.2.2", 20 | "turndown-plugin-gfm": "^1.0.2" 21 | } 22 | }, 23 | "node_modules/@asamuzakjp/css-color": { 24 | "version": "4.1.0", 25 | "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.0.tgz", 26 | "integrity": "sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==", 27 | "license": "MIT", 28 | "dependencies": { 29 | "@csstools/css-calc": "^2.1.4", 30 | "@csstools/css-color-parser": "^3.1.0", 31 | "@csstools/css-parser-algorithms": "^3.0.5", 32 | "@csstools/css-tokenizer": "^3.0.4", 33 | "lru-cache": "^11.2.2" 34 | } 35 | }, 36 | "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { 37 | "version": "11.2.2", 38 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", 39 | "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", 40 | "license": "ISC", 41 | "engines": { 42 | "node": "20 || >=22" 43 | } 44 | }, 45 | "node_modules/@asamuzakjp/dom-selector": { 46 | "version": "6.7.4", 47 | "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.7.4.tgz", 48 | "integrity": "sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==", 49 | "license": "MIT", 50 | "dependencies": { 51 | "@asamuzakjp/nwsapi": "^2.3.9", 52 | "bidi-js": "^1.0.3", 53 | "css-tree": "^3.1.0", 54 | "is-potential-custom-element-name": "^1.0.1", 55 | "lru-cache": "^11.2.2" 56 | } 57 | }, 58 | "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { 59 | "version": "11.2.2", 60 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", 61 | "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", 62 | "license": "ISC", 63 | "engines": { 64 | "node": "20 || >=22" 65 | } 66 | }, 67 | "node_modules/@asamuzakjp/nwsapi": { 68 | "version": "2.3.9", 69 | "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", 70 | "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", 71 | "license": "MIT" 72 | }, 73 | "node_modules/@babel/code-frame": { 74 | "version": "7.27.1", 75 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 76 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 77 | "license": "MIT", 78 | "dependencies": { 79 | "@babel/helper-validator-identifier": "^7.27.1", 80 | "js-tokens": "^4.0.0", 81 | "picocolors": "^1.1.1" 82 | }, 83 | "engines": { 84 | "node": ">=6.9.0" 85 | } 86 | }, 87 | "node_modules/@babel/helper-validator-identifier": { 88 | "version": "7.28.5", 89 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 90 | "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 91 | "license": "MIT", 92 | "engines": { 93 | "node": ">=6.9.0" 94 | } 95 | }, 96 | "node_modules/@csstools/color-helpers": { 97 | "version": "5.1.0", 98 | "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", 99 | "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", 100 | "funding": [ 101 | { 102 | "type": "github", 103 | "url": "https://github.com/sponsors/csstools" 104 | }, 105 | { 106 | "type": "opencollective", 107 | "url": "https://opencollective.com/csstools" 108 | } 109 | ], 110 | "license": "MIT-0", 111 | "engines": { 112 | "node": ">=18" 113 | } 114 | }, 115 | "node_modules/@csstools/css-calc": { 116 | "version": "2.1.4", 117 | "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", 118 | "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", 119 | "funding": [ 120 | { 121 | "type": "github", 122 | "url": "https://github.com/sponsors/csstools" 123 | }, 124 | { 125 | "type": "opencollective", 126 | "url": "https://opencollective.com/csstools" 127 | } 128 | ], 129 | "license": "MIT", 130 | "engines": { 131 | "node": ">=18" 132 | }, 133 | "peerDependencies": { 134 | "@csstools/css-parser-algorithms": "^3.0.5", 135 | "@csstools/css-tokenizer": "^3.0.4" 136 | } 137 | }, 138 | "node_modules/@csstools/css-color-parser": { 139 | "version": "3.1.0", 140 | "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", 141 | "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", 142 | "funding": [ 143 | { 144 | "type": "github", 145 | "url": "https://github.com/sponsors/csstools" 146 | }, 147 | { 148 | "type": "opencollective", 149 | "url": "https://opencollective.com/csstools" 150 | } 151 | ], 152 | "license": "MIT", 153 | "dependencies": { 154 | "@csstools/color-helpers": "^5.1.0", 155 | "@csstools/css-calc": "^2.1.4" 156 | }, 157 | "engines": { 158 | "node": ">=18" 159 | }, 160 | "peerDependencies": { 161 | "@csstools/css-parser-algorithms": "^3.0.5", 162 | "@csstools/css-tokenizer": "^3.0.4" 163 | } 164 | }, 165 | "node_modules/@csstools/css-parser-algorithms": { 166 | "version": "3.0.5", 167 | "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", 168 | "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", 169 | "funding": [ 170 | { 171 | "type": "github", 172 | "url": "https://github.com/sponsors/csstools" 173 | }, 174 | { 175 | "type": "opencollective", 176 | "url": "https://opencollective.com/csstools" 177 | } 178 | ], 179 | "license": "MIT", 180 | "engines": { 181 | "node": ">=18" 182 | }, 183 | "peerDependencies": { 184 | "@csstools/css-tokenizer": "^3.0.4" 185 | } 186 | }, 187 | "node_modules/@csstools/css-syntax-patches-for-csstree": { 188 | "version": "1.0.17", 189 | "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.17.tgz", 190 | "integrity": "sha512-LCC++2h8pLUSPY+EsZmrrJ1EOUu+5iClpEiDhhdw3zRJpPbABML/N5lmRuBHjxtKm9VnRcsUzioyD0sekFMF0A==", 191 | "funding": [ 192 | { 193 | "type": "github", 194 | "url": "https://github.com/sponsors/csstools" 195 | }, 196 | { 197 | "type": "opencollective", 198 | "url": "https://opencollective.com/csstools" 199 | } 200 | ], 201 | "license": "MIT-0", 202 | "engines": { 203 | "node": ">=18" 204 | } 205 | }, 206 | "node_modules/@csstools/css-tokenizer": { 207 | "version": "3.0.4", 208 | "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", 209 | "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", 210 | "funding": [ 211 | { 212 | "type": "github", 213 | "url": "https://github.com/sponsors/csstools" 214 | }, 215 | { 216 | "type": "opencollective", 217 | "url": "https://opencollective.com/csstools" 218 | } 219 | ], 220 | "license": "MIT", 221 | "engines": { 222 | "node": ">=18" 223 | } 224 | }, 225 | "node_modules/@mixmark-io/domino": { 226 | "version": "2.2.0", 227 | "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", 228 | "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", 229 | "license": "BSD-2-Clause" 230 | }, 231 | "node_modules/@mozilla/readability": { 232 | "version": "0.6.0", 233 | "resolved": "https://registry.npmjs.org/@mozilla/readability/-/readability-0.6.0.tgz", 234 | "integrity": "sha512-juG5VWh4qAivzTAeMzvY9xs9HY5rAcr2E4I7tiSSCokRFi7XIZCAu92ZkSTsIj1OPceCifL3cpfteP3pDT9/QQ==", 235 | "license": "Apache-2.0", 236 | "engines": { 237 | "node": ">=14.0.0" 238 | } 239 | }, 240 | "node_modules/@puppeteer/browsers": { 241 | "version": "2.6.1", 242 | "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", 243 | "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", 244 | "license": "Apache-2.0", 245 | "dependencies": { 246 | "debug": "^4.4.0", 247 | "extract-zip": "^2.0.1", 248 | "progress": "^2.0.3", 249 | "proxy-agent": "^6.5.0", 250 | "semver": "^7.6.3", 251 | "tar-fs": "^3.0.6", 252 | "unbzip2-stream": "^1.4.3", 253 | "yargs": "^17.7.2" 254 | }, 255 | "bin": { 256 | "browsers": "lib/cjs/main-cli.js" 257 | }, 258 | "engines": { 259 | "node": ">=18" 260 | } 261 | }, 262 | "node_modules/@tootallnate/quickjs-emscripten": { 263 | "version": "0.23.0", 264 | "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", 265 | "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", 266 | "license": "MIT" 267 | }, 268 | "node_modules/@types/debug": { 269 | "version": "4.1.12", 270 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", 271 | "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", 272 | "license": "MIT", 273 | "dependencies": { 274 | "@types/ms": "*" 275 | } 276 | }, 277 | "node_modules/@types/ms": { 278 | "version": "2.1.0", 279 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", 280 | "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", 281 | "license": "MIT" 282 | }, 283 | "node_modules/@types/node": { 284 | "version": "24.9.2", 285 | "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", 286 | "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", 287 | "license": "MIT", 288 | "optional": true, 289 | "dependencies": { 290 | "undici-types": "~7.16.0" 291 | } 292 | }, 293 | "node_modules/@types/yauzl": { 294 | "version": "2.10.3", 295 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", 296 | "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", 297 | "license": "MIT", 298 | "optional": true, 299 | "dependencies": { 300 | "@types/node": "*" 301 | } 302 | }, 303 | "node_modules/agent-base": { 304 | "version": "7.1.4", 305 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", 306 | "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", 307 | "license": "MIT", 308 | "engines": { 309 | "node": ">= 14" 310 | } 311 | }, 312 | "node_modules/ansi-regex": { 313 | "version": "5.0.1", 314 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 315 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 316 | "license": "MIT", 317 | "engines": { 318 | "node": ">=8" 319 | } 320 | }, 321 | "node_modules/ansi-styles": { 322 | "version": "4.3.0", 323 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 324 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 325 | "license": "MIT", 326 | "dependencies": { 327 | "color-convert": "^2.0.1" 328 | }, 329 | "engines": { 330 | "node": ">=8" 331 | }, 332 | "funding": { 333 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 334 | } 335 | }, 336 | "node_modules/argparse": { 337 | "version": "2.0.1", 338 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 339 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 340 | "license": "Python-2.0" 341 | }, 342 | "node_modules/arr-union": { 343 | "version": "3.1.0", 344 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 345 | "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", 346 | "license": "MIT", 347 | "engines": { 348 | "node": ">=0.10.0" 349 | } 350 | }, 351 | "node_modules/ast-types": { 352 | "version": "0.13.4", 353 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", 354 | "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", 355 | "license": "MIT", 356 | "dependencies": { 357 | "tslib": "^2.0.1" 358 | }, 359 | "engines": { 360 | "node": ">=4" 361 | } 362 | }, 363 | "node_modules/b4a": { 364 | "version": "1.7.3", 365 | "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", 366 | "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", 367 | "license": "Apache-2.0", 368 | "peerDependencies": { 369 | "react-native-b4a": "*" 370 | }, 371 | "peerDependenciesMeta": { 372 | "react-native-b4a": { 373 | "optional": true 374 | } 375 | } 376 | }, 377 | "node_modules/balanced-match": { 378 | "version": "1.0.2", 379 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 380 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 381 | "license": "MIT" 382 | }, 383 | "node_modules/bare-events": { 384 | "version": "2.8.1", 385 | "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.1.tgz", 386 | "integrity": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==", 387 | "license": "Apache-2.0", 388 | "peerDependencies": { 389 | "bare-abort-controller": "*" 390 | }, 391 | "peerDependenciesMeta": { 392 | "bare-abort-controller": { 393 | "optional": true 394 | } 395 | } 396 | }, 397 | "node_modules/bare-fs": { 398 | "version": "4.5.0", 399 | "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.0.tgz", 400 | "integrity": "sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ==", 401 | "license": "Apache-2.0", 402 | "optional": true, 403 | "dependencies": { 404 | "bare-events": "^2.5.4", 405 | "bare-path": "^3.0.0", 406 | "bare-stream": "^2.6.4", 407 | "bare-url": "^2.2.2", 408 | "fast-fifo": "^1.3.2" 409 | }, 410 | "engines": { 411 | "bare": ">=1.16.0" 412 | }, 413 | "peerDependencies": { 414 | "bare-buffer": "*" 415 | }, 416 | "peerDependenciesMeta": { 417 | "bare-buffer": { 418 | "optional": true 419 | } 420 | } 421 | }, 422 | "node_modules/bare-os": { 423 | "version": "3.6.2", 424 | "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", 425 | "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", 426 | "license": "Apache-2.0", 427 | "optional": true, 428 | "engines": { 429 | "bare": ">=1.14.0" 430 | } 431 | }, 432 | "node_modules/bare-path": { 433 | "version": "3.0.0", 434 | "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", 435 | "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", 436 | "license": "Apache-2.0", 437 | "optional": true, 438 | "dependencies": { 439 | "bare-os": "^3.0.1" 440 | } 441 | }, 442 | "node_modules/bare-stream": { 443 | "version": "2.7.0", 444 | "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", 445 | "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", 446 | "license": "Apache-2.0", 447 | "optional": true, 448 | "dependencies": { 449 | "streamx": "^2.21.0" 450 | }, 451 | "peerDependencies": { 452 | "bare-buffer": "*", 453 | "bare-events": "*" 454 | }, 455 | "peerDependenciesMeta": { 456 | "bare-buffer": { 457 | "optional": true 458 | }, 459 | "bare-events": { 460 | "optional": true 461 | } 462 | } 463 | }, 464 | "node_modules/bare-url": { 465 | "version": "2.3.2", 466 | "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", 467 | "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", 468 | "license": "Apache-2.0", 469 | "optional": true, 470 | "dependencies": { 471 | "bare-path": "^3.0.0" 472 | } 473 | }, 474 | "node_modules/base64-js": { 475 | "version": "1.5.1", 476 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 477 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 478 | "funding": [ 479 | { 480 | "type": "github", 481 | "url": "https://github.com/sponsors/feross" 482 | }, 483 | { 484 | "type": "patreon", 485 | "url": "https://www.patreon.com/feross" 486 | }, 487 | { 488 | "type": "consulting", 489 | "url": "https://feross.org/support" 490 | } 491 | ], 492 | "license": "MIT" 493 | }, 494 | "node_modules/basic-ftp": { 495 | "version": "5.0.5", 496 | "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", 497 | "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", 498 | "license": "MIT", 499 | "engines": { 500 | "node": ">=10.0.0" 501 | } 502 | }, 503 | "node_modules/bidi-js": { 504 | "version": "1.0.3", 505 | "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", 506 | "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", 507 | "license": "MIT", 508 | "dependencies": { 509 | "require-from-string": "^2.0.2" 510 | } 511 | }, 512 | "node_modules/boolbase": { 513 | "version": "1.0.0", 514 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 515 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", 516 | "license": "ISC" 517 | }, 518 | "node_modules/brace-expansion": { 519 | "version": "1.1.12", 520 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 521 | "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 522 | "license": "MIT", 523 | "dependencies": { 524 | "balanced-match": "^1.0.0", 525 | "concat-map": "0.0.1" 526 | } 527 | }, 528 | "node_modules/buffer": { 529 | "version": "5.7.1", 530 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 531 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 532 | "funding": [ 533 | { 534 | "type": "github", 535 | "url": "https://github.com/sponsors/feross" 536 | }, 537 | { 538 | "type": "patreon", 539 | "url": "https://www.patreon.com/feross" 540 | }, 541 | { 542 | "type": "consulting", 543 | "url": "https://feross.org/support" 544 | } 545 | ], 546 | "license": "MIT", 547 | "dependencies": { 548 | "base64-js": "^1.3.1", 549 | "ieee754": "^1.1.13" 550 | } 551 | }, 552 | "node_modules/buffer-crc32": { 553 | "version": "0.2.13", 554 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 555 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 556 | "license": "MIT", 557 | "engines": { 558 | "node": "*" 559 | } 560 | }, 561 | "node_modules/callsites": { 562 | "version": "3.1.0", 563 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 564 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 565 | "license": "MIT", 566 | "engines": { 567 | "node": ">=6" 568 | } 569 | }, 570 | "node_modules/cheerio": { 571 | "version": "1.1.2", 572 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", 573 | "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", 574 | "license": "MIT", 575 | "dependencies": { 576 | "cheerio-select": "^2.1.0", 577 | "dom-serializer": "^2.0.0", 578 | "domhandler": "^5.0.3", 579 | "domutils": "^3.2.2", 580 | "encoding-sniffer": "^0.2.1", 581 | "htmlparser2": "^10.0.0", 582 | "parse5": "^7.3.0", 583 | "parse5-htmlparser2-tree-adapter": "^7.1.0", 584 | "parse5-parser-stream": "^7.1.2", 585 | "undici": "^7.12.0", 586 | "whatwg-mimetype": "^4.0.0" 587 | }, 588 | "engines": { 589 | "node": ">=20.18.1" 590 | }, 591 | "funding": { 592 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1" 593 | } 594 | }, 595 | "node_modules/cheerio-select": { 596 | "version": "2.1.0", 597 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", 598 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", 599 | "license": "BSD-2-Clause", 600 | "dependencies": { 601 | "boolbase": "^1.0.0", 602 | "css-select": "^5.1.0", 603 | "css-what": "^6.1.0", 604 | "domelementtype": "^2.3.0", 605 | "domhandler": "^5.0.3", 606 | "domutils": "^3.0.1" 607 | }, 608 | "funding": { 609 | "url": "https://github.com/sponsors/fb55" 610 | } 611 | }, 612 | "node_modules/chromium-bidi": { 613 | "version": "0.11.0", 614 | "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz", 615 | "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==", 616 | "license": "Apache-2.0", 617 | "dependencies": { 618 | "mitt": "3.0.1", 619 | "zod": "3.23.8" 620 | }, 621 | "peerDependencies": { 622 | "devtools-protocol": "*" 623 | } 624 | }, 625 | "node_modules/cliui": { 626 | "version": "8.0.1", 627 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 628 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 629 | "license": "ISC", 630 | "dependencies": { 631 | "string-width": "^4.2.0", 632 | "strip-ansi": "^6.0.1", 633 | "wrap-ansi": "^7.0.0" 634 | }, 635 | "engines": { 636 | "node": ">=12" 637 | } 638 | }, 639 | "node_modules/clone-deep": { 640 | "version": "0.2.4", 641 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", 642 | "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==", 643 | "license": "MIT", 644 | "dependencies": { 645 | "for-own": "^0.1.3", 646 | "is-plain-object": "^2.0.1", 647 | "kind-of": "^3.0.2", 648 | "lazy-cache": "^1.0.3", 649 | "shallow-clone": "^0.1.2" 650 | }, 651 | "engines": { 652 | "node": ">=0.10.0" 653 | } 654 | }, 655 | "node_modules/color-convert": { 656 | "version": "2.0.1", 657 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 658 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 659 | "license": "MIT", 660 | "dependencies": { 661 | "color-name": "~1.1.4" 662 | }, 663 | "engines": { 664 | "node": ">=7.0.0" 665 | } 666 | }, 667 | "node_modules/color-name": { 668 | "version": "1.1.4", 669 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 670 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 671 | "license": "MIT" 672 | }, 673 | "node_modules/concat-map": { 674 | "version": "0.0.1", 675 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 676 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 677 | "license": "MIT" 678 | }, 679 | "node_modules/cosmiconfig": { 680 | "version": "9.0.0", 681 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", 682 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 683 | "license": "MIT", 684 | "dependencies": { 685 | "env-paths": "^2.2.1", 686 | "import-fresh": "^3.3.0", 687 | "js-yaml": "^4.1.0", 688 | "parse-json": "^5.2.0" 689 | }, 690 | "engines": { 691 | "node": ">=14" 692 | }, 693 | "funding": { 694 | "url": "https://github.com/sponsors/d-fischer" 695 | }, 696 | "peerDependencies": { 697 | "typescript": ">=4.9.5" 698 | }, 699 | "peerDependenciesMeta": { 700 | "typescript": { 701 | "optional": true 702 | } 703 | } 704 | }, 705 | "node_modules/css-select": { 706 | "version": "5.2.2", 707 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", 708 | "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", 709 | "license": "BSD-2-Clause", 710 | "dependencies": { 711 | "boolbase": "^1.0.0", 712 | "css-what": "^6.1.0", 713 | "domhandler": "^5.0.2", 714 | "domutils": "^3.0.1", 715 | "nth-check": "^2.0.1" 716 | }, 717 | "funding": { 718 | "url": "https://github.com/sponsors/fb55" 719 | } 720 | }, 721 | "node_modules/css-tree": { 722 | "version": "3.1.0", 723 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", 724 | "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", 725 | "license": "MIT", 726 | "dependencies": { 727 | "mdn-data": "2.12.2", 728 | "source-map-js": "^1.0.1" 729 | }, 730 | "engines": { 731 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 732 | } 733 | }, 734 | "node_modules/css-what": { 735 | "version": "6.2.2", 736 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", 737 | "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", 738 | "license": "BSD-2-Clause", 739 | "engines": { 740 | "node": ">= 6" 741 | }, 742 | "funding": { 743 | "url": "https://github.com/sponsors/fb55" 744 | } 745 | }, 746 | "node_modules/cssstyle": { 747 | "version": "5.3.3", 748 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.3.tgz", 749 | "integrity": "sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==", 750 | "license": "MIT", 751 | "dependencies": { 752 | "@asamuzakjp/css-color": "^4.0.3", 753 | "@csstools/css-syntax-patches-for-csstree": "^1.0.14", 754 | "css-tree": "^3.1.0" 755 | }, 756 | "engines": { 757 | "node": ">=20" 758 | } 759 | }, 760 | "node_modules/data-uri-to-buffer": { 761 | "version": "6.0.2", 762 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", 763 | "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", 764 | "license": "MIT", 765 | "engines": { 766 | "node": ">= 14" 767 | } 768 | }, 769 | "node_modules/data-urls": { 770 | "version": "6.0.0", 771 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", 772 | "integrity": "sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==", 773 | "license": "MIT", 774 | "dependencies": { 775 | "whatwg-mimetype": "^4.0.0", 776 | "whatwg-url": "^15.0.0" 777 | }, 778 | "engines": { 779 | "node": ">=20" 780 | } 781 | }, 782 | "node_modules/debug": { 783 | "version": "4.4.3", 784 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 785 | "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 786 | "license": "MIT", 787 | "dependencies": { 788 | "ms": "^2.1.3" 789 | }, 790 | "engines": { 791 | "node": ">=6.0" 792 | }, 793 | "peerDependenciesMeta": { 794 | "supports-color": { 795 | "optional": true 796 | } 797 | } 798 | }, 799 | "node_modules/decimal.js": { 800 | "version": "10.6.0", 801 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", 802 | "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", 803 | "license": "MIT" 804 | }, 805 | "node_modules/deepmerge": { 806 | "version": "4.3.1", 807 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 808 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 809 | "license": "MIT", 810 | "engines": { 811 | "node": ">=0.10.0" 812 | } 813 | }, 814 | "node_modules/degenerator": { 815 | "version": "5.0.1", 816 | "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", 817 | "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", 818 | "license": "MIT", 819 | "dependencies": { 820 | "ast-types": "^0.13.4", 821 | "escodegen": "^2.1.0", 822 | "esprima": "^4.0.1" 823 | }, 824 | "engines": { 825 | "node": ">= 14" 826 | } 827 | }, 828 | "node_modules/devtools-protocol": { 829 | "version": "0.0.1367902", 830 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", 831 | "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", 832 | "license": "BSD-3-Clause" 833 | }, 834 | "node_modules/dom-serializer": { 835 | "version": "2.0.0", 836 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 837 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 838 | "license": "MIT", 839 | "dependencies": { 840 | "domelementtype": "^2.3.0", 841 | "domhandler": "^5.0.2", 842 | "entities": "^4.2.0" 843 | }, 844 | "funding": { 845 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 846 | } 847 | }, 848 | "node_modules/domelementtype": { 849 | "version": "2.3.0", 850 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 851 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 852 | "funding": [ 853 | { 854 | "type": "github", 855 | "url": "https://github.com/sponsors/fb55" 856 | } 857 | ], 858 | "license": "BSD-2-Clause" 859 | }, 860 | "node_modules/domhandler": { 861 | "version": "5.0.3", 862 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 863 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 864 | "license": "BSD-2-Clause", 865 | "dependencies": { 866 | "domelementtype": "^2.3.0" 867 | }, 868 | "engines": { 869 | "node": ">= 4" 870 | }, 871 | "funding": { 872 | "url": "https://github.com/fb55/domhandler?sponsor=1" 873 | } 874 | }, 875 | "node_modules/domutils": { 876 | "version": "3.2.2", 877 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", 878 | "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 879 | "license": "BSD-2-Clause", 880 | "dependencies": { 881 | "dom-serializer": "^2.0.0", 882 | "domelementtype": "^2.3.0", 883 | "domhandler": "^5.0.3" 884 | }, 885 | "funding": { 886 | "url": "https://github.com/fb55/domutils?sponsor=1" 887 | } 888 | }, 889 | "node_modules/emoji-regex": { 890 | "version": "8.0.0", 891 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 892 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 893 | "license": "MIT" 894 | }, 895 | "node_modules/encoding-sniffer": { 896 | "version": "0.2.1", 897 | "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", 898 | "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", 899 | "license": "MIT", 900 | "dependencies": { 901 | "iconv-lite": "^0.6.3", 902 | "whatwg-encoding": "^3.1.1" 903 | }, 904 | "funding": { 905 | "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" 906 | } 907 | }, 908 | "node_modules/end-of-stream": { 909 | "version": "1.4.5", 910 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", 911 | "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", 912 | "license": "MIT", 913 | "dependencies": { 914 | "once": "^1.4.0" 915 | } 916 | }, 917 | "node_modules/entities": { 918 | "version": "4.5.0", 919 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 920 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 921 | "license": "BSD-2-Clause", 922 | "engines": { 923 | "node": ">=0.12" 924 | }, 925 | "funding": { 926 | "url": "https://github.com/fb55/entities?sponsor=1" 927 | } 928 | }, 929 | "node_modules/env-paths": { 930 | "version": "2.2.1", 931 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 932 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 933 | "license": "MIT", 934 | "engines": { 935 | "node": ">=6" 936 | } 937 | }, 938 | "node_modules/error-ex": { 939 | "version": "1.3.4", 940 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", 941 | "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", 942 | "license": "MIT", 943 | "dependencies": { 944 | "is-arrayish": "^0.2.1" 945 | } 946 | }, 947 | "node_modules/escalade": { 948 | "version": "3.2.0", 949 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 950 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 951 | "license": "MIT", 952 | "engines": { 953 | "node": ">=6" 954 | } 955 | }, 956 | "node_modules/escodegen": { 957 | "version": "2.1.0", 958 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", 959 | "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", 960 | "license": "BSD-2-Clause", 961 | "dependencies": { 962 | "esprima": "^4.0.1", 963 | "estraverse": "^5.2.0", 964 | "esutils": "^2.0.2" 965 | }, 966 | "bin": { 967 | "escodegen": "bin/escodegen.js", 968 | "esgenerate": "bin/esgenerate.js" 969 | }, 970 | "engines": { 971 | "node": ">=6.0" 972 | }, 973 | "optionalDependencies": { 974 | "source-map": "~0.6.1" 975 | } 976 | }, 977 | "node_modules/esprima": { 978 | "version": "4.0.1", 979 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 980 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 981 | "license": "BSD-2-Clause", 982 | "bin": { 983 | "esparse": "bin/esparse.js", 984 | "esvalidate": "bin/esvalidate.js" 985 | }, 986 | "engines": { 987 | "node": ">=4" 988 | } 989 | }, 990 | "node_modules/estraverse": { 991 | "version": "5.3.0", 992 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 993 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 994 | "license": "BSD-2-Clause", 995 | "engines": { 996 | "node": ">=4.0" 997 | } 998 | }, 999 | "node_modules/esutils": { 1000 | "version": "2.0.3", 1001 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1002 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1003 | "license": "BSD-2-Clause", 1004 | "engines": { 1005 | "node": ">=0.10.0" 1006 | } 1007 | }, 1008 | "node_modules/events-universal": { 1009 | "version": "1.0.1", 1010 | "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", 1011 | "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", 1012 | "license": "Apache-2.0", 1013 | "dependencies": { 1014 | "bare-events": "^2.7.0" 1015 | } 1016 | }, 1017 | "node_modules/extract-zip": { 1018 | "version": "2.0.1", 1019 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 1020 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 1021 | "license": "BSD-2-Clause", 1022 | "dependencies": { 1023 | "debug": "^4.1.1", 1024 | "get-stream": "^5.1.0", 1025 | "yauzl": "^2.10.0" 1026 | }, 1027 | "bin": { 1028 | "extract-zip": "cli.js" 1029 | }, 1030 | "engines": { 1031 | "node": ">= 10.17.0" 1032 | }, 1033 | "optionalDependencies": { 1034 | "@types/yauzl": "^2.9.1" 1035 | } 1036 | }, 1037 | "node_modules/fast-fifo": { 1038 | "version": "1.3.2", 1039 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", 1040 | "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", 1041 | "license": "MIT" 1042 | }, 1043 | "node_modules/fd-slicer": { 1044 | "version": "1.1.0", 1045 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 1046 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 1047 | "license": "MIT", 1048 | "dependencies": { 1049 | "pend": "~1.2.0" 1050 | } 1051 | }, 1052 | "node_modules/for-in": { 1053 | "version": "1.0.2", 1054 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1055 | "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", 1056 | "license": "MIT", 1057 | "engines": { 1058 | "node": ">=0.10.0" 1059 | } 1060 | }, 1061 | "node_modules/for-own": { 1062 | "version": "0.1.5", 1063 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 1064 | "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", 1065 | "license": "MIT", 1066 | "dependencies": { 1067 | "for-in": "^1.0.1" 1068 | }, 1069 | "engines": { 1070 | "node": ">=0.10.0" 1071 | } 1072 | }, 1073 | "node_modules/fs-extra": { 1074 | "version": "10.1.0", 1075 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 1076 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 1077 | "license": "MIT", 1078 | "dependencies": { 1079 | "graceful-fs": "^4.2.0", 1080 | "jsonfile": "^6.0.1", 1081 | "universalify": "^2.0.0" 1082 | }, 1083 | "engines": { 1084 | "node": ">=12" 1085 | } 1086 | }, 1087 | "node_modules/fs.realpath": { 1088 | "version": "1.0.0", 1089 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1090 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1091 | "license": "ISC" 1092 | }, 1093 | "node_modules/get-caller-file": { 1094 | "version": "2.0.5", 1095 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1096 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1097 | "license": "ISC", 1098 | "engines": { 1099 | "node": "6.* || 8.* || >= 10.*" 1100 | } 1101 | }, 1102 | "node_modules/get-stream": { 1103 | "version": "5.2.0", 1104 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1105 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1106 | "license": "MIT", 1107 | "dependencies": { 1108 | "pump": "^3.0.0" 1109 | }, 1110 | "engines": { 1111 | "node": ">=8" 1112 | }, 1113 | "funding": { 1114 | "url": "https://github.com/sponsors/sindresorhus" 1115 | } 1116 | }, 1117 | "node_modules/get-uri": { 1118 | "version": "6.0.5", 1119 | "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", 1120 | "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", 1121 | "license": "MIT", 1122 | "dependencies": { 1123 | "basic-ftp": "^5.0.2", 1124 | "data-uri-to-buffer": "^6.0.2", 1125 | "debug": "^4.3.4" 1126 | }, 1127 | "engines": { 1128 | "node": ">= 14" 1129 | } 1130 | }, 1131 | "node_modules/glob": { 1132 | "version": "7.2.3", 1133 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1134 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1135 | "deprecated": "Glob versions prior to v9 are no longer supported", 1136 | "license": "ISC", 1137 | "dependencies": { 1138 | "fs.realpath": "^1.0.0", 1139 | "inflight": "^1.0.4", 1140 | "inherits": "2", 1141 | "minimatch": "^3.1.1", 1142 | "once": "^1.3.0", 1143 | "path-is-absolute": "^1.0.0" 1144 | }, 1145 | "engines": { 1146 | "node": "*" 1147 | }, 1148 | "funding": { 1149 | "url": "https://github.com/sponsors/isaacs" 1150 | } 1151 | }, 1152 | "node_modules/graceful-fs": { 1153 | "version": "4.2.11", 1154 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1155 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1156 | "license": "ISC" 1157 | }, 1158 | "node_modules/html-encoding-sniffer": { 1159 | "version": "4.0.0", 1160 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", 1161 | "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", 1162 | "license": "MIT", 1163 | "dependencies": { 1164 | "whatwg-encoding": "^3.1.1" 1165 | }, 1166 | "engines": { 1167 | "node": ">=18" 1168 | } 1169 | }, 1170 | "node_modules/htmlparser2": { 1171 | "version": "10.0.0", 1172 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", 1173 | "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", 1174 | "funding": [ 1175 | "https://github.com/fb55/htmlparser2?sponsor=1", 1176 | { 1177 | "type": "github", 1178 | "url": "https://github.com/sponsors/fb55" 1179 | } 1180 | ], 1181 | "license": "MIT", 1182 | "dependencies": { 1183 | "domelementtype": "^2.3.0", 1184 | "domhandler": "^5.0.3", 1185 | "domutils": "^3.2.1", 1186 | "entities": "^6.0.0" 1187 | } 1188 | }, 1189 | "node_modules/htmlparser2/node_modules/entities": { 1190 | "version": "6.0.1", 1191 | "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 1192 | "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 1193 | "license": "BSD-2-Clause", 1194 | "engines": { 1195 | "node": ">=0.12" 1196 | }, 1197 | "funding": { 1198 | "url": "https://github.com/fb55/entities?sponsor=1" 1199 | } 1200 | }, 1201 | "node_modules/http-proxy-agent": { 1202 | "version": "7.0.2", 1203 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 1204 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 1205 | "license": "MIT", 1206 | "dependencies": { 1207 | "agent-base": "^7.1.0", 1208 | "debug": "^4.3.4" 1209 | }, 1210 | "engines": { 1211 | "node": ">= 14" 1212 | } 1213 | }, 1214 | "node_modules/https-proxy-agent": { 1215 | "version": "7.0.6", 1216 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", 1217 | "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", 1218 | "license": "MIT", 1219 | "dependencies": { 1220 | "agent-base": "^7.1.2", 1221 | "debug": "4" 1222 | }, 1223 | "engines": { 1224 | "node": ">= 14" 1225 | } 1226 | }, 1227 | "node_modules/iconv-lite": { 1228 | "version": "0.6.3", 1229 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1230 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1231 | "license": "MIT", 1232 | "dependencies": { 1233 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1234 | }, 1235 | "engines": { 1236 | "node": ">=0.10.0" 1237 | } 1238 | }, 1239 | "node_modules/ieee754": { 1240 | "version": "1.2.1", 1241 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1242 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1243 | "funding": [ 1244 | { 1245 | "type": "github", 1246 | "url": "https://github.com/sponsors/feross" 1247 | }, 1248 | { 1249 | "type": "patreon", 1250 | "url": "https://www.patreon.com/feross" 1251 | }, 1252 | { 1253 | "type": "consulting", 1254 | "url": "https://feross.org/support" 1255 | } 1256 | ], 1257 | "license": "BSD-3-Clause" 1258 | }, 1259 | "node_modules/import-fresh": { 1260 | "version": "3.3.1", 1261 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 1262 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 1263 | "license": "MIT", 1264 | "dependencies": { 1265 | "parent-module": "^1.0.0", 1266 | "resolve-from": "^4.0.0" 1267 | }, 1268 | "engines": { 1269 | "node": ">=6" 1270 | }, 1271 | "funding": { 1272 | "url": "https://github.com/sponsors/sindresorhus" 1273 | } 1274 | }, 1275 | "node_modules/inflight": { 1276 | "version": "1.0.6", 1277 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1278 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1279 | "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.", 1280 | "license": "ISC", 1281 | "dependencies": { 1282 | "once": "^1.3.0", 1283 | "wrappy": "1" 1284 | } 1285 | }, 1286 | "node_modules/inherits": { 1287 | "version": "2.0.4", 1288 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1289 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1290 | "license": "ISC" 1291 | }, 1292 | "node_modules/ip-address": { 1293 | "version": "10.0.1", 1294 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", 1295 | "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", 1296 | "license": "MIT", 1297 | "engines": { 1298 | "node": ">= 12" 1299 | } 1300 | }, 1301 | "node_modules/is-arrayish": { 1302 | "version": "0.2.1", 1303 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1304 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1305 | "license": "MIT" 1306 | }, 1307 | "node_modules/is-buffer": { 1308 | "version": "1.1.6", 1309 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1310 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1311 | "license": "MIT" 1312 | }, 1313 | "node_modules/is-extendable": { 1314 | "version": "0.1.1", 1315 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1316 | "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", 1317 | "license": "MIT", 1318 | "engines": { 1319 | "node": ">=0.10.0" 1320 | } 1321 | }, 1322 | "node_modules/is-fullwidth-code-point": { 1323 | "version": "3.0.0", 1324 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1325 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1326 | "license": "MIT", 1327 | "engines": { 1328 | "node": ">=8" 1329 | } 1330 | }, 1331 | "node_modules/is-plain-object": { 1332 | "version": "2.0.4", 1333 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1334 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1335 | "license": "MIT", 1336 | "dependencies": { 1337 | "isobject": "^3.0.1" 1338 | }, 1339 | "engines": { 1340 | "node": ">=0.10.0" 1341 | } 1342 | }, 1343 | "node_modules/is-potential-custom-element-name": { 1344 | "version": "1.0.1", 1345 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 1346 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 1347 | "license": "MIT" 1348 | }, 1349 | "node_modules/isobject": { 1350 | "version": "3.0.1", 1351 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1352 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", 1353 | "license": "MIT", 1354 | "engines": { 1355 | "node": ">=0.10.0" 1356 | } 1357 | }, 1358 | "node_modules/js-tokens": { 1359 | "version": "4.0.0", 1360 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1361 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1362 | "license": "MIT" 1363 | }, 1364 | "node_modules/js-yaml": { 1365 | "version": "4.1.1", 1366 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 1367 | "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 1368 | "license": "MIT", 1369 | "dependencies": { 1370 | "argparse": "^2.0.1" 1371 | }, 1372 | "bin": { 1373 | "js-yaml": "bin/js-yaml.js" 1374 | } 1375 | }, 1376 | "node_modules/jsdom": { 1377 | "version": "27.0.1", 1378 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.0.1.tgz", 1379 | "integrity": "sha512-SNSQteBL1IlV2zqhwwolaG9CwhIhTvVHWg3kTss/cLE7H/X4644mtPQqYvCfsSrGQWt9hSZcgOXX8bOZaMN+kA==", 1380 | "license": "MIT", 1381 | "dependencies": { 1382 | "@asamuzakjp/dom-selector": "^6.7.2", 1383 | "cssstyle": "^5.3.1", 1384 | "data-urls": "^6.0.0", 1385 | "decimal.js": "^10.6.0", 1386 | "html-encoding-sniffer": "^4.0.0", 1387 | "http-proxy-agent": "^7.0.2", 1388 | "https-proxy-agent": "^7.0.6", 1389 | "is-potential-custom-element-name": "^1.0.1", 1390 | "parse5": "^8.0.0", 1391 | "rrweb-cssom": "^0.8.0", 1392 | "saxes": "^6.0.0", 1393 | "symbol-tree": "^3.2.4", 1394 | "tough-cookie": "^6.0.0", 1395 | "w3c-xmlserializer": "^5.0.0", 1396 | "webidl-conversions": "^8.0.0", 1397 | "whatwg-encoding": "^3.1.1", 1398 | "whatwg-mimetype": "^4.0.0", 1399 | "whatwg-url": "^15.1.0", 1400 | "ws": "^8.18.3", 1401 | "xml-name-validator": "^5.0.0" 1402 | }, 1403 | "engines": { 1404 | "node": ">=20" 1405 | }, 1406 | "peerDependencies": { 1407 | "canvas": "^3.0.0" 1408 | }, 1409 | "peerDependenciesMeta": { 1410 | "canvas": { 1411 | "optional": true 1412 | } 1413 | } 1414 | }, 1415 | "node_modules/jsdom/node_modules/entities": { 1416 | "version": "6.0.1", 1417 | "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 1418 | "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 1419 | "license": "BSD-2-Clause", 1420 | "engines": { 1421 | "node": ">=0.12" 1422 | }, 1423 | "funding": { 1424 | "url": "https://github.com/fb55/entities?sponsor=1" 1425 | } 1426 | }, 1427 | "node_modules/jsdom/node_modules/parse5": { 1428 | "version": "8.0.0", 1429 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", 1430 | "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", 1431 | "license": "MIT", 1432 | "dependencies": { 1433 | "entities": "^6.0.0" 1434 | }, 1435 | "funding": { 1436 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1437 | } 1438 | }, 1439 | "node_modules/json-parse-even-better-errors": { 1440 | "version": "2.3.1", 1441 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1442 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1443 | "license": "MIT" 1444 | }, 1445 | "node_modules/jsonfile": { 1446 | "version": "6.2.0", 1447 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", 1448 | "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", 1449 | "license": "MIT", 1450 | "dependencies": { 1451 | "universalify": "^2.0.0" 1452 | }, 1453 | "optionalDependencies": { 1454 | "graceful-fs": "^4.1.6" 1455 | } 1456 | }, 1457 | "node_modules/kind-of": { 1458 | "version": "3.2.2", 1459 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1460 | "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", 1461 | "license": "MIT", 1462 | "dependencies": { 1463 | "is-buffer": "^1.1.5" 1464 | }, 1465 | "engines": { 1466 | "node": ">=0.10.0" 1467 | } 1468 | }, 1469 | "node_modules/lazy-cache": { 1470 | "version": "1.0.4", 1471 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1472 | "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", 1473 | "license": "MIT", 1474 | "engines": { 1475 | "node": ">=0.10.0" 1476 | } 1477 | }, 1478 | "node_modules/lines-and-columns": { 1479 | "version": "1.2.4", 1480 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1481 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1482 | "license": "MIT" 1483 | }, 1484 | "node_modules/lru-cache": { 1485 | "version": "7.18.3", 1486 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", 1487 | "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", 1488 | "license": "ISC", 1489 | "engines": { 1490 | "node": ">=12" 1491 | } 1492 | }, 1493 | "node_modules/mdn-data": { 1494 | "version": "2.12.2", 1495 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", 1496 | "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", 1497 | "license": "CC0-1.0" 1498 | }, 1499 | "node_modules/merge-deep": { 1500 | "version": "3.0.3", 1501 | "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", 1502 | "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==", 1503 | "license": "MIT", 1504 | "dependencies": { 1505 | "arr-union": "^3.1.0", 1506 | "clone-deep": "^0.2.4", 1507 | "kind-of": "^3.0.2" 1508 | }, 1509 | "engines": { 1510 | "node": ">=0.10.0" 1511 | } 1512 | }, 1513 | "node_modules/minimatch": { 1514 | "version": "3.1.2", 1515 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1516 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1517 | "license": "ISC", 1518 | "dependencies": { 1519 | "brace-expansion": "^1.1.7" 1520 | }, 1521 | "engines": { 1522 | "node": "*" 1523 | } 1524 | }, 1525 | "node_modules/mitt": { 1526 | "version": "3.0.1", 1527 | "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", 1528 | "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", 1529 | "license": "MIT" 1530 | }, 1531 | "node_modules/mixin-object": { 1532 | "version": "2.0.1", 1533 | "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", 1534 | "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", 1535 | "license": "MIT", 1536 | "dependencies": { 1537 | "for-in": "^0.1.3", 1538 | "is-extendable": "^0.1.1" 1539 | }, 1540 | "engines": { 1541 | "node": ">=0.10.0" 1542 | } 1543 | }, 1544 | "node_modules/mixin-object/node_modules/for-in": { 1545 | "version": "0.1.8", 1546 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", 1547 | "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", 1548 | "license": "MIT", 1549 | "engines": { 1550 | "node": ">=0.10.0" 1551 | } 1552 | }, 1553 | "node_modules/ms": { 1554 | "version": "2.1.3", 1555 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1556 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1557 | "license": "MIT" 1558 | }, 1559 | "node_modules/netmask": { 1560 | "version": "2.0.2", 1561 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 1562 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 1563 | "license": "MIT", 1564 | "engines": { 1565 | "node": ">= 0.4.0" 1566 | } 1567 | }, 1568 | "node_modules/nth-check": { 1569 | "version": "2.1.1", 1570 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", 1571 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", 1572 | "license": "BSD-2-Clause", 1573 | "dependencies": { 1574 | "boolbase": "^1.0.0" 1575 | }, 1576 | "funding": { 1577 | "url": "https://github.com/fb55/nth-check?sponsor=1" 1578 | } 1579 | }, 1580 | "node_modules/once": { 1581 | "version": "1.4.0", 1582 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1583 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1584 | "license": "ISC", 1585 | "dependencies": { 1586 | "wrappy": "1" 1587 | } 1588 | }, 1589 | "node_modules/pac-proxy-agent": { 1590 | "version": "7.2.0", 1591 | "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", 1592 | "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", 1593 | "license": "MIT", 1594 | "dependencies": { 1595 | "@tootallnate/quickjs-emscripten": "^0.23.0", 1596 | "agent-base": "^7.1.2", 1597 | "debug": "^4.3.4", 1598 | "get-uri": "^6.0.1", 1599 | "http-proxy-agent": "^7.0.0", 1600 | "https-proxy-agent": "^7.0.6", 1601 | "pac-resolver": "^7.0.1", 1602 | "socks-proxy-agent": "^8.0.5" 1603 | }, 1604 | "engines": { 1605 | "node": ">= 14" 1606 | } 1607 | }, 1608 | "node_modules/pac-resolver": { 1609 | "version": "7.0.1", 1610 | "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", 1611 | "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", 1612 | "license": "MIT", 1613 | "dependencies": { 1614 | "degenerator": "^5.0.0", 1615 | "netmask": "^2.0.2" 1616 | }, 1617 | "engines": { 1618 | "node": ">= 14" 1619 | } 1620 | }, 1621 | "node_modules/parent-module": { 1622 | "version": "1.0.1", 1623 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1624 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1625 | "license": "MIT", 1626 | "dependencies": { 1627 | "callsites": "^3.0.0" 1628 | }, 1629 | "engines": { 1630 | "node": ">=6" 1631 | } 1632 | }, 1633 | "node_modules/parse-json": { 1634 | "version": "5.2.0", 1635 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1636 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1637 | "license": "MIT", 1638 | "dependencies": { 1639 | "@babel/code-frame": "^7.0.0", 1640 | "error-ex": "^1.3.1", 1641 | "json-parse-even-better-errors": "^2.3.0", 1642 | "lines-and-columns": "^1.1.6" 1643 | }, 1644 | "engines": { 1645 | "node": ">=8" 1646 | }, 1647 | "funding": { 1648 | "url": "https://github.com/sponsors/sindresorhus" 1649 | } 1650 | }, 1651 | "node_modules/parse5": { 1652 | "version": "7.3.0", 1653 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", 1654 | "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", 1655 | "license": "MIT", 1656 | "dependencies": { 1657 | "entities": "^6.0.0" 1658 | }, 1659 | "funding": { 1660 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1661 | } 1662 | }, 1663 | "node_modules/parse5-htmlparser2-tree-adapter": { 1664 | "version": "7.1.0", 1665 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", 1666 | "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", 1667 | "license": "MIT", 1668 | "dependencies": { 1669 | "domhandler": "^5.0.3", 1670 | "parse5": "^7.0.0" 1671 | }, 1672 | "funding": { 1673 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1674 | } 1675 | }, 1676 | "node_modules/parse5-parser-stream": { 1677 | "version": "7.1.2", 1678 | "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", 1679 | "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", 1680 | "license": "MIT", 1681 | "dependencies": { 1682 | "parse5": "^7.0.0" 1683 | }, 1684 | "funding": { 1685 | "url": "https://github.com/inikulin/parse5?sponsor=1" 1686 | } 1687 | }, 1688 | "node_modules/parse5/node_modules/entities": { 1689 | "version": "6.0.1", 1690 | "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 1691 | "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 1692 | "license": "BSD-2-Clause", 1693 | "engines": { 1694 | "node": ">=0.12" 1695 | }, 1696 | "funding": { 1697 | "url": "https://github.com/fb55/entities?sponsor=1" 1698 | } 1699 | }, 1700 | "node_modules/path-is-absolute": { 1701 | "version": "1.0.1", 1702 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1703 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1704 | "license": "MIT", 1705 | "engines": { 1706 | "node": ">=0.10.0" 1707 | } 1708 | }, 1709 | "node_modules/pend": { 1710 | "version": "1.2.0", 1711 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1712 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 1713 | "license": "MIT" 1714 | }, 1715 | "node_modules/picocolors": { 1716 | "version": "1.1.1", 1717 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1718 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1719 | "license": "ISC" 1720 | }, 1721 | "node_modules/progress": { 1722 | "version": "2.0.3", 1723 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1724 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1725 | "license": "MIT", 1726 | "engines": { 1727 | "node": ">=0.4.0" 1728 | } 1729 | }, 1730 | "node_modules/proxy-agent": { 1731 | "version": "6.5.0", 1732 | "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", 1733 | "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", 1734 | "license": "MIT", 1735 | "dependencies": { 1736 | "agent-base": "^7.1.2", 1737 | "debug": "^4.3.4", 1738 | "http-proxy-agent": "^7.0.1", 1739 | "https-proxy-agent": "^7.0.6", 1740 | "lru-cache": "^7.14.1", 1741 | "pac-proxy-agent": "^7.1.0", 1742 | "proxy-from-env": "^1.1.0", 1743 | "socks-proxy-agent": "^8.0.5" 1744 | }, 1745 | "engines": { 1746 | "node": ">= 14" 1747 | } 1748 | }, 1749 | "node_modules/proxy-from-env": { 1750 | "version": "1.1.0", 1751 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1752 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 1753 | "license": "MIT" 1754 | }, 1755 | "node_modules/pump": { 1756 | "version": "3.0.3", 1757 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", 1758 | "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", 1759 | "license": "MIT", 1760 | "dependencies": { 1761 | "end-of-stream": "^1.1.0", 1762 | "once": "^1.3.1" 1763 | } 1764 | }, 1765 | "node_modules/punycode": { 1766 | "version": "2.3.1", 1767 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1768 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1769 | "license": "MIT", 1770 | "engines": { 1771 | "node": ">=6" 1772 | } 1773 | }, 1774 | "node_modules/puppeteer": { 1775 | "version": "24.31.0", 1776 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.31.0.tgz", 1777 | "integrity": "sha512-q8y5yLxLD8xdZdzNWqdOL43NbfvUOp60SYhaLZQwHC9CdKldxQKXOyJAciOr7oUJfyAH/KgB2wKvqT2sFKoVXA==", 1778 | "hasInstallScript": true, 1779 | "license": "Apache-2.0", 1780 | "dependencies": { 1781 | "@puppeteer/browsers": "2.10.13", 1782 | "chromium-bidi": "11.0.0", 1783 | "cosmiconfig": "^9.0.0", 1784 | "devtools-protocol": "0.0.1521046", 1785 | "puppeteer-core": "24.31.0", 1786 | "typed-query-selector": "^2.12.0" 1787 | }, 1788 | "bin": { 1789 | "puppeteer": "lib/cjs/puppeteer/node/cli.js" 1790 | }, 1791 | "engines": { 1792 | "node": ">=18" 1793 | } 1794 | }, 1795 | "node_modules/puppeteer-core": { 1796 | "version": "23.11.1", 1797 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz", 1798 | "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==", 1799 | "license": "Apache-2.0", 1800 | "dependencies": { 1801 | "@puppeteer/browsers": "2.6.1", 1802 | "chromium-bidi": "0.11.0", 1803 | "debug": "^4.4.0", 1804 | "devtools-protocol": "0.0.1367902", 1805 | "typed-query-selector": "^2.12.0", 1806 | "ws": "^8.18.0" 1807 | }, 1808 | "engines": { 1809 | "node": ">=18" 1810 | } 1811 | }, 1812 | "node_modules/puppeteer-extra": { 1813 | "version": "3.3.6", 1814 | "resolved": "https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz", 1815 | "integrity": "sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A==", 1816 | "license": "MIT", 1817 | "dependencies": { 1818 | "@types/debug": "^4.1.0", 1819 | "debug": "^4.1.1", 1820 | "deepmerge": "^4.2.2" 1821 | }, 1822 | "engines": { 1823 | "node": ">=8" 1824 | }, 1825 | "peerDependencies": { 1826 | "@types/puppeteer": "*", 1827 | "puppeteer": "*", 1828 | "puppeteer-core": "*" 1829 | }, 1830 | "peerDependenciesMeta": { 1831 | "@types/puppeteer": { 1832 | "optional": true 1833 | }, 1834 | "puppeteer": { 1835 | "optional": true 1836 | }, 1837 | "puppeteer-core": { 1838 | "optional": true 1839 | } 1840 | } 1841 | }, 1842 | "node_modules/puppeteer-extra-plugin": { 1843 | "version": "3.2.3", 1844 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.2.3.tgz", 1845 | "integrity": "sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q==", 1846 | "license": "MIT", 1847 | "dependencies": { 1848 | "@types/debug": "^4.1.0", 1849 | "debug": "^4.1.1", 1850 | "merge-deep": "^3.0.1" 1851 | }, 1852 | "engines": { 1853 | "node": ">=9.11.2" 1854 | }, 1855 | "peerDependencies": { 1856 | "playwright-extra": "*", 1857 | "puppeteer-extra": "*" 1858 | }, 1859 | "peerDependenciesMeta": { 1860 | "playwright-extra": { 1861 | "optional": true 1862 | }, 1863 | "puppeteer-extra": { 1864 | "optional": true 1865 | } 1866 | } 1867 | }, 1868 | "node_modules/puppeteer-extra-plugin-stealth": { 1869 | "version": "2.11.2", 1870 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.11.2.tgz", 1871 | "integrity": "sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ==", 1872 | "license": "MIT", 1873 | "dependencies": { 1874 | "debug": "^4.1.1", 1875 | "puppeteer-extra-plugin": "^3.2.3", 1876 | "puppeteer-extra-plugin-user-preferences": "^2.4.1" 1877 | }, 1878 | "engines": { 1879 | "node": ">=8" 1880 | }, 1881 | "peerDependencies": { 1882 | "playwright-extra": "*", 1883 | "puppeteer-extra": "*" 1884 | }, 1885 | "peerDependenciesMeta": { 1886 | "playwright-extra": { 1887 | "optional": true 1888 | }, 1889 | "puppeteer-extra": { 1890 | "optional": true 1891 | } 1892 | } 1893 | }, 1894 | "node_modules/puppeteer-extra-plugin-user-data-dir": { 1895 | "version": "2.4.1", 1896 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.4.1.tgz", 1897 | "integrity": "sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g==", 1898 | "license": "MIT", 1899 | "dependencies": { 1900 | "debug": "^4.1.1", 1901 | "fs-extra": "^10.0.0", 1902 | "puppeteer-extra-plugin": "^3.2.3", 1903 | "rimraf": "^3.0.2" 1904 | }, 1905 | "engines": { 1906 | "node": ">=8" 1907 | }, 1908 | "peerDependencies": { 1909 | "playwright-extra": "*", 1910 | "puppeteer-extra": "*" 1911 | }, 1912 | "peerDependenciesMeta": { 1913 | "playwright-extra": { 1914 | "optional": true 1915 | }, 1916 | "puppeteer-extra": { 1917 | "optional": true 1918 | } 1919 | } 1920 | }, 1921 | "node_modules/puppeteer-extra-plugin-user-preferences": { 1922 | "version": "2.4.1", 1923 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.4.1.tgz", 1924 | "integrity": "sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A==", 1925 | "license": "MIT", 1926 | "dependencies": { 1927 | "debug": "^4.1.1", 1928 | "deepmerge": "^4.2.2", 1929 | "puppeteer-extra-plugin": "^3.2.3", 1930 | "puppeteer-extra-plugin-user-data-dir": "^2.4.1" 1931 | }, 1932 | "engines": { 1933 | "node": ">=8" 1934 | }, 1935 | "peerDependencies": { 1936 | "playwright-extra": "*", 1937 | "puppeteer-extra": "*" 1938 | }, 1939 | "peerDependenciesMeta": { 1940 | "playwright-extra": { 1941 | "optional": true 1942 | }, 1943 | "puppeteer-extra": { 1944 | "optional": true 1945 | } 1946 | } 1947 | }, 1948 | "node_modules/puppeteer/node_modules/@puppeteer/browsers": { 1949 | "version": "2.10.13", 1950 | "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", 1951 | "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", 1952 | "license": "Apache-2.0", 1953 | "dependencies": { 1954 | "debug": "^4.4.3", 1955 | "extract-zip": "^2.0.1", 1956 | "progress": "^2.0.3", 1957 | "proxy-agent": "^6.5.0", 1958 | "semver": "^7.7.3", 1959 | "tar-fs": "^3.1.1", 1960 | "yargs": "^17.7.2" 1961 | }, 1962 | "bin": { 1963 | "browsers": "lib/cjs/main-cli.js" 1964 | }, 1965 | "engines": { 1966 | "node": ">=18" 1967 | } 1968 | }, 1969 | "node_modules/puppeteer/node_modules/chromium-bidi": { 1970 | "version": "11.0.0", 1971 | "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", 1972 | "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", 1973 | "license": "Apache-2.0", 1974 | "dependencies": { 1975 | "mitt": "^3.0.1", 1976 | "zod": "^3.24.1" 1977 | }, 1978 | "peerDependencies": { 1979 | "devtools-protocol": "*" 1980 | } 1981 | }, 1982 | "node_modules/puppeteer/node_modules/devtools-protocol": { 1983 | "version": "0.0.1521046", 1984 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz", 1985 | "integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==", 1986 | "license": "BSD-3-Clause" 1987 | }, 1988 | "node_modules/puppeteer/node_modules/puppeteer-core": { 1989 | "version": "24.31.0", 1990 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.31.0.tgz", 1991 | "integrity": "sha512-pnAohhSZipWQoFpXuGV7xCZfaGhqcBR9C4pVrU0QSrcMi7tQMH9J9lDBqBvyMAHQqe8HCARuREqFuVKRQOgTvg==", 1992 | "license": "Apache-2.0", 1993 | "dependencies": { 1994 | "@puppeteer/browsers": "2.10.13", 1995 | "chromium-bidi": "11.0.0", 1996 | "debug": "^4.4.3", 1997 | "devtools-protocol": "0.0.1521046", 1998 | "typed-query-selector": "^2.12.0", 1999 | "webdriver-bidi-protocol": "0.3.9", 2000 | "ws": "^8.18.3" 2001 | }, 2002 | "engines": { 2003 | "node": ">=18" 2004 | } 2005 | }, 2006 | "node_modules/puppeteer/node_modules/zod": { 2007 | "version": "3.25.76", 2008 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", 2009 | "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", 2010 | "license": "MIT", 2011 | "funding": { 2012 | "url": "https://github.com/sponsors/colinhacks" 2013 | } 2014 | }, 2015 | "node_modules/require-directory": { 2016 | "version": "2.1.1", 2017 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2018 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2019 | "license": "MIT", 2020 | "engines": { 2021 | "node": ">=0.10.0" 2022 | } 2023 | }, 2024 | "node_modules/require-from-string": { 2025 | "version": "2.0.2", 2026 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 2027 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 2028 | "license": "MIT", 2029 | "engines": { 2030 | "node": ">=0.10.0" 2031 | } 2032 | }, 2033 | "node_modules/resolve-from": { 2034 | "version": "4.0.0", 2035 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2036 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2037 | "license": "MIT", 2038 | "engines": { 2039 | "node": ">=4" 2040 | } 2041 | }, 2042 | "node_modules/rimraf": { 2043 | "version": "3.0.2", 2044 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2045 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2046 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 2047 | "license": "ISC", 2048 | "dependencies": { 2049 | "glob": "^7.1.3" 2050 | }, 2051 | "bin": { 2052 | "rimraf": "bin.js" 2053 | }, 2054 | "funding": { 2055 | "url": "https://github.com/sponsors/isaacs" 2056 | } 2057 | }, 2058 | "node_modules/rrweb-cssom": { 2059 | "version": "0.8.0", 2060 | "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", 2061 | "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", 2062 | "license": "MIT" 2063 | }, 2064 | "node_modules/safer-buffer": { 2065 | "version": "2.1.2", 2066 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2067 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2068 | "license": "MIT" 2069 | }, 2070 | "node_modules/saxes": { 2071 | "version": "6.0.0", 2072 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", 2073 | "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", 2074 | "license": "ISC", 2075 | "dependencies": { 2076 | "xmlchars": "^2.2.0" 2077 | }, 2078 | "engines": { 2079 | "node": ">=v12.22.7" 2080 | } 2081 | }, 2082 | "node_modules/semver": { 2083 | "version": "7.7.3", 2084 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", 2085 | "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", 2086 | "license": "ISC", 2087 | "bin": { 2088 | "semver": "bin/semver.js" 2089 | }, 2090 | "engines": { 2091 | "node": ">=10" 2092 | } 2093 | }, 2094 | "node_modules/shallow-clone": { 2095 | "version": "0.1.2", 2096 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", 2097 | "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==", 2098 | "license": "MIT", 2099 | "dependencies": { 2100 | "is-extendable": "^0.1.1", 2101 | "kind-of": "^2.0.1", 2102 | "lazy-cache": "^0.2.3", 2103 | "mixin-object": "^2.0.1" 2104 | }, 2105 | "engines": { 2106 | "node": ">=0.10.0" 2107 | } 2108 | }, 2109 | "node_modules/shallow-clone/node_modules/kind-of": { 2110 | "version": "2.0.1", 2111 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", 2112 | "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==", 2113 | "license": "MIT", 2114 | "dependencies": { 2115 | "is-buffer": "^1.0.2" 2116 | }, 2117 | "engines": { 2118 | "node": ">=0.10.0" 2119 | } 2120 | }, 2121 | "node_modules/shallow-clone/node_modules/lazy-cache": { 2122 | "version": "0.2.7", 2123 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", 2124 | "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==", 2125 | "license": "MIT", 2126 | "engines": { 2127 | "node": ">=0.10.0" 2128 | } 2129 | }, 2130 | "node_modules/smart-buffer": { 2131 | "version": "4.2.0", 2132 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 2133 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 2134 | "license": "MIT", 2135 | "engines": { 2136 | "node": ">= 6.0.0", 2137 | "npm": ">= 3.0.0" 2138 | } 2139 | }, 2140 | "node_modules/socks": { 2141 | "version": "2.8.7", 2142 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", 2143 | "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", 2144 | "license": "MIT", 2145 | "dependencies": { 2146 | "ip-address": "^10.0.1", 2147 | "smart-buffer": "^4.2.0" 2148 | }, 2149 | "engines": { 2150 | "node": ">= 10.0.0", 2151 | "npm": ">= 3.0.0" 2152 | } 2153 | }, 2154 | "node_modules/socks-proxy-agent": { 2155 | "version": "8.0.5", 2156 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", 2157 | "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", 2158 | "license": "MIT", 2159 | "dependencies": { 2160 | "agent-base": "^7.1.2", 2161 | "debug": "^4.3.4", 2162 | "socks": "^2.8.3" 2163 | }, 2164 | "engines": { 2165 | "node": ">= 14" 2166 | } 2167 | }, 2168 | "node_modules/source-map": { 2169 | "version": "0.6.1", 2170 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2171 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2172 | "license": "BSD-3-Clause", 2173 | "optional": true, 2174 | "engines": { 2175 | "node": ">=0.10.0" 2176 | } 2177 | }, 2178 | "node_modules/source-map-js": { 2179 | "version": "1.2.1", 2180 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2181 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2182 | "license": "BSD-3-Clause", 2183 | "engines": { 2184 | "node": ">=0.10.0" 2185 | } 2186 | }, 2187 | "node_modules/streamx": { 2188 | "version": "2.23.0", 2189 | "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", 2190 | "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", 2191 | "license": "MIT", 2192 | "dependencies": { 2193 | "events-universal": "^1.0.0", 2194 | "fast-fifo": "^1.3.2", 2195 | "text-decoder": "^1.1.0" 2196 | } 2197 | }, 2198 | "node_modules/string-width": { 2199 | "version": "4.2.3", 2200 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2201 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2202 | "license": "MIT", 2203 | "dependencies": { 2204 | "emoji-regex": "^8.0.0", 2205 | "is-fullwidth-code-point": "^3.0.0", 2206 | "strip-ansi": "^6.0.1" 2207 | }, 2208 | "engines": { 2209 | "node": ">=8" 2210 | } 2211 | }, 2212 | "node_modules/strip-ansi": { 2213 | "version": "6.0.1", 2214 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2215 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2216 | "license": "MIT", 2217 | "dependencies": { 2218 | "ansi-regex": "^5.0.1" 2219 | }, 2220 | "engines": { 2221 | "node": ">=8" 2222 | } 2223 | }, 2224 | "node_modules/symbol-tree": { 2225 | "version": "3.2.4", 2226 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 2227 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 2228 | "license": "MIT" 2229 | }, 2230 | "node_modules/tar-fs": { 2231 | "version": "3.1.1", 2232 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", 2233 | "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", 2234 | "license": "MIT", 2235 | "dependencies": { 2236 | "pump": "^3.0.0", 2237 | "tar-stream": "^3.1.5" 2238 | }, 2239 | "optionalDependencies": { 2240 | "bare-fs": "^4.0.1", 2241 | "bare-path": "^3.0.0" 2242 | } 2243 | }, 2244 | "node_modules/tar-stream": { 2245 | "version": "3.1.7", 2246 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", 2247 | "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", 2248 | "license": "MIT", 2249 | "dependencies": { 2250 | "b4a": "^1.6.4", 2251 | "fast-fifo": "^1.2.0", 2252 | "streamx": "^2.15.0" 2253 | } 2254 | }, 2255 | "node_modules/text-decoder": { 2256 | "version": "1.2.3", 2257 | "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", 2258 | "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", 2259 | "license": "Apache-2.0", 2260 | "dependencies": { 2261 | "b4a": "^1.6.4" 2262 | } 2263 | }, 2264 | "node_modules/through": { 2265 | "version": "2.3.8", 2266 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2267 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2268 | "license": "MIT" 2269 | }, 2270 | "node_modules/tldts": { 2271 | "version": "7.0.18", 2272 | "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.18.tgz", 2273 | "integrity": "sha512-lCcgTAgMxQ1JKOWrVGo6E69Ukbnx4Gc1wiYLRf6J5NN4HRYJtCby1rPF8rkQ4a6qqoFBK5dvjJ1zJ0F7VfDSvw==", 2274 | "license": "MIT", 2275 | "dependencies": { 2276 | "tldts-core": "^7.0.18" 2277 | }, 2278 | "bin": { 2279 | "tldts": "bin/cli.js" 2280 | } 2281 | }, 2282 | "node_modules/tldts-core": { 2283 | "version": "7.0.18", 2284 | "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.18.tgz", 2285 | "integrity": "sha512-jqJC13oP4FFAahv4JT/0WTDrCF9Okv7lpKtOZUGPLiAnNbACcSg8Y8T+Z9xthOmRBqi/Sob4yi0TE0miRCvF7Q==", 2286 | "license": "MIT" 2287 | }, 2288 | "node_modules/tough-cookie": { 2289 | "version": "6.0.0", 2290 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", 2291 | "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", 2292 | "license": "BSD-3-Clause", 2293 | "dependencies": { 2294 | "tldts": "^7.0.5" 2295 | }, 2296 | "engines": { 2297 | "node": ">=16" 2298 | } 2299 | }, 2300 | "node_modules/tr46": { 2301 | "version": "6.0.0", 2302 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", 2303 | "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", 2304 | "license": "MIT", 2305 | "dependencies": { 2306 | "punycode": "^2.3.1" 2307 | }, 2308 | "engines": { 2309 | "node": ">=20" 2310 | } 2311 | }, 2312 | "node_modules/tslib": { 2313 | "version": "2.8.1", 2314 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 2315 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 2316 | "license": "0BSD" 2317 | }, 2318 | "node_modules/turndown": { 2319 | "version": "7.2.2", 2320 | "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", 2321 | "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==", 2322 | "license": "MIT", 2323 | "dependencies": { 2324 | "@mixmark-io/domino": "^2.2.0" 2325 | } 2326 | }, 2327 | "node_modules/turndown-plugin-gfm": { 2328 | "version": "1.0.2", 2329 | "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz", 2330 | "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==", 2331 | "license": "MIT" 2332 | }, 2333 | "node_modules/typed-query-selector": { 2334 | "version": "2.12.0", 2335 | "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", 2336 | "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", 2337 | "license": "MIT" 2338 | }, 2339 | "node_modules/unbzip2-stream": { 2340 | "version": "1.4.3", 2341 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 2342 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 2343 | "license": "MIT", 2344 | "dependencies": { 2345 | "buffer": "^5.2.1", 2346 | "through": "^2.3.8" 2347 | } 2348 | }, 2349 | "node_modules/undici": { 2350 | "version": "7.16.0", 2351 | "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", 2352 | "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", 2353 | "license": "MIT", 2354 | "engines": { 2355 | "node": ">=20.18.1" 2356 | } 2357 | }, 2358 | "node_modules/undici-types": { 2359 | "version": "7.16.0", 2360 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", 2361 | "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", 2362 | "license": "MIT", 2363 | "optional": true 2364 | }, 2365 | "node_modules/universalify": { 2366 | "version": "2.0.1", 2367 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", 2368 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", 2369 | "license": "MIT", 2370 | "engines": { 2371 | "node": ">= 10.0.0" 2372 | } 2373 | }, 2374 | "node_modules/w3c-xmlserializer": { 2375 | "version": "5.0.0", 2376 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", 2377 | "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", 2378 | "license": "MIT", 2379 | "dependencies": { 2380 | "xml-name-validator": "^5.0.0" 2381 | }, 2382 | "engines": { 2383 | "node": ">=18" 2384 | } 2385 | }, 2386 | "node_modules/webdriver-bidi-protocol": { 2387 | "version": "0.3.9", 2388 | "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz", 2389 | "integrity": "sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==", 2390 | "license": "Apache-2.0" 2391 | }, 2392 | "node_modules/webidl-conversions": { 2393 | "version": "8.0.0", 2394 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz", 2395 | "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==", 2396 | "license": "BSD-2-Clause", 2397 | "engines": { 2398 | "node": ">=20" 2399 | } 2400 | }, 2401 | "node_modules/whatwg-encoding": { 2402 | "version": "3.1.1", 2403 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", 2404 | "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", 2405 | "license": "MIT", 2406 | "dependencies": { 2407 | "iconv-lite": "0.6.3" 2408 | }, 2409 | "engines": { 2410 | "node": ">=18" 2411 | } 2412 | }, 2413 | "node_modules/whatwg-mimetype": { 2414 | "version": "4.0.0", 2415 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", 2416 | "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", 2417 | "license": "MIT", 2418 | "engines": { 2419 | "node": ">=18" 2420 | } 2421 | }, 2422 | "node_modules/whatwg-url": { 2423 | "version": "15.1.0", 2424 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", 2425 | "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", 2426 | "license": "MIT", 2427 | "dependencies": { 2428 | "tr46": "^6.0.0", 2429 | "webidl-conversions": "^8.0.0" 2430 | }, 2431 | "engines": { 2432 | "node": ">=20" 2433 | } 2434 | }, 2435 | "node_modules/wrap-ansi": { 2436 | "version": "7.0.0", 2437 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2438 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2439 | "license": "MIT", 2440 | "dependencies": { 2441 | "ansi-styles": "^4.0.0", 2442 | "string-width": "^4.1.0", 2443 | "strip-ansi": "^6.0.0" 2444 | }, 2445 | "engines": { 2446 | "node": ">=10" 2447 | }, 2448 | "funding": { 2449 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2450 | } 2451 | }, 2452 | "node_modules/wrappy": { 2453 | "version": "1.0.2", 2454 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2455 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2456 | "license": "ISC" 2457 | }, 2458 | "node_modules/ws": { 2459 | "version": "8.18.3", 2460 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", 2461 | "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", 2462 | "license": "MIT", 2463 | "engines": { 2464 | "node": ">=10.0.0" 2465 | }, 2466 | "peerDependencies": { 2467 | "bufferutil": "^4.0.1", 2468 | "utf-8-validate": ">=5.0.2" 2469 | }, 2470 | "peerDependenciesMeta": { 2471 | "bufferutil": { 2472 | "optional": true 2473 | }, 2474 | "utf-8-validate": { 2475 | "optional": true 2476 | } 2477 | } 2478 | }, 2479 | "node_modules/xml-name-validator": { 2480 | "version": "5.0.0", 2481 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", 2482 | "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", 2483 | "license": "Apache-2.0", 2484 | "engines": { 2485 | "node": ">=18" 2486 | } 2487 | }, 2488 | "node_modules/xmlchars": { 2489 | "version": "2.2.0", 2490 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 2491 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 2492 | "license": "MIT" 2493 | }, 2494 | "node_modules/y18n": { 2495 | "version": "5.0.8", 2496 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2497 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2498 | "license": "ISC", 2499 | "engines": { 2500 | "node": ">=10" 2501 | } 2502 | }, 2503 | "node_modules/yargs": { 2504 | "version": "17.7.2", 2505 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 2506 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 2507 | "license": "MIT", 2508 | "dependencies": { 2509 | "cliui": "^8.0.1", 2510 | "escalade": "^3.1.1", 2511 | "get-caller-file": "^2.0.5", 2512 | "require-directory": "^2.1.1", 2513 | "string-width": "^4.2.3", 2514 | "y18n": "^5.0.5", 2515 | "yargs-parser": "^21.1.1" 2516 | }, 2517 | "engines": { 2518 | "node": ">=12" 2519 | } 2520 | }, 2521 | "node_modules/yargs-parser": { 2522 | "version": "21.1.1", 2523 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2524 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2525 | "license": "ISC", 2526 | "engines": { 2527 | "node": ">=12" 2528 | } 2529 | }, 2530 | "node_modules/yauzl": { 2531 | "version": "2.10.0", 2532 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2533 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 2534 | "license": "MIT", 2535 | "dependencies": { 2536 | "buffer-crc32": "~0.2.3", 2537 | "fd-slicer": "~1.1.0" 2538 | } 2539 | }, 2540 | "node_modules/zod": { 2541 | "version": "3.23.8", 2542 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 2543 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 2544 | "license": "MIT", 2545 | "funding": { 2546 | "url": "https://github.com/sponsors/colinhacks" 2547 | } 2548 | } 2549 | } 2550 | } 2551 | --------------------------------------------------------------------------------