Compare commits

..

7 Commits

Author SHA1 Message Date
paoloricciuti
48b756a21d fix: lint 2025-10-24 08:23:29 +02:00
paoloricciuti
0054d13b7e feat: analytics 2025-10-24 08:06:33 +02:00
paoloricciuti
1e83c35faa fix: update transport and cancel request only after sending it 2025-10-23 19:10:34 +02:00
Paolo Ricciuti
31edfe1b5f Merge pull request #85 from sveltejs/renovate/major-vitest-monorepo 2025-10-23 10:07:20 +02:00
paoloricciuti
3fabcc0f9b fix: add preferred-frame-size to UI resource 2025-10-23 09:57:51 +02:00
renovate[bot]
deb5f2670c chore(deps): update dependency vitest to v4 2025-10-22 19:36:46 +00:00
paoloricciuti
02c951baa8 fix: add icons to server.json 2025-10-22 21:35:01 +02:00
18 changed files with 238 additions and 251 deletions

View File

@@ -0,0 +1,5 @@
---
'@sveltejs/mcp': patch
---
fix: add icons to `server.json`

View File

@@ -0,0 +1,5 @@
---
'@sveltejs/mcp': patch
---
fix: add `preferred-frame-size` to UI resource

View File

@@ -59,12 +59,13 @@
"typescript": "^5.0.0",
"vite": "^7.0.4",
"vite-plugin-devtools-json": "^1.0.0",
"vitest": "^3.2.3"
"vitest": "^4.0.0"
},
"dependencies": {
"@sveltejs/mcp-schema": "workspace:^",
"@sveltejs/mcp-server": "workspace:^",
"@tmcp/transport-http": "^0.7.0",
"tmcp": "^1.15.1"
"@tmcp/transport-http": "^0.7.1",
"@vercel/analytics": "^1.5.0",
"tmcp": "^1.15.3"
}
}

View File

@@ -1,8 +1,13 @@
import { dev } from '$app/environment';
import { http_transport } from '$lib/mcp/index.js';
import { db } from '$lib/server/db/index.js';
import { redirect } from '@sveltejs/kit';
import { track } from '@vercel/analytics/server';
export async function handle({ event, resolve }) {
if (event.request.method === 'POST') {
console.log(await event.request.clone().text());
}
if (event.request.method === 'GET') {
const accept = event.request.headers.get('accept');
if (accept) {
@@ -16,6 +21,12 @@ export async function handle({ event, resolve }) {
}
const mcp_response = await http_transport.respond(event.request, {
db,
// only add analytics in production
track: dev
? undefined
: async (session_id, event, slug) => {
await track(event, { session_id, ...(slug ? { slug } : {}) });
},
});
// we are deploying on vercel the SSE connection will timeout after 5 minutes...for
// the moment we are not sending back any notifications (logs, or list changed notifications)
@@ -25,11 +36,14 @@ export async function handle({ event, resolve }) {
// 200 or the MCP client will complain)
if (mcp_response && event.request.method === 'GET') {
try {
await mcp_response.body?.cancel();
} catch {
// ignore
return mcp_response;
} finally {
try {
await mcp_response.body?.cancel();
} catch {
// ignore
}
}
return new Response('', { status: 200 });
}
return mcp_response ?? resolve(event);
}

View File

@@ -1,8 +1,6 @@
import { createClient } from '@libsql/client';
import { drizzle } from 'drizzle-orm/libsql';
import * as schema from './schema.js';
// let's disable it for the moment...i can't figure out a way to make it wotk with eslint
// eslint-disable-next-line import/extensions
import { DATABASE_TOKEN, DATABASE_URL } from '$env/static/private';
if (!DATABASE_URL) throw new Error('DATABASE_URL is not set');
if (!DATABASE_TOKEN) throw new Error('DATABASE_TOKEN is not set');

View File

@@ -48,13 +48,17 @@ export default /** @type {import("eslint").Linter.Config} */ ([
'import/no-unresolved': 'off', // this doesn't work well with typescript path mapping
'import/extensions': [
'error',
'ignorePackages',
{
js: 'always',
mjs: 'always',
cjs: 'always',
ts: 'always',
svelte: 'always',
ignorePackages: true,
pattern: {
js: 'always',
mjs: 'always',
cjs: 'always',
ts: 'always',
svelte: 'always',
svg: 'always',
json: 'always',
},
},
],
},

View File

@@ -46,7 +46,7 @@
"publint": "^0.3.13",
"typescript": "^5.0.0",
"typescript-eslint": "^8.44.1",
"vitest": "^3.2.3"
"vitest": "^4.0.0"
},
"pnpm": {
"onlyBuiltDependencies": [

View File

@@ -28,11 +28,11 @@
"eslint-plugin-svelte": "^3.12.3",
"svelte": "^5.39.2",
"svelte-eslint-parser": "^1.3.2",
"tmcp": "^1.15.0",
"tmcp": "^1.15.3",
"ts-blank-space": "^0.6.2",
"typescript-eslint": "^8.44.0",
"valibot": "^1.1.0",
"vitest": "^3.2.4",
"vitest": "^4.0.0",
"zimmerframe": "^1.1.4"
},
"devDependencies": {

View File

@@ -68,6 +68,9 @@ export function setup_svelte_task(server: SvelteMcp) {
icons,
},
async ({ task }) => {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'svelte-task');
}
const available_docs = await format_sections_list();
return {

View File

@@ -46,6 +46,13 @@ export async function list_sections(server: SvelteMcp) {
icons,
},
async (uri, { slug }) => {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(
server.ctx.sessionId,
'svelte-doc-section',
Array.isArray(slug) ? slug.join(',') : slug,
);
}
const section = sections.find((section) => {
return slug === section.slug;
});

View File

@@ -21,6 +21,9 @@ export function get_documentation(server: SvelteMcp) {
icons,
},
async ({ section }) => {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'get-documentation');
}
let sections: string[];
if (Array.isArray(section)) {

View File

@@ -12,6 +12,9 @@ export function list_sections(server: SvelteMcp) {
icons,
},
async () => {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'list-sections');
}
const formatted_sections = await format_sections_list();
return {

View File

@@ -59,6 +59,9 @@ export function playground_link(server: SvelteMcp) {
icons,
},
async ({ files, name, tailwind }) => {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'playground-link');
}
const playground_base = new URL('https://svelte.dev/playground');
const playground_files: File[] = [];
@@ -76,6 +79,9 @@ export function playground_link(server: SvelteMcp) {
}
if (!has_app_svelte) {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'playground-link-no-app-svelte');
}
return {
isError: true,
content: [
@@ -116,6 +122,9 @@ export function playground_link(server: SvelteMcp) {
type: 'externalUrl',
iframeUrl: playground_base.toString(),
},
uiMetadata: {
'preferred-frame-size': ['100%', '1200px'],
},
encoding: 'text',
}),
],

View File

@@ -46,12 +46,18 @@ export function svelte_autofixer(server: SvelteMcp) {
filename: filename_or_path,
desired_svelte_version: desired_svelte_version_unchecked,
}) => {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'svelte-autofixer');
}
// we validate manually because some clients don't support union in the input schema (looking at you cursor)
const parsed_version = v.safeParse(
v.union([v.literal(4), v.literal(5), v.literal('4'), v.literal('5')]),
desired_svelte_version_unchecked,
);
if (parsed_version.success === false) {
if (server.ctx.sessionId && server.ctx.custom?.track) {
await server.ctx.custom?.track?.(server.ctx.sessionId, 'svelte-autofixer-wrong-version');
}
return {
isError: true,
content: [

View File

@@ -24,7 +24,10 @@ export const server = new McpServer(
instructions:
'This is the official Svelte MCP server. It MUST be used whenever svelte development is involved. It can provide official documentation, code examples and correct your code. After you correct the component call this tool again to confirm all the issues are fixed.',
},
).withContext<{ db: LibSQLDatabase<Schema> }>();
).withContext<{
db: LibSQLDatabase<Schema>;
track?: (sessionId: string, event: string, slug?: string) => Promise<void>;
}>();
export type SvelteMcp = typeof server;

View File

@@ -37,10 +37,10 @@
"publint": "^0.3.13",
"tsdown": "^0.15.0",
"typescript": "^5.8.3",
"vitest": "^3.1.3"
"vitest": "^4.0.0"
},
"dependencies": {
"eslint": "^9.36.0",
"tmcp": "^1.15.0"
"tmcp": "^1.15.3"
}
}

View File

@@ -10,6 +10,16 @@
},
"version": "0.1.9",
"websiteUrl": "https://svelte.dev/docs/mcp/overview",
"icons": [
{
"src": "https://mcp.svelte.dev/logo.svg",
"mimeType": "image/svg+xml"
},
{
"src": "https://mcp.svelte.dev/logo.png",
"mimeType": "image/png"
}
],
"packages": [
{
"registryType": "npm",

376
pnpm-lock.yaml generated
View File

@@ -31,7 +31,7 @@ importers:
version: 10.1.8(eslint@9.36.0(jiti@2.6.0))
eslint-plugin-import:
specifier: ^2.32.0
version: 2.32.0(eslint@9.36.0(jiti@2.6.0))
version: 2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0))
eslint-plugin-svelte:
specifier: ^3.12.3
version: 3.12.4(eslint@9.36.0(jiti@2.6.0))(svelte@5.39.6)(ts-node@10.9.2(@types/node@24.5.2)(typescript@5.9.2))
@@ -57,8 +57,8 @@ importers:
specifier: ^8.44.1
version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)
vitest:
specifier: ^3.2.3
version: 3.2.4(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
specifier: ^4.0.0
version: 4.0.1(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
apps/mcp-remote:
dependencies:
@@ -69,11 +69,14 @@ importers:
specifier: workspace:^
version: link:../../packages/mcp-server
'@tmcp/transport-http':
specifier: ^0.7.0
version: 0.7.0(tmcp@1.15.1(typescript@5.9.2))
specifier: ^0.7.1
version: 0.7.1(tmcp@1.15.3(typescript@5.9.2))
'@vercel/analytics':
specifier: ^1.5.0
version: 1.5.0(@sveltejs/kit@2.43.5(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.6)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)))(svelte@5.39.6)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)))(react@18.3.1)(svelte@5.39.6)
tmcp:
specifier: ^1.15.1
version: 1.15.1(typescript@5.9.2)
specifier: ^1.15.3
version: 1.15.3(typescript@5.9.2)
devDependencies:
'@eslint/compat':
specifier: ^1.3.2
@@ -142,8 +145,8 @@ importers:
specifier: ^1.0.0
version: 1.0.0(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6))
vitest:
specifier: ^3.2.3
version: 3.2.4(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
specifier: ^4.0.0
version: 4.0.1(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
packages/mcp-schema:
dependencies:
@@ -161,7 +164,7 @@ importers:
version: link:../mcp-schema
'@tmcp/adapter-valibot':
specifier: ^0.1.4
version: 0.1.4(tmcp@1.15.0(typescript@5.9.2))(valibot@1.1.0(typescript@5.9.2))
version: 0.1.4(tmcp@1.15.3(typescript@5.9.2))(valibot@1.1.0(typescript@5.9.2))
'@typescript-eslint/parser':
specifier: ^8.44.0
version: 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)
@@ -181,8 +184,8 @@ importers:
specifier: ^1.3.2
version: 1.3.3(svelte@5.39.6)
tmcp:
specifier: ^1.15.0
version: 1.15.0(typescript@5.9.2)
specifier: ^1.15.3
version: 1.15.3(typescript@5.9.2)
ts-blank-space:
specifier: ^0.6.2
version: 0.6.2
@@ -193,8 +196,8 @@ importers:
specifier: ^1.1.0
version: 1.1.0(typescript@5.9.2)
vitest:
specifier: ^3.2.4
version: 3.2.4(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
specifier: ^4.0.0
version: 4.0.1(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
zimmerframe:
specifier: ^1.1.4
version: 1.1.4
@@ -224,15 +227,15 @@ importers:
specifier: ^9.36.0
version: 9.36.0(jiti@2.6.0)
tmcp:
specifier: ^1.15.0
version: 1.15.0(typescript@5.9.2)
specifier: ^1.15.3
version: 1.15.3(typescript@5.9.2)
devDependencies:
'@sveltejs/mcp-server':
specifier: workspace:^
version: link:../mcp-server
'@tmcp/transport-stdio':
specifier: ^0.3.1
version: 0.3.1(tmcp@1.15.0(typescript@5.9.2))
version: 0.3.1(tmcp@1.15.3(typescript@5.9.2))
'@types/node':
specifier: ^22.15.17
version: 22.18.6
@@ -246,8 +249,8 @@ importers:
specifier: ^5.8.3
version: 5.9.2
vitest:
specifier: ^3.1.3
version: 3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6)
specifier: ^4.0.0
version: 4.0.1(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6)
packages:
@@ -1557,10 +1560,10 @@ packages:
'@tmcp/session-manager@0.1.2':
resolution: {integrity: sha512-hNkEeMt7/CdD8JdjPXMlIv5OMPTp5LnBqeo1Tb/AXcm31DpgwlNbf4voJ3CeWxWAZPPZ/MgHZ682TtgGhsvXiw==}
'@tmcp/transport-http@0.7.0':
resolution: {integrity: sha512-JvLvi2ZM3xaBIZyxy6ssGtzlhL/5JvOkjWWymxkLi84vMK44pM5zCQVN1KXAfQqHbbDlYNR/BW39cd/eP3hylA==}
'@tmcp/transport-http@0.7.1':
resolution: {integrity: sha512-Run9uMuARbCwAJQDWYvANXCsRAyJL/hUFfuD5eftU7mjarIjtwWQAXJ4NS7hKPsVf2g2GCF/XNNU+DGpdo3vYQ==}
peerDependencies:
tmcp: ^1.15.1
tmcp: ^1.15.3
'@tmcp/transport-stdio@0.3.1':
resolution: {integrity: sha512-r+eiHa2URw5+lBMRI0t4D84LfcWHam3DsTog/lPZSALIjlYxlFUfAaJ8dgh5gdQnmXiFJfE9hzmN0gIrB6+Lzw==}
@@ -1685,39 +1688,65 @@ packages:
peerDependencies:
valibot: ^1.1.0
'@vercel/analytics@1.5.0':
resolution: {integrity: sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==}
peerDependencies:
'@remix-run/react': ^2
'@sveltejs/kit': ^1 || ^2
next: '>= 13'
react: ^18 || ^19 || ^19.0.0-rc
svelte: '>= 4'
vue: ^3
vue-router: ^4
peerDependenciesMeta:
'@remix-run/react':
optional: true
'@sveltejs/kit':
optional: true
next:
optional: true
react:
optional: true
svelte:
optional: true
vue:
optional: true
vue-router:
optional: true
'@vercel/nft@0.30.1':
resolution: {integrity: sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g==}
engines: {node: '>=18'}
hasBin: true
'@vitest/expect@3.2.4':
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
'@vitest/expect@4.0.1':
resolution: {integrity: sha512-KtvGLN/IWoZfg68JF2q/zbDEo+UJTWnc7suYJ8RF+ZTBeBcBz4NIOJDxO4Q3bEY9GsOYhgy5cOevcVPFh4+V7g==}
'@vitest/mocker@3.2.4':
resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
'@vitest/mocker@4.0.1':
resolution: {integrity: sha512-fwmvg8YvwSAE41Hyhul7dL4UzPhG+k2VaZCcL+aHagLx4qlNQgKYTw7coF4YdjAxSBBt0b408gQFYMX1Qeqweg==}
peerDependencies:
msw: ^2.4.9
vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
vite: ^6.0.0 || ^7.0.0-0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
'@vitest/pretty-format@3.2.4':
resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
'@vitest/pretty-format@4.0.1':
resolution: {integrity: sha512-6nq3JY/zQ91+oX1vd4fajiVNyA/HMhaF9cOw5P9cQi6ML7PRi7ilVaQ77PulF+4kvUKr9bcLm9GoAtwlVFbGzw==}
'@vitest/runner@3.2.4':
resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
'@vitest/runner@4.0.1':
resolution: {integrity: sha512-nxUoWmw7ZX2OiSNwolJeSOOzrrR/o79wRTwP7HhiW/lDFwQHtWMj9snMhrdvccFqanvI8897E81eXjgDbrRvqA==}
'@vitest/snapshot@3.2.4':
resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
'@vitest/snapshot@4.0.1':
resolution: {integrity: sha512-CvfsEWutEIN/Z9ScXYup7YwlPeK9JICrV7FN9p3pVytsyh+aCHAH0PUi//YlTiQ7T8qYxJYpUrAwZL9XqmZ5ZA==}
'@vitest/spy@3.2.4':
resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
'@vitest/spy@4.0.1':
resolution: {integrity: sha512-Hj0/TBQ2EN72wDpfKiUf63mRCkE0ZiSGXGeDDvW9T3LBKVVApItd0GyQLDBIe03kWbyK9gOTEbJVVWthcLFzCg==}
'@vitest/utils@3.2.4':
resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
'@vitest/utils@4.0.1':
resolution: {integrity: sha512-uRrACgpIz5sxuT87ml7xhh7EdKtW8k0N9oSFVBPl8gHB/JfLObLe9dXO6ZrsNN55FzciGIRqIEILgTQvg1eNHw==}
abbrev@3.0.1:
resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
@@ -1822,10 +1851,6 @@ packages:
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
ast-kit@2.1.2:
resolution: {integrity: sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==}
engines: {node: '>=20.18.0'}
@@ -1907,8 +1932,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
chai@5.3.3:
resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
chai@6.2.0:
resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==}
engines: {node: '>=18'}
chalk@4.1.2:
@@ -1918,10 +1943,6 @@ packages:
chardet@2.1.0:
resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==}
check-error@2.1.1:
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
engines: {node: '>= 16'}
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
@@ -2050,10 +2071,6 @@ packages:
supports-color:
optional: true
deep-eql@5.0.2:
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
engines: {node: '>=6'}
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
@@ -2862,9 +2879,6 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
js-tokens@9.0.1:
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
@@ -2945,9 +2959,6 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
loupe@3.2.1:
resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
@@ -3195,10 +3206,6 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
pathval@2.0.1:
resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
engines: {node: '>= 14.16'}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -3631,9 +3638,6 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
strip-literal@3.0.0:
resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3691,23 +3695,12 @@ packages:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
tinypool@1.1.1:
resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
engines: {node: ^18.0.0 || >=20.0.0}
tinyrainbow@2.0.0:
resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
tinyrainbow@3.0.3:
resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==}
engines: {node: '>=14.0.0'}
tinyspy@4.0.4:
resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==}
engines: {node: '>=14.0.0'}
tmcp@1.15.0:
resolution: {integrity: sha512-ell+gBSC7T5P7ogrROYsoohfLSAu0aXmKzWH8eZqkMX4K0iGc+BYJJC4kb60uJcK7PRZWBOktNGuOq1BLNFA6Q==}
tmcp@1.15.1:
resolution: {integrity: sha512-Mn2FZIcN6Vj/pJYda/Zv1t5Iv0vJIQDi+BRpcpBn9gNwID5bNtgMFOj+1LH3rkOJOTz9R78dIXSsJxDN5Vy90g==}
tmcp@1.15.3:
resolution: {integrity: sha512-woRK1qeUei0+3juJ3OS/LBFhKwg26YPGtQqJV8HwXqYP1sOHaOeLC/6jyZuBfmfXqZf1qUg8Dk3I/Wwm+WKZ1Q==}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -3893,11 +3886,6 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
vite-node@3.2.4:
resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
vite-plugin-devtools-json@1.0.0:
resolution: {integrity: sha512-MobvwqX76Vqt/O4AbnNMNWoXWGrKUqZbphCUle/J2KXH82yKQiunOeKnz/nqEPosPsoWWPP9FtNuPBSYpiiwkw==}
peerDependencies:
@@ -3951,16 +3939,18 @@ packages:
vite:
optional: true
vitest@3.2.4:
resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
vitest@4.0.1:
resolution: {integrity: sha512-4rwTfUNF0MExMZBiNirkzZpeyUZGOs3JD76N2qHNP9i6w6/bff7MRv2I9yFJKd1ICxzn2igpra+E4t9o2EfQhw==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/debug': ^4.1.12
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
'@vitest/browser': 3.2.4
'@vitest/ui': 3.2.4
'@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
'@vitest/browser-playwright': 4.0.1
'@vitest/browser-preview': 4.0.1
'@vitest/browser-webdriverio': 4.0.1
'@vitest/ui': 4.0.1
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
@@ -3970,7 +3960,11 @@ packages:
optional: true
'@types/node':
optional: true
'@vitest/browser':
'@vitest/browser-playwright':
optional: true
'@vitest/browser-preview':
optional: true
'@vitest/browser-webdriverio':
optional: true
'@vitest/ui':
optional: true
@@ -5293,24 +5287,24 @@ snapshots:
transitivePeerDependencies:
- encoding
'@tmcp/adapter-valibot@0.1.4(tmcp@1.15.0(typescript@5.9.2))(valibot@1.1.0(typescript@5.9.2))':
'@tmcp/adapter-valibot@0.1.4(tmcp@1.15.3(typescript@5.9.2))(valibot@1.1.0(typescript@5.9.2))':
dependencies:
'@standard-schema/spec': 1.0.0
'@valibot/to-json-schema': 1.3.0(valibot@1.1.0(typescript@5.9.2))
tmcp: 1.15.0(typescript@5.9.2)
tmcp: 1.15.3(typescript@5.9.2)
valibot: 1.1.0(typescript@5.9.2)
'@tmcp/session-manager@0.1.2': {}
'@tmcp/transport-http@0.7.0(tmcp@1.15.1(typescript@5.9.2))':
'@tmcp/transport-http@0.7.1(tmcp@1.15.3(typescript@5.9.2))':
dependencies:
'@tmcp/session-manager': 0.1.2
esm-env: 1.2.2
tmcp: 1.15.1(typescript@5.9.2)
tmcp: 1.15.3(typescript@5.9.2)
'@tmcp/transport-stdio@0.3.1(tmcp@1.15.0(typescript@5.9.2))':
'@tmcp/transport-stdio@0.3.1(tmcp@1.15.3(typescript@5.9.2))':
dependencies:
tmcp: 1.15.0(typescript@5.9.2)
tmcp: 1.15.3(typescript@5.9.2)
'@tsconfig/node10@1.0.11': {}
@@ -5464,6 +5458,12 @@ snapshots:
dependencies:
valibot: 1.1.0(typescript@5.9.2)
'@vercel/analytics@1.5.0(@sveltejs/kit@2.43.5(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.6)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)))(svelte@5.39.6)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)))(react@18.3.1)(svelte@5.39.6)':
optionalDependencies:
'@sveltejs/kit': 2.43.5(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.39.6)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)))(svelte@5.39.6)(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6))
react: 18.3.1
svelte: 5.39.6
'@vercel/nft@0.30.1(rollup@4.52.2)':
dependencies:
'@mapbox/node-pre-gyp': 2.0.0
@@ -5483,55 +5483,52 @@ snapshots:
- rollup
- supports-color
'@vitest/expect@3.2.4':
'@vitest/expect@4.0.1':
dependencies:
'@standard-schema/spec': 1.0.0
'@types/chai': 5.2.2
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.3.3
tinyrainbow: 2.0.0
'@vitest/spy': 4.0.1
'@vitest/utils': 4.0.1
chai: 6.2.0
tinyrainbow: 3.0.3
'@vitest/mocker@3.2.4(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6))':
'@vitest/mocker@4.0.1(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6))':
dependencies:
'@vitest/spy': 3.2.4
'@vitest/spy': 4.0.1
estree-walker: 3.0.3
magic-string: 0.30.19
optionalDependencies:
vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6)
'@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6))':
'@vitest/mocker@4.0.1(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6))':
dependencies:
'@vitest/spy': 3.2.4
'@vitest/spy': 4.0.1
estree-walker: 3.0.3
magic-string: 0.30.19
optionalDependencies:
vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
'@vitest/pretty-format@3.2.4':
'@vitest/pretty-format@4.0.1':
dependencies:
tinyrainbow: 2.0.0
tinyrainbow: 3.0.3
'@vitest/runner@3.2.4':
'@vitest/runner@4.0.1':
dependencies:
'@vitest/utils': 3.2.4
'@vitest/utils': 4.0.1
pathe: 2.0.3
strip-literal: 3.0.0
'@vitest/snapshot@3.2.4':
'@vitest/snapshot@4.0.1':
dependencies:
'@vitest/pretty-format': 3.2.4
'@vitest/pretty-format': 4.0.1
magic-string: 0.30.19
pathe: 2.0.3
'@vitest/spy@3.2.4':
dependencies:
tinyspy: 4.0.4
'@vitest/spy@4.0.1': {}
'@vitest/utils@3.2.4':
'@vitest/utils@4.0.1':
dependencies:
'@vitest/pretty-format': 3.2.4
loupe: 3.2.1
tinyrainbow: 2.0.0
'@vitest/pretty-format': 4.0.1
tinyrainbow: 3.0.3
abbrev@3.0.1: {}
@@ -5643,8 +5640,6 @@ snapshots:
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
assertion-error@2.0.1: {}
ast-kit@2.1.2:
dependencies:
'@babel/parser': 7.28.4
@@ -5730,13 +5725,7 @@ snapshots:
callsites@3.1.0: {}
chai@5.3.3:
dependencies:
assertion-error: 2.0.1
check-error: 2.1.1
deep-eql: 5.0.2
loupe: 3.2.1
pathval: 2.0.1
chai@6.2.0: {}
chalk@4.1.2:
dependencies:
@@ -5745,8 +5734,6 @@ snapshots:
chardet@2.1.0: {}
check-error@2.1.1: {}
chokidar@4.0.3:
dependencies:
readdirp: 4.1.2
@@ -5859,8 +5846,6 @@ snapshots:
dependencies:
ms: 2.1.3
deep-eql@5.0.2: {}
deep-is@0.1.4: {}
deepmerge@4.3.1: {}
@@ -6121,16 +6106,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)):
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0)):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)
eslint: 9.36.0(jiti@2.6.0)
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
eslint-plugin-import@2.32.0(eslint@9.36.0(jiti@2.6.0)):
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.36.0(jiti@2.6.0)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -6141,7 +6127,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.36.0(jiti@2.6.0)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.36.0(jiti@2.6.0))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -6152,6 +6138,8 @@ snapshots:
semver: 6.3.1
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 8.44.1(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -6721,8 +6709,6 @@ snapshots:
js-tokens@4.0.0: {}
js-tokens@9.0.1: {}
js-yaml@3.14.1:
dependencies:
argparse: 1.0.10
@@ -6803,8 +6789,6 @@ snapshots:
dependencies:
js-tokens: 4.0.0
loupe@3.2.1: {}
lru-cache@10.4.3: {}
lucide-react@0.523.0(react@18.3.1):
@@ -7016,8 +7000,6 @@ snapshots:
pathe@2.0.3: {}
pathval@2.0.1: {}
picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -7503,10 +7485,6 @@ snapshots:
strip-json-comments@3.1.1: {}
strip-literal@3.0.0:
dependencies:
js-tokens: 9.0.1
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -7580,23 +7558,9 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
tinypool@1.1.1: {}
tinyrainbow@3.0.3: {}
tinyrainbow@2.0.0: {}
tinyspy@4.0.4: {}
tmcp@1.15.0(typescript@5.9.2):
dependencies:
'@standard-schema/spec': 1.0.0
json-rpc-2.0: 1.7.1
sqids: 0.3.0
uri-template-matcher: 1.1.1
valibot: 1.1.0(typescript@5.9.2)
transitivePeerDependencies:
- typescript
tmcp@1.15.1(typescript@5.9.2):
tmcp@1.15.3(typescript@5.9.2):
dependencies:
'@standard-schema/spec': 1.0.0
json-rpc-2.0: 1.7.1
@@ -7796,48 +7760,6 @@ snapshots:
vary@1.1.2: {}
vite-node@3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6):
dependencies:
cac: 6.7.14
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6)
transitivePeerDependencies:
- '@types/node'
- jiti
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
vite-node@3.2.4(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6):
dependencies:
cac: 6.7.14
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
transitivePeerDependencies:
- '@types/node'
- jiti
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
vite-plugin-devtools-json@1.0.0(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)):
dependencies:
uuid: 11.1.0
@@ -7875,18 +7797,17 @@ snapshots:
optionalDependencies:
vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
vitest@3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6):
vitest@4.0.1(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6):
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.3.3
'@vitest/expect': 4.0.1
'@vitest/mocker': 4.0.1(vite@7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6))
'@vitest/pretty-format': 4.0.1
'@vitest/runner': 4.0.1
'@vitest/snapshot': 4.0.1
'@vitest/spy': 4.0.1
'@vitest/utils': 4.0.1
debug: 4.4.3
es-module-lexer: 1.7.0
expect-type: 1.2.2
magic-string: 0.30.19
pathe: 2.0.3
@@ -7895,10 +7816,8 @@ snapshots:
tinybench: 2.9.0
tinyexec: 0.3.2
tinyglobby: 0.2.15
tinypool: 1.1.1
tinyrainbow: 2.0.0
tinyrainbow: 3.0.3
vite: 7.1.7(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6)
vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.20.6)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.18.6
@@ -7916,18 +7835,17 @@ snapshots:
- tsx
- yaml
vitest@3.2.4(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6):
vitest@4.0.1(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6):
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.3.3
'@vitest/expect': 4.0.1
'@vitest/mocker': 4.0.1(vite@7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6))
'@vitest/pretty-format': 4.0.1
'@vitest/runner': 4.0.1
'@vitest/snapshot': 4.0.1
'@vitest/spy': 4.0.1
'@vitest/utils': 4.0.1
debug: 4.4.3
es-module-lexer: 1.7.0
expect-type: 1.2.2
magic-string: 0.30.19
pathe: 2.0.3
@@ -7936,10 +7854,8 @@ snapshots:
tinybench: 2.9.0
tinyexec: 0.3.2
tinyglobby: 0.2.15
tinypool: 1.1.1
tinyrainbow: 2.0.0
tinyrainbow: 3.0.3
vite: 7.1.7(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
vite-node: 3.2.4(@types/node@24.5.2)(jiti@2.6.0)(tsx@4.20.6)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 24.5.2