diff --git a/apps/frontend/.gitignore b/apps/frontend/.gitignore
deleted file mode 100644
index 5a3590c..0000000
--- a/apps/frontend/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-.vercel
diff --git a/apps/frontend/cool_hacker.png b/apps/frontend/cool_hacker.png
deleted file mode 100644
index af1e3c9..0000000
Binary files a/apps/frontend/cool_hacker.png and /dev/null differ
diff --git a/apps/frontend/index.html b/apps/frontend/index.html
deleted file mode 100644
index 33fdb8e..0000000
--- a/apps/frontend/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
- Rubber Duck - Voice Activity Detector
-
-
-
-
-
-
-
Click "Start" to begin
-
Start
-
-
Grant microphone access to start voice detection
-
-
-
-
diff --git a/apps/frontend/main.js b/apps/frontend/main.js
deleted file mode 100644
index 4ed44f5..0000000
--- a/apps/frontend/main.js
+++ /dev/null
@@ -1,121 +0,0 @@
-const indicator = document.getElementById('duck-indicator')
-const statusText = document.getElementById('status-text')
-const toggleBtn = document.getElementById('toggle-btn')
-const errorText = document.getElementById('error-text')
-
-let detector = null
-
-class SmartVoiceDetector {
- constructor(options = {}) {
- this.threshold = options.threshold ?? -50
- this.silenceDelay = options.silenceDelay ?? 700
- this.onSpeechStart = options.onSpeechStart || (() => {})
- this.onSpeechEnd = options.onSpeechEnd || (() => {})
-
- this.isSpeaking = false
- this.timeout = null
- this.audioContext = null
- this.running = false
- }
-
- async start() {
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
- this.audioContext = new AudioContext()
- const source = this.audioContext.createMediaStreamSource(stream)
- const analyser = this.audioContext.createAnalyser()
-
- analyser.fftSize = 1024
- analyser.smoothingTimeConstant = 0.4
- source.connect(analyser)
-
- const bufferLength = analyser.frequencyBinCount
- const dataArray = new Float32Array(bufferLength)
-
- const sampleRate = this.audioContext.sampleRate
- const minHz = 85
- const maxHz = 3000
- const minIndex = Math.floor(minHz / (sampleRate / analyser.fftSize))
- const maxIndex = Math.ceil(maxHz / (sampleRate / analyser.fftSize))
-
- this.running = true
- const check = () => {
- if (!this.running) return
-
- analyser.getFloatFrequencyData(dataArray)
-
- let maxVolume = -Infinity
- for (let i = minIndex; i <= maxIndex; i++) {
- if (dataArray[i] > maxVolume) maxVolume = dataArray[i]
- }
-
- if (maxVolume > this.threshold) {
- if (!this.isSpeaking) {
- this.isSpeaking = true
- this.onSpeechStart()
- }
- clearTimeout(this.timeout)
- this.timeout = null
- } else if (this.isSpeaking && !this.timeout) {
- this.timeout = setTimeout(() => {
- this.isSpeaking = false
- this.onSpeechEnd()
- }, this.silenceDelay)
- }
-
- requestAnimationFrame(check)
- }
-
- check()
- }
-
- stop() {
- this.running = false
- if (this.audioContext) {
- this.audioContext.close()
- this.audioContext = null
- }
- }
-}
-
-toggleBtn.addEventListener('click', async () => {
- if (detector) {
- detector.stop()
- detector = null
- statusText.textContent = 'Stopped'
- toggleBtn.textContent = 'Start'
- indicator.classList.remove('speaking')
- indicator.classList.add('silent')
- return
- }
-
- toggleBtn.disabled = true
- statusText.textContent = 'Starting...'
-
- try {
- detector = new SmartVoiceDetector({
- threshold: -50,
- onSpeechStart: () => {
- indicator.classList.remove('silent')
- indicator.classList.add('speaking')
- statusText.textContent = 'Voice detected'
- },
- onSpeechEnd: () => {
- indicator.classList.remove('speaking')
- indicator.classList.add('silent')
- statusText.textContent = 'Listening...'
- },
- })
-
- await detector.start()
- statusText.textContent = 'Listening...'
- toggleBtn.textContent = 'Stop'
- toggleBtn.disabled = false
- } catch (err) {
- console.error('Mic error:', err)
- errorText.textContent = err.message || String(err)
- errorText.classList.remove('hidden')
- statusText.textContent = 'Error'
- toggleBtn.textContent = 'Retry'
- toggleBtn.disabled = false
- }
-})
\ No newline at end of file
diff --git a/apps/frontend/package.json b/apps/frontend/package.json
deleted file mode 100644
index 56431c1..0000000
--- a/apps/frontend/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "rubber-duck",
- "version": "0.0.1",
- "description": "Best debug tool - rubber duck",
- "keywords": [
- "rubber",
- "duck",
- "debug",
- "tool",
- "fun"
- ],
- "homepage": "https://github.com/Ku6epXBOCTuK/rubber-duck#readme",
- "bugs": {
- "url": "https://github.com/Ku6epXBOCTuK/rubber-duck/issues"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/Ku6epXBOCTuK/rubber-duck.git"
- },
- "license": "MIT",
- "author": "Ku6epXBOCTuK",
- "type": "module",
- "main": "index.js",
- "scripts": {
- "dev": "vite",
- "test": "echo \"Error: no test specified\" && exit 1",
- "build": "vite build",
- "preview": "vite preview"
- },
- "devDependencies": {
- "vite": "^8.0.11"
- }
-}
diff --git a/apps/frontend/style.css b/apps/frontend/style.css
deleted file mode 100644
index b15c38b..0000000
--- a/apps/frontend/style.css
+++ /dev/null
@@ -1,107 +0,0 @@
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- background: #1a1a2e;
- display: flex;
- justify-content: center;
- align-items: center;
- min-height: 100vh;
- color: #fff;
-}
-
-.container {
- text-align: center;
-}
-
-#duck-wrapper {
- position: relative;
- display: inline-block;
-}
-
-#duck-indicator {
- position: relative;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 160px;
- height: 160px;
- transition: filter 0.3s ease;
-}
-
-.duck-icon {
- width: 120px;
- height: 120px;
- position: relative;
- z-index: 2;
-}
-
-#glow-ring {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border-radius: 50%;
- transition: all 0.3s ease;
- z-index: 1;
- pointer-events: none;
-}
-
-#duck-indicator.silent #glow-ring {
- background: radial-gradient(circle, rgba(255, 50, 50, 0.3) 0%, transparent 70%);
- box-shadow: 0 0 40px 10px rgba(255, 50, 50, 0.2), inset 0 0 40px 10px rgba(255, 50, 50, 0.05);
-}
-
-#duck-indicator.speaking #glow-ring {
- background: radial-gradient(circle, rgba(50, 255, 50, 0.4) 0%, transparent 70%);
- box-shadow: 0 0 60px 20px rgba(50, 255, 50, 0.3), inset 0 0 60px 20px rgba(50, 255, 50, 0.1);
- animation: pulse 1.2s ease-in-out infinite;
-}
-
-@keyframes pulse {
- 0%, 100% { transform: scale(1); opacity: 1; }
- 50% { transform: scale(1.08); opacity: 0.85; }
-}
-
-#status-text {
- margin-top: 20px;
- font-size: 1.2rem;
- opacity: 0.8;
-}
-
-.btn {
- margin-top: 16px;
- padding: 10px 28px;
- font-size: 1rem;
- border: none;
- border-radius: 8px;
- background: #16213e;
- color: #fff;
- cursor: pointer;
- transition: background 0.2s;
-}
-
-.btn:hover {
- background: #0f3460;
-}
-
-.hint {
- margin-top: 24px;
- font-size: 0.85rem;
- opacity: 0.5;
-}
-
-.error {
- margin-top: 12px;
- color: #ff6b6b;
- font-size: 0.9rem;
-}
-
-.hidden {
- display: none;
-}
diff --git a/apps/frontend/vite.config.js b/apps/frontend/vite.config.js
deleted file mode 100644
index 529b129..0000000
--- a/apps/frontend/vite.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineConfig } from 'vite'
-
-export default defineConfig({
- assetsInlineLimit: 0,
-})
\ No newline at end of file
diff --git a/apps/mcp/.gitignore b/apps/mcp/.gitignore
deleted file mode 100644
index c4ea510..0000000
--- a/apps/mcp/.gitignore
+++ /dev/null
@@ -1,43 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.*
-.yarn/*
-!.yarn/patches
-!.yarn/plugins
-!.yarn/releases
-!.yarn/versions
-
-# testing
-/coverage
-
-# next.js
-/.next/
-/out/
-
-# production
-/build
-
-# misc
-.DS_Store
-*.pem
-
-# debug
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-.pnpm-debug.log*
-
-# env files (can opt-in for committing if needed)
-.env*
-
-# vercel
-.vercel
-
-# typescript
-*.tsbuildinfo
-next-env.d.ts
-
-.vercel
diff --git a/apps/mcp/AGENTS.md b/apps/mcp/AGENTS.md
deleted file mode 100644
index 643577d..0000000
--- a/apps/mcp/AGENTS.md
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-# This is NOT the Next.js you know
-
-This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
-
-This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
-
-
diff --git a/apps/mcp/CLAUDE.md b/apps/mcp/CLAUDE.md
deleted file mode 100644
index 43c994c..0000000
--- a/apps/mcp/CLAUDE.md
+++ /dev/null
@@ -1 +0,0 @@
-@AGENTS.md
diff --git a/apps/mcp/README.md b/apps/mcp/README.md
deleted file mode 100644
index 285b6d4..0000000
--- a/apps/mcp/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Rubber Duck MCP
-
-MCP-сервер для техники «резиновая уточка»: когда ИИ застревает в логическом цикле или склонен к
-галлюцинациям, он вызывает инструмент `quack()`, чтобы сформулировать мысль и продолжить.
-
-Сервер работает в режиме **Streamable HTTP** (stateless), развёртывается на Vercel, использует
-`mcp-handler` v2 + `@modelcontextprotocol/server` v2.
-
-## Эндпоинт
-
-```
-POST /api/mcp
-```
-
-Подключите этот URL как MCP-сервер (тип Streamable HTTP) в Cursor, Claude Desktop и других клиентах.
-
-## Инструменты
-
-- `quack` — возвращает кряк. Опциональный параметр `mood`: `happy | confused | excited | sleepy`.
-
-## Запуск
-
-```bash
-pnpm install
-pnpm dev # http://localhost:3000
-pnpm build
-pnpm start
-```
-
-## Проверка
-
-```bash
-curl -X POST http://localhost:3000/api/mcp \
- -H "Content-Type: application/json" \
- -H "Accept: application/json, text/event-stream" \
- -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"quack","arguments":{"mood":"happy"}}}'
-```
-
-## Деплой на Vercel
-
-```bash
-vercel --prod
-```
-
-(`rootDirectory` проекта — `apps/mcp`.)
diff --git a/apps/mcp/app/api/mcp/route.ts b/apps/mcp/app/api/mcp/route.ts
deleted file mode 100644
index 3c5645e..0000000
--- a/apps/mcp/app/api/mcp/route.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import { createMcpHandler } from "mcp-handler";
-import { registerDuckTools } from "@/lib/mcp";
-
-export const runtime = "nodejs";
-
-const post = createMcpHandler(
- async (server) => {
- registerDuckTools(server);
- },
- {
- serverInfo: { name: "rubber-duck-mcp", version: "1.0.0" },
- },
-);
-
-export async function GET(req: Request) {
- return post(req);
-}
-
-export async function POST(req: Request) {
- return post(req);
-}
diff --git a/apps/mcp/app/favicon.ico b/apps/mcp/app/favicon.ico
deleted file mode 100644
index 718d6fe..0000000
Binary files a/apps/mcp/app/favicon.ico and /dev/null differ
diff --git a/apps/mcp/app/globals.css b/apps/mcp/app/globals.css
deleted file mode 100644
index 4c18fb3..0000000
--- a/apps/mcp/app/globals.css
+++ /dev/null
@@ -1,49 +0,0 @@
-:root {
- --background: #ffffff;
- --foreground: #171717;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
- }
-}
-
-html {
- height: 100%;
-}
-
-html,
-body {
- max-width: 100vw;
- overflow-x: hidden;
-}
-
-body {
- min-height: 100%;
- display: flex;
- flex-direction: column;
- color: var(--foreground);
- background: var(--background);
- font-family: Arial, Helvetica, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-* {
- box-sizing: border-box;
- padding: 0;
- margin: 0;
-}
-
-a {
- color: inherit;
- text-decoration: none;
-}
-
-@media (prefers-color-scheme: dark) {
- html {
- color-scheme: dark;
- }
-}
diff --git a/apps/mcp/app/layout.tsx b/apps/mcp/app/layout.tsx
deleted file mode 100644
index 0044570..0000000
--- a/apps/mcp/app/layout.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import type { Metadata } from "next";
-import "./globals.css";
-
-export const metadata: Metadata = {
- title: "Rubber Duck MCP",
- description: "MCP server for rubber duck debugging — quack() to articulate your thinking.",
-};
-
-export default function RootLayout({ children }: { children: React.ReactNode }) {
- return (
-
- {children}
-
- );
-}
diff --git a/apps/mcp/app/page.tsx b/apps/mcp/app/page.tsx
deleted file mode 100644
index d06ef68..0000000
--- a/apps/mcp/app/page.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-export default function Home() {
- return (
-
- Rubber Duck MCP
-
- MCP-сервер для техники «резиновая уточка»: когда ИИ застревает, он вызывает инструмент{" "}
- quack(), чтобы сформулировать мысль и продолжить. Сервер работает в режиме
- Streamable HTTP и предназначен для подключения в Cursor, Claude Desktop и других MCP-клиентах.
-
- Эндпоинт
-
- /api/mcp — подключите этот URL как MCP-сервер (тип Streamable HTTP).
-
- Инструменты
-
-
- quack — возвращает кряк. Опциональный параметр mood:{" "}
- happy | confused | excited | sleepy.
-
-
-
- );
-}
diff --git a/apps/mcp/lib/mcp.ts b/apps/mcp/lib/mcp.ts
deleted file mode 100644
index 295edd6..0000000
--- a/apps/mcp/lib/mcp.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import type { McpServer } from "@modelcontextprotocol/server";
-import { z } from "zod";
-
-const QUACKS = {
- happy: ["QUACK! 🎉", "Quack quack! 😄", "QUAAACK! 🦆✨"],
- confused: ["Qu...ack?", "Quack? 🤔", "Quaaack...?"],
- excited: ["QUACK QUACK QUACK!", "QUAAACK!! 🔥", "Quack! Quack! Quack!"],
- sleepy: ["quack... 😴", "quaack... 💤", "quack. *yawn*"],
- default: ["Quack!", "Quack quack!", "QUACK!", "Quaaack!", "Quack. 🦆"],
-} as const;
-
-const MOODS = ["happy", "confused", "excited", "sleepy"] as const;
-
-function randomFrom(arr: readonly T[]): T {
- return arr[Math.floor(Math.random() * arr.length)];
-}
-
-export function registerDuckTools(server: McpServer): void {
- server.registerTool(
- "quack",
- {
- title: "Quack",
- description:
- "Rubber duck quacks. Use when you're stuck, looping, or hallucinating. " +
- "The act of calling forces you to articulate your current thinking out loud.",
- inputSchema: z.object({
- mood: z
- .enum(MOODS)
- .optional()
- .describe("Mood of the duck. Omit for a random quack."),
- }),
- },
- async ({ mood }) => {
- const text = mood ? randomFrom(QUACKS[mood]) : randomFrom(QUACKS.default);
- return { content: [{ type: "text", text }] };
- },
- );
-}
diff --git a/apps/mcp/next.config.ts b/apps/mcp/next.config.ts
deleted file mode 100644
index e9ffa30..0000000
--- a/apps/mcp/next.config.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { NextConfig } from "next";
-
-const nextConfig: NextConfig = {
- /* config options here */
-};
-
-export default nextConfig;
diff --git a/apps/mcp/package.json b/apps/mcp/package.json
deleted file mode 100644
index 3a49399..0000000
--- a/apps/mcp/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "mcp",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "dev": "next dev",
- "build": "next build",
- "start": "next start"
- },
- "dependencies": {
- "@modelcontextprotocol/server": "^2.0.0",
- "mcp-handler": "^2.1.1",
- "next": "16.3.3",
- "react": "19.2.8",
- "react-dom": "19.2.8",
- "zod": "^4.5.4"
- },
- "devDependencies": {
- "@types/node": "^20",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "typescript": "^5"
- },
- "packageManager": "pnpm@11.20.0"
-}
diff --git a/apps/mcp/tsconfig.json b/apps/mcp/tsconfig.json
deleted file mode 100644
index 3a13f90..0000000
--- a/apps/mcp/tsconfig.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "compilerOptions": {
- "target": "ES2017",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "bundler",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "react-jsx",
- "incremental": true,
- "plugins": [
- {
- "name": "next"
- }
- ],
- "paths": {
- "@/*": ["./*"]
- }
- },
- "include": [
- "next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- ".next/types/**/*.ts",
- ".next/dev/types/**/*.ts",
- "**/*.mts"
- ],
- "exclude": ["node_modules"]
-}
diff --git a/apps/web/.gitignore b/apps/web/.gitignore
index 3b462cb..d9c7962 100644
--- a/apps/web/.gitignore
+++ b/apps/web/.gitignore
@@ -1,23 +1,23 @@
-node_modules
-
-# Output
-.output
-.vercel
-.netlify
-.wrangler
-/.svelte-kit
-/build
-
-# OS
-.DS_Store
-Thumbs.db
-
-# Env
-.env
-.env.*
-!.env.example
-!.env.test
-
-# Vite
-vite.config.js.timestamp-*
-vite.config.ts.timestamp-*
+node_modules
+
+# Output
+.output
+.vercel
+.netlify
+.wrangler
+/.svelte-kit
+/build
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Env
+.env
+.env.*
+!.env.example
+!.env.test
+
+# Vite
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/package.json b/package.json
index 8374bb4..f679c37 100644
--- a/package.json
+++ b/package.json
@@ -3,13 +3,10 @@
"version": "1.0.0",
"description": "Rubber duck debugging - frontend + MCP server monorepo",
"scripts": {
- "dev": "pnpm --dir apps/frontend dev",
- "build-frontend": "pnpm --dir apps/frontend build",
- "build-mcp": "pnpm --dir apps/mcp build",
- "dev-mcp": "pnpm --dir apps/mcp dev",
- "typecheck-mcp": "pnpm --dir apps/mcp exec tsc --noEmit",
- "deploy-mcp": "vercel --cwd apps/mcp --prod --yes",
- "deploy-frontend": "vercel --cwd apps/frontend --prod --yes",
+ "dev": "pnpm --dir apps/web dev",
+ "build": "pnpm --dir apps/web build",
+ "deploy": "vercel --cwd apps/web --prod --yes",
+ "typecheck": "pnpm --dir apps/eval run typecheck && pnpm --dir apps/web run typecheck",
"eval:run": "pnpm --dir apps/eval run run",
"eval:review": "pnpm --dir apps/eval run review",
"eval:sync": "node scripts/sync-report.mjs",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 996eeb7..3a0a4ed 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -223,46 +223,6 @@ importers:
specifier: ^5.9.3
version: 5.9.3
- apps/frontend:
- devDependencies:
- vite:
- specifier: ^8.0.11
- version: 8.2.2(@types/node@20.19.43)(esbuild@0.28.2)(tsx@4.23.13)
-
- apps/mcp:
- dependencies:
- '@modelcontextprotocol/server':
- specifier: ^2.0.0
- version: 2.0.0
- mcp-handler:
- specifier: ^2.1.1
- version: 2.1.1(@modelcontextprotocol/server@2.0.0)(next@16.3.3(@types/node@20.19.43)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))
- next:
- specifier: 16.3.3
- version: 16.3.3(@types/node@20.19.43)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
- react:
- specifier: 19.2.8
- version: 19.2.8
- react-dom:
- specifier: 19.2.8
- version: 19.2.8(react@19.2.8)
- zod:
- specifier: ^4.5.4
- version: 4.5.4
- devDependencies:
- '@types/node':
- specifier: ^20
- version: 20.19.43
- '@types/react':
- specifier: ^19
- version: 19.2.18
- '@types/react-dom':
- specifier: ^19
- version: 19.2.5(@types/react@19.2.18)
- typescript:
- specifier: ^5
- version: 5.9.3
-
apps/web:
dependencies:
'@duck/types':
@@ -887,14 +847,6 @@ packages:
'@types/node@20.19.43':
resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==}
- '@types/react-dom@19.2.5':
- resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==}
- peerDependencies:
- '@types/react': ^19.2.0
-
- '@types/react@19.2.18':
- resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==}
-
'@vercel/nft@1.11.0':
resolution: {integrity: sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==}
engines: {node: '>=20'}
@@ -979,9 +931,6 @@ packages:
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
- csstype@3.2.3:
- resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
-
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -1663,7 +1612,8 @@ snapshots:
'@modelcontextprotocol/core': 2.0.0
zod: 4.5.4
- '@next/env@16.3.3': {}
+ '@next/env@16.3.3':
+ optional: true
'@next/swc-darwin-arm64@16.3.3':
optional: true
@@ -1796,6 +1746,7 @@ snapshots:
'@swc/helpers@0.5.23':
dependencies:
tslib: 2.8.1
+ optional: true
'@types/cookie@0.6.0': {}
@@ -1805,14 +1756,6 @@ snapshots:
dependencies:
undici-types: 6.21.0
- '@types/react-dom@19.2.5(@types/react@19.2.18)':
- dependencies:
- '@types/react': 19.2.18
-
- '@types/react@19.2.18':
- dependencies:
- csstype: 3.2.3
-
'@vercel/nft@1.11.0':
dependencies:
'@mapbox/node-pre-gyp': 2.0.3
@@ -1850,7 +1793,8 @@ snapshots:
balanced-match@4.0.4: {}
- baseline-browser-mapping@2.11.20: {}
+ baseline-browser-mapping@2.11.20:
+ optional: true
bindings@1.5.0:
dependencies:
@@ -1860,7 +1804,8 @@ snapshots:
dependencies:
balanced-match: 4.0.4
- caniuse-lite@1.0.30001810: {}
+ caniuse-lite@1.0.30001810:
+ optional: true
chalk@5.6.2: {}
@@ -1870,7 +1815,8 @@ snapshots:
chownr@3.0.0: {}
- client-only@0.0.1: {}
+ client-only@0.0.1:
+ optional: true
clsx@2.1.1: {}
@@ -1880,8 +1826,6 @@ snapshots:
cookie@0.6.0: {}
- csstype@3.2.3: {}
-
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -2070,6 +2014,7 @@ snapshots:
- '@babel/core'
- '@types/node'
- babel-plugin-macros
+ optional: true
node-fetch@2.7.0:
dependencies:
@@ -2097,6 +2042,7 @@ snapshots:
nanoid: 3.3.18
picocolors: 1.1.1
source-map-js: 1.2.1
+ optional: true
postcss@8.5.26:
dependencies:
@@ -2108,8 +2054,10 @@ snapshots:
dependencies:
react: 19.2.8
scheduler: 0.27.0
+ optional: true
- react@19.2.8: {}
+ react@19.2.8:
+ optional: true
readdirp@4.1.2: {}
@@ -2140,7 +2088,8 @@ snapshots:
dependencies:
mri: 1.2.0
- scheduler@0.27.0: {}
+ scheduler@0.27.0:
+ optional: true
semver@7.8.5: {}
@@ -2192,6 +2141,7 @@ snapshots:
dependencies:
client-only: 0.0.1
react: 19.2.8
+ optional: true
svelte-check@4.7.6(picomatch@4.0.7)(svelte@5.57.0)(typescript@6.0.3):
dependencies:
@@ -2243,7 +2193,8 @@ snapshots:
tr46@0.0.3: {}
- tslib@2.8.1: {}
+ tslib@2.8.1:
+ optional: true
tsx@4.23.13:
dependencies: