From 66242f140d730c825eb0e99fe9f80e5d4150aa0b Mon Sep 17 00:00:00 2001 From: alvaro Date: Fri, 6 Jun 2025 14:39:54 +0200 Subject: [PATCH 1/8] Just a test --- .gitignore | 2 + .nvmrc | 2 +- .tool-versions | 1 + package-lock.json | 2761 ++++++++++++++++++++++++++++++++++++---- package.json | 13 +- smithery.yaml | 16 +- src/index.ts | 110 +- src/server.ts | 211 ++- src/tools/env-vars.ts | 64 + src/tools/processes.ts | 119 ++ src/tools/run-code.ts | 116 ++ src/utils.ts | 27 +- tsconfig.json | 21 +- 13 files changed, 3084 insertions(+), 379 deletions(-) create mode 100644 .tool-versions create mode 100644 src/tools/env-vars.ts create mode 100644 src/tools/processes.ts create mode 100644 src/tools/run-code.ts diff --git a/.gitignore b/.gitignore index 40b50d4..e62acb4 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,5 @@ Thumbs.db # Environment variables .env + +.smithery \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 3c03207..209e3ef 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18 +20 diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..b8867a4 --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +nodejs 22.13.1 diff --git a/package-lock.json b/package-lock.json index 2e9adc5..5c3cb35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,15 +18,120 @@ "yepcode-mcp-server": "dist/index.js" }, "devDependencies": { + "@smithery/cli": "^1.2.9", "@types/node": "^22", "ts-node": "^10.9.2", + "tsx": "^4.19.4", "typescript": "^5.3.2" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" }, "engines": { - "node": ">=18", - "npm": ">=9" + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", + "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/react": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", + "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/ui-utils": "1.2.11", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } } }, + "node_modules/@ai-sdk/ui-utils": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", + "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.32.1.tgz", + "integrity": "sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.111", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.111.tgz", + "integrity": "sha512-90sGdgA+QLJr1F9X79tQuEut0gEYIfkX9pydI4XGRgvFo9g2JWswefI+WUSUHPYVBHYSEfTEqBxA5hQvAZB3Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -40,6 +145,431 @@ "node": ">=12" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -90,6 +620,322 @@ "node": ">=18" } }, + "node_modules/@ngrok/ngrok": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.5.1.tgz", + "integrity": "sha512-sfcgdpiAJHqmuO3e6QjQGbavIrR3E72do/NAsnGhm+7SGstLj1aM3Sd8mkfTORb2Hj7ATMuoBYuED5ylKuRQCg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@ngrok/ngrok-android-arm64": "1.5.1", + "@ngrok/ngrok-darwin-arm64": "1.5.1", + "@ngrok/ngrok-darwin-universal": "1.5.1", + "@ngrok/ngrok-darwin-x64": "1.5.1", + "@ngrok/ngrok-freebsd-x64": "1.5.1", + "@ngrok/ngrok-linux-arm-gnueabihf": "1.5.1", + "@ngrok/ngrok-linux-arm64-gnu": "1.5.1", + "@ngrok/ngrok-linux-arm64-musl": "1.5.1", + "@ngrok/ngrok-linux-x64-gnu": "1.5.1", + "@ngrok/ngrok-linux-x64-musl": "1.5.1", + "@ngrok/ngrok-win32-arm64-msvc": "1.5.1", + "@ngrok/ngrok-win32-ia32-msvc": "1.5.1", + "@ngrok/ngrok-win32-x64-msvc": "1.5.1" + } + }, + "node_modules/@ngrok/ngrok-android-arm64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.5.1.tgz", + "integrity": "sha512-2Tokwi5GVWNLw3JEoM0Ieb/ypALniZu6fciUTgpuByutbKxOjvahD4fYOKwW3KMdV9bCb3XGGtWJCZXfRPPq1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-darwin-arm64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-arm64/-/ngrok-darwin-arm64-1.5.1.tgz", + "integrity": "sha512-HNOhrPDP+nJJY7Bh45DOeh6jmcGASWINGbUuseZM0C8psQMp7crPywjRh0inkRegUrb4K8y06sfmgt2fmsF6jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-darwin-universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-universal/-/ngrok-darwin-universal-1.5.1.tgz", + "integrity": "sha512-EsMxYC/tY+ZqhjbeZtVq5MFIuD8SEPgAlHINEszsHd8ZRICc2U9Xl15CbDrew3pcfEg/ZVFrOH9CyC4aZ/V/cA==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-darwin-x64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.5.1.tgz", + "integrity": "sha512-H/x1BsYpAoTMhOtv4oYvwY6WHqbY0MsJ1XFcJQgrpAIjgmYqlwsnsUMHvEdBB/KY9kXF9DPgKUdRMfJwUIpwGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-freebsd-x64": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.5.1.tgz", + "integrity": "sha512-dY2W6HUv7e2xkpdfVj7fIk+5qmvrC7kVu6PJWJ8/rshW1FrU7qMcpnU53JvoQJRZzUf5k8xMNdx30zai/8mqYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-linux-arm-gnueabihf": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.5.1.tgz", + "integrity": "sha512-JvbI/IIycw4Qq02ysyOBsSK5E0bZDgRqXSslHLTwuDAfw14lmrq2U0QkBeEOL8qwJ7wCwCH1PEOJacUyrqa9bg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-linux-arm64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.5.1.tgz", + "integrity": "sha512-yLFAlqTYYvH7QRg589HJarQGw1QrKQZcHiw0gm175eCqc+jpUG/Zcf8wohCTIJVLylMIzjDzVFSUsXC7UtMJdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-linux-arm64-musl": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.5.1.tgz", + "integrity": "sha512-momB/ZjjrxaGYOZ3YPAw1kT4DAfWT1x3dAHL0YoSVfNCpc8Fw0189ZAcxGn0hUFqkGDmSARS9o8b7hYd1b41oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-fmMaz0b1Ry2CDLLn0mV8b9nLxqm0taQ2jYyn+C9OrazYNMT4XYYDKRQSm4UEaNoakdnoH+f2FsrWi/712GFxAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-linux-x64-musl": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.5.1.tgz", + "integrity": "sha512-6Ajl9wpJSlvukl4WrkIw+WxVwAr7WTGnE35Voec6CERWtKMsO/F+BOSu3pfAa6iwxGK//JBpsTT1IwLLw7b2xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-win32-arm64-msvc": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-arm64-msvc/-/ngrok-win32-arm64-msvc-1.5.1.tgz", + "integrity": "sha512-JUH2yZxDPQGmQNT1d2KIu64u2k/R6uG1kEIXjcbsoff37v9aI6nUlzldRWB/wFSYkpZ4W/EuovM4Epar+fQOxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-win32-ia32-msvc": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.5.1.tgz", + "integrity": "sha512-zS1JsMTJHnY+lPJFUwKnB5fzPm4GZCKeeZLehHrXP0LpQaKN8Y/vywqDGhuC0WtymvWE88+oreMV/6hQdviLSA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-win32-x64-msvc": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.5.1.tgz", + "integrity": "sha512-HegRwV9Gchh4p7K7sC6SPpWmFRwDEgwPByrb8tkuWDyP+EWNgpt3GKp8OAIK2xdWWHnN5VIwMa9u3COE/e5S8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@smithery/cli": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@smithery/cli/-/cli-1.2.9.tgz", + "integrity": "sha512-QeOTPKDt7iU0iC0e+0RZp60jP+yuOjYGt33i3z1Ru4Bx6hphbAMyZfaYyUlyuVLB5MUTL2DYyRDm0uqZSjEMhA==", + "dev": true, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.10.1", + "@ngrok/ngrok": "^1.5.1", + "@smithery/registry": "^0.3.7", + "@smithery/sdk": "^1.5.2", + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "commander": "^14.0.0", + "cors": "^2.8.5", + "cross-fetch": "^4.1.0", + "esbuild": "^0.25.5", + "express": "^5.1.0", + "inquirer": "^8.2.4", + "inquirer-autocomplete-prompt": "^2.0.0", + "lodash": "^4.17.21", + "ora": "^8.2.0", + "uuid": "^11.1.0", + "uuidv7": "^1.0.2" + }, + "bin": { + "cli": "dist/index.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "bufferutil": "^4.0.9" + } + }, + "node_modules/@smithery/registry": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@smithery/registry/-/registry-0.3.7.tgz", + "integrity": "sha512-lfVsxsxF/RdQmaLTleAL2/K+blCGiEeJseFoHYWfqk8K/vZc8ypN4inVA4ABMW/cAS31VZS8inFMYeVTYgLZdQ==", + "dev": true, + "peerDependencies": { + "zod": ">= 3" + } + }, + "node_modules/@smithery/sdk": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@smithery/sdk/-/sdk-1.5.2.tgz", + "integrity": "sha512-UWvXvOY18d7WYl7JfhS1G1Gcy/K64RMcJMMUTfXDfYIbrKbjpKmgI85/ch0/SGJkNL0kF3fpIyhDHgvb+rhDjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "^0.32.1", + "@modelcontextprotocol/sdk": "^1.10.2", + "ai": "^4.3.15", + "express": "^5.1.0", + "json-schema": "^0.4.0", + "lodash": "^4.17.21", + "okay-error": "^1.0.2", + "openai": "^4.0.0", + "uuid": "^11.0.3", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -118,6 +964,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/diff-match-patch": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.36.tgz", + "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.13.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz", @@ -128,6 +981,24 @@ "undici-types": "~6.20.0" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@yepcode/run": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@yepcode/run/-/run-1.3.0.tgz", @@ -141,6 +1012,19 @@ "npm": ">=9" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -180,6 +1064,46 @@ "node": ">=0.4.0" } }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/ai/-/ai-4.3.16.tgz", + "integrity": "sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "@ai-sdk/react": "1.2.12", + "@ai-sdk/ui-utils": "1.2.11", + "@opentelemetry/api": "1.9.0", + "jsondiffpatch": "0.6.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -196,24 +1120,106 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, "node_modules/body-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.1.0.tgz", - "integrity": "sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", - "iconv-lite": "^0.5.2", + "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", @@ -223,42 +1229,44 @@ "node": ">=18" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", + "node_modules/bufferutil": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "side-channel": "^1.1.0" + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.14.2" } }, "node_modules/bytes": { @@ -299,6 +1307,119 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/content-disposition": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", @@ -358,6 +1479,16 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -373,12 +1504,12 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -389,6 +1520,29 @@ } } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -398,14 +1552,14 @@ "node": ">= 0.8" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 ||>= 1.4.16" + "node": ">=6" } }, "node_modules/diff": { @@ -418,6 +1572,13 @@ "node": ">=0.3.1" } }, + "node_modules/diff-match-patch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", + "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -450,6 +1611,13 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -489,12 +1657,79 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -504,6 +1739,16 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/eventsource": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz", @@ -526,46 +1771,45 @@ } }, "node_modules/express": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.0.1.tgz", - "integrity": "sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.0.1", + "body-parser": "^2.2.0", "content-disposition": "^1.0.0", - "content-type": "~1.0.4", - "cookie": "0.7.1", + "content-type": "^1.0.5", + "cookie": "^0.7.1", "cookie-signature": "^1.2.1", - "debug": "4.3.6", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "^2.0.0", - "fresh": "2.0.0", - "http-errors": "2.0.0", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", - "methods": "~1.1.2", "mime-types": "^3.0.0", - "on-finished": "2.4.1", - "once": "1.4.0", - "parseurl": "~1.3.3", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "router": "^2.0.0", - "safe-buffer": "5.2.1", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", "send": "^1.1.0", - "serve-static": "^2.1.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "^2.0.0", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-rate-limit": { @@ -583,6 +1827,34 @@ "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -595,46 +1867,100 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 12.20" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -653,6 +1979,21 @@ "node": ">= 0.8" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 ||>=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -662,6 +2003,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -699,6 +2053,19 @@ "node": ">= 0.4" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -711,6 +2078,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -723,6 +2100,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -751,51 +2144,317 @@ "node": ">= 0.8" } }, - "node_modules/iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer-autocomplete-prompt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-2.0.1.tgz", + "integrity": "sha512-jUHrH0btO7j5r8DTQgANf2CBkTZChoVySD8zF/wp5fZCOLIuUbleXhf4ZY5jNBOc1owA3gdfWtfZuppfYBhcUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "ansi-escapes": "^4.3.2", + "figures": "^3.2.0", + "picocolors": "^1.0.0", + "run-async": "^2.4.1", + "rxjs": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "inquirer": "^8.0.0" + } + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/jsondiffpatch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", + "integrity": "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/diff-match-patch": "^1.0.36", + "chalk": "^5.3.0", + "diff-match-patch": "^1.0.5" + }, + "bin": { + "jsondiffpatch": "bin/jsondiffpatch.js" + }, + "engines": { + "node": "^18.0.0 ||>=20.0.0" + } + }, + "node_modules/jsondiffpatch/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 ||>=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": "^12.17.0 || ^14.13 ||>=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -833,15 +2492,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -852,23 +2502,72 @@ } }, "node_modules/mime-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", - "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", "dependencies": { - "mime-db": "^1.53.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 ||>=15.0.1" + } + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -878,6 +2577,61 @@ "node": ">= 0.6" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x ||>=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -893,31 +2647,265 @@ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/okay-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/okay-error/-/okay-error-1.0.2.tgz", + "integrity": "sha512-jbaUyzfqiOlVmrqNzxJhjNwdB2zDCtXFfIfYz49CHemPbOldo6mA7iDELiSZJkbxYj4KCmS8GdmGE6hhcjZ+Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openai": { + "version": "4.104.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", + "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.111", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.111.tgz", + "integrity": "sha512-90sGdgA+QLJr1F9X79tQuEut0gEYIfkX9pydI4XGRgvFo9g2JWswefI+WUSUHPYVBHYSEfTEqBxA5hQvAZB3Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 ||>=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, "node_modules/parseurl": { @@ -947,6 +2935,13 @@ "node": ">=16" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/pkce-challenge": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", @@ -979,12 +2974,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -1017,24 +3012,64 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, "node_modules/router": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.1.0.tgz", - "integrity": "sha512-/m/NSLxeYEgWNtyC+WtNHCF7jbGxOibVWKnn+1Psff4dJGOfoXP+MuC/f2CwSmyiHdOIzYnYFp4W6GxWfekaLA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" @@ -1043,6 +3078,26 @@ "node": ">= 18" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1069,20 +3124,26 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/send": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", - "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { "debug": "^4.3.5", - "destroy": "^1.2.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", - "fresh": "^0.5.2", + "fresh": "^2.0.0", "http-errors": "^2.0.0", - "mime-types": "^2.1.35", + "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", @@ -1092,52 +3153,16 @@ "node": ">= 18" } }, - "node_modules/send/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/serve-static": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", - "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", - "send": "^1.0.0" + "send": "^1.2.0" }, "engines": { "node": ">= 18" @@ -1242,6 +3267,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1251,6 +3283,117 @@ "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swr": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", + "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1260,6 +3403,13 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -1304,10 +3454,50 @@ } } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", + "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", - "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -1357,13 +3547,45 @@ "punycode": "^2.1.0" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4.0" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "uuidv7": "cli.js" } }, "node_modules/v8-compile-cache-lib": { @@ -1382,6 +3604,44 @@ "node": ">= 0.8" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1397,6 +3657,21 @@ "node": ">= 8" } }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 43ff09e..9ced002 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "MCP server for YepCode", "main": "dist/index.js", "type": "module", + "module": "src/index.ts", "homepage": "https://yepcode.io/", "author": "YepCode Developers ", "license": "MIT", @@ -24,10 +25,6 @@ "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18", - "npm": ">=9" - }, "files": [ "dist", "dist/**/*.d.ts" @@ -43,10 +40,12 @@ "lint": "eslint .", "lint:fix": "eslint . --fix", "start": "node dist/index.js", - "dev": "node --loader ts-node/esm src/index.ts", "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', '755')\"", + "build:smithery": "npx @smithery/cli build", + "dev": "node --loader ts-node/esm src/index.ts", + "dev:smithery": "STANDALONE=false npx @smithery/cli dev", "type-check": "tsc --noEmit", - "inspector": "npx @modelcontextprotocol/inspector dist/index.js" + "inspector": "npx @modelcontextprotocol/inspector node dist/index.js" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.12.1", @@ -55,8 +54,10 @@ "zod": "^3.24.2" }, "devDependencies": { + "@smithery/cli": "^1.2.9", "@types/node": "^22", "ts-node": "^10.9.2", + "tsx": "^4.19.4", "typescript": "^5.3.2" }, "types": "dist/index.d.ts" diff --git a/smithery.yaml b/smithery.yaml index 0ee25e9..79107b3 100644 --- a/smithery.yaml +++ b/smithery.yaml @@ -1,13 +1,3 @@ -startCommand: - type: stdio - configSchema: - type: object - properties: - yepcodeApiToken: - type: string - description: Your YepCode API token - required: - - yepcodeApiToken - commandFunction: - |- - (config) => ({ command: 'node', args: ['./dist/index.js'], env: { YEPCODE_API_TOKEN: config.yepcodeApiToken } }) \ No newline at end of file +# Smithery configuration file: https://smithery.ai/docs/deployments + +runtime: typescript diff --git a/src/index.ts b/src/index.ts index d4e1576..c084e63 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,49 +1,81 @@ #!/usr/bin/env node - -import Logger from "./logger.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -import YepCodeMcpServer from "./server.js"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { z } from "zod"; import { getVersion } from "./utils.js"; +import { registerEnvVarsTools } from "./tools/env-vars.js"; +import { + YepCodeApi, + YepCodeApiConfig, + YepCodeEnv, + YepCodeRun, +} from "@yepcode/run"; +import { registerRunCodeTools } from "./tools/run-code.js"; +import { registerProcessesTools } from "./tools/processes.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; -const logger = new Logger("StdioServer", { logsToStderr: true }); +let disableRunCodeTool = false; +let skipRunCodeCleanup = false; +if (process.env.YEPCODE_MCP_OPTIONS) { + const mcpOptions = process.env.YEPCODE_MCP_OPTIONS.split(","); + disableRunCodeTool = mcpOptions.includes("disableRunCodeTool"); + skipRunCodeCleanup = mcpOptions.includes("skipRunCodeCleanup"); +} -const main = async (): Promise => { - let disableRunCodeTool = false; - let skipRunCodeCleanup = false; - if (process.env.YEPCODE_MCP_OPTIONS) { - const mcpOptions = process.env.YEPCODE_MCP_OPTIONS.split(","); - disableRunCodeTool = mcpOptions.includes("disableRunCodeTool"); - skipRunCodeCleanup = mcpOptions.includes("skipRunCodeCleanup"); - } - const server = new YepCodeMcpServer( - {}, - { logsToStderr: true, disableRunCodeTool, skipRunCodeCleanup } - ); - try { - const transport = new StdioServerTransport(); - await server.connect(transport); - logger.info(`@yepcode/mcp-server v${getVersion()} successfully started`); +export const configSchema = z.object({ + yepcodeApiToken: z.string().optional(), +}); - // Handle process termination - process.on("SIGINT", async () => { - logger.info("Received SIGINT, shutting down"); - await server.close(); - process.exit(0); +export default function createStatelessServer({ + config, +}: { + config: z.infer; +}) { + try { + const server = new McpServer({ + name: "YepCode MCP Server", + version: getVersion(), }); - process.on("SIGTERM", async () => { - logger.info("Received SIGTERM, shutting down"); - await server.close(); - process.exit(0); - }); + let yepCodeEnv; + let yepCodeRun; + let yepCodeApi; + if (config.yepcodeApiToken) { + const yepCodeApiConfig: YepCodeApiConfig = { + apiToken: config.yepcodeApiToken, + }; + yepCodeEnv = new YepCodeEnv(yepCodeApiConfig); + yepCodeRun = new YepCodeRun(yepCodeApiConfig); + yepCodeApi = new YepCodeApi(yepCodeApiConfig); + } else { + console.log("Running without YepCode API token"); + yepCodeEnv = {} as YepCodeEnv; + yepCodeRun = {} as YepCodeRun; + yepCodeApi = { + getProcesses: async () => ({ + data: [], + hasNextPage: false, + }), + } as unknown as YepCodeApi; + } + + registerRunCodeTools(server, yepCodeRun); + registerEnvVarsTools(server, yepCodeEnv); + registerProcessesTools(server, yepCodeApi); + + return server.server; } catch (error) { - logger.error("Failed to start server:", error as Error); - process.exit(1); + console.error(error); + throw error; } -}; - -main().catch((error) => { - logger.error("Error running server", error); -}); +} -export default main; +if (process.env.STANDALONE !== "false") { + console.log("Running in standalone mode"); + const transport = new StdioServerTransport(); + const server = createStatelessServer({ + config: { + yepcodeApiToken: process.env.YEPCODE_API_TOKEN || "", + }, + }); + server.connect(transport).catch(console.error); +} diff --git a/src/server.ts b/src/server.ts index 95bb82a..e90613a 100644 --- a/src/server.ts +++ b/src/server.ts @@ -32,6 +32,11 @@ import { import { z } from "zod"; import { getVersion, isEmpty } from "./utils.js"; import Logger from "./logger.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; + +const logger = new Logger("yepcode-mcp-server", { + logsToStderr: true, +}); const RUN_PROCESS_TOOL_NAME_PREFIX = "run_ycp_"; const RUN_PROCESS_TOOL_TAG = "mcp-tool"; @@ -39,10 +44,7 @@ const RUN_PROCESS_TOOL_TAG = "mcp-tool"; dotenv.config(); class YepCodeMcpServer extends Server { - private yepCodeRun: YepCodeRun; - private yepCodeEnv: YepCodeEnv; - private yepCodeApi: YepCodeApi; - private logger: Logger; + private config: YepCodeApiConfig; private disableRunCodeTool: boolean; private skipRunCodeCleanup: boolean; constructor( @@ -71,38 +73,34 @@ class YepCodeMcpServer extends Server { } ); + this.config = config; this.disableRunCodeTool = disableRunCodeTool; this.skipRunCodeCleanup = skipRunCodeCleanup; + this.setupHandlers(); this.setupErrorHandling(); - try { - this.yepCodeRun = new YepCodeRun(config); - this.yepCodeEnv = new YepCodeEnv(config); - this.yepCodeApi = YepCodeApiManager.getInstance(config); - this.logger = new Logger(this.yepCodeApi.getTeamId(), { - logsToStderr, - }); - this.logger.info("YepCode initialized successfully"); - } catch (error) { - this.logger = new Logger("YepCodeMcpServer", { - logsToStderr, - }); - this.logger.error("Exception while initializing YepCode", error as Error); - throw new McpError( - ErrorCode.InternalError, - "Exception while initializing YepCode. Have you set the YEPCODE_API_TOKEN environment variable?" - ); - } + // try { + // this.yepCodeRun = new YepCodeRun(config); + // this.yepCodeEnv = new YepCodeEnv(config); + + // logger.info("YepCode initialized successfully"); + // } catch (error) { + // console = new Logger("YepCodeMcpServer", { logsToStderr }); + // throw new McpError( + // ErrorCode.InternalError, + // "Exception while initializing YepCode. Have you set the YEPCODE_API_TOKEN environment variable?" + // ); + // } } private setupErrorHandling(): void { this.onerror = (error) => { - this.logger.error("[MCP Error]", error); + logger.error("[MCP Error]", error); }; process.on("SIGINT", async () => { - this.logger.info("Received SIGINT, shutting down"); + logger.info("Received SIGINT, shutting down"); await this.close(); process.exit(0); }); @@ -136,12 +134,12 @@ class YepCodeMcpServer extends Server { }> { const parsed = schema.safeParse(request.params.arguments); if (!parsed.success) { - this.logger.error("Invalid request arguments", parsed.error); + logger.error("Invalid request arguments", parsed.error); throw new McpError(ErrorCode.InvalidParams, "Invalid request arguments"); } try { - this.logger.info(`Handling tool request: ${request.params.name}`); + logger.info(`Handling tool request: ${request.params.name}`); const result = await handler(parsed.data); return { isError: false, @@ -161,7 +159,7 @@ class YepCodeMcpServer extends Server { } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; - this.logger.error( + logger.error( `Error in tool handler: ${request.params.name}`, error as Error ); @@ -186,8 +184,11 @@ class YepCodeMcpServer extends Server { private async executionResult( executionId: string ): Promise { + // TODO: + const yepCodeApi = YepCodeApiManager.getInstance({}); + const execution = new Execution({ - yepCodeApi: this.yepCodeApi, + yepCodeApi, executionId, }); await execution.waitForDone(); @@ -205,24 +206,118 @@ class YepCodeMcpServer extends Server { } private setupToolHandlers(): void { + // TODO: + let yepCodeApi: YepCodeApi | null = null; + try { + yepCodeApi = YepCodeApiManager.getInstance({}); + } catch (error) { + logger.error("Exception while initializing YepCode API", error as Error); + } + + if (!yepCodeApi) { + this.setRequestHandler(ListToolsRequestSchema, async () => { + return { + tools: [ + { + name: "run_code", + description: "Run code in YepCode", + inputSchema: zodToJsonSchema(RunCodeSchema), + }, + { + name: "set_env_var", + description: + "Set a YepCode environment variable to be available for future code executions", + inputSchema: zodToJsonSchema(SetEnvVarSchema), + }, + { + name: "remove_env_var", + description: "Remove a YepCode environment variable", + inputSchema: zodToJsonSchema(RemoveEnvVarSchema), + }, + { + name: "get_execution", + description: + "Get the status, result, logs, timeline, etc. of a YepCode execution", + inputSchema: zodToJsonSchema(GetExecutionSchema), + }, + ], + }; + }); + + this.setRequestHandler(CallToolRequestSchema, async (request) => { + if (this.disableRunCodeTool) { + logger.error("Run code tool is disabled"); + throw new McpError( + ErrorCode.MethodNotFound, + "Run code tool is disabled" + ); + } + + return this.handleToolRequest(RunCodeSchema, request, async (data) => { + const yepCodeRun = new YepCodeRun(this.config); + + const { code, options } = data; + const logs: Log[] = []; + let executionError: string | undefined; + let returnValue: unknown; + + logger.info("Running code with YepCode", { + codeLength: code.length, + options, + }); + + const execution = await yepCodeRun.run(code, { + removeOnDone: !this.skipRunCodeCleanup, + ...options, + initiatedBy: "@yepcode/mcp-server", + onLog: (log) => { + logs.push(log); + }, + onError: (error) => { + executionError = error.message; + logger.error("YepCode execution error", error as Error); + }, + onFinish: (value) => { + returnValue = value; + logger.info("YepCode execution finished", { + hasReturnValue: value !== undefined, + }); + }, + }); + + await execution.waitForDone(); + + return { + logs, + returnValue, + ...(executionError && { error: executionError }), + }; + }); + }); + + return; + } + this.setRequestHandler(ListToolsRequestSchema, async () => { - this.logger.info(`Handling ListTools request`); - const envVars = await this.yepCodeEnv.getEnvVars(); + logger.info(`Handling ListTools request`); + // TODO: + const yepCodeEnv = new YepCodeEnv(this.config); + const envVars = await yepCodeEnv.getEnvVars(); const tools = this.disableRunCodeTool ? [] : [ { name: "run_code", description: `Execute LLM-generated code safely in YepCode’s secure, production-grade sandboxes. -This tool is ideal when your AI agent needs to handle tasks that don’t have a predefined tool available — but could be solved by writing and running a custom script. + This tool is ideal when your AI agent needs to handle tasks that don’t have a predefined tool available — but could be solved by writing and running a custom script. -It supports external dependencies (NPM or PyPI), so it’s perfect for: - • Complex data transformations - • API calls to services not yet integrated - • Custom logic implementations - • One-off utility scripts + It supports external dependencies (NPM or PyPI), so it’s perfect for: + • Complex data transformations + • API calls to services not yet integrated + • Custom logic implementations + • One-off utility scripts -Tip: First try to find a tool that matches your task, but if not available, try generating the code and running it here!`, + Tip: First try to find a tool that matches your task, but if not available, try generating the code and running it here!`, inputSchema: zodToJsonSchema( buildRunCodeSchema(envVars.map((envVar) => envVar.key)) ), @@ -245,11 +340,12 @@ Tip: First try to find a tool that matches your task, but if not available, try inputSchema: zodToJsonSchema(GetExecutionSchema), }, ]; + let page = 0; let limit = 100; while (true) { - const processes = await this.yepCodeApi.getProcesses({ page, limit }); - this.logger.info(`Found ${processes?.data?.length} processes`); + const processes = await yepCodeApi.getProcesses({ page, limit }); + logger.info(`Found ${processes?.data?.length} processes`); if (!processes.data) { break; } @@ -281,7 +377,7 @@ Tip: First try to find a tool that matches your task, but if not available, try } page++; } - this.logger.info( + logger.info( `Found ${tools.length} tools: ${tools .map((tool) => tool.name) .join(", ")}` @@ -292,7 +388,10 @@ Tip: First try to find a tool that matches your task, but if not available, try }); this.setRequestHandler(CallToolRequestSchema, async (request) => { - this.logger.info(`Received CallTool request for: ${request.params.name}`); + logger.info(`Received CallTool request for: ${request.params.name}`); + + // TODO: + const yepCodeApi = YepCodeApiManager.getInstance({}); if (request.params.name.startsWith(RUN_PROCESS_TOOL_NAME_PREFIX)) { const processId = request.params.name.replace( @@ -309,7 +408,7 @@ Tip: First try to find a tool that matches your task, but if not available, try parameters, ...options } = data; - const { executionId } = await this.yepCodeApi.executeProcessAsync( + const { executionId } = await yepCodeApi.executeProcessAsync( processId, parameters, { @@ -327,10 +426,11 @@ Tip: First try to find a tool that matches your task, but if not available, try ); } + const yepCodeEnv = new YepCodeEnv(this.config); switch (request.params.name) { case "run_code": if (this.disableRunCodeTool) { - this.logger.error("Run code tool is disabled"); + logger.error("Run code tool is disabled"); throw new McpError( ErrorCode.MethodNotFound, "Run code tool is disabled" @@ -340,17 +440,19 @@ Tip: First try to find a tool that matches your task, but if not available, try RunCodeSchema, request, async (data) => { + const yepCodeRun = new YepCodeRun(this.config); + const { code, options } = data; const logs: Log[] = []; let executionError: string | undefined; let returnValue: unknown; - this.logger.info("Running code with YepCode", { + logger.info("Running code with YepCode", { codeLength: code.length, options, }); - const execution = await this.yepCodeRun.run(code, { + const execution = await yepCodeRun.run(code, { removeOnDone: !this.skipRunCodeCleanup, ...options, initiatedBy: "@yepcode/mcp-server", @@ -359,11 +461,11 @@ Tip: First try to find a tool that matches your task, but if not available, try }, onError: (error) => { executionError = error.message; - this.logger.error("YepCode execution error", error as Error); + logger.error("YepCode execution error", error as Error); }, onFinish: (value) => { returnValue = value; - this.logger.info("YepCode execution finished", { + logger.info("YepCode execution finished", { hasReturnValue: value !== undefined, }); }, @@ -385,10 +487,10 @@ Tip: First try to find a tool that matches your task, but if not available, try request, async (data) => { const { key, value, isSensitive } = data; - this.logger.info(`Setting environment variable: ${key}`, { + logger.info(`Setting environment variable: ${key}`, { isSensitive, }); - await this.yepCodeEnv.setEnvVar(key, value, isSensitive); + await yepCodeEnv.setEnvVar(key, value, isSensitive); return {}; } ); @@ -398,8 +500,8 @@ Tip: First try to find a tool that matches your task, but if not available, try RemoveEnvVarSchema, request, async (data) => { - this.logger.info(`Removing environment variable: ${data.key}`); - await this.yepCodeEnv.delEnvVar(data.key); + logger.info(`Removing environment variable: ${data.key}`); + await yepCodeEnv.delEnvVar(data.key); return {}; } ); @@ -413,7 +515,7 @@ Tip: First try to find a tool that matches your task, but if not available, try } ); default: - this.logger.error(`Unknown tool requested: ${request.params.name}`); + logger.error(`Unknown tool requested: ${request.params.name}`); throw new McpError( ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}` @@ -421,6 +523,11 @@ Tip: First try to find a tool that matches your task, but if not available, try } }); } + + async run(): Promise { + const transport = new StdioServerTransport(); + await this.connect(transport); + } } export default YepCodeMcpServer; diff --git a/src/tools/env-vars.ts b/src/tools/env-vars.ts new file mode 100644 index 0000000..059b648 --- /dev/null +++ b/src/tools/env-vars.ts @@ -0,0 +1,64 @@ +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { YepCodeEnv } from "@yepcode/run"; +import { z } from "zod"; + +export const registerEnvVarsTools = ( + server: McpServer, + yepCodeEnv: YepCodeEnv +) => { + server.tool( + "set_env_var", + "Set a YepCode environment variable to be available for future code executions", + { + key: z.string().describe("The key of the environment variable to set"), + value: z + .string() + .describe("The value of the environment variable to set"), + isSensitive: z + .boolean() + .optional() + .default(true) + .describe("Whether the environment variable is sensitive"), + }, + async ({ key, value, isSensitive }) => { + try { + console.log("setting env var", key, value, isSensitive); + await yepCodeEnv.setEnvVar(key, value, isSensitive); + return { + content: [ + { + type: "text", + text: `Environment variable '${key}' set successfully`, + }, + ], + }; + } catch (e: any) { + return { + isError: true, + content: [{ type: "text", text: `Error: ${e.message}` }], + }; + } + } + ); + + server.tool( + "remove_env_var", + "Remove a YepCode environment variable", + { + key: z.string().describe("The key of the environment variable to remove"), + }, + async ({ key }) => { + try { + await yepCodeEnv.delEnvVar(key); + return { + content: [{ type: "text", text: "Environment variable removed" }], + }; + } catch (e: any) { + return { + isError: true, + content: [{ type: "text", text: `Error: ${e.message}` }], + }; + } + } + ); +}; diff --git a/src/tools/processes.ts b/src/tools/processes.ts new file mode 100644 index 0000000..a41f01c --- /dev/null +++ b/src/tools/processes.ts @@ -0,0 +1,119 @@ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { Process, YepCodeApi, YepCodeEnv } from "@yepcode/run"; +import { isEmpty } from "../utils.js"; +import { zodToJsonSchema } from "zod-to-json-schema"; +import { z } from "zod"; + +const RUN_PROCESS_TOOL_NAME_PREFIX = "run_ycp_"; +const RUN_PROCESS_TOOL_TAG = "mcp-tool"; + +export const RunProcessSchema = { + parameters: z.any().optional() as any, + options: z + .object({ + tag: z + .string() + .optional() + .describe( + "The process version to be executed. You may provide a specific version if user asks explicity for a process version." + ), + comment: z + .string() + .optional() + .describe( + "A comment to be added to the execution. You may provide some context about the execution." + ), + }) + .optional(), + synchronousExecution: z + .boolean() + .optional() + .default(true) + .describe( + "Whether the execution should be synchronous or not. If true, the execution will be synchronous and the execution result will be returned immediately. If false, the execution will be asynchronous and you should use the execution id to get the result later." + ), +}; + +async function registerProcessTool( + server: McpServer, + yepCodeApi: YepCodeApi, + process: Process +) { + let toolName = `${RUN_PROCESS_TOOL_NAME_PREFIX}${process.slug}`; + if (toolName.length> 60) { + toolName = `${RUN_PROCESS_TOOL_NAME_PREFIX}${process.id}`; + } + + const inputSchema = RunProcessSchema; + if (!isEmpty(process.parametersSchema)) { + inputSchema.parameters = process.parametersSchema as any; + } else { + delete inputSchema.parameters; + } + + server.registerTool( + toolName, + { + description: process.description || process.name, + inputSchema, + }, + // @ts-ignore + async (data: any) => { + const { synchronousExecution = true, parameters, ...options } = data; + const { executionId } = await yepCodeApi.executeProcessAsync( + process.id, + parameters, + { + ...options, + initiatedBy: "@yepcode/mcp-server", + } + ); + + return { + isError: false, + content: [{ type: "text", text: "Executed" }], + }; + } + ); + // server.tool( + // toolName, + // `${process.name}${process.description ? ` - ${process.description}` : ""}`, + // {}, + // async (data) => { + // const { synchronousExecution = true, parameters, ...options } = data; + // const { executionId } = await yepCodeApi.executeProcessAsync( + // processId, + // parameters, + // { + // ...options, + // initiatedBy: "@yepcode/mcp-server", + // } + // ); + + // return { + // content: [{ type: "text", text: `Execution ID: ${executionId}` }], + // }; + // } + // ); +} + +export async function registerProcessesTools( + server: McpServer, + yepCodeApi: YepCodeApi +) { + let page = 0; + let limit = 100; + while (true) { + const processes = await yepCodeApi.getProcesses({ page, limit }); + if (!processes.data) { + break; + } + processes.data + .filter((process) => process.tags?.includes(RUN_PROCESS_TOOL_TAG)) + .forEach((process) => registerProcessTool(server, yepCodeApi, process)); + if (!processes.hasNextPage) { + break; + } + page++; + } +} diff --git a/src/tools/run-code.ts b/src/tools/run-code.ts new file mode 100644 index 0000000..f95543b --- /dev/null +++ b/src/tools/run-code.ts @@ -0,0 +1,116 @@ +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { Log, YepCodeEnv, YepCodeRun } from "@yepcode/run"; +import { z } from "zod"; +import { RunCodeOptionsSchema } from "../types.js"; +import { zodToJsonSchema } from "zod-to-json-schema"; + +const buildRunCodeSchema = (envVars: string[]) => { + return z.object({ + code: z.string().describe(` + * We support JavaScript (NodeJS v20) or Python (v3.12). + ${ + envVars && + envVars.length> 0 && + `* You may use the following environment variables already set in the execution context: ${envVars.join( + ", " + )}.` + } + * Use external dependencies freely from NPM or PyPI. You should import them as usually. + * If package name is different from the import sentence, add an anotation for us to detect them (\`// @add-package package_name\` (javascript) or \`# @add-package package_name\` (python)). + * When possible, use binary packages to avoid compilation issues. + * Include debugging logs (\`console.log()\` in javascript or \`print()\` in python) if necessary for execution tracking and error debugging. + * Do not catch errors, let them fail the execution. + * Follow the required script structure based on the chosen language: + + \`\`\`js + // @add-package package_name_1 + const package_name_1 = require("package_name_1"); + // @add-package package_name_2 + const package_name_2 = require("package_name_2"); + + async function main() { + // The generated code should go here + return {"success": true, "data": result} + } + + module.exports = { main } + \`\`\` + + \`\`\`py + # @add-package package_name_1 + import package_name_1 + # @add-package package_name_2 + from package_name_2.module import Module + + def main(): + # The generated code should go here + return {"success": True, "data": result} + \`\`\` + `), + options: RunCodeOptionsSchema, + }); +}; + +export const registerRunCodeTools = ( + server: McpServer, + yepCodeRun: YepCodeRun +) => { + server.tool( + "run_code", + `Execute LLM-generated code safely in YepCode's secure, production-grade sandboxes. + This tool is ideal when your AI agent needs to handle tasks that don't have a predefined tool available — but could be solved by writing and running a custom script. + + It supports external dependencies (NPM or PyPI), so it's perfect for: + • Complex data transformations + • API calls to services not yet integrated + • Custom logic implementations + • One-off utility scripts + + Tip: First try to find a tool that matches your task, but if not available, try generating the code and running it here!`, + zodToJsonSchema(buildRunCodeSchema([])), + async ({ code, options }) => { + try { + const logs: Log[] = []; + let executionError: string | undefined; + let returnValue: unknown; + const execution = await yepCodeRun.run(code, { + // removeOnDone: !this.skipRunCodeCleanup, + initiatedBy: "@yepcode/mcp-server", + onLog: (log) => { + logs.push(log); + }, + onError: (error) => { + executionError = error.message; + }, + onFinish: (value) => { + returnValue = value; + }, + ...options, + }); + execution.waitForDone(); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + logs, + returnValue, + ...(executionError && { error: executionError }), + }, + null, + 2 + ), + }, + ], + }; + } catch (e: any) { + return { + isError: true, + content: [{ type: "text", text: `Error: ${e.message}` }], + }; + } + } + ); +}; diff --git a/src/utils.ts b/src/utils.ts index cb311e0..def3a2a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,6 +1,6 @@ -import { fileURLToPath } from "url"; -import { join, dirname } from "path"; -import { readFileSync } from "fs"; +// import { fileURLToPath } from "url"; +// import { join, dirname } from "path"; +// import { readFileSync } from "fs"; export const isEmpty = (value: unknown): boolean => { return ( @@ -19,16 +19,17 @@ export const isString = (value: unknown): value is string => { return typeof value === "string"; }; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +// const __filename = fileURLToPath(import.meta.url); +// const __dirname = dirname(__filename); export function getVersion(): string { - try { - const packageJsonPath = join(__dirname, "../package.json"); - const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); - return packageJson.version || "1.0.0"; - } catch (err) { - console.error("[yepcode-mcp-server]", "Unable to retrieve version:", err); - return "unknown"; - } + return "1.0.0"; + // try { + // const packageJsonPath = join(__dirname, "../package.json"); + // const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); + // return packageJson.version || "1.0.0"; + // } catch (err) { + // console.error("[yepcode-mcp-server]", "Unable to retrieve version:", err); + // return "unknown"; + // } } diff --git a/tsconfig.json b/tsconfig.json index aa78243..81dad85 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,15 @@ { "compilerOptions": { - "target": "ES2020", - "module": "ES2020", - "moduleResolution": "node", - "esModuleInterop": true, + "target": "ES2022", + "module": "Node16", + "moduleResolution": "Node16", + "outDir": "./dist", + "rootDir": "./src", "strict": true, + "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "outDir": "./dist", - "declaration": true - }, - "ts-node": { - "esm": true + "forceConsistentCasingInFileNames": true }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules", "tests"] + "include": ["src/**/*"], + "exclude": ["node_modules"] } From 48181f63165ec9f9cb5678eaa537359fb5f71f61 Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 12:34:11 +0200 Subject: [PATCH 2/8] Add env vars to run_code tool schema --- src/index.ts | 8 ++++---- src/tools/run-code.ts | 12 +++++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index c084e63..bb494b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,8 +47,9 @@ export default function createStatelessServer({ yepCodeRun = new YepCodeRun(yepCodeApiConfig); yepCodeApi = new YepCodeApi(yepCodeApiConfig); } else { - console.log("Running without YepCode API token"); - yepCodeEnv = {} as YepCodeEnv; + yepCodeEnv = { + getEnvVars: async () => [], + } as unknown as YepCodeEnv; yepCodeRun = {} as YepCodeRun; yepCodeApi = { getProcesses: async () => ({ @@ -58,7 +59,7 @@ export default function createStatelessServer({ } as unknown as YepCodeApi; } - registerRunCodeTools(server, yepCodeRun); + registerRunCodeTools(server, yepCodeRun, yepCodeEnv); registerEnvVarsTools(server, yepCodeEnv); registerProcessesTools(server, yepCodeApi); @@ -70,7 +71,6 @@ export default function createStatelessServer({ } if (process.env.STANDALONE !== "false") { - console.log("Running in standalone mode"); const transport = new StdioServerTransport(); const server = createStatelessServer({ config: { diff --git a/src/tools/run-code.ts b/src/tools/run-code.ts index f95543b..e29e1c9 100644 --- a/src/tools/run-code.ts +++ b/src/tools/run-code.ts @@ -5,7 +5,7 @@ import { RunCodeOptionsSchema } from "../types.js"; import { zodToJsonSchema } from "zod-to-json-schema"; const buildRunCodeSchema = (envVars: string[]) => { - return z.object({ + return { code: z.string().describe(` * We support JavaScript (NodeJS v20) or Python (v3.12). ${ @@ -48,13 +48,15 @@ const buildRunCodeSchema = (envVars: string[]) => { \`\`\` `), options: RunCodeOptionsSchema, - }); + }; }; -export const registerRunCodeTools = ( +export const registerRunCodeTools = async ( server: McpServer, - yepCodeRun: YepCodeRun + yepCodeRun: YepCodeRun, + yepCodeEnv: YepCodeEnv ) => { + const envVars = await yepCodeEnv.getEnvVars(); server.tool( "run_code", `Execute LLM-generated code safely in YepCode's secure, production-grade sandboxes. @@ -67,7 +69,7 @@ export const registerRunCodeTools = ( • One-off utility scripts Tip: First try to find a tool that matches your task, but if not available, try generating the code and running it here!`, - zodToJsonSchema(buildRunCodeSchema([])), + buildRunCodeSchema(envVars.map((envVar) => envVar.key)), async ({ code, options }) => { try { const logs: Log[] = []; From 92fdbec9e549e84431f439f32d1c46f82453f0da Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 12:42:52 +0200 Subject: [PATCH 3/8] yepcodeApiToken is required --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index bb494b1..42b5bee 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,7 +22,7 @@ if (process.env.YEPCODE_MCP_OPTIONS) { } export const configSchema = z.object({ - yepcodeApiToken: z.string().optional(), + yepcodeApiToken: z.string(), }); export default function createStatelessServer({ From e429438a4749a7b3c7ddf80d58abfe23d66a8085 Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 13:12:40 +0200 Subject: [PATCH 4/8] Update tsconfig Copied from github example --- tsconfig.json | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 81dad85..b341780 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,11 @@ { "compilerOptions": { "target": "ES2022", - "module": "Node16", - "moduleResolution": "Node16", + "module": "NodeNext", + "moduleResolution": "NodeNext", "outDir": "./dist", - "rootDir": "./src", - "strict": true, "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true + "strict": true }, - "include": ["src/**/*"], - "exclude": ["node_modules"] + "include": ["src/**/*"] } From 5b039286c4f603425086e40f94bc8f05ac01001f Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 13:25:30 +0200 Subject: [PATCH 5/8] Add description to api key --- src/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 42b5bee..1a83c93 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,7 +22,11 @@ if (process.env.YEPCODE_MCP_OPTIONS) { } export const configSchema = z.object({ - yepcodeApiToken: z.string(), + yepcodeApiToken: z + .string() + .describe( + "YepCode API token, obtained from https://cloud.yepcode.io//settings/api-credentials" + ), }); export default function createStatelessServer({ From dada2a1fef971cace4867e964e96b2b9c0f21fe8 Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 13:28:58 +0200 Subject: [PATCH 6/8] Remove transport just to see what happens --- src/index.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1a83c93..42b5bee 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,11 +22,7 @@ if (process.env.YEPCODE_MCP_OPTIONS) { } export const configSchema = z.object({ - yepcodeApiToken: z - .string() - .describe( - "YepCode API token, obtained from https://cloud.yepcode.io//settings/api-credentials" - ), + yepcodeApiToken: z.string(), }); export default function createStatelessServer({ From ac0c2d74ae3fe60293e6c240189c6fc4f87d026c Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 13:44:42 +0200 Subject: [PATCH 7/8] Remove old files --- package-lock.json | 9 +- package.json | 27 +-- src/index.ts | 10 - src/logger.ts | 56 ----- src/server.ts | 533 ----------------------------------------- src/tools/processes.ts | 11 +- src/tools/run-code.ts | 13 +- src/types.ts | 166 ------------- 8 files changed, 25 insertions(+), 800 deletions(-) delete mode 100644 src/logger.ts delete mode 100644 src/server.ts delete mode 100644 src/types.ts diff --git a/package-lock.json b/package-lock.json index 5c3cb35..151f35f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,8 @@ "version": "0.7.0", "license": "MIT", "dependencies": { - "@modelcontextprotocol/sdk": "^1.12.1", - "@yepcode/run": "^1.3.0", - "dotenv": "^16.4.7", - "zod": "^3.24.2" - }, - "bin": { - "yepcode-mcp-server": "dist/index.js" + "@modelcontextprotocol/sdk": "^1.11.0", + "@yepcode/run": "^1.3.0" }, "devDependencies": { "@smithery/cli": "^1.2.9", diff --git a/package.json b/package.json index 9ced002..433a4d0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,6 @@ "name": "@yepcode/mcp-server", "version": "0.7.0", "description": "MCP server for YepCode", - "main": "dist/index.js", "type": "module", "module": "src/index.ts", "homepage": "https://yepcode.io/", @@ -26,32 +25,18 @@ "access": "public" }, "files": [ - "dist", - "dist/**/*.d.ts" + "dist" ], - "exports": { - ".": "./dist/index.js", - "./server": "./dist/server.js" - }, - "bin": { - "yepcode-mcp-server": "dist/index.js" - }, "scripts": { "lint": "eslint .", "lint:fix": "eslint . --fix", - "start": "node dist/index.js", - "build": "tsc && node -e \"require('fs').chmodSync('dist/index.js', '755')\"", - "build:smithery": "npx @smithery/cli build", - "dev": "node --loader ts-node/esm src/index.ts", - "dev:smithery": "STANDALONE=false npx @smithery/cli dev", - "type-check": "tsc --noEmit", - "inspector": "npx @modelcontextprotocol/inspector node dist/index.js" + "build": "npx @smithery/cli build", + "dev": "npx @smithery/cli dev", + "type-check": "tsc --noEmit" }, "dependencies": { - "@modelcontextprotocol/sdk": "^1.12.1", - "@yepcode/run": "^1.3.0", - "dotenv": "^16.4.7", - "zod": "^3.24.2" + "@modelcontextprotocol/sdk": "^1.11.0", + "@yepcode/run": "^1.3.0" }, "devDependencies": { "@smithery/cli": "^1.2.9", diff --git a/src/index.ts b/src/index.ts index 42b5bee..4fefba3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -69,13 +69,3 @@ export default function createStatelessServer({ throw error; } } - -if (process.env.STANDALONE !== "false") { - const transport = new StdioServerTransport(); - const server = createStatelessServer({ - config: { - yepcodeApiToken: process.env.YEPCODE_API_TOKEN || "", - }, - }); - server.connect(transport).catch(console.error); -} diff --git a/src/logger.ts b/src/logger.ts deleted file mode 100644 index 510722b..0000000 --- a/src/logger.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { isObject } from "./utils.js"; - -class Logger { - private name: string | undefined; - private logsToStderr: boolean; - - constructor( - name: string | undefined = undefined, - { logsToStderr = false }: { logsToStderr?: boolean } = {} - ) { - this.name = name; - this.logsToStderr = logsToStderr; - } - - private log(level: string, message: string, data: unknown = undefined) { - let dataOutput = undefined; - if (data) { - if (data instanceof Error) { - dataOutput = { - error: data.stack || data.message || String(data), - }; - } else if (isObject(data)) { - dataOutput = JSON.stringify(data); - } else { - dataOutput = String(data); - } - } - - const logEntry = { - time: new Date().toISOString(), - level_name: level, - message: `${this.name ? `[${this.name}] ` : ""}${message}`, - data: dataOutput, - }; - const logString = JSON.stringify(logEntry); - if (this.logsToStderr || level === "ERROR") { - console.error(logString); - } else { - console.log(logString); - } - } - - error(message: string, error: Error | undefined = undefined) { - this.log("error", message, error); - } - - warn(message: string, data: unknown = undefined) { - this.log("warn", message, data); - } - - info(message: string, data: unknown = undefined) { - this.log("info", message, data); - } -} - -export default Logger; diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index e90613a..0000000 --- a/src/server.ts +++ /dev/null @@ -1,533 +0,0 @@ -import { Server } from "@modelcontextprotocol/sdk/server/index.js"; -import { - ListToolsRequestSchema, - CallToolRequestSchema, - ErrorCode, - McpError, - ListResourcesRequestSchema, - ListResourceTemplatesRequestSchema, -} from "@modelcontextprotocol/sdk/types.js"; -import { zodToJsonSchema } from "zod-to-json-schema"; -import { - YepCodeEnv, - Log, - YepCodeApi, - YepCodeApiManager, - YepCodeRun, - Execution, - YepCodeApiConfig, -} from "@yepcode/run"; -import dotenv from "dotenv"; -import { - RunCodeSchema, - buildRunCodeSchema, - SetEnvVarSchema, - RemoveEnvVarSchema, - ToolCallRequest, - ToolHandler, - RunProcessSchema, - ExecutionResultSchema, - GetExecutionSchema, -} from "./types.js"; -import { z } from "zod"; -import { getVersion, isEmpty } from "./utils.js"; -import Logger from "./logger.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; - -const logger = new Logger("yepcode-mcp-server", { - logsToStderr: true, -}); - -const RUN_PROCESS_TOOL_NAME_PREFIX = "run_ycp_"; -const RUN_PROCESS_TOOL_TAG = "mcp-tool"; - -dotenv.config(); - -class YepCodeMcpServer extends Server { - private config: YepCodeApiConfig; - private disableRunCodeTool: boolean; - private skipRunCodeCleanup: boolean; - constructor( - config: YepCodeApiConfig, - { - logsToStderr = false, - disableRunCodeTool = false, - skipRunCodeCleanup = false, - }: { - logsToStderr?: boolean; - disableRunCodeTool?: boolean; - skipRunCodeCleanup?: boolean; - } = {} - ) { - super( - { - name: "yepcode-mcp-server", - version: getVersion(), - }, - { - capabilities: { - tools: {}, - resources: {}, - resourceTemplates: {}, - }, - } - ); - - this.config = config; - this.disableRunCodeTool = disableRunCodeTool; - this.skipRunCodeCleanup = skipRunCodeCleanup; - - this.setupHandlers(); - this.setupErrorHandling(); - - // try { - // this.yepCodeRun = new YepCodeRun(config); - // this.yepCodeEnv = new YepCodeEnv(config); - - // logger.info("YepCode initialized successfully"); - // } catch (error) { - // console = new Logger("YepCodeMcpServer", { logsToStderr }); - // throw new McpError( - // ErrorCode.InternalError, - // "Exception while initializing YepCode. Have you set the YEPCODE_API_TOKEN environment variable?" - // ); - // } - } - - private setupErrorHandling(): void { - this.onerror = (error) => { - logger.error("[MCP Error]", error); - }; - - process.on("SIGINT", async () => { - logger.info("Received SIGINT, shutting down"); - await this.close(); - process.exit(0); - }); - } - - private setupHandlers(): void { - this.setupToolHandlers(); - this.setupResourceHandlers(); - this.setupTemplateHandlers(); - } - - private setupResourceHandlers(): void { - this.setRequestHandler(ListResourcesRequestSchema, async () => ({ - resources: [], // Empty list as we don't have any resources - })); - } - - private setupTemplateHandlers(): void { - this.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({ - resourceTemplates: [], // Empty list as we don't have any templates - })); - } - - private async handleToolRequest( - schema: z.ZodSchema, - request: ToolCallRequest, - handler: ToolHandler - ): Promise<{ - isError: boolean; - content: Array<{ type: string; text: string }>; - }> { - const parsed = schema.safeParse(request.params.arguments); - if (!parsed.success) { - logger.error("Invalid request arguments", parsed.error); - throw new McpError(ErrorCode.InvalidParams, "Invalid request arguments"); - } - - try { - logger.info(`Handling tool request: ${request.params.name}`); - const result = await handler(parsed.data); - return { - isError: false, - content: [ - { - type: "text", - text: JSON.stringify( - { - ...(result as Record), - }, - null, - 2 - ), - }, - ], - }; - } catch (error) { - const errorMessage = - error instanceof Error ? error.message : "Unknown error occurred"; - logger.error( - `Error in tool handler: ${request.params.name}`, - error as Error - ); - return { - isError: true, - content: [ - { - type: "text", - text: JSON.stringify( - { - error: errorMessage, - }, - null, - 2 - ), - }, - ], - }; - } - } - - private async executionResult( - executionId: string - ): Promise { - // TODO: - const yepCodeApi = YepCodeApiManager.getInstance({}); - - const execution = new Execution({ - yepCodeApi, - executionId, - }); - await execution.waitForDone(); - return { - executionId, - logs: execution.logs, - processId: execution.processId, - status: execution.status, - timeline: execution.timeline, - ...(execution.returnValue && { - returnValue: execution.returnValue, - }), - ...(execution.error && { error: execution.error }), - }; - } - - private setupToolHandlers(): void { - // TODO: - let yepCodeApi: YepCodeApi | null = null; - try { - yepCodeApi = YepCodeApiManager.getInstance({}); - } catch (error) { - logger.error("Exception while initializing YepCode API", error as Error); - } - - if (!yepCodeApi) { - this.setRequestHandler(ListToolsRequestSchema, async () => { - return { - tools: [ - { - name: "run_code", - description: "Run code in YepCode", - inputSchema: zodToJsonSchema(RunCodeSchema), - }, - { - name: "set_env_var", - description: - "Set a YepCode environment variable to be available for future code executions", - inputSchema: zodToJsonSchema(SetEnvVarSchema), - }, - { - name: "remove_env_var", - description: "Remove a YepCode environment variable", - inputSchema: zodToJsonSchema(RemoveEnvVarSchema), - }, - { - name: "get_execution", - description: - "Get the status, result, logs, timeline, etc. of a YepCode execution", - inputSchema: zodToJsonSchema(GetExecutionSchema), - }, - ], - }; - }); - - this.setRequestHandler(CallToolRequestSchema, async (request) => { - if (this.disableRunCodeTool) { - logger.error("Run code tool is disabled"); - throw new McpError( - ErrorCode.MethodNotFound, - "Run code tool is disabled" - ); - } - - return this.handleToolRequest(RunCodeSchema, request, async (data) => { - const yepCodeRun = new YepCodeRun(this.config); - - const { code, options } = data; - const logs: Log[] = []; - let executionError: string | undefined; - let returnValue: unknown; - - logger.info("Running code with YepCode", { - codeLength: code.length, - options, - }); - - const execution = await yepCodeRun.run(code, { - removeOnDone: !this.skipRunCodeCleanup, - ...options, - initiatedBy: "@yepcode/mcp-server", - onLog: (log) => { - logs.push(log); - }, - onError: (error) => { - executionError = error.message; - logger.error("YepCode execution error", error as Error); - }, - onFinish: (value) => { - returnValue = value; - logger.info("YepCode execution finished", { - hasReturnValue: value !== undefined, - }); - }, - }); - - await execution.waitForDone(); - - return { - logs, - returnValue, - ...(executionError && { error: executionError }), - }; - }); - }); - - return; - } - - this.setRequestHandler(ListToolsRequestSchema, async () => { - logger.info(`Handling ListTools request`); - // TODO: - const yepCodeEnv = new YepCodeEnv(this.config); - const envVars = await yepCodeEnv.getEnvVars(); - const tools = this.disableRunCodeTool - ? [] - : [ - { - name: "run_code", - description: `Execute LLM-generated code safely in YepCode’s secure, production-grade sandboxes. - This tool is ideal when your AI agent needs to handle tasks that don’t have a predefined tool available — but could be solved by writing and running a custom script. - - It supports external dependencies (NPM or PyPI), so it’s perfect for: - • Complex data transformations - • API calls to services not yet integrated - • Custom logic implementations - • One-off utility scripts - - Tip: First try to find a tool that matches your task, but if not available, try generating the code and running it here!`, - inputSchema: zodToJsonSchema( - buildRunCodeSchema(envVars.map((envVar) => envVar.key)) - ), - }, - { - name: "set_env_var", - description: - "Set a YepCode environment variable to be available for future code executions", - inputSchema: zodToJsonSchema(SetEnvVarSchema), - }, - { - name: "remove_env_var", - description: "Remove a YepCode environment variable", - inputSchema: zodToJsonSchema(RemoveEnvVarSchema), - }, - { - name: "get_execution", - description: - "Get the status, result, logs, timeline, etc. of a YepCode execution", - inputSchema: zodToJsonSchema(GetExecutionSchema), - }, - ]; - - let page = 0; - let limit = 100; - while (true) { - const processes = await yepCodeApi.getProcesses({ page, limit }); - logger.info(`Found ${processes?.data?.length} processes`); - if (!processes.data) { - break; - } - tools.push( - ...processes.data - .filter((process) => process.tags?.includes(RUN_PROCESS_TOOL_TAG)) - .map((process) => { - const inputSchema = zodToJsonSchema(RunProcessSchema) as any; - if (!isEmpty(process.parametersSchema)) { - inputSchema.properties.parameters = process.parametersSchema; - } else { - delete inputSchema.properties.parameters; - } - let toolName = `${RUN_PROCESS_TOOL_NAME_PREFIX}${process.slug}`; - if (toolName.length> 60) { - toolName = `${RUN_PROCESS_TOOL_NAME_PREFIX}${process.id}`; - } - return { - name: toolName, - description: `${process.name}${ - process.description ? ` - ${process.description}` : "" - }`, - inputSchema, - }; - }) - ); - if (!processes.hasNextPage) { - break; - } - page++; - } - logger.info( - `Found ${tools.length} tools: ${tools - .map((tool) => tool.name) - .join(", ")}` - ); - return { - tools, - }; - }); - - this.setRequestHandler(CallToolRequestSchema, async (request) => { - logger.info(`Received CallTool request for: ${request.params.name}`); - - // TODO: - const yepCodeApi = YepCodeApiManager.getInstance({}); - - if (request.params.name.startsWith(RUN_PROCESS_TOOL_NAME_PREFIX)) { - const processId = request.params.name.replace( - RUN_PROCESS_TOOL_NAME_PREFIX, - "" - ); - - return this.handleToolRequest( - RunProcessSchema, - request, - async (data) => { - const { - synchronousExecution = true, - parameters, - ...options - } = data; - const { executionId } = await yepCodeApi.executeProcessAsync( - processId, - parameters, - { - ...options, - initiatedBy: "@yepcode/mcp-server", - } - ); - if (!synchronousExecution) { - return { - executionId, - }; - } - return await this.executionResult(executionId); - } - ); - } - - const yepCodeEnv = new YepCodeEnv(this.config); - switch (request.params.name) { - case "run_code": - if (this.disableRunCodeTool) { - logger.error("Run code tool is disabled"); - throw new McpError( - ErrorCode.MethodNotFound, - "Run code tool is disabled" - ); - } - return this.handleToolRequest( - RunCodeSchema, - request, - async (data) => { - const yepCodeRun = new YepCodeRun(this.config); - - const { code, options } = data; - const logs: Log[] = []; - let executionError: string | undefined; - let returnValue: unknown; - - logger.info("Running code with YepCode", { - codeLength: code.length, - options, - }); - - const execution = await yepCodeRun.run(code, { - removeOnDone: !this.skipRunCodeCleanup, - ...options, - initiatedBy: "@yepcode/mcp-server", - onLog: (log) => { - logs.push(log); - }, - onError: (error) => { - executionError = error.message; - logger.error("YepCode execution error", error as Error); - }, - onFinish: (value) => { - returnValue = value; - logger.info("YepCode execution finished", { - hasReturnValue: value !== undefined, - }); - }, - }); - - await execution.waitForDone(); - - return { - logs, - returnValue, - ...(executionError && { error: executionError }), - }; - } - ); - - case "set_env_var": - return this.handleToolRequest( - SetEnvVarSchema, - request, - async (data) => { - const { key, value, isSensitive } = data; - logger.info(`Setting environment variable: ${key}`, { - isSensitive, - }); - await yepCodeEnv.setEnvVar(key, value, isSensitive); - return {}; - } - ); - - case "remove_env_var": - return this.handleToolRequest( - RemoveEnvVarSchema, - request, - async (data) => { - logger.info(`Removing environment variable: ${data.key}`); - await yepCodeEnv.delEnvVar(data.key); - return {}; - } - ); - - case "get_execution": - return this.handleToolRequest( - GetExecutionSchema, - request, - async (data) => { - return await this.executionResult(data.executionId); - } - ); - default: - logger.error(`Unknown tool requested: ${request.params.name}`); - throw new McpError( - ErrorCode.MethodNotFound, - `Unknown tool: ${request.params.name}` - ); - } - }); - } - - async run(): Promise { - const transport = new StdioServerTransport(); - await this.connect(transport); - } -} - -export default YepCodeMcpServer; diff --git a/src/tools/processes.ts b/src/tools/processes.ts index a41f01c..98cd29a 100644 --- a/src/tools/processes.ts +++ b/src/tools/processes.ts @@ -7,7 +7,7 @@ import { z } from "zod"; const RUN_PROCESS_TOOL_NAME_PREFIX = "run_ycp_"; const RUN_PROCESS_TOOL_TAG = "mcp-tool"; -export const RunProcessSchema = { +export const RunProcessSchema = z.object({ parameters: z.any().optional() as any, options: z .object({ @@ -32,7 +32,7 @@ export const RunProcessSchema = { .describe( "Whether the execution should be synchronous or not. If true, the execution will be synchronous and the execution result will be returned immediately. If false, the execution will be asynchronous and you should use the execution id to get the result later." ), -}; +}); async function registerProcessTool( server: McpServer, @@ -44,11 +44,12 @@ async function registerProcessTool( toolName = `${RUN_PROCESS_TOOL_NAME_PREFIX}${process.id}`; } - const inputSchema = RunProcessSchema; + // const inputSchema = RunProcessSchema; + const inputSchema = zodToJsonSchema(RunProcessSchema) as any; if (!isEmpty(process.parametersSchema)) { - inputSchema.parameters = process.parametersSchema as any; + inputSchema.properties.parameters = process.parametersSchema; } else { - delete inputSchema.parameters; + delete inputSchema.properties.parameters; } server.registerTool( diff --git a/src/tools/run-code.ts b/src/tools/run-code.ts index e29e1c9..fb0b915 100644 --- a/src/tools/run-code.ts +++ b/src/tools/run-code.ts @@ -1,8 +1,17 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { Log, YepCodeEnv, YepCodeRun } from "@yepcode/run"; import { z } from "zod"; -import { RunCodeOptionsSchema } from "../types.js"; -import { zodToJsonSchema } from "zod-to-json-schema"; + +const RunCodeOptionsSchema = z.object({ + language: z + .string() + .optional() + .describe( + "The language to be used to run the code. We support javascript or python." + ), + comment: z.string().optional(), + settings: z.record(z.unknown()).optional(), +}); const buildRunCodeSchema = (envVars: string[]) => { return { diff --git a/src/types.ts b/src/types.ts deleted file mode 100644 index 18f651c..0000000 --- a/src/types.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { z } from "zod"; - -export const LogSchema = z.object({ - timestamp: z.string(), - level: z.string(), - message: z.string(), -}); - -export const RunCodeOptionsSchema = z.object({ - language: z - .string() - .optional() - .describe( - "The language to be used to run the code. We support javascript or python." - ), - comment: z.string().optional(), - settings: z.record(z.unknown()).optional(), -}); - -export const buildRunCodeSchema = (envVars: string[]) => { - return z.object({ - code: z.string().describe(` - * We support JavaScript (NodeJS v20) or Python (v3.12). - ${ - envVars && - envVars.length> 0 && - `* You may use the following environment variables already set in the execution context: ${envVars.join( - ", " - )}.` - } - * Use external dependencies freely from NPM or PyPI. You should import them as usually. - * If package name is different from the import sentence, add an anotation for us to detect them (\`// @add-package package_name\` (javascript) or \`# @add-package package_name\` (python)). - * When possible, use binary packages to avoid compilation issues. - * Include debugging logs (\`console.log()\` in javascript or \`print()\` in python) if necessary for execution tracking and error debugging. - * Do not catch errors, let them fail the execution. - * Follow the required script structure based on the chosen language: - - \`\`\`js - // @add-package package_name_1 - const package_name_1 = require("package_name_1"); - // @add-package package_name_2 - const package_name_2 = require("package_name_2"); - - async function main() { - // The generated code should go here - return {"success": true, "data": result} - } - - module.exports = { main } - \`\`\` - - \`\`\`py - # @add-package package_name_1 - import package_name_1 - # @add-package package_name_2 - from package_name_2.module import Module - - def main(): - # The generated code should go here - return {"success": True, "data": result} - \`\`\` - `), - options: RunCodeOptionsSchema, - }); -}; - -export const RunCodeSchema = buildRunCodeSchema([]); - -export type RunCodeRequestSchema = z.infer; - -export interface RunCodeResultSchema { - returnValue?: unknown; - logs: Array; - error?: string; -} - -export const EnvVarKeySchema = z - .string() - .min(1) - .max(255) - .regex(/^[a-zA-Z][a-zA-Z0-9_]*$/); - -export const SetEnvVarSchema = z.object({ - key: EnvVarKeySchema, - value: z.string(), - isSensitive: z.boolean().optional().default(true), -}); - -export const RemoveEnvVarSchema = z.object({ - key: EnvVarKeySchema, -}); - -export type SetEnvVarRequestSchema = z.infer; -export type RemoveEnvVarRequestSchema = z.infer; - -export interface EnvVarResultSchema { - error?: string; -} - -export const RunProcessSchema = z.object({ - parameters: z.any().optional(), - options: z - .object({ - tag: z - .string() - .optional() - .describe( - "The process version to be executed. You may provide a specific version if user asks explicity for a process version." - ), - comment: z - .string() - .optional() - .describe( - "A comment to be added to the execution. You may provide some context about the execution." - ), - }) - .optional(), - synchronousExecution: z - .boolean() - .optional() - .default(true) - .describe( - "Whether the execution should be synchronous or not. If true, the execution will be synchronous and the execution result will be returned immediately. If false, the execution will be asynchronous and you should use the execution id to get the result later." - ), -}); - -export const GetExecutionSchema = z.object({ - executionId: z.string(), -}); - -export const ExecutionResultSchema = z.object({ - executionId: z.string(), - logs: z.array(LogSchema), - processId: z.string(), - status: z.string(), - timeline: z.array(z.any()), - returnValue: z.any().optional(), - error: z.string().optional(), -}); - -export type ExecutionResultSchema = z.infer; - -export interface MCPRequest { - params: { - name: string; - arguments: T; - }; -} - -export interface MCPResponse { - content: Array<{ - type: string; - text: string; - }>; -} - -export interface ToolCallRequest { - params: { - name: string; - arguments?: Record; - _meta?: Record; - }; - method: "tools/call"; -} - -export type ToolHandler = (data: T) => Promise; From 06151e211a7d692ed2f2c2b3a34c35de96508b4f Mon Sep 17 00:00:00 2001 From: alvaro Date: Mon, 9 Jun 2025 13:55:31 +0200 Subject: [PATCH 8/8] Manage lazy loading of configurations with try-catch --- src/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 4fefba3..9aed910 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,6 @@ import { } from "@yepcode/run"; import { registerRunCodeTools } from "./tools/run-code.js"; import { registerProcessesTools } from "./tools/processes.js"; -import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; let disableRunCodeTool = false; let skipRunCodeCleanup = false; @@ -39,14 +38,14 @@ export default function createStatelessServer({ let yepCodeEnv; let yepCodeRun; let yepCodeApi; - if (config.yepcodeApiToken) { + try { const yepCodeApiConfig: YepCodeApiConfig = { apiToken: config.yepcodeApiToken, }; yepCodeEnv = new YepCodeEnv(yepCodeApiConfig); yepCodeRun = new YepCodeRun(yepCodeApiConfig); yepCodeApi = new YepCodeApi(yepCodeApiConfig); - } else { + } catch (error) { yepCodeEnv = { getEnvVars: async () => [], } as unknown as YepCodeEnv;

AltStyle によって変換されたページ (->オリジナル) /