diff --git a/.github/workflows/deploy-cubebot.yml b/.github/workflows/deploy-cubebot.yml new file mode 100644 index 000000000..699eda522 --- /dev/null +++ b/.github/workflows/deploy-cubebot.yml @@ -0,0 +1,29 @@ +name: Deploy CubeBot + +on: + push: + branches: + - main + paths: + - 'apps/cubebot/**' + pull_request: + branches: + - main + paths: + - 'apps/cubebot/**' + +jobs: + deploy: + runs-on: ubuntu-latest + name: Deploy to Cloudflare Workers + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: ./.github/actions/setup-node + + - name: Deploy + run: pnpm --filter cubebot run deploy + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} diff --git a/apps/cubebot/.gitignore b/apps/cubebot/.gitignore new file mode 100644 index 000000000..9b8684cf5 --- /dev/null +++ b/apps/cubebot/.gitignore @@ -0,0 +1,3 @@ +data/ +.wrangler/ +.dev.vars diff --git a/apps/cubebot/CLAUDE.md b/apps/cubebot/CLAUDE.md new file mode 100644 index 000000000..62550656d --- /dev/null +++ b/apps/cubebot/CLAUDE.md @@ -0,0 +1,33 @@ +# CubeBot + +GitHub App bot for TresJS issue triage built on Cloudflare Workers. + +## Tech Stack + +- **Runtime:** Cloudflare Workers +- **Framework:** Hono +- **Database:** Cloudflare D1 +- **AI:** Anthropic Claude + Workers AI (embeddings) +- **GitHub:** Octokit + +## Key Files + +- `src/index.ts` - Worker entry point, webhook routing +- `src/github/handlers/` - Event handlers for issues and comments +- `src/ai/` - Claude integration and RAG retrieval +- `src/triage/` - Issue detection and comment formatting +- `scripts/embed-docs.ts` - Documentation embedding script + +## Testing Locally + +```bash +pnpm dev +# Expose via ngrok for webhook testing +``` + +## Secrets Required + +- `GITHUB_APP_ID` +- `GITHUB_PRIVATE_KEY` +- `GITHUB_WEBHOOK_SECRET` +- `ANTHROPIC_API_KEY` diff --git a/apps/cubebot/README.md b/apps/cubebot/README.md new file mode 100644 index 000000000..b999ed0a0 --- /dev/null +++ b/apps/cubebot/README.md @@ -0,0 +1,106 @@ +# CubeBot 🧊 + +GitHub App bot for TresJS issue triage and documentation assistance. + +## Features + +- Auto-triages new issues (bug vs feature detection) +- Redirects feature requests to GitHub Discussions +- Checks for required bug report info (reproduction, system info) +- Suggests relevant documentation via RAG +- Responds to @mentions with doc-based assistance + +## Setup + +### 1. Create GitHub App + +1. Go to github.com/settings/apps β†’ New GitHub App +2. Name: `tresjs-cubebot` +3. Permissions: + - Issues: Read & Write + - Discussions: Read & Write +4. Subscribe to events: `issues`, `issue_comment` +5. Generate and download private key (`.pem` file) + +### 2. Cloudflare Setup + +```bash +# Create D1 database +pnpm wrangler d1 create cubebot-docs + +# Copy the database_id from output and update wrangler.toml + +# Apply schema to remote D1 +cd apps/cubebot +pnpm wrangler d1 execute cubebot-docs --remote --file=schema.sql +``` + +### 3. Deploy Worker + +```bash +cd apps/cubebot +pnpm wrangler deploy +``` + +### 4. Set Secrets + +```bash +cd apps/cubebot + +# App ID from GitHub App page +pnpm wrangler secret put GITHUB_APP_ID + +# Contents of the .pem private key file +pnpm wrangler secret put GITHUB_PRIVATE_KEY + +# Generate with: openssl rand -hex 32 +# Use same value in GitHub App webhook settings +pnpm wrangler secret put GITHUB_WEBHOOK_SECRET + +# From console.anthropic.com +pnpm wrangler secret put ANTHROPIC_API_KEY +``` + +### 5. Configure GitHub App Webhook + +1. Go to your GitHub App settings +2. Set Webhook URL: `https://tresjs-cubebot..workers.dev/webhook` +3. Set Webhook secret: same value as `GITHUB_WEBHOOK_SECRET` +4. Save + +### 6. Seed Documentation (RAG) + +```bash +# Seed one source at a time (core | cientos | postprocessing) +# Add &clear=true on the first call to wipe existing docs first +curl -X POST https://tresjs-cubebot..workers.dev/admin/seed-docs?source=core \ + -H "Authorization: Bearer " + +curl -X POST https://tresjs-cubebot..workers.dev/admin/seed-docs?source=cientos \ + -H "Authorization: Bearer " + +curl -X POST https://tresjs-cubebot..workers.dev/admin/seed-docs?source=postprocessing \ + -H "Authorization: Bearer " +``` + +This fetches `llms-full.txt` from TresJS doc sites, generates embeddings via Workers AI, and stores them in D1. + +### 7. Install GitHub App + +Install the app on the TresJS organization or specific repositories. + +## Development + +```bash +cd apps/cubebot + +# Start local dev server +pnpm wrangler dev + +# Use ngrok to expose for webhook testing +ngrok http 8787 +``` + +## Architecture + +See [design doc](../../.claude/plans/2026-01-27-cubebot-design.md) for full architecture details. diff --git a/apps/cubebot/eslint.config.js b/apps/cubebot/eslint.config.js new file mode 100644 index 000000000..0940dc9e5 --- /dev/null +++ b/apps/cubebot/eslint.config.js @@ -0,0 +1,5 @@ +import { tresLintConfig } from '@tresjs/eslint-config' + +export default tresLintConfig({ + ignores: ['**/*.md'], +}) diff --git a/apps/cubebot/package.json b/apps/cubebot/package.json new file mode 100644 index 000000000..c3c75f0fd --- /dev/null +++ b/apps/cubebot/package.json @@ -0,0 +1,26 @@ +{ + "name": "cubebot", + "type": "module", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "wrangler dev", + "deploy": "wrangler deploy", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "typecheck": "tsc --noEmit", + "embed-docs": "npx tsx scripts/embed-docs.ts" + }, + "dependencies": { + "@anthropic-ai/sdk": "^0.78.0", + "@octokit/auth-app": "^8.2.0", + "hono": "^4.12.12", + "octokit": "^5.0.5" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20260226.1", + "@tresjs/eslint-config": "workspace:^", + "typescript": "catalog:typescript", + "wrangler": "^4.69.0" + } +} diff --git a/apps/cubebot/schema.sql b/apps/cubebot/schema.sql new file mode 100644 index 000000000..ceac80eaf --- /dev/null +++ b/apps/cubebot/schema.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS doc_chunks ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + source TEXT NOT NULL, + url TEXT NOT NULL, + title TEXT NOT NULL, + content TEXT NOT NULL, + embedding TEXT NOT NULL, + created_at TEXT DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX IF NOT EXISTS idx_doc_chunks_source ON doc_chunks(source); diff --git a/apps/cubebot/scripts/embed-docs.ts b/apps/cubebot/scripts/embed-docs.ts new file mode 100644 index 000000000..4ef63e0b8 --- /dev/null +++ b/apps/cubebot/scripts/embed-docs.ts @@ -0,0 +1,92 @@ +import { execSync } from 'node:child_process' + +const DOC_SOURCES = [ + { name: 'core', url: 'https://docs.tresjs.org/llms-full.txt' }, + { name: 'cientos', url: 'https://cientos.tresjs.org/llms-full.txt' }, + { name: 'postprocessing', url: 'https://post-processing.tresjs.org/llms-full.txt' }, +] + +interface DocChunk { + source: string + url: string + title: string + content: string +} + +async function fetchDocs(source: { name: string, url: string }): Promise { + console.log(`Fetching ${source.name} docs from ${source.url}...`) + + try { + const response = await fetch(source.url) + if (!response.ok) { + console.warn(`Failed to fetch ${source.url}: ${response.status}`) + return [] + } + + const text = await response.text() + return parseDocsIntoChunks(source.name, source.url, text) + } + catch (error) { + console.warn(`Error fetching ${source.url}:`, error) + return [] + } +} + +function parseDocsIntoChunks(source: string, baseUrl: string, text: string): DocChunk[] { + const chunks: DocChunk[] = [] + + // Split by headers (## or #) + const sections = text.split(/(?=^#{1,2}\s)/m) + + for (const section of sections) { + if (section.trim().length < 50) { continue } // Skip tiny sections + + const titleMatch = section.match(/^#{1,2}\s+(.+)$/m) + const title = titleMatch?.[1] ?? 'Untitled' + + // Extract URL if present in the section + const urlMatch = section.match(/https?:\/\/[^\s)]+/) + const url = urlMatch?.[0] ?? baseUrl + + chunks.push({ + source, + url, + title: title.trim(), + content: section.slice(0, 2000), // Limit chunk size + }) + } + + return chunks +} + +async function main() { + console.log('Starting docs embedding process...\n') + + const allChunks: DocChunk[] = [] + + for (const source of DOC_SOURCES) { + const chunks = await fetchDocs(source) + allChunks.push(...chunks) + console.log(` β†’ ${chunks.length} chunks from ${source.name}`) + } + + console.log(`\nTotal chunks: ${allChunks.length}`) + + // Write chunks to a JSON file for manual D1 import + // In production, this would call Workers AI for embeddings + const outputPath = 'apps/cubebot/data/doc-chunks.json' + + // Create data directory + execSync('mkdir -p apps/cubebot/data') + + const fs = await import('node:fs') + fs.writeFileSync(outputPath, JSON.stringify(allChunks, null, 2)) + + console.log(`\nChunks written to ${outputPath}`) + console.log('\nNext steps:') + console.log('1. Run wrangler d1 execute to create the database') + console.log('2. Use a separate script to generate embeddings via Workers AI') + console.log('3. Import the embeddings into D1') +} + +main().catch(console.error) diff --git a/apps/cubebot/src/admin/seed-docs.ts b/apps/cubebot/src/admin/seed-docs.ts new file mode 100644 index 000000000..b9e549518 --- /dev/null +++ b/apps/cubebot/src/admin/seed-docs.ts @@ -0,0 +1,160 @@ +import type { Context } from 'hono' +import type { Env } from '../env' +import { generateEmbeddingsBatch } from '../ai/rag' + +const DOC_SOURCES: Record = { + core: { name: 'core', url: 'https://docs.tresjs.org/llms-full.txt' }, + cientos: { name: 'cientos', url: 'https://cientos.tresjs.org/llms-full.txt' }, + postprocessing: { name: 'postprocessing', url: 'https://post-processing.tresjs.org/llms-full.txt' }, +} + +interface DocChunk { + source: string + url: string + title: string + content: string +} + +async function fetchDocs(source: { name: string, url: string }): Promise { + console.log(`Fetching ${source.name} docs from ${source.url}...`) + + try { + const response = await fetch(source.url) + if (!response.ok) { + console.warn(`Failed to fetch ${source.url}: ${response.status}`) + return [] + } + + const text = await response.text() + return parseDocsIntoChunks(source.name, source.url, text) + } + catch (error) { + console.warn(`Error fetching ${source.url}:`, error) + return [] + } +} + +function parseDocsIntoChunks(source: string, baseUrl: string, text: string): DocChunk[] { + const chunks: DocChunk[] = [] + const sections = text.split(/(?=^#{1,2}\s)/m) + + for (const section of sections) { + if (section.trim().length < 50) { continue } + + const titleMatch = section.match(/^#{1,2}\s+(.+)$/m) + const title = titleMatch?.[1] ?? 'Untitled' + + // Extract URL if present in the section + const urlMatch = section.match(/https?:\/\/[^\s)]+/) + const url = urlMatch?.[0] ?? baseUrl + + chunks.push({ + source, + url, + title: title.trim(), + content: section.slice(0, 2000), + }) + } + + return chunks +} + +export async function handleSeedDocs( + c: Context<{ Bindings: Env }>, +): Promise { + // Require ADMIN_SECRET β€” fail hard if not configured + if (!c.env.ADMIN_SECRET) { + return c.json({ error: 'Server misconfigured: ADMIN_SECRET not set' }, 500) + } + const authHeader = c.req.header('Authorization') + if (authHeader !== `Bearer ${c.env.ADMIN_SECRET}`) { + return c.json({ error: 'Unauthorized' }, 401) + } + + // Get source from query param - seed one at a time to avoid subrequest limits + const sourceKey = c.req.query('source') + const clearAll = c.req.query('clear') === 'true' + + if (!sourceKey) { + return c.json({ + error: 'Missing source param', + usage: '/admin/seed-docs?source=core|cientos|postprocessing', + hint: 'Add &clear=true on first call to clear existing docs', + }, 400) + } + + const source = DOC_SOURCES[sourceKey] + if (!source) { + return c.json({ + error: `Unknown source: ${sourceKey}`, + available: Object.keys(DOC_SOURCES), + }, 400) + } + + const results: string[] = [] + + // Only clear if explicitly requested + if (clearAll) { + await c.env.DB.prepare('DELETE FROM doc_chunks').run() + results.push('Cleared all existing docs') + } + else { + // Clear only this source + await c.env.DB.prepare('DELETE FROM doc_chunks WHERE source = ?').bind(sourceKey).run() + results.push(`Cleared existing ${sourceKey} docs`) + } + + // Fetch the single source + const chunks = await fetchDocs(source) + results.push(`Fetched ${chunks.length} chunks from ${source.name}`) + + if (chunks.length === 0) { + return c.json({ success: true, results, totalChunks: 0 }) + } + + // Generate all embeddings in batches (reduces subrequests) + const texts = chunks.map(chunk => `${chunk.title} ${chunk.content}`) + let embeddings: number[][] = [] + + try { + embeddings = await generateEmbeddingsBatch(c.env.AI, texts) + results.push(`Generated ${embeddings.length} embeddings`) + } + catch (error) { + console.error('Failed to generate embeddings:', error) + return c.json({ success: false, error: 'Embedding generation failed', results }, 500) + } + + // Insert all chunks with embeddings + let insertedCount = 0 + for (let i = 0; i < chunks.length; i++) { + const chunk = chunks[i] + const embedding = embeddings[i] + + if (!embedding) { continue } + + try { + await c.env.DB.prepare( + 'INSERT INTO doc_chunks (source, url, title, content, embedding) VALUES (?, ?, ?, ?, ?)', + ) + .bind(chunk.source, chunk.url, chunk.title, chunk.content, JSON.stringify(embedding)) + .run() + insertedCount++ + } + catch (error) { + console.error(`Failed to insert chunk: ${chunk.title}`, error) + } + } + + results.push(`Inserted ${insertedCount} chunks into database`) + + // Get total count + const { results: countResult } = await c.env.DB.prepare('SELECT COUNT(*) as count FROM doc_chunks').all() + const totalCount = (countResult?.[0] as { count: number })?.count ?? 0 + + return c.json({ + success: true, + results, + totalChunks: totalCount, + }) +} diff --git a/apps/cubebot/src/ai/claude.ts b/apps/cubebot/src/ai/claude.ts new file mode 100644 index 000000000..dea78fe98 --- /dev/null +++ b/apps/cubebot/src/ai/claude.ts @@ -0,0 +1,98 @@ +import Anthropic from '@anthropic-ai/sdk' +import { + buildAnalysisPrompt, + buildFeasibilityPrompt, + FEASIBILITY_SYSTEM_PROMPT, + SYSTEM_PROMPT, +} from './prompts' + +interface AnalysisResponse { + summary: string + package: string | null + suggestedDocs: Array<{ title: string, url: string, reason: string }> + missingInfo: string[] + authorMessage: string + greeting: string + joke: string +} + +interface FeasibilityResponse { + analysis: string + suggestedDocs: Array<{ title: string, url: string, reason: string }> +} + +export async function analyzeIssue( + apiKey: string, + issueTitle: string, + issueBody: string, + relevantDocs: Array<{ title: string, url: string, content: string }>, +): Promise { + const client = new Anthropic({ apiKey }) + + const message = await client.messages.create({ + model: 'claude-sonnet-4-20250514', + max_tokens: 1024, + system: SYSTEM_PROMPT, + messages: [ + { + role: 'user', + content: buildAnalysisPrompt(issueTitle, issueBody, relevantDocs), + }, + ], + }) + + const content = message.content[0] + if (content.type !== 'text') { + throw new Error('Unexpected response type') + } + + // Extract JSON from response (handle potential markdown code blocks) + let jsonStr = content.text + const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/) + if (jsonMatch) { + jsonStr = jsonMatch[1] + } + + return JSON.parse(jsonStr.trim()) as AnalysisResponse +} + +export async function analyzeFeasibility( + apiKey: string, + question: string, + issueTitle: string, + issueBody: string, + relevantDocs: Array<{ title: string, url: string, content: string }>, + codeFiles: Array<{ path: string, content: string }>, +): Promise { + const client = new Anthropic({ apiKey }) + + // Build code context + const codeContext = codeFiles.length > 0 + ? `\n\nRelevant source code from the TresJS monorepo:\n${codeFiles.map(f => `--- ${f.path} ---\n\`\`\`typescript\n${f.content}\n\`\`\``).join('\n\n')}` + : '' + + const message = await client.messages.create({ + model: 'claude-sonnet-4-20250514', + max_tokens: 2048, + system: FEASIBILITY_SYSTEM_PROMPT + codeContext, + messages: [ + { + role: 'user', + content: buildFeasibilityPrompt(question, issueTitle, issueBody, relevantDocs), + }, + ], + }) + + const content = message.content[0] + if (content.type !== 'text') { + throw new Error('Unexpected response type') + } + + let jsonStr = content.text + const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/) + if (jsonMatch) { + jsonStr = jsonMatch[1] + } + + return JSON.parse(jsonStr.trim()) as FeasibilityResponse +} diff --git a/apps/cubebot/src/ai/prompts.ts b/apps/cubebot/src/ai/prompts.ts new file mode 100644 index 000000000..d9cb32e35 --- /dev/null +++ b/apps/cubebot/src/ai/prompts.ts @@ -0,0 +1,97 @@ +export const SYSTEM_PROMPT = `You are CubeBot, a friendly assistant for the TresJS project - a Vue-based 3D rendering library built on Three.js. + +Your personality: +- Friendly and playful with a "cube" theme +- Use 🧊 emoji occasionally +- Always helpful and welcoming to contributors + +Your job is to analyze GitHub issues and provide: +1. A brief summary for maintainers +2. Identification of which TresJS package is affected (core, cientos, postprocessing, nuxt, leches) +3. Whether required information is present (reproduction, system info, expected behavior) +4. Relevant documentation links that might help the user + +Prioritize TresJS ecosystem documentation over Three.js docs. Only reference Three.js docs when explaining underlying Three.js concepts not covered by TresJS docs. + +Documentation sources (in priority order): +- docs.tresjs.org - Core TresJS documentation +- cientos.tresjs.org - Cientos helpers and abstractions +- post-processing.tresjs.org - Post-processing effects +- tresleches.tresjs.org - GUI controls + +Always be encouraging and end responses with a reminder that you're an AI and a human maintainer will follow up.` + +export function buildAnalysisPrompt( + issueTitle: string, + issueBody: string, + relevantDocs: Array<{ title: string, url: string, content: string }>, +): string { + const docsContext = relevantDocs.length > 0 + ? `\n\nRelevant documentation:\n${relevantDocs.map(d => `- ${d.title} (${d.url}):\n${d.content.slice(0, 500)}...`).join('\n\n')}` + : '' + + return `Analyze this GitHub issue: + +Title: ${issueTitle} + +Body: +${issueBody ?? '(no body provided)'} +${docsContext} + +Respond with JSON in this exact format: +{ + "summary": "Brief 1-2 sentence summary for maintainers", + "package": "core" | "cientos" | "nuxt" | "postprocessing" | "leches" | null, + "suggestedDocs": [ + {"title": "Doc title", "url": "https://...", "reason": "Why this helps"} + ], + "missingInfo": ["reproduction", "systemInfo", "expectedBehavior"], + "authorMessage": "Friendly message to the issue author", + "greeting": "A casual, varied greeting for the issue author. Mix it up β€” sometimes 'Yo', 'Hey', 'Hola', 'Sup', 'Oh hey', etc. Keep it warm and human, not corporate. Include the 🧊 emoji somewhere naturally.", + "joke": "A short, original dad/geek joke about 3D graphics or Vue.js (use markdown italics for the punchline)" +}` +} + +export const FEASIBILITY_SYSTEM_PROMPT = `You are CubeBot, a technical assistant for the TresJS project - a Vue-based 3D rendering library built on Three.js. + +When asked to analyze a proposal or feature request, provide substantive technical feedback: + +1. **Feasibility Assessment** - Can this be implemented? What are the technical challenges? +2. **Architecture Impact** - How would this affect the existing codebase? Which packages/areas? +3. **Implementation Approach** - High-level suggestions on how it could be done +4. **Concerns or Trade-offs** - Performance, API consistency, breaking changes, maintenance burden +5. **Prior Art** - Similar patterns in Three.js, React-Three-Fiber, or other ecosystems + +Be direct and technical. Skip pleasantries and generic thanks. Focus on substance. +Use 🧊 emoji sparingly. Keep responses concise but informative.` + +export function buildFeasibilityPrompt( + question: string, + issueTitle: string, + issueBody: string, + relevantDocs: Array<{ title: string, url: string, content: string }>, +): string { + const docsContext = relevantDocs.length > 0 + ? `\n\nRelevant documentation for context:\n${relevantDocs.map(d => `- ${d.title} (${d.url}):\n${d.content.slice(0, 500)}...`).join('\n\n')}` + : '' + + return `A maintainer is asking for your technical opinion. + +Their question: ${question || 'What do you think?'} + +Issue context: +Title: ${issueTitle} +Body: +${issueBody ?? '(no body provided)'} +${docsContext} + +Provide a technical feasibility analysis. Be substantive - discuss implementation approaches, potential challenges, and trade-offs. Skip generic thanks or praise. + +Respond with JSON: +{ + "analysis": "Your technical assessment (2-4 paragraphs, use markdown formatting)", + "suggestedDocs": [ + {"title": "Doc title", "url": "https://...", "reason": "Why relevant"} + ] +}` +} diff --git a/apps/cubebot/src/ai/rag.ts b/apps/cubebot/src/ai/rag.ts new file mode 100644 index 000000000..c98dc806a --- /dev/null +++ b/apps/cubebot/src/ai/rag.ts @@ -0,0 +1,90 @@ +import type { DocChunk } from '../types' + +export async function generateEmbedding( + ai: Ai, + text: string, +): Promise { + const result = await ai.run('@cf/baai/bge-base-en-v1.5', { + text: [text], + }) + + if (!('data' in result) || !result.data || result.data.length === 0) { + throw new Error('Failed to generate embedding') + } + + return result.data[0] +} + +export async function generateEmbeddingsBatch( + ai: Ai, + texts: string[], +): Promise { + if (texts.length === 0) { return [] } + + // Workers AI supports batching - process up to 100 at once + const batchSize = 100 + const allEmbeddings: number[][] = [] + + for (let i = 0; i < texts.length; i += batchSize) { + const batch = texts.slice(i, i + batchSize) + const result = await ai.run('@cf/baai/bge-base-en-v1.5', { + text: batch, + }) + + if (!('data' in result) || !result.data) { + throw new Error('Failed to generate embeddings batch') + } + + allEmbeddings.push(...result.data) + } + + return allEmbeddings +} + +export async function searchDocs( + db: D1Database, + ai: Ai, + query: string, + limit: number = 5, +): Promise { + const queryEmbedding = await generateEmbedding(ai, query) + + // D1 doesn't have native vector search, so we fetch a capped subset and compute in-memory + // For production scale, consider Vectorize or external vector DB + const { results } = await db + .prepare('SELECT * FROM doc_chunks LIMIT 1000') + .all() + + if (!results || results.length === 0) { + return [] + } + + // Compute cosine similarity + const scored = results.map((chunk) => { + const embedding = JSON.parse(chunk.embedding) as number[] + const similarity = cosineSimilarity(queryEmbedding, embedding) + return { chunk, similarity } + }) + + // Sort by similarity descending + scored.sort((a, b) => b.similarity - a.similarity) + + return scored.slice(0, limit).map(s => s.chunk) +} + +function cosineSimilarity(a: number[], b: number[]): number { + if (a.length !== b.length) { return 0 } + + let dotProduct = 0 + let normA = 0 + let normB = 0 + + for (let i = 0; i < a.length; i++) { + dotProduct += a[i] * b[i] + normA += a[i] * a[i] + normB += b[i] * b[i] + } + + const magnitude = Math.sqrt(normA) * Math.sqrt(normB) + return magnitude === 0 ? 0 : dotProduct / magnitude +} diff --git a/apps/cubebot/src/env.ts b/apps/cubebot/src/env.ts new file mode 100644 index 000000000..3c211f1fd --- /dev/null +++ b/apps/cubebot/src/env.ts @@ -0,0 +1,9 @@ +export interface Env { + DB: D1Database + AI: Ai + GITHUB_APP_ID: string + GITHUB_PRIVATE_KEY: string + GITHUB_WEBHOOK_SECRET: string + ANTHROPIC_API_KEY: string + ADMIN_SECRET: string +} diff --git a/apps/cubebot/src/github/api.ts b/apps/cubebot/src/github/api.ts new file mode 100644 index 000000000..e88e0b37c --- /dev/null +++ b/apps/cubebot/src/github/api.ts @@ -0,0 +1,70 @@ +import type { Octokit } from 'octokit' + +const TRESJS_ORG = 'Tresjs' + +export async function isOrgMember( + octokit: Octokit, + username: string, +): Promise { + try { + await octokit.rest.orgs.checkMembershipForUser({ + org: TRESJS_ORG, + username, + }) + return true + } + catch { + return false + } +} + +export async function addComment( + octokit: Octokit, + owner: string, + repo: string, + issueNumber: number, + body: string, +): Promise { + await octokit.rest.issues.createComment({ + owner, + repo, + issue_number: issueNumber, + body, + }) +} + +export async function addLabels( + octokit: Octokit, + owner: string, + repo: string, + issueNumber: number, + labels: string[], +): Promise { + if (labels.length === 0) { return } + + await octokit.rest.issues.addLabels({ + owner, + repo, + issue_number: issueNumber, + labels, + }) +} + +export async function closeIssueAsFeatureRequest( + octokit: Octokit, + owner: string, + repo: string, + issueNumber: number, +): Promise { + // Close the issue with "not planned" reason + await octokit.rest.issues.update({ + owner, + repo, + issue_number: issueNumber, + state: 'closed', + state_reason: 'not_planned', + }) + + // Return the discussions URL for the repo + return `https://github.com/${owner}/${repo}/discussions/new?category=ideas` +} diff --git a/apps/cubebot/src/github/auth.ts b/apps/cubebot/src/github/auth.ts new file mode 100644 index 000000000..90ef609da --- /dev/null +++ b/apps/cubebot/src/github/auth.ts @@ -0,0 +1,38 @@ +import { createAppAuth } from '@octokit/auth-app' +import { Octokit } from 'octokit' + +interface TokenCache { + token: string + expiresAt: number +} + +const tokenCache = new Map() + +export async function getInstallationOctokit( + appId: string, + privateKey: string, + installationId: number, +): Promise { + const cached = tokenCache.get(installationId) + if (cached && cached.expiresAt > Date.now() + 60000) { + return new Octokit({ auth: cached.token }) + } + if (cached) { + tokenCache.delete(installationId) + } + + const auth = createAppAuth({ + appId, + privateKey, + installationId, + }) + + const { token, expiresAt } = await auth({ type: 'installation' }) + + tokenCache.set(installationId, { + token, + expiresAt: new Date(expiresAt).getTime(), + }) + + return new Octokit({ auth: token }) +} diff --git a/apps/cubebot/src/github/code.ts b/apps/cubebot/src/github/code.ts new file mode 100644 index 000000000..0bfccfd04 --- /dev/null +++ b/apps/cubebot/src/github/code.ts @@ -0,0 +1,134 @@ +import type { Octokit } from 'octokit' + +function decodeBase64(base64: string): string { + const binary = atob(base64) + const bytes = Uint8Array.from(binary, c => c.charCodeAt(0)) + return new TextDecoder('utf-8').decode(bytes) +} + +const TRESJS_ORG = 'Tresjs' +const TRES_REPO = 'tres' + +// Key files per package for feasibility analysis +const PACKAGE_FILES: Record = { + core: [ + 'packages/core/src/composables/index.ts', + 'packages/core/src/core/nodeOps.ts', + 'packages/core/src/components/TresCanvas.vue', + 'packages/core/src/types/index.ts', + ], + cientos: [ + 'packages/cientos/src/index.ts', + 'packages/cientos/src/core/index.ts', + ], + nuxt: [ + 'packages/nuxt/src/module.ts', + ], + postprocessing: [ + 'packages/postprocessing/src/index.ts', + 'packages/postprocessing/src/core/EffectComposerThree.vue', + ], + leches: [ + 'packages/leches/src/index.ts', + ], +} + +// General architecture files when package unknown +const GENERAL_FILES = [ + 'packages/core/src/composables/index.ts', + 'packages/core/src/types/index.ts', +] + +interface CodeFile { + path: string + content: string +} + +export async function fetchRelevantCode( + octokit: Octokit, + detectedPackage: string | null, + keywords: string[] = [], +): Promise { + const filePaths = detectedPackage && PACKAGE_FILES[detectedPackage] + ? PACKAGE_FILES[detectedPackage] + : GENERAL_FILES + + const files: CodeFile[] = [] + + for (const path of filePaths) { + try { + const { data } = await octokit.rest.repos.getContent({ + owner: TRESJS_ORG, + repo: TRES_REPO, + path, + ref: 'main', + }) + + if ('content' in data && data.type === 'file') { + const content = decodeBase64(data.content) + // Truncate large files + files.push({ + path, + content: content.slice(0, 4000), + }) + } + } + catch (error) { + console.error(`Failed to fetch ${path}:`, error) + } + } + + // If keywords provided, try to find more specific files via search + if (keywords.length > 0 && files.length < 5) { + const searchResults = await searchCodeInRepo(octokit, keywords.slice(0, 2)) + for (const result of searchResults.slice(0, 2)) { + if (!files.some(f => f.path === result.path)) { + files.push(result) + } + } + } + + return files.slice(0, 6) // Limit total files for context +} + +async function searchCodeInRepo( + octokit: Octokit, + keywords: string[], +): Promise { + const files: CodeFile[] = [] + + try { + const query = `${keywords.join(' ')} repo:${TRESJS_ORG}/${TRES_REPO} language:typescript` + const { data } = await octokit.rest.search.code({ + q: query, + per_page: 3, + }) + + for (const item of data.items) { + try { + const { data: fileData } = await octokit.rest.repos.getContent({ + owner: TRESJS_ORG, + repo: TRES_REPO, + path: item.path, + ref: 'main', + }) + + if ('content' in fileData && fileData.type === 'file') { + const content = decodeBase64(fileData.content) + files.push({ + path: item.path, + content: content.slice(0, 3000), + }) + } + } + catch { + // Skip files that can't be fetched + } + } + } + catch (error) { + console.error('Code search failed:', error) + } + + return files +} diff --git a/apps/cubebot/src/github/handlers/comments.ts b/apps/cubebot/src/github/handlers/comments.ts new file mode 100644 index 000000000..e0ccc1154 --- /dev/null +++ b/apps/cubebot/src/github/handlers/comments.ts @@ -0,0 +1,100 @@ +import type { Context } from 'hono' +import type { Env } from '../../env' +import type { CommentPayload } from '../../types' +import { analyzeFeasibility } from '../../ai/claude' +import { searchDocs } from '../../ai/rag' +import { detectPackage } from '../../triage/detect' +import { addComment } from '../api' +import { getInstallationOctokit } from '../auth' +import { fetchRelevantCode } from '../code' + +const BOT_MENTION_PATTERN = /@tresjs-cubebot/i + +export async function handleCommentCreated( + c: Context<{ Bindings: Env }>, + payload: CommentPayload, +): Promise { + const { comment, issue, repository } = payload + const owner = repository.owner.login + const repo = repository.name + const installationId = (payload as { installation?: { id: number } }).installation?.id + + // Ignore if not mentioning the bot + if (!BOT_MENTION_PATTERN.test(comment.body)) { + return + } + + // Ignore bot's own comments + if (comment.user.login.includes('cubebot')) { + return + } + + if (!installationId) { + console.error('No installation ID found') + return + } + + const octokit = await getInstallationOctokit( + c.env.GITHUB_APP_ID, + c.env.GITHUB_PRIVATE_KEY, + installationId, + ) + + // Extract the question/request from the comment + const question = comment.body.replace(BOT_MENTION_PATTERN, '').trim() + + // Detect package from issue for targeted code fetch + const detectedPackage = detectPackage(issue) + + // Extract keywords from question for code search + const keywords = extractKeywords(question) + + // Fetch relevant code from the monorepo + const codeFiles = await fetchRelevantCode(octokit, detectedPackage, keywords) + + // Get relevant docs via RAG + const searchQuery = `${issue.title} ${question}` + const relevantChunks = await searchDocs(c.env.DB, c.env.AI, searchQuery, 3) + const relevantDocs = relevantChunks.map(chunk => ({ + title: chunk.title, + url: chunk.url, + content: chunk.content, + })) + + // Get feasibility analysis from Claude with code context + const analysis = await analyzeFeasibility( + c.env.ANTHROPIC_API_KEY, + question, + issue.title, + issue.body ?? '', + relevantDocs, + codeFiles, + ) + + // Format response + const docsSection = analysis.suggestedDocs.length > 0 + ? `\n\n**πŸ“š Relevant docs:**\n${analysis.suggestedDocs.map(d => `- [${d.title}](${d.url}) β€” ${d.reason}`).join('\n')}` + : '' + + const codeNote = codeFiles.length > 0 + ? `\n\n
πŸ“‚ Code files analyzed\n\n${codeFiles.map(f => `- \`${f.path}\``).join('\n')}\n
` + : '' + + const response = `🧊 **Analysis** + +${analysis.analysis}${docsSection}${codeNote} + +> πŸ€– I'm an AI assistant and can make mistakes. A human maintainer can provide more help if needed!` + + await addComment(octokit, owner, repo, issue.number, response) +} + +function extractKeywords(text: string): string[] { + // Extract potential code-related keywords + const words = text.toLowerCase().split(/\s+/) + const techTerms = words.filter(w => + w.length > 3 + && !['what', 'think', 'this', 'that', 'with', 'would', 'could', 'should', 'about', 'have', 'from'].includes(w), + ) + return [...new Set(techTerms)].slice(0, 5) +} diff --git a/apps/cubebot/src/github/handlers/issues.ts b/apps/cubebot/src/github/handlers/issues.ts new file mode 100644 index 000000000..e58e2cc04 --- /dev/null +++ b/apps/cubebot/src/github/handlers/issues.ts @@ -0,0 +1,127 @@ +import type { Context } from 'hono' +import type { Env } from '../../env' +import type { IssuePayload, TriageResult } from '../../types' +import { analyzeIssue } from '../../ai/claude' +import { searchDocs } from '../../ai/rag' +import { + formatAuthorComment, + formatFeatureRedirectComment, + formatMaintainerComment, +} from '../../triage/comments' +import { + detectIssueType, + detectPackage, + hasExpectedBehavior, + hasReproduction, + hasSystemInfo, +} from '../../triage/detect' +import { addComment, addLabels, closeIssueAsFeatureRequest, isOrgMember } from '../api' +import { getInstallationOctokit } from '../auth' + +export async function handleIssueOpened( + c: Context<{ Bindings: Env }>, + payload: IssuePayload, +): Promise { + const { issue, repository } = payload + const owner = repository.owner.login + const repo = repository.name + const installationId = (payload as { installation?: { id: number } }).installation?.id + + if (!installationId) { + console.error('No installation ID found') + return + } + + const octokit = await getInstallationOctokit( + c.env.GITHUB_APP_ID, + c.env.GITHUB_PRIVATE_KEY, + installationId, + ) + + // Check if author is TresJS org member before any action + const authorIsOrgMember = await isOrgMember(octokit, issue.user.login) + + // Detect issue type + const issueType = detectIssueType(issue) + + // Handle feature requests - close and redirect to discussions (skip for org members) + if (issueType === 'feature' && !authorIsOrgMember) { + const discussionUrl = `https://github.com/${owner}/${repo}/discussions/new?category=ideas` + const comment = formatFeatureRedirectComment(issue.user.login, discussionUrl) + await addComment(octokit, owner, repo, issue.number, comment) + await closeIssueAsFeatureRequest(octokit, owner, repo, issue.number) + return + } + + // Only do full bug analysis for bug/unknown issues. + // Intentional no-op: feature requests from org members skip both the redirect + // (handled above) and the bug path β€” maintainers can open features freely. + if (issueType !== 'bug' && issueType !== 'unknown') { + return + } + + // For bugs, do full analysis + const detectedPackage = detectPackage(issue) + const reproduction = hasReproduction(issue.body) + const systemInfo = hasSystemInfo(issue.body) + const expectedBehavior = hasExpectedBehavior(issue.body) + + // Get relevant docs via RAG + const searchQuery = `${issue.title} ${issue.body ?? ''}` + const relevantChunks = await searchDocs(c.env.DB, c.env.AI, searchQuery, 3) + const relevantDocs = relevantChunks.map(chunk => ({ + title: chunk.title, + url: chunk.url, + content: chunk.content, + })) + + // Analyze with Claude + const analysis = await analyzeIssue( + c.env.ANTHROPIC_API_KEY, + issue.title, + issue.body ?? '', + relevantDocs, + ) + + // Normalize AI package: treat literal "null" string as no package + const normalizedAiPackage = analysis.package === 'null' ? null : analysis.package + + // Build triage result + const labelsToAdd: string[] = [] + // Skip needs reproduction label for org members + if (!reproduction && !authorIsOrgMember) { labelsToAdd.push('needs reproduction') } + if (!systemInfo || !expectedBehavior) { labelsToAdd.push('waiting for author') } + const pkgLabel = detectedPackage ?? normalizedAiPackage + if (pkgLabel) { + labelsToAdd.push(pkgLabel) + } + + const triageResult: TriageResult = { + issueType, + package: detectedPackage ?? normalizedAiPackage, + hasReproduction: reproduction, + hasSystemInfo: systemInfo, + hasExpectedBehavior: expectedBehavior, + summary: analysis.summary, + suggestedDocs: analysis.suggestedDocs, + labelsToAdd, + } + + // Add labels + await addLabels(octokit, owner, repo, issue.number, labelsToAdd) + + // Post maintainer comment + const maintainerComment = formatMaintainerComment(triageResult) + await addComment(octokit, owner, repo, issue.number, maintainerComment) + + // Post author comment (skip reproduction request for org members) + const authorComment = formatAuthorComment( + issue.user.login, + triageResult, + analysis.authorMessage, + authorIsOrgMember, + analysis.greeting, + analysis.joke, + ) + await addComment(octokit, owner, repo, issue.number, authorComment) +} diff --git a/apps/cubebot/src/github/verify.ts b/apps/cubebot/src/github/verify.ts new file mode 100644 index 000000000..ab3af93f7 --- /dev/null +++ b/apps/cubebot/src/github/verify.ts @@ -0,0 +1,34 @@ +export async function verifyWebhookSignature( + payload: string, + signature: string | null | undefined, + secret: string, +): Promise { + if (!signature) { + return false + } + + const encoder = new TextEncoder() + const key = await crypto.subtle.importKey( + 'raw', + encoder.encode(secret), + { name: 'HMAC', hash: 'SHA-256' }, + false, + ['sign'], + ) + + const signatureBuffer = await crypto.subtle.sign( + 'HMAC', + key, + encoder.encode(payload), + ) + + const expectedSignature = `sha256=${Array.from(new Uint8Array(signatureBuffer)) + .map(b => b.toString(16).padStart(2, '0')) + .join('')}` + + // Constant-time comparison to prevent timing attacks + const sigBytes = encoder.encode(signature) + const expectedBytes = encoder.encode(expectedSignature) + if (sigBytes.length !== expectedBytes.length) { return false } + return crypto.subtle.timingSafeEqual(sigBytes, expectedBytes) +} diff --git a/apps/cubebot/src/index.ts b/apps/cubebot/src/index.ts new file mode 100644 index 000000000..040441ee7 --- /dev/null +++ b/apps/cubebot/src/index.ts @@ -0,0 +1,53 @@ +import { Hono } from 'hono' +import { handleSeedDocs } from './admin/seed-docs' +import { handleCommentCreated } from './github/handlers/comments' +import { handleIssueOpened } from './github/handlers/issues' +import { verifyWebhookSignature } from './github/verify' +import type { Env } from './env' +import type { CommentPayload, IssuePayload } from './types' + +const app = new Hono<{ Bindings: Env }>() + +app.get('/', (c) => { + return c.json({ status: 'ok', name: 'CubeBot 🧊' }) +}) + +// Admin endpoint to seed documentation embeddings +app.post('/admin/seed-docs', handleSeedDocs) + +app.post('/webhook', async (c) => { + const signature = c.req.header('x-hub-signature-256') + const payload = await c.req.text() + + const isValid = await verifyWebhookSignature( + payload, + signature, + c.env.GITHUB_WEBHOOK_SECRET, + ) + + if (!isValid) { + return c.json({ error: 'Invalid signature' }, 401) + } + + const event = c.req.header('x-github-event') + const body = JSON.parse(payload) + + console.log(`Received ${event} event:`, body.action) + + try { + if (event === 'issues' && body.action === 'opened') { + await handleIssueOpened(c, body as IssuePayload) + } + else if (event === 'issue_comment' && body.action === 'created') { + await handleCommentCreated(c, body as CommentPayload) + } + + return c.json({ received: true, event, action: body.action }) + } + catch (error) { + console.error('Error handling webhook:', error) + return c.json({ error: 'Internal error' }, 500) + } +}) + +export default app diff --git a/apps/cubebot/src/triage/comments.ts b/apps/cubebot/src/triage/comments.ts new file mode 100644 index 000000000..23d601aac --- /dev/null +++ b/apps/cubebot/src/triage/comments.ts @@ -0,0 +1,83 @@ +import type { TriageResult } from '../types' + +export function formatMaintainerComment(result: TriageResult): string { + const reproStatus = result.hasReproduction ? 'βœ… Provided' : '❌ Missing' + const sysInfoStatus = result.hasSystemInfo ? 'βœ… Provided' : '❌ Missing' + const expectedStatus = result.hasExpectedBehavior ? 'βœ… Provided' : '❌ Missing' + + return `
+🧊 CubeBot Analysis + +**Issue Type:** ${result.issueType === 'bug' ? 'Bug Report' : result.issueType === 'feature' ? 'Feature Request' : 'Unknown'} +**Package:** ${result.package ? `@tresjs/${result.package}` : 'Not detected'} +**Reproduction:** ${reproStatus} +**System Info:** ${sysInfoStatus} +**Expected Behavior:** ${expectedStatus} + +**Summary:** +${result.summary} + +${result.labelsToAdd.length > 0 ? `**Labels added:** ${result.labelsToAdd.map(l => `\`${l}\``).join(', ')}` : ''} + +
` +} + +export function formatAuthorComment( + authorUsername: string, + result: TriageResult, + authorMessage: string, + isOrgMember = false, + greeting?: string, + joke?: string, +): string { + const missingItems: string[] = [] + + // Skip reproduction request for org members + if (!result.hasReproduction && !isOrgMember) { + missingItems.push( + '- [ ] **Reproduction:** Please add a [StackBlitz](https://stackblitz.com/edit/tresjs-minimal-reproduction) or GitHub repo link', + ) + } + if (!result.hasSystemInfo) { + missingItems.push( + '- [ ] **System info:** Run `npx envinfo --system --npmPackages \'{vite,@tresjs/*,three,vue}\' --binaries --browsers` and paste the output', + ) + } + if (!result.hasExpectedBehavior) { + missingItems.push( + '- [ ] **Expected behavior:** Please describe what you expected to happen', + ) + } + + const jokeSection = joke ? `\n\n---\n A quick dad joke 😬 _While you wait…_ ${joke}` : '' + + const docsSection = result.suggestedDocs.length > 0 + ? `\n\n**πŸ“š These might help:**\n${result.suggestedDocs.map(d => `- [${d.title}](${d.url}) β€” ${d.reason}`).join('\n')}` + : '' + + const missingSection = missingItems.length > 0 + ? `\n\nBefore a maintainer can dig in, could you help with a few things?\n\n${missingItems.join('\n')}` + : `\n\n${authorMessage}` + + const opener = greeting + ? `${greeting} @${authorUsername}!` + : `Hey @${authorUsername}! 🧊` + + return `${opener} +${missingSection}${docsSection}${jokeSection} + +> πŸ€– I'm an AI assistant and can make mistakes. A human is on the way!` +} + +export function formatFeatureRedirectComment( + authorUsername: string, + newDiscussionUrl: string, +): string { + return `Hey @${authorUsername}! 🧊 + +This looks like a feature request β€” awesome ideas belong in [Discussions](${newDiscussionUrl}) where the community can upvote and discuss! + +I'm closing this issue, but please [create a discussion](${newDiscussionUrl}) so the community can weigh in. Thanks for contributing! πŸ’š + +> πŸ€– I'm an AI assistant and can make mistakes.` +} diff --git a/apps/cubebot/src/triage/detect.ts b/apps/cubebot/src/triage/detect.ts new file mode 100644 index 000000000..46aa61b07 --- /dev/null +++ b/apps/cubebot/src/triage/detect.ts @@ -0,0 +1,103 @@ +import type { IssuePayload } from '../types' + +const PACKAGE_PATTERNS: Record = { + core: [/@tresjs\/core/i, /\bTresCanvas\b/, /\buseTres\b/], + cientos: [/@tresjs\/cientos/i, /\bOrbitControls\b/, /\buseGLTF\b/, /\buseFBX\b/], + nuxt: [/@tresjs\/nuxt/i, /\bnuxt\b.*tres/i], + postprocessing: [/@tresjs\/post-processing/i, /\bEffectComposer\b/, /\bBloom\b/], + leches: [/@tresjs\/leches/i, /\bTresLeches\b/], +} + +const REPRODUCTION_PATTERNS = [ + /stackblitz\.com/i, + /codesandbox\.io/i, + /github\.com\/[\w-]+\/[\w-]+/i, + /codepen\.io/i, + /jsfiddle\.net/i, +] + +const SYSTEM_INFO_PATTERNS = [ + /system:/i, + /binaries:/i, + /browsers:/i, + /npmPackages:/i, + /vite.*@/i, + /three.*@/i, + /vue.*@/i, +] + +export function detectIssueType(issue: IssuePayload['issue']): 'bug' | 'feature' | 'unknown' { + const labels = issue.labels.map(l => l.name.toLowerCase()) + const title = issue.title.toLowerCase() + const body = (issue.body ?? '').toLowerCase() + + // Check labels first + if (labels.includes('bug') || labels.includes('pending triage')) { + return 'bug' + } + if (labels.includes('enhancement') || labels.includes('feature')) { + return 'feature' + } + + // Check title/body for bug indicators + if ( + title.includes('bug') + || title.includes('error') + || title.includes('not working') + || title.includes('broken') + || body.includes('describe the bug') + || body.includes('reproduction') + ) { + return 'bug' + } + + // Check for feature indicators + if ( + title.includes('feature') + || title.includes('request') + || title.includes('proposal') + || body.includes('feature request') + || body.includes('suggested solution') + ) { + return 'feature' + } + + return 'unknown' +} + +export function detectPackage(issue: IssuePayload['issue']): string | null { + const text = `${issue.title} ${issue.body ?? ''}` + + for (const [pkg, patterns] of Object.entries(PACKAGE_PATTERNS)) { + for (const pattern of patterns) { + if (pattern.test(text)) { + return pkg + } + } + } + + return null +} + +export function hasReproduction(body: string | null): boolean { + if (!body) { return false } + return REPRODUCTION_PATTERNS.some(pattern => pattern.test(body)) +} + +export function hasSystemInfo(body: string | null): boolean { + if (!body) { return false } + // Need at least 2 matches to consider it valid system info + const matches = SYSTEM_INFO_PATTERNS.filter(pattern => pattern.test(body)) + return matches.length >= 2 +} + +export function hasExpectedBehavior(body: string | null): boolean { + if (!body) { return false } + const lower = body.toLowerCase() + return ( + lower.includes('expected') + || lower.includes('should') + || lower.includes('want') + || lower.includes('i expect') + ) +} diff --git a/apps/cubebot/src/types.ts b/apps/cubebot/src/types.ts new file mode 100644 index 000000000..20b115ee7 --- /dev/null +++ b/apps/cubebot/src/types.ts @@ -0,0 +1,56 @@ +export interface DocChunk { + id: number + source: string + url: string + title: string + content: string + embedding: string + created_at: string +} + +export interface IssuePayload { + action: string + issue: { + number: number + title: string + body: string | null + user: { + login: string + } + labels: Array<{ name: string }> + html_url: string + } + repository: { + owner: { + login: string + } + name: string + full_name: string + } + sender: { + login: string + } +} + +export interface CommentPayload { + action: string + comment: { + body: string + user: { + login: string + } + } + issue: IssuePayload['issue'] + repository: IssuePayload['repository'] +} + +export interface TriageResult { + issueType: 'bug' | 'feature' | 'unknown' + package: string | null + hasReproduction: boolean + hasSystemInfo: boolean + hasExpectedBehavior: boolean + summary: string + suggestedDocs: Array<{ title: string, url: string, reason: string }> + labelsToAdd: string[] +} diff --git a/apps/cubebot/tsconfig.json b/apps/cubebot/tsconfig.json new file mode 100644 index 000000000..891520014 --- /dev/null +++ b/apps/cubebot/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext"], + "module": "ESNext", + "moduleResolution": "bundler", + "types": ["@cloudflare/workers-types"], + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "isolatedModules": true, + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] +} diff --git a/apps/cubebot/wrangler.toml b/apps/cubebot/wrangler.toml new file mode 100644 index 000000000..82dd6f276 --- /dev/null +++ b/apps/cubebot/wrangler.toml @@ -0,0 +1,26 @@ +name = "tresjs-cubebot" +main = "src/index.ts" +compatibility_date = "2025-01-27" + +[[d1_databases]] +binding = "DB" +database_name = "cubebot-docs" +database_id = "e6060231-ec0d-4c96-a673-30cbd2bbaa60" + +[ai] +binding = "AI" + +[observability] +enabled = false +head_sampling_rate = 1 + +[observability.logs] +enabled = true +head_sampling_rate = 1 +persist = true +invocation_logs = true + +[observability.traces] +enabled = true +persist = true +head_sampling_rate = 1 diff --git a/package.json b/package.json index 7822a1685..4a716402b 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "better-sqlite3" ], "overrides": { - "ipx": "3.0.2" + "ipx": "3.0.2", + "undici": "^7.24.7" } } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bbb4838b0..823298ee9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,6 +133,7 @@ catalogs: overrides: ipx: 3.0.2 + undici: ^7.24.7 importers: @@ -215,6 +216,34 @@ importers: specifier: catalog:typescript version: 3.2.1(typescript@5.8.3) + apps/cubebot: + dependencies: + '@anthropic-ai/sdk': + specifier: ^0.78.0 + version: 0.78.0(zod@3.25.76) + '@octokit/auth-app': + specifier: ^8.2.0 + version: 8.2.0 + hono: + specifier: ^4.12.12 + version: 4.12.12 + octokit: + specifier: ^5.0.5 + version: 5.0.5 + devDependencies: + '@cloudflare/workers-types': + specifier: ^4.20260226.1 + version: 4.20260226.1 + '@tresjs/eslint-config': + specifier: workspace:^ + version: link:../../packages/eslint-config + typescript: + specifier: catalog:typescript + version: 5.8.3 + wrangler: + specifier: ^4.69.0 + version: 4.69.0(@cloudflare/workers-types@4.20260226.1) + apps/docs: dependencies: '@iconify-json/lucide': @@ -499,7 +528,7 @@ importers: version: 20.3.0(@nuxt/kit@4.3.1(magicast@0.5.1))(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3))) vite-plugin-glsl: specifier: catalog:vite - version: 1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vite-plugin-qrcode: specifier: catalog:vite version: 0.3.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) @@ -552,7 +581,7 @@ importers: devDependencies: unocss: specifier: catalog:utils - version: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) unplugin-vue-components: specifier: ^28.0.0 version: 28.8.0(@babel/parser@7.28.5)(@nuxt/kit@4.3.1(magicast@0.5.1))(vue@3.5.26(typescript@5.9.3)) @@ -719,7 +748,7 @@ importers: version: 4.5.4(@types/node@24.10.4)(rollup@4.54.0)(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vite-plugin-glsl: specifier: ^1.5.1 - version: 1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) vite-svg-loader: specifier: ^5.1.0 version: 5.1.0(vue@3.5.26(typescript@5.8.3)) @@ -917,7 +946,7 @@ importers: version: 5.8.3 unocss: specifier: catalog:utils - version: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) unplugin-vue-components: specifier: ^28.8.0 version: 28.8.0(@babel/parser@7.28.5)(@nuxt/kit@4.3.1(magicast@0.5.1))(vue@3.5.26(typescript@5.8.3)) @@ -977,20 +1006,20 @@ importers: version: 3.0.2 vite-plugin-glsl: specifier: ^1.5.1 - version: 1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) devDependencies: '@nuxt/devtools': specifier: ^2.6.5 version: 2.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3)) '@nuxt/devtools-ui-kit': specifier: ^2.6.5 - version: 2.7.0(@nuxt/devtools@2.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3)))(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(@vue/compiler-core@3.5.26)(axios@1.13.2)(change-case@5.4.4)(fuse.js@7.1.0)(magicast@0.5.1)(nuxt@4.1.3(@parcel/watcher@2.5.1)(@types/node@24.10.4)(@vue/compiler-sfc@3.5.26)(better-sqlite3@12.5.0)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.31.1)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.1(typescript@5.8.3))(yaml@2.8.2))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3))(webpack@5.104.1(esbuild@0.27.2)) + version: 2.7.0(@nuxt/devtools@2.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3)))(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(@vue/compiler-core@3.5.26)(axios@1.13.2)(change-case@5.4.4)(fuse.js@7.1.0)(magicast@0.5.1)(nuxt@4.1.3(@parcel/watcher@2.5.1)(@types/node@24.10.4)(@vue/compiler-sfc@3.5.26)(better-sqlite3@12.5.0)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.31.1)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.1(typescript@5.8.3))(yaml@2.8.2))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3))(webpack@5.104.1(esbuild@0.27.3)) '@nuxt/eslint-config': specifier: ^1.9.0 version: 1.12.1(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(@vue/compiler-sfc@3.5.26)(eslint-plugin-format@0.1.3(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@nuxt/module-builder': specifier: ^1.0.2 - version: 1.0.2(@nuxt/cli@3.31.3(cac@6.7.14)(commander@13.1.0)(magicast@0.5.1))(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(typescript@5.8.3)(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) + version: 1.0.2(@nuxt/cli@3.31.3(cac@6.7.14)(commander@13.1.0)(magicast@0.5.1))(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(typescript@5.8.3)(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) '@nuxt/schema': specifier: ^4.1.2 version: 4.2.2 @@ -1334,6 +1363,15 @@ packages: '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@anthropic-ai/sdk@0.78.0': + resolution: {integrity: sha512-PzQhR715td/m1UaaN5hHXjYB8Gl2lF9UVhrrGrZeysiF6Rb74Wc9GCB8hzLdzmQtBd1qe89F9OptgB9Za1Ib5w==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + '@apidevtools/json-schema-ref-parser@11.9.3': resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} @@ -1953,10 +1991,56 @@ packages: '@clack/prompts@1.0.0-alpha.8': resolution: {integrity: sha512-YZGC4BmTKSF5OturNKEz/y4xNjYGmGk6NI785CQucJ7OEdX0qbMmL/zok+9bL6c7qE3WSYffyK5grh2RnkGNtQ==} - '@cloudflare/kv-asset-handler@0.4.1': - resolution: {integrity: sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==} + '@cloudflare/kv-asset-handler@0.4.2': + resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==} engines: {node: '>=18.0.0'} + '@cloudflare/unenv-preset@2.14.0': + resolution: {integrity: sha512-XKAkWhi1nBdNsSEoNG9nkcbyvfUrSjSf+VYVPfOto3gLTZVc3F4g6RASCMh6IixBKCG2yDgZKQIHGKtjcnLnKg==} + peerDependencies: + unenv: 2.0.0-rc.24 + workerd: ^1.20260218.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20260305.0': + resolution: {integrity: sha512-chhKOpymo0Eh9J3nymrauMqKGboCc4uz/j0gA1G4gioMnKsN2ZDKJ+qjRZDnCoVGy8u2C4pxlmyIfsXCAfIzhQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20260305.0': + resolution: {integrity: sha512-K9aG2OQk5bBfOP+fyGPqLcqZ9OR3ra6uwnxJ8f2mveq2A2LsCI7ZeGxQiAj75Ti80ytH/gJffZIx4Np2JtU3aQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20260305.0': + resolution: {integrity: sha512-tt7XUoIw/cYFeGbkPkcZ6XX1aZm26Aju/4ih+DXxOosbBeGshFSrNJDBfAKKOvkjsAZymJ+WWVDBU+hmNaGfwA==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20260305.0': + resolution: {integrity: sha512-72QTkY5EzylmvCZ8ZTrnJ9DctmQsfSof1OKyOWqu/pv/B2yACfuPMikq8RpPxvVu7hhS0ztGP6ZvXz72Htq4Zg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20260305.0': + resolution: {integrity: sha512-BA0uaQPOaI2F6mJtBDqplGnQQhpXCzwEMI33p/TnDxtSk9u8CGIfBFuI6uqo8mJ6ijIaPjeBLGOn2CiRMET4qg==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20260226.1': + resolution: {integrity: sha512-ci/3wgHBLs7QYemyPCJa8ooQd0f9mL9V8cXknZj5f9joX1Iuf6+isDbfjphn0o/bDHpt88vxabC9mXeIYvBVDw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -2064,8 +2148,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2082,8 +2166,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2100,8 +2184,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2118,8 +2202,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2136,8 +2220,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2154,8 +2238,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2172,8 +2256,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2190,8 +2274,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2208,8 +2292,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2226,8 +2310,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2244,8 +2328,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2262,8 +2346,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2280,8 +2364,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2298,8 +2382,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2316,8 +2400,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2334,8 +2418,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2352,8 +2436,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -2364,8 +2448,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -2382,8 +2466,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -2394,8 +2478,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2412,8 +2496,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2424,8 +2508,8 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -2442,8 +2526,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2460,8 +2544,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2478,8 +2562,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2496,8 +2580,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2667,111 +2751,276 @@ packages: peerDependencies: vue: '>=3' + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -2841,6 +3090,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} @@ -3203,21 +3455,25 @@ packages: resolution: {integrity: sha512-vsCz2A2uHL5I8GzQW8X2/IlW+lIoyOUVgcSviZA6P1UFFOKOxAlVUsKvGZlfyTEwK9LDnH5zYclUrimxNEwYVw==} cpu: [arm64] os: [linux] + libc: [glibc] '@nx/nx-linux-arm64-musl@22.4.4': resolution: {integrity: sha512-Jj0bqoB9a2iqHycVM6NY0OkU3np6yshFTcggteEH3jWQ5iSgO3E6O00rfwGx8mrMT8GfpCyQGLS5Q1HW79zKzQ==} cpu: [arm64] os: [linux] + libc: [musl] '@nx/nx-linux-x64-gnu@22.4.4': resolution: {integrity: sha512-2pMPaFae59j/Erop/LCWPr7xxT4NcY7CR9b5GJ+Dfz1Wv3wE9jE66tp2qFaH36Igso9r0Khf6rPrSCLaO+0QgQ==} cpu: [x64] os: [linux] + libc: [glibc] '@nx/nx-linux-x64-musl@22.4.4': resolution: {integrity: sha512-8Rnhrk2eWZfVs1Db5K15JGiis8h8v1w2avHlp4abJVJ+j1Sa0a1OWexBz2X0WkjYh/LcgRTzYBrE8+BV4yCPMw==} cpu: [x64] os: [linux] + libc: [musl] '@nx/nx-win32-arm64-msvc@22.4.4': resolution: {integrity: sha512-e32okeoiaFSjfcZYj+uBdPRSzANAXLnh6D0k3isZ7stJnUtJ2hy5Kz5RCk10ddwdQgUn34sNz1oL2yFhXVWU4w==} @@ -3232,6 +3488,113 @@ packages: '@nx/workspace@22.4.4': resolution: {integrity: sha512-XnmBV7AFadNVdPLqZyYtGTVCIeGpScJTYUIii6wILB+pH8Qx2kTsDWVaWeHcUDeiymTVsbJfcwiXqn8nAISkfQ==} + '@octokit/app@16.1.2': + resolution: {integrity: sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==} + engines: {node: '>= 20'} + + '@octokit/auth-app@8.2.0': + resolution: {integrity: sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==} + engines: {node: '>= 20'} + + '@octokit/auth-oauth-app@9.0.3': + resolution: {integrity: sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==} + engines: {node: '>= 20'} + + '@octokit/auth-oauth-device@8.0.3': + resolution: {integrity: sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==} + engines: {node: '>= 20'} + + '@octokit/auth-oauth-user@6.0.2': + resolution: {integrity: sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==} + engines: {node: '>= 20'} + + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} + + '@octokit/auth-unauthenticated@7.0.3': + resolution: {integrity: sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==} + engines: {node: '>= 20'} + + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} + engines: {node: '>= 20'} + + '@octokit/endpoint@11.0.2': + resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==} + engines: {node: '>= 20'} + + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} + engines: {node: '>= 20'} + + '@octokit/oauth-app@8.0.3': + resolution: {integrity: sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==} + engines: {node: '>= 20'} + + '@octokit/oauth-authorization-url@8.0.0': + resolution: {integrity: sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==} + engines: {node: '>= 20'} + + '@octokit/oauth-methods@6.0.2': + resolution: {integrity: sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==} + engines: {node: '>= 20'} + + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} + + '@octokit/openapi-webhooks-types@12.1.0': + resolution: {integrity: sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==} + + '@octokit/plugin-paginate-graphql@6.0.0': + resolution: {integrity: sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-retry@8.1.0': + resolution: {integrity: sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': '>=7' + + '@octokit/plugin-throttling@11.0.3': + resolution: {integrity: sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': ^7.0.0 + + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} + engines: {node: '>= 20'} + + '@octokit/request@10.0.7': + resolution: {integrity: sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==} + engines: {node: '>= 20'} + + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + + '@octokit/webhooks-methods@6.0.0': + resolution: {integrity: sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==} + engines: {node: '>= 20'} + + '@octokit/webhooks@14.2.0': + resolution: {integrity: sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==} + engines: {node: '>= 20'} + '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} @@ -3276,36 +3639,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-arm64-musl@0.94.0': resolution: {integrity: sha512-IMi2Sq3Z3xvA06Otit/D6Vo2BATZJcDHu6dHcaznBwnpO0z0+N9i3TKprIVizBHW77wq8QBLIbQaWQn4go1WwQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-minify/binding-linux-riscv64-gnu@0.94.0': resolution: {integrity: sha512-1QWSK1CcmGwlJZBWCF+NpzpQ5c3WybtgVqeQX8FRIhlApBtvMsifZe4tz1FIoBoQeCKwCQzyvpIA71cpCpY/xg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-s390x-gnu@0.94.0': resolution: {integrity: sha512-UfIuYWcs1tb/vwGwZPPVaO38OubKfi+MkySl2ZP/3Vk4InxtQ+BxxgNqiQbhyvx14GZtkFphH3I2FZaDUsvfYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-x64-gnu@0.94.0': resolution: {integrity: sha512-Iokd1dfneOcNHBJH8o5cMgDkII8R7dzOFSaMrZiSZkLr+woT3Ed7uLqTKwleNKq52z5+XwmgcvO00c6ywStCpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-minify/binding-linux-x64-musl@0.94.0': resolution: {integrity: sha512-W4hFq/e21o2cOKx9xltJuVo/xgXnn4SsUioo/86pk5vCmUXg++J0PMML/oOZTSbevlklg/Vxo8slRUSU4/0PzA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-minify/binding-wasm32-wasi@0.94.0': resolution: {integrity: sha512-0bOaEuh7QX8MfqyrRjNPOWhcsYl0IGoHX1nPtFIFGm0f/AJsJ+3wbyI9WvkAOXZmRgI9DMKGbDJdU6J59JxA7w==} @@ -3407,84 +3776,98 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-gnu@0.94.0': resolution: {integrity: sha512-u55PGVVfZF/frpEcv/vowfuqsCd5VKz3wta8KZ3MBxboat7XxgRIMS8VQEBiJ3aYE80taACu5EfPN1y9DhiU0Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.115.0': resolution: {integrity: sha512-HjsZbJPH9mMd4swJRywVMsDZsJX0hyKb1iNHo5ijRl5yhtbO3lj7ImSrrL1oZ1VEg0te4iKmDGGz/6YPLd1G8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-arm64-musl@0.94.0': resolution: {integrity: sha512-Qm2SEU7/f2b2Rg76Pj49BdMFF7Vv7+2qLPxaae4aH1515kzVv6nZW0bqCo4fPDDyiE4bryF7Jr+WKhllBxvXPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.115.0': resolution: {integrity: sha512-zhhePoBrd7kQx3oClX/W6NldsuCbuMqaN9rRsY+6/WoorAb4j490PG/FjqgAXscWp2uSW2WV9L+ksn0wHrvsrg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.115.0': resolution: {integrity: sha512-t/IRojvUE9XrKu+/H1b8YINug+7Q6FLls5rsm2lxB5mnS8GN/eYAYrPgHkcg9/1SueRDSzGpDYu3lGWTObk1zw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.94.0': resolution: {integrity: sha512-bZO3QAt0lsZjk351mVM85obMivbXG+tDiah5XmmOaGO8k4vEYmoiKr2YHJoA2eNpKhPJF8dNyIS7U+XAvirr9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.115.0': resolution: {integrity: sha512-79jBHSSh/YpQRAmvYoaCfpyToRbJ/HBrdB7hxK2ku2JMehjopTVo+xMJss/RV7/ZYqeezgjvKDQzapJbgcjVZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.115.0': resolution: {integrity: sha512-nA1TpxkhNTIOMMyiSSsa7XIVJVoOU/SsVrHIz3gHvWweB5PHCQfO7w+Lb2EP0lBWokv7HtA/KbF7aLDoXzmuMw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-s390x-gnu@0.94.0': resolution: {integrity: sha512-IdbJ/rwsaEPQx11mQwGoClqhAmVaAF9+3VmDRYVmfsYsrhX1Ue1HvBdVHDvtHzJDuumC/X/codkVId9Ss+7fVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.115.0': resolution: {integrity: sha512-9iVX789DoC3SaOOG+X6NcF/tVChgLp2vcHffzOC2/Z1JTPlz6bMG2ogvcW6/9s0BG2qvhNQImd+gbWYeQbOwVw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.94.0': resolution: {integrity: sha512-TbtpRdViF3aPCQBKuEo+TcucwW3KFa6bMHVakgaJu12RZrFpO4h1IWppBbuuBQ9X7SfvpgC1YgCDGve9q6fpEA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.115.0': resolution: {integrity: sha512-RmQmk+mjCB0nMNfEYhaCxwofLo1Z95ebHw1AGvRiWGCd4zhCNOyskgCbMogIcQzSB3SuEKWgkssyaiQYVAA4hQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-linux-x64-musl@0.94.0': resolution: {integrity: sha512-hlfoDmWvgSbexoJ9u3KwAJwpeu91FfJR6++fQjeYXD2InK4gZow9o3DRoTpN/kslZwzUNpiRURqxey/RvWh8JQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.115.0': resolution: {integrity: sha512-viigraWWQhhDvX5aGq+wrQq58k00Xq3MHz/0R4AFMxGlZ8ogNonpEfNc73Q5Ly87Z6sU9BvxEdG0dnYTfVnmew==} @@ -3585,36 +3968,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.94.0': resolution: {integrity: sha512-QiyHubpKo7upYPfwB+8bjaTczd60PJdL2zJrMKgL+CDlmP6HZlnWXZkeVTA3S6QXnbulRlrtERmqS2DePszG0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-riscv64-gnu@0.94.0': resolution: {integrity: sha512-vh3PZGmoUCbfkqVGuB7fweuqthYxzAAGqhiAJAn8x4V+R86W5esCtxbm+PTyVawBT/eoq1cU8HhNVqE0rQlChg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-s390x-gnu@0.94.0': resolution: {integrity: sha512-DT3m7cF612RdHBmYK3Ave6OVT1iSvlbKo8T+81n6ZcFXO+L8vDJHzwMwMOXfeOLQ15zr0WmSHqBOZ14tHKNidw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.94.0': resolution: {integrity: sha512-kK5dt8wfxUD3MGXnLHWxv57oYinIwoRFcjw2oJD5DCoGTeXCmrFk4D0eGPAlZKOm7uvWMs9yNI8rg1KY5nEs1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.94.0': resolution: {integrity: sha512-+zfNBO2qEPcSPTHVUxsiG3Hm0vxWzuL+DZX0wbbtjKwwhH2Jr1Eo26R+Dwc1SfbvoWen36NitKkd2arkpMW8KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-transform/binding-wasm32-wasi@0.94.0': resolution: {integrity: sha512-rn3c2wGT3ha6j0VLykYOkXU5YyQYIeGXRsDPP7xyiZHVTVssoM0X1BuheFlgxmC1POXMT+dAAcVOFG5MdW1bnQ==} @@ -3662,36 +4051,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-wasm@2.5.1': resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} @@ -3827,48 +4222,56 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.57': resolution: {integrity: sha512-A3/wu1RgsHhqP3rVH2+sM81bpk+Qd2XaHTl8LtX5/1LNR7QVBFBCpAoiXwjTdGnI5cMdBVi7Z1pi52euW760Fw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': resolution: {integrity: sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-arm64-musl@1.0.0-beta.57': resolution: {integrity: sha512-d0kIVezTQtazpyWjiJIn5to8JlwfKITDqwsFv0Xc6s31N16CD2PC/Pl2OtKgS7n8WLOJbfqgIp5ixYzTAxCqMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': resolution: {integrity: sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-beta.57': resolution: {integrity: sha512-E199LPijo98yrLjPCmETx8EF43sZf9t3guSrLee/ej1rCCc3zDVTR4xFfN9BRAapGVl7/8hYqbbiQPTkv73kUg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': resolution: {integrity: sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-linux-x64-musl@1.0.0-beta.57': resolution: {integrity: sha512-++EQDpk/UJ33kY/BNsh7A7/P1sr/jbMuQ8cE554ZIy+tCUWCivo9zfyjDUoiMdnxqX6HLJEqqGnbGQOvzm2OMQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': resolution: {integrity: sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==} @@ -4037,56 +4440,67 @@ packages: resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.54.0': resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.54.0': resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.54.0': resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.54.0': resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.54.0': resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.54.0': resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.54.0': resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.54.0': resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.54.0': resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.54.0': resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.54.0': resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} @@ -4273,24 +4687,28 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.2.1': resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.2.1': resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.2.1': resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.2.1': resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} @@ -4608,6 +5026,9 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/aws-lambda@8.10.160': + resolution: {integrity: sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -5035,41 +5456,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -5929,6 +6358,10 @@ packages: basic-ftp@5.1.0: resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade + + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} better-sqlite3@12.5.0: resolution: {integrity: sha512-WwCZ/5Diz7rsF29o27o0Gcc1Du+l7Zsv7SYtVPG0X3G/uUI1LqdxrQI7c9Hs2FWpqXXERjW9hp6g3/tH7DlVKg==} @@ -5953,12 +6386,18 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + blob-to-buffer@1.2.9: resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -6283,6 +6722,10 @@ packages: cookie-es@2.0.0: resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + copy-anything@4.0.5: resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} engines: {node: '>=18'} @@ -6806,8 +7249,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true @@ -7193,6 +7636,9 @@ packages: resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} engines: {node: '>=18'} + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + fast-deep-equal@2.0.1: resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} @@ -7656,6 +8102,10 @@ packages: hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + hono@4.12.12: + resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} + engines: {node: '>=16.9.0'} + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -8069,6 +8519,10 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + json-schema-to-typescript-lite@15.0.0: resolution: {integrity: sha512-5mMORSQm9oTLyjM4mWnyNBi2T042Fhg1/0gCIB6X8U/LVpM2A+Nmj2yEyArqVouDmFThDxpEXcnTgSrjkGJRFA==} @@ -8193,24 +8647,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} @@ -8553,11 +9011,6 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - mime@4.1.0: resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} @@ -8583,6 +9036,11 @@ packages: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true + miniflare@4.20260305.0: + resolution: {integrity: sha512-jVhtKJtiwaZa3rI+WgoLvSJmEazDsoUmAPYRUmEe2VO6VSbvkhbnDRm+dsPbYRatgNIExwrpqG1rv96jHiSb0w==} + engines: {node: '>=18.0.0'} + hasBin: true + minimark@0.2.0: resolution: {integrity: sha512-AmtWU9pO0C2/3AM2pikaVhJ//8E5rOpJ7+ioFQfjIq+wCsBeuZoxPd97hBFZ9qrI7DMHZudwGH3r8A7BMnsIew==} @@ -8877,6 +9335,10 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + octokit@5.0.5: + resolution: {integrity: sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==} + engines: {node: '>= 20'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -9096,6 +9558,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -9369,6 +9834,7 @@ packages: prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true prelude-ls@1.2.1: @@ -9938,6 +10404,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -10422,6 +10892,10 @@ packages: resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} engines: {node: '>=20'} + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -10462,6 +10936,9 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + ts-api-utils@2.2.0: resolution: {integrity: sha512-L6f5oQRAoLU1RwXz0Ab9mxsE7LtxeVB6AIR1lpkZMsOyg/JXeaxBaXa/FVCBZyNr9S9I4wkHrlZTklX+im+WMw==} engines: {node: '>=18.12'} @@ -10653,12 +11130,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@6.22.0: - resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} - engines: {node: '>=18.17'} - - undici@7.16.0: - resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + undici@7.24.7: + resolution: {integrity: sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==} engines: {node: '>=20.18.1'} unenv@2.0.0-rc.24: @@ -10737,6 +11210,12 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-github-app-jwt@2.2.2: + resolution: {integrity: sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==} + + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -11474,6 +11953,21 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + workerd@1.20260305.0: + resolution: {integrity: sha512-JkhfCLU+w+KbQmZ9k49IcDYc78GBo7eG8Mir8E2+KVjR7otQAmpcLlsous09YLh8WQ3Bt3Mi6/WMStvMAPukeA==} + engines: {node: '>=16'} + hasBin: true + + wrangler@4.69.0: + resolution: {integrity: sha512-EmVfIM65I5b4ITHe3Y9R7zQyf4NUBQ1leStakMlWiVR9n6VlDwuEltyQI2l3i0JciDnWyR3uqe+T6C08ivniTQ==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20260305.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -11489,6 +11983,18 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -11588,6 +12094,9 @@ packages: youch-core@0.3.3: resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} + youch@4.1.0-beta.13: resolution: {integrity: sha512-3+AG1Xvt+R7M7PSDudhbfbwiyveW6B8PLBIwTyEC598biEYIjHhC89i6DBEvR0EZUjGY3uGSnC429HpIa2Z09g==} @@ -11794,6 +12303,12 @@ snapshots: '@antfu/utils@0.7.10': {} + '@anthropic-ai/sdk@0.78.0(zod@3.25.76)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 3.25.76 + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 @@ -12611,9 +13126,34 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - '@cloudflare/kv-asset-handler@0.4.1': + '@cloudflare/kv-asset-handler@0.4.2': {} + + '@cloudflare/unenv-preset@2.14.0(unenv@2.0.0-rc.24)(workerd@1.20260305.0)': dependencies: - mime: 3.0.0 + unenv: 2.0.0-rc.24 + optionalDependencies: + workerd: 1.20260305.0 + + '@cloudflare/workerd-darwin-64@1.20260305.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20260305.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20260305.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20260305.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20260305.0': + optional: true + + '@cloudflare/workers-types@4.20260226.1': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 '@csstools/color-helpers@5.1.0': {} @@ -12714,7 +13254,7 @@ snapshots: '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.27.2': + '@esbuild/aix-ppc64@0.27.3': optional: true '@esbuild/android-arm64@0.21.5': @@ -12723,7 +13263,7 @@ snapshots: '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.27.2': + '@esbuild/android-arm64@0.27.3': optional: true '@esbuild/android-arm@0.21.5': @@ -12732,7 +13272,7 @@ snapshots: '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.27.2': + '@esbuild/android-arm@0.27.3': optional: true '@esbuild/android-x64@0.21.5': @@ -12741,7 +13281,7 @@ snapshots: '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.27.2': + '@esbuild/android-x64@0.27.3': optional: true '@esbuild/darwin-arm64@0.21.5': @@ -12750,7 +13290,7 @@ snapshots: '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.27.2': + '@esbuild/darwin-arm64@0.27.3': optional: true '@esbuild/darwin-x64@0.21.5': @@ -12759,7 +13299,7 @@ snapshots: '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.27.2': + '@esbuild/darwin-x64@0.27.3': optional: true '@esbuild/freebsd-arm64@0.21.5': @@ -12768,7 +13308,7 @@ snapshots: '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.27.2': + '@esbuild/freebsd-arm64@0.27.3': optional: true '@esbuild/freebsd-x64@0.21.5': @@ -12777,7 +13317,7 @@ snapshots: '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.27.2': + '@esbuild/freebsd-x64@0.27.3': optional: true '@esbuild/linux-arm64@0.21.5': @@ -12786,7 +13326,7 @@ snapshots: '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.27.2': + '@esbuild/linux-arm64@0.27.3': optional: true '@esbuild/linux-arm@0.21.5': @@ -12795,7 +13335,7 @@ snapshots: '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.27.2': + '@esbuild/linux-arm@0.27.3': optional: true '@esbuild/linux-ia32@0.21.5': @@ -12804,7 +13344,7 @@ snapshots: '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.27.2': + '@esbuild/linux-ia32@0.27.3': optional: true '@esbuild/linux-loong64@0.21.5': @@ -12813,7 +13353,7 @@ snapshots: '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.27.2': + '@esbuild/linux-loong64@0.27.3': optional: true '@esbuild/linux-mips64el@0.21.5': @@ -12822,7 +13362,7 @@ snapshots: '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.27.2': + '@esbuild/linux-mips64el@0.27.3': optional: true '@esbuild/linux-ppc64@0.21.5': @@ -12831,7 +13371,7 @@ snapshots: '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.27.2': + '@esbuild/linux-ppc64@0.27.3': optional: true '@esbuild/linux-riscv64@0.21.5': @@ -12840,7 +13380,7 @@ snapshots: '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.27.2': + '@esbuild/linux-riscv64@0.27.3': optional: true '@esbuild/linux-s390x@0.21.5': @@ -12849,7 +13389,7 @@ snapshots: '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.27.2': + '@esbuild/linux-s390x@0.27.3': optional: true '@esbuild/linux-x64@0.21.5': @@ -12858,13 +13398,13 @@ snapshots: '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.27.2': + '@esbuild/linux-x64@0.27.3': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.27.2': + '@esbuild/netbsd-arm64@0.27.3': optional: true '@esbuild/netbsd-x64@0.21.5': @@ -12873,13 +13413,13 @@ snapshots: '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.27.2': + '@esbuild/netbsd-x64@0.27.3': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.27.2': + '@esbuild/openbsd-arm64@0.27.3': optional: true '@esbuild/openbsd-x64@0.21.5': @@ -12888,13 +13428,13 @@ snapshots: '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.27.2': + '@esbuild/openbsd-x64@0.27.3': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.27.2': + '@esbuild/openharmony-arm64@0.27.3': optional: true '@esbuild/sunos-x64@0.21.5': @@ -12903,7 +13443,7 @@ snapshots: '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.27.2': + '@esbuild/sunos-x64@0.27.3': optional: true '@esbuild/win32-arm64@0.21.5': @@ -12912,7 +13452,7 @@ snapshots: '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.27.2': + '@esbuild/win32-arm64@0.27.3': optional: true '@esbuild/win32-ia32@0.21.5': @@ -12921,7 +13461,7 @@ snapshots: '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.27.2': + '@esbuild/win32-ia32@0.27.3': optional: true '@esbuild/win32-x64@0.21.5': @@ -12930,7 +13470,7 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.27.2': + '@esbuild/win32-x64@0.27.3': optional: true '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.39.2(jiti@2.6.1))': @@ -12967,12 +13507,12 @@ snapshots: '@eslint/config-inspector@1.4.2(eslint@9.39.2(jiti@2.6.1))': dependencies: ansis: 4.2.0 - bundle-require: 5.1.0(esbuild@0.27.2) + bundle-require: 5.1.0(esbuild@0.27.3) cac: 6.7.14 chokidar: 4.0.3 - esbuild: 0.27.2 + esbuild: 0.27.3 eslint: 9.39.2(jiti@2.6.1) - h3: 1.15.4 + h3: 1.15.5 tinyglobby: 0.2.15 ws: 8.18.3 transitivePeerDependencies: @@ -13150,81 +13690,177 @@ snapshots: '@iconify/types': 2.0.0 vue: 3.5.26(typescript@5.9.3) + '@img/colour@1.0.0': {} + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.7.1 optional: true + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.5': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/external-editor@1.0.3(@types/node@24.10.4)': dependencies: chardet: 2.1.1 @@ -13295,6 +13931,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jsdevtools/ono@7.1.3': {} '@kwsites/file-exists@1.1.1': @@ -13570,7 +14211,7 @@ snapshots: '@nuxt/devtools-kit@3.1.1(magicast@0.5.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@nuxt/kit': 4.2.2(magicast@0.5.1) + '@nuxt/kit': 4.3.1(magicast@0.5.1) execa: 8.0.1 vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: @@ -13584,7 +14225,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/devtools-ui-kit@2.7.0(@nuxt/devtools@2.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3)))(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(@vue/compiler-core@3.5.26)(axios@1.13.2)(change-case@5.4.4)(fuse.js@7.1.0)(magicast@0.5.1)(nuxt@4.1.3(@parcel/watcher@2.5.1)(@types/node@24.10.4)(@vue/compiler-sfc@3.5.26)(better-sqlite3@12.5.0)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.31.1)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.1(typescript@5.8.3))(yaml@2.8.2))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3))(webpack@5.104.1(esbuild@0.27.2))': + '@nuxt/devtools-ui-kit@2.7.0(@nuxt/devtools@2.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3)))(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(@vue/compiler-core@3.5.26)(axios@1.13.2)(change-case@5.4.4)(fuse.js@7.1.0)(magicast@0.5.1)(nuxt@4.1.3(@parcel/watcher@2.5.1)(@types/node@24.10.4)(@vue/compiler-sfc@3.5.26)(better-sqlite3@12.5.0)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(better-sqlite3@12.5.0))(eslint@9.39.2(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.31.1)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(terser@5.44.1)(tsx@4.21.0)(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.1(typescript@5.8.3))(yaml@2.8.2))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.8.3))(webpack@5.104.1(esbuild@0.27.3))': dependencies: '@iconify-json/carbon': 1.2.15 '@iconify-json/logos': 1.2.10 @@ -13594,7 +14235,7 @@ snapshots: '@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@nuxt/kit': 3.20.2(magicast@0.5.1) '@unocss/core': 66.5.11 - '@unocss/nuxt': 66.5.11(magicast@0.5.1)(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2)) + '@unocss/nuxt': 66.5.11(magicast@0.5.1)(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.3)) '@unocss/preset-attributify': 66.5.11 '@unocss/preset-icons': 66.5.11 '@unocss/preset-mini': 66.5.11 @@ -13605,7 +14246,7 @@ snapshots: defu: 6.1.4 focus-trap: 7.7.0 splitpanes: 3.2.0(vue@3.5.26(typescript@5.8.3)) - unocss: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + unocss: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) v-lazy-show: 0.3.0(@vue/compiler-core@3.5.26) transitivePeerDependencies: - '@unocss/astro' @@ -14060,9 +14701,9 @@ snapshots: pkg-types: 2.3.0 rc9: 2.1.2 scule: 1.3.0 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 - ufo: 1.6.1 + ufo: 1.6.3 unctx: 2.5.0 untyped: 2.0.0 transitivePeerDependencies: @@ -14086,9 +14727,9 @@ snapshots: pkg-types: 2.3.0 rc9: 2.1.2 scule: 1.3.0 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 - ufo: 1.6.1 + ufo: 1.6.3 unctx: 2.5.0 untyped: 2.0.0 transitivePeerDependencies: @@ -14165,9 +14806,9 @@ snapshots: pkg-types: 2.3.0 rc9: 2.1.2 scule: 1.3.0 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 - ufo: 1.6.1 + ufo: 1.6.3 unctx: 2.5.0 untyped: 2.0.0 transitivePeerDependencies: @@ -14198,7 +14839,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/module-builder@1.0.2(@nuxt/cli@3.31.3(cac@6.7.14)(commander@13.1.0)(magicast@0.5.1))(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(typescript@5.8.3)(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3))': + '@nuxt/module-builder@1.0.2(@nuxt/cli@3.31.3(cac@6.7.14)(commander@13.1.0)(magicast@0.5.1))(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(typescript@5.8.3)(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3))': dependencies: '@nuxt/cli': 3.31.3(cac@6.7.14)(commander@13.1.0)(magicast@0.5.1) citty: 0.1.6 @@ -14206,14 +14847,14 @@ snapshots: defu: 6.1.4 jiti: 2.6.1 magic-regexp: 0.10.0 - mkdist: 2.4.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) + mkdist: 2.4.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.3.0 tsconfck: 3.1.6(typescript@5.8.3) typescript: 5.8.3 - unbuild: 3.6.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) - vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)) + unbuild: 3.6.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) + vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)) transitivePeerDependencies: - '@vue/compiler-core' - esbuild @@ -15002,6 +15643,153 @@ snapshots: - '@swc/core' - debug + '@octokit/app@16.1.2': + dependencies: + '@octokit/auth-app': 8.2.0 + '@octokit/auth-unauthenticated': 7.0.3 + '@octokit/core': 7.0.6 + '@octokit/oauth-app': 8.0.3 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/types': 16.0.0 + '@octokit/webhooks': 14.2.0 + + '@octokit/auth-app@8.2.0': + dependencies: + '@octokit/auth-oauth-app': 9.0.3 + '@octokit/auth-oauth-user': 6.0.2 + '@octokit/request': 10.0.7 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + toad-cache: 3.7.0 + universal-github-app-jwt: 2.2.2 + universal-user-agent: 7.0.3 + + '@octokit/auth-oauth-app@9.0.3': + dependencies: + '@octokit/auth-oauth-device': 8.0.3 + '@octokit/auth-oauth-user': 6.0.2 + '@octokit/request': 10.0.7 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-oauth-device@8.0.3': + dependencies: + '@octokit/oauth-methods': 6.0.2 + '@octokit/request': 10.0.7 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-oauth-user@6.0.2': + dependencies: + '@octokit/auth-oauth-device': 8.0.3 + '@octokit/oauth-methods': 6.0.2 + '@octokit/request': 10.0.7 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/auth-token@6.0.0': {} + + '@octokit/auth-unauthenticated@7.0.3': + dependencies: + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + + '@octokit/core@7.0.6': + dependencies: + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.7 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 + + '@octokit/endpoint@11.0.2': + dependencies: + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/graphql@9.0.3': + dependencies: + '@octokit/request': 10.0.7 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 + + '@octokit/oauth-app@8.0.3': + dependencies: + '@octokit/auth-oauth-app': 9.0.3 + '@octokit/auth-oauth-user': 6.0.2 + '@octokit/auth-unauthenticated': 7.0.3 + '@octokit/core': 7.0.6 + '@octokit/oauth-authorization-url': 8.0.0 + '@octokit/oauth-methods': 6.0.2 + '@types/aws-lambda': 8.10.160 + universal-user-agent: 7.0.3 + + '@octokit/oauth-authorization-url@8.0.0': {} + + '@octokit/oauth-methods@6.0.2': + dependencies: + '@octokit/oauth-authorization-url': 8.0.0 + '@octokit/request': 10.0.7 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + + '@octokit/openapi-types@27.0.0': {} + + '@octokit/openapi-webhooks-types@12.1.0': {} + + '@octokit/plugin-paginate-graphql@6.0.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 + + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 + + '@octokit/plugin-retry@8.1.0(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@11.0.3(@octokit/core@7.0.6)': + dependencies: + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 + bottleneck: 2.19.5 + + '@octokit/request-error@7.1.0': + dependencies: + '@octokit/types': 16.0.0 + + '@octokit/request@10.0.7': + dependencies: + '@octokit/endpoint': 11.0.2 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 + universal-user-agent: 7.0.3 + + '@octokit/types@16.0.0': + dependencies: + '@octokit/openapi-types': 27.0.0 + + '@octokit/webhooks-methods@6.0.0': {} + + '@octokit/webhooks@14.2.0': + dependencies: + '@octokit/openapi-webhooks-types': 12.1.0 + '@octokit/request-error': 7.1.0 + '@octokit/webhooks-methods': 6.0.0 + '@one-ini/wasm@0.1.1': {} '@oxc-minify/binding-android-arm64@0.94.0': @@ -16105,6 +16893,8 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/aws-lambda@8.10.160': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -16359,7 +17149,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.50.1 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.2.0(typescript@5.8.3) typescript: 5.8.3 @@ -16374,7 +17164,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.50.1 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.2.0(typescript@5.9.3) typescript: 5.9.3 @@ -16545,7 +17335,7 @@ snapshots: gzip-size: 6.0.0 sirv: 3.0.2 - '@unocss/nuxt@66.5.11(magicast@0.5.1)(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.2))': + '@unocss/nuxt@66.5.11(magicast@0.5.1)(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.104.1(esbuild@0.27.3))': dependencies: '@nuxt/kit': 4.3.1(magicast@0.5.1) '@unocss/config': 66.5.11 @@ -16559,8 +17349,8 @@ snapshots: '@unocss/preset-wind4': 66.5.11 '@unocss/reset': 66.5.11 '@unocss/vite': 66.5.11(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - '@unocss/webpack': 66.5.11(webpack@5.104.1(esbuild@0.27.2)) - unocss: 66.5.11(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@unocss/webpack': 66.5.11(webpack@5.104.1(esbuild@0.27.3)) + unocss: 66.5.11(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - magicast - postcss @@ -16696,7 +17486,7 @@ snapshots: '@unocss/rule-utils@66.5.11': dependencies: - '@unocss/core': 66.5.11 + '@unocss/core': 66.6.7 magic-string: 0.30.21 '@unocss/rule-utils@66.6.7': @@ -16772,7 +17562,7 @@ snapshots: unplugin-utils: 0.3.1 vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) - '@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2))': + '@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3))': dependencies: '@jridgewell/remapping': 2.3.5 '@unocss/config': 66.5.11 @@ -16783,7 +17573,7 @@ snapshots: tinyglobby: 0.2.15 unplugin: 2.3.11 unplugin-utils: 0.3.1 - webpack: 5.104.1(esbuild@0.27.2) + webpack: 5.104.1(esbuild@0.27.3) webpack-sources: 3.3.3 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -17965,6 +18755,8 @@ snapshots: basic-ftp@5.1.0: {} + before-after-hook@4.0.0: {} + better-sqlite3@12.5.0: dependencies: bindings: 1.5.0 @@ -17990,10 +18782,14 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + blake3-wasm@2.1.5: {} + blob-to-buffer@1.2.9: {} boolbase@1.0.0: {} + bottleneck@2.19.5: {} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -18043,9 +18839,9 @@ snapshots: dependencies: run-applescript: 7.1.0 - bundle-require@5.1.0(esbuild@0.27.2): + bundle-require@5.1.0(esbuild@0.27.3): dependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 load-tsconfig: 0.2.5 c12@3.3.3(magicast@0.3.5): @@ -18175,7 +18971,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.16.0 + undici: 7.24.7 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -18334,6 +19130,8 @@ snapshots: cookie-es@2.0.0: {} + cookie@1.1.1: {} + copy-anything@4.0.5: dependencies: is-what: 5.5.0 @@ -18862,34 +19660,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - esbuild@0.27.2: + esbuild@0.27.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 escalade@3.2.0: {} @@ -19435,6 +20233,8 @@ snapshots: fake-indexeddb@6.2.5: {} + fast-content-type-parse@3.0.0: {} + fast-deep-equal@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -19551,7 +20351,7 @@ snapshots: magic-regexp: 0.10.0 magic-string: 0.30.21 pathe: 2.0.3 - ufo: 1.6.1 + ufo: 1.6.3 unplugin: 2.3.11 transitivePeerDependencies: - encoding @@ -19587,7 +20387,7 @@ snapshots: consola: 3.4.2 css-tree: 3.1.0 defu: 6.1.4 - esbuild: 0.27.2 + esbuild: 0.27.3 fontaine: 0.8.0 jiti: 2.6.1 lightningcss: 1.31.1 @@ -19863,7 +20663,7 @@ snapshots: iron-webcrypto: 1.2.1 node-mock-http: 1.0.4 radix3: 1.1.2 - ufo: 1.6.1 + ufo: 1.6.3 uncrypto: 0.1.3 h3@1.15.5: @@ -20042,6 +20842,8 @@ snapshots: hey-listen@1.0.8: {} + hono@4.12.12: {} + hookable@5.5.3: {} hookable@6.0.1: {} @@ -20483,6 +21285,11 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.28.4 + ts-algebra: 2.0.0 + json-schema-to-typescript-lite@15.0.0: dependencies: '@apidevtools/json-schema-ref-parser': 14.2.1(@types/json-schema@7.0.15) @@ -20758,7 +21565,7 @@ snapshots: mlly: 1.8.0 regexp-tree: 0.1.27 type-level-regexp: 0.1.17 - ufo: 1.6.1 + ufo: 1.6.3 unplugin: 2.3.11 magic-string-ast@1.0.3: @@ -21156,8 +21963,6 @@ snapshots: dependencies: mime-db: 1.54.0 - mime@3.0.0: {} - mime@4.1.0: {} mimic-fn@2.1.0: {} @@ -21170,6 +21975,18 @@ snapshots: mini-svg-data-uri@1.4.4: {} + miniflare@4.20260305.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + sharp: 0.34.5 + undici: 7.24.7 + workerd: 1.20260305.0 + ws: 8.18.0 + youch: 4.1.0-beta.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + minimark@0.2.0: {} minimatch@10.0.3: @@ -21218,7 +22035,7 @@ snapshots: dependencies: minimist: 1.2.8 - mkdist@2.4.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)): + mkdist@2.4.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)): dependencies: autoprefixer: 10.4.23(postcss@8.5.6) citty: 0.1.6 @@ -21236,7 +22053,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 vue: 3.5.26(typescript@5.8.3) - vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)) + vue-sfc-transformer: 0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)) vue-tsc: 3.2.1(typescript@5.8.3) mlly@1.8.0: @@ -21308,7 +22125,7 @@ snapshots: nitropack@2.12.9(better-sqlite3@12.5.0)(rolldown@1.0.0-beta.57): dependencies: - '@cloudflare/kv-asset-handler': 0.4.1 + '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 5.1.1(rollup@4.54.0) '@rollup/plugin-commonjs': 28.0.9(rollup@4.54.0) '@rollup/plugin-inject': 5.0.5(rollup@4.54.0) @@ -21828,11 +22645,25 @@ snapshots: obug@2.1.1: {} + octokit@5.0.5: + dependencies: + '@octokit/app': 16.1.2 + '@octokit/core': 7.0.6 + '@octokit/oauth-app': 8.0.3 + '@octokit/plugin-paginate-graphql': 6.0.0(@octokit/core@7.0.6) + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) + '@octokit/plugin-retry': 8.1.0(@octokit/core@7.0.6) + '@octokit/plugin-throttling': 11.0.3(@octokit/core@7.0.6) + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + '@octokit/webhooks': 14.2.0 + ofetch@1.5.1: dependencies: destr: 2.0.5 node-fetch-native: 1.6.7 - ufo: 1.6.1 + ufo: 1.6.3 ohash@2.0.11: {} @@ -22147,6 +22978,8 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-to-regexp@6.3.0: {} + path-type@4.0.0: {} path-type@6.0.0: {} @@ -23197,6 +24030,37 @@ snapshots: '@img/sharp-win32-x64': 0.33.5 optional: true + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -23606,16 +24470,16 @@ snapshots: minizlib: 3.1.0 yallist: 5.0.0 - terser-webpack-plugin@5.3.16(esbuild@0.27.2)(webpack@5.104.1(esbuild@0.27.2)): + terser-webpack-plugin@5.3.16(esbuild@0.27.3)(webpack@5.104.1(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.1 - webpack: 5.104.1(esbuild@0.27.2) + webpack: 5.104.1(esbuild@0.27.3) optionalDependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 terser@5.44.1: dependencies: @@ -23711,6 +24575,8 @@ snapshots: '@sindresorhus/base62': 1.0.0 reserved-identifiers: 1.2.0 + toad-cache@3.7.0: {} + toidentifier@1.0.1: {} toml-eslint-parser@0.10.1: @@ -23739,6 +24605,8 @@ snapshots: trough@2.2.0: {} + ts-algebra@2.0.0: {} + ts-api-utils@2.2.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -23821,7 +24689,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -23875,7 +24743,7 @@ snapshots: ultrahtml@1.6.0: {} - unbuild@3.6.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)): + unbuild@3.6.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.54.0) '@rollup/plugin-commonjs': 28.0.9(rollup@4.54.0) @@ -23891,7 +24759,7 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.4.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) + mkdist: 2.4.1(typescript@5.8.3)(vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)))(vue-tsc@3.2.1(typescript@5.8.3))(vue@3.5.26(typescript@5.8.3)) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.3.0 @@ -23948,9 +24816,7 @@ snapshots: undici-types@7.16.0: {} - undici@6.22.0: {} - - undici@7.16.0: {} + undici@7.24.7: {} unenv@2.0.0-rc.24: dependencies: @@ -24066,6 +24932,10 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + universal-github-app-jwt@2.2.2: {} + + universal-user-agent@7.0.3: {} + universalify@0.1.2: {} universalify@2.0.1: {} @@ -24073,9 +24943,9 @@ snapshots: unocss-preset-scrollbar@3.2.0(unocss@66.6.7(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))): dependencies: '@unocss/preset-mini': 65.5.0 - unocss: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + unocss: 66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) - unocss@66.5.11(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + unocss@66.5.11(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(postcss@8.5.6)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@unocss/astro': 66.5.11(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@unocss/cli': 66.5.11 @@ -24097,13 +24967,13 @@ snapshots: '@unocss/transformer-variant-group': 66.5.11 '@unocss/vite': 66.5.11(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) optionalDependencies: - '@unocss/webpack': 66.5.11(webpack@5.104.1(esbuild@0.27.2)) + '@unocss/webpack': 66.5.11(webpack@5.104.1(esbuild@0.27.3)) vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - postcss - supports-color - unocss@66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.2)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + unocss@66.6.7(@unocss/webpack@66.5.11(webpack@5.104.1(esbuild@0.27.3)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@unocss/cli': 66.6.7 '@unocss/core': 66.6.7 @@ -24123,7 +24993,7 @@ snapshots: '@unocss/transformer-variant-group': 66.6.7 '@unocss/vite': 66.6.7(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) optionalDependencies: - '@unocss/webpack': 66.5.11(webpack@5.104.1(esbuild@0.27.2)) + '@unocss/webpack': 66.5.11(webpack@5.104.1(esbuild@0.27.3)) transitivePeerDependencies: - vite @@ -24333,11 +25203,11 @@ snapshots: anymatch: 3.1.3 chokidar: 4.0.3 destr: 2.0.5 - h3: 1.15.4 + h3: 1.15.5 lru-cache: 10.4.3 node-fetch-native: 1.6.7 ofetch: 1.5.1 - ufo: 1.6.1 + ufo: 1.6.3 optionalDependencies: db0: 0.3.4(better-sqlite3@12.5.0) ioredis: 5.8.2 @@ -24546,12 +25416,12 @@ snapshots: - rollup - supports-color - vite-plugin-glsl@1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.2)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-glsl@1.5.5(@rollup/pluginutils@5.3.0(rollup@4.54.0))(esbuild@0.27.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: '@rollup/pluginutils': 5.3.0(rollup@4.54.0) - esbuild: 0.27.2 + esbuild: 0.27.3 vite-plugin-inspect@11.3.3(@nuxt/kit@3.20.2(magicast@0.3.5))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): dependencies: @@ -24664,7 +25534,7 @@ snapshots: vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 @@ -24855,11 +25725,11 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.26(typescript@5.9.3) - vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.2)(vue@3.5.26(typescript@5.8.3)): + vue-sfc-transformer@0.1.17(@vue/compiler-core@3.5.26)(esbuild@0.27.3)(vue@3.5.26(typescript@5.8.3)): dependencies: '@babel/parser': 7.28.5 '@vue/compiler-core': 3.5.26 - esbuild: 0.27.2 + esbuild: 0.27.3 vue: 3.5.26(typescript@5.8.3) vue-tsc@3.2.1(typescript@5.8.3): @@ -24930,7 +25800,7 @@ snapshots: '@wdio/utils': 9.22.0 deepmerge-ts: 7.1.5 https-proxy-agent: 7.0.6 - undici: 6.22.0 + undici: 7.24.7 ws: 8.18.3 transitivePeerDependencies: - bare-abort-controller @@ -24983,7 +25853,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.104.1(esbuild@0.27.2): + webpack@5.104.1(esbuild@0.27.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -25007,7 +25877,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.2)(webpack@5.104.1(esbuild@0.27.2)) + terser-webpack-plugin: 5.3.16(esbuild@0.27.3)(webpack@5.104.1(esbuild@0.27.3)) watchpack: 2.5.0 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -25062,6 +25932,31 @@ snapshots: word-wrap@1.2.5: {} + workerd@1.20260305.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20260305.0 + '@cloudflare/workerd-darwin-arm64': 1.20260305.0 + '@cloudflare/workerd-linux-64': 1.20260305.0 + '@cloudflare/workerd-linux-arm64': 1.20260305.0 + '@cloudflare/workerd-windows-64': 1.20260305.0 + + wrangler@4.69.0(@cloudflare/workers-types@4.20260226.1): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.2 + '@cloudflare/unenv-preset': 2.14.0(unenv@2.0.0-rc.24)(workerd@1.20260305.0) + blake3-wasm: 2.1.5 + esbuild: 0.27.3 + miniflare: 4.20260305.0 + path-to-regexp: 6.3.0 + unenv: 2.0.0-rc.24 + workerd: 1.20260305.0 + optionalDependencies: + '@cloudflare/workers-types': 4.20260226.1 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -25082,6 +25977,8 @@ snapshots: wrappy@1.0.2: {} + ws@8.18.0: {} + ws@8.18.3: {} wsl-utils@0.1.0: @@ -25156,6 +26053,14 @@ snapshots: '@poppinss/exception': 1.2.3 error-stack-parser-es: 1.0.5 + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.12 + cookie: 1.1.1 + youch-core: 0.3.3 + youch@4.1.0-beta.13: dependencies: '@poppinss/colors': 4.1.6