diff --git a/.claude/launch.json b/.claude/launch.json new file mode 100644 index 00000000..8f541789 --- /dev/null +++ b/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "astro-dev", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "port": 4321 + } + ] +} diff --git a/package-lock.json b/package-lock.json index 1cd48402..ae9aff7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "@keystatic/astro": "5.2.0", "@keystatic/core": "0.6.4", "@pagefind/default-ui": "1.5.2", + "@scalar/api-reference": "1.64.0", "@tabler/icons": "3.46.0", "@tailwindcss/forms": "0.5.11", "@tailwindcss/vite": "4.3.3", @@ -76,6 +77,78 @@ } } }, + "node_modules/@ai-sdk/gateway": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.13.tgz", + "integrity": "sha512-g7nE4PFtngOZNZSy1lOPpkC+FAiHxqBJXqyRMEG7NUrEVZlz5goBdtHg1YgWRJIX776JTXAmbOI5JreAKVAsVA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.2", + "@ai-sdk/provider-utils": "4.0.5", + "@vercel/oidc": "3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/gateway/node_modules/@vercel/oidc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz", + "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.2.tgz", + "integrity": "sha512-HrEmNt/BH/hkQ7zpi2o6N3k1ZR1QTb7z85WYhYygiTxOQuaml4CMtHCWRbric5WPU+RNsYI7r1EpyVQMKO1pYw==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.5.tgz", + "integrity": "sha512-Ow/X/SEkeExTTc1x+nYLB9ZHK2WUId8+9TlkamAx7Tl9vxU+cKzWx2dwjgMHeCN6twrgwkLrrtqckQeO4mxgVA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.2", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.6" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/vue": { + "version": "3.0.33", + "resolved": "https://registry.npmjs.org/@ai-sdk/vue/-/vue-3.0.33.tgz", + "integrity": "sha512-czM9Js3a7f+Eo35gjEYEeJYUoPvMg5Dfi4bOLyDBghLqn0gaVg8yTmTaSuHCg+3K/+1xPjyXd4+2XcQIohWWiQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "4.0.5", + "ai": "6.0.33", + "swrv": "^1.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vue": "^3.3.4" + } + }, "node_modules/@antfu/install-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", @@ -1090,6 +1163,160 @@ "node": ">= 20.12.0" } }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.4.tgz", + "integrity": "sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-xml": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/xml": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-yaml": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.3.tgz", + "integrity": "sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.2.0", + "@lezer/lr": "^1.0.0", + "@lezer/yaml": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.8", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.8.tgz", + "integrity": "sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -1918,6 +2145,43 @@ "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, + "node_modules/@floating-ui/vue": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.9.tgz", + "integrity": "sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4", + "@floating-ui/utils": "^0.2.10", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/@fontsource-variable/inter": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", @@ -1945,6 +2209,33 @@ "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@headlessui/tailwindcss": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@headlessui/tailwindcss/-/tailwindcss-0.2.2.tgz", + "integrity": "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "tailwindcss": "^3.0 || ^4.0" + } + }, + "node_modules/@headlessui/vue": { + "version": "1.7.23", + "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz", + "integrity": "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==", + "license": "MIT", + "dependencies": { + "@tanstack/vue-virtual": "^3.0.0-beta.60" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", @@ -2132,6 +2423,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2154,6 +2446,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2173,6 +2466,7 @@ "version": "0.35.3", "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2195,6 +2489,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2211,6 +2506,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2227,6 +2523,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2243,6 +2540,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2259,6 +2557,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2275,6 +2574,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2291,6 +2591,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2307,6 +2608,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2323,6 +2625,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2339,6 +2642,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -2355,6 +2659,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2377,6 +2682,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2399,6 +2705,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2421,6 +2728,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2443,6 +2751,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2465,6 +2774,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2487,6 +2797,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2509,6 +2820,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -2528,6 +2840,7 @@ "version": "0.35.3", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -2547,6 +2860,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -2566,6 +2880,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2585,6 +2900,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2604,6 +2920,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2846,6 +3163,96 @@ "react-stately": "3.48.0" } }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/xml": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.6.tgz", + "integrity": "sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/yaml": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.4.tgz", + "integrity": "sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.4.0" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", @@ -2867,6 +3274,12 @@ "node": ">=18" } }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", + "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", + "license": "MIT" + }, "node_modules/@markdoc/markdoc": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@markdoc/markdoc/-/markdoc-0.4.0.tgz", @@ -3173,6 +3586,15 @@ "@octokit/openapi-types": "^28.0.0" } }, + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", @@ -3292,6 +3714,12 @@ "win32" ] }, + "node_modules/@phosphor-icons/core": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@phosphor-icons/core/-/core-2.1.1.tgz", + "integrity": "sha512-v4ARvrip4qBCImOE5rmPUylOEK4iiED9ZyKjcvzuezqMaiRASCHKcRIuvvxL/twvLpkfnEODCOJp5dM4eZilxQ==", + "license": "MIT" + }, "node_modules/@pkgr/core": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", @@ -3349,6 +3777,17 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, + "node_modules/@replit/codemirror-css-color-picker": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@replit/codemirror-css-color-picker/-/codemirror-css-color-picker-6.3.0.tgz", + "integrity": "sha512-19biDANghUm7Fz7L1SNMIhK48tagaWuCOHj4oPPxc7hxPGkTVY2lU/jVZ8tsbTKQPVG7BO2CBDzs7CBwb20t4A==", + "license": "MIT", + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz", @@ -3607,44 +4046,526 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", - "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^8.0.0", - "conventional-changelog-writer": "^8.0.0", - "conventional-commits-filter": "^5.0.0", - "conventional-commits-parser": "^6.0.0", - "debug": "^4.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "micromatch": "^4.0.2" + "node_modules/@scalar/agent-chat": { + "version": "0.12.23", + "resolved": "https://registry.npmjs.org/@scalar/agent-chat/-/agent-chat-0.12.23.tgz", + "integrity": "sha512-jBddLcMpID7MFoDzEMRXDiu+OIbzgU8OzdJNFXrpndDlsEssC3gDMz+2ztgIqwrXPOir8CMXFt66K+jFs15ZKQ==", + "license": "MIT", + "dependencies": { + "@ai-sdk/vue": "3.0.33", + "@scalar/api-client": "3.14.0", + "@scalar/components": "0.27.10", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-types": "0.9.4", + "@scalar/schemas": "0.8.0", + "@scalar/themes": "0.17.2", + "@scalar/types": "0.17.0", + "@scalar/use-toasts": "0.10.4", + "@scalar/validation": "0.6.2", + "@scalar/workspace-store": "0.56.0", + "@vueuse/core": "13.9.0", + "ai": "6.0.33", + "js-base64": "^3.7.8", + "neverpanic": "0.0.8", + "truncate-json": "3.0.1", + "vue": "^3.5.30" }, "engines": { - "node": ">=20.8.1" + "node": ">=22" + } + }, + "node_modules/@scalar/api-client": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@scalar/api-client/-/api-client-3.14.0.tgz", + "integrity": "sha512-GX97fACHV2ht3/IpSUYJw7ozrDtszcBw+O0uKl6XlD33aKvzCHqvNRLvf/JgLGeZpyqFkJEh/jsBJwPqBUarsA==", + "license": "MIT", + "dependencies": { + "@headlessui/tailwindcss": "^0.2.2", + "@headlessui/vue": "1.7.23", + "@scalar/blocks": "0.1.9", + "@scalar/components": "0.27.10", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/oas-utils": "0.19.9", + "@scalar/openapi-types": "0.9.4", + "@scalar/sidebar": "0.9.34", + "@scalar/snippetz": "0.9.24", + "@scalar/themes": "0.17.2", + "@scalar/typebox": "^0.1.3", + "@scalar/types": "0.17.0", + "@scalar/use-codemirror": "0.14.14", + "@scalar/use-hooks": "0.4.9", + "@scalar/use-toasts": "0.10.4", + "@scalar/workspace-store": "0.56.0", + "@vueuse/core": "13.9.0", + "@vueuse/integrations": "13.9.0", + "focus-trap": "^7.8.0", + "fuse.js": "^7.1.0", + "js-base64": "^3.7.8", + "jsonc-parser": "3.3.1", + "nanoid": "^5.1.6", + "pretty-ms": "^9.3.0", + "radix-vue": "^1.9.17", + "set-cookie-parser": "3.1.0", + "vue": "^3.5.30", + "yaml": "^2.8.3", + "zod": "^4.3.5" }, - "peerDependencies": { - "semantic-release": ">=20.1.0" + "engines": { + "node": ">=22" } }, - "node_modules/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", - "dev": true, - "license": "MIT", + "node_modules/@scalar/api-client/node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "license": "MIT" + }, + "node_modules/@scalar/api-reference": { + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@scalar/api-reference/-/api-reference-1.64.0.tgz", + "integrity": "sha512-CFtFWX+X8XJvrSoa1OGPpTzf7p81sbL10fBSCiRO/nN3tKUc3IqEhL0EYzK+K3HThApTOEgtfSY/3bIS2mA6ew==", + "license": "MIT", + "dependencies": { + "@headlessui/vue": "1.7.23", + "@scalar/agent-chat": "0.12.23", + "@scalar/api-client": "3.14.0", + "@scalar/blocks": "0.1.9", + "@scalar/code-highlight": "0.4.3", + "@scalar/components": "0.27.10", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/oas-utils": "0.19.9", + "@scalar/schemas": "0.8.0", + "@scalar/sidebar": "0.9.34", + "@scalar/snippetz": "0.9.24", + "@scalar/themes": "0.17.2", + "@scalar/types": "0.17.0", + "@scalar/use-hooks": "0.4.9", + "@scalar/use-toasts": "0.10.4", + "@scalar/validation": "0.6.2", + "@scalar/workspace-store": "0.56.0", + "@unhead/vue": "^2.1.4", + "@vueuse/core": "13.9.0", + "fuse.js": "^7.1.0", + "microdiff": "^1.5.0", + "nanoid": "^5.1.6", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, "engines": { - "node": ">=18" + "node": ">=22" + } + }, + "node_modules/@scalar/asyncapi-upgrader": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@scalar/asyncapi-upgrader/-/asyncapi-upgrader-0.1.4.tgz", + "integrity": "sha512-pyAoyuFVlUf+ZThiuHAShV4lyF9LlPab5AJrvoER8JBz00bHF1NWiGveYySRcNcvke5U5nWCr7NxtiMIokP8sA==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/blocks": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@scalar/blocks/-/blocks-0.1.9.tgz", + "integrity": "sha512-D0Y5HnQ+VPf6Cj9lHZl93Ner8gxdQ85qRP7c/njCeB8cqVSxvB22iiY5gxKELLNvO6YVd6b4BFU3II0DQQPv0g==", + "license": "MIT", + "dependencies": { + "@scalar/components": "0.27.10", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/snippetz": "0.9.24", + "@scalar/themes": "0.17.2", + "@scalar/types": "0.17.0", + "@scalar/workspace-store": "0.56.0", + "@types/har-format": "^1.2.16", + "js-base64": "^3.7.8", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/code-highlight": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@scalar/code-highlight/-/code-highlight-0.4.3.tgz", + "integrity": "sha512-uueW22siajrJUtszH+k/PmABqau2MmJzajpEFTPapK7Zak167xcKUIjcMbFFFgW8SGKLMSVzLkuB/VNDbOHuOg==", + "license": "MIT", + "dependencies": { + "hast-util-to-text": "^4.0.2", + "highlight.js": "^11.11.1", + "lowlight": "^3.3.0", + "rehype-external-links": "^3.0.0", + "rehype-format": "^5.0.1", + "rehype-parse": "^9.0.1", + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.1.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/code-highlight/node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@scalar/components": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@scalar/components/-/components-0.27.10.tgz", + "integrity": "sha512-nCN7lksiktG8sPzqWNIbxehNNbbbcXsSGZCbnnpQtRveNkVuOuceCpn7EbbPG65hB+H0o0ZBPki3arPUwBUDwA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "0.2.10", + "@floating-ui/vue": "1.1.9", + "@headlessui/tailwindcss": "^0.2.2", + "@headlessui/vue": "1.7.23", + "@scalar/code-highlight": "0.4.3", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/themes": "0.17.2", + "@scalar/use-hooks": "0.4.9", + "@vueuse/core": "13.9.0", + "cva": "1.0.0-beta.4", + "radix-vue": "^1.9.17", + "vue": "^3.5.30", + "vue-component-type-helpers": "^3.2.6" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/components/node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@scalar/helpers": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@scalar/helpers/-/helpers-0.9.2.tgz", + "integrity": "sha512-hjyMpMZjTBZQhyByZmz5oUgRKUQJO5V5AOiJxsVEGbUmgA7sJRQeTrXLB+BEwzaKS5nm2opJeNyMBYLFNK4hiQ==", + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/icons": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@scalar/icons/-/icons-0.7.5.tgz", + "integrity": "sha512-kWYkjmYlHzrZ+31d8L1uJpVeil6r1xNcyR+MewnxFslpMBCDIeo9udhYzg09v8s6nWKxwuPokhdQPLbKS+SSgg==", + "license": "MIT", + "dependencies": { + "@phosphor-icons/core": "^2.1.1", + "@types/node": "^24.1.0", + "chalk": "^5.6.2", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/icons/node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@scalar/icons/node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/@scalar/json-magic": { + "version": "0.12.19", + "resolved": "https://registry.npmjs.org/@scalar/json-magic/-/json-magic-0.12.19.tgz", + "integrity": "sha512-1T4QoFYZ1nKt25xFeHtghAuZzaLq2X4CpCSLFXG0Fjcz6K2HIZqo+RtywfI0WD8RRRRgS34keo7X4Gv1BQUNoQ==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "pathe": "^2.0.3", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/oas-utils": { + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@scalar/oas-utils/-/oas-utils-0.19.9.tgz", + "integrity": "sha512-GnpsFGJTavHNX5qsMydQzAgpylcjv5eQK1Ee0TqiIf9Y8N79snsONepsmfS469/ld5SgYkY06DfgTzkuw/ANYQ==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/themes": "0.17.2", + "@scalar/types": "0.17.0", + "@scalar/workspace-store": "0.56.0", + "flatted": "^3.4.0", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/openapi-types": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.9.4.tgz", + "integrity": "sha512-eUSIjZEBLEF2i2pvcNdzXhzlKx6qt+hZsNklLmCyzPBoXWxHcQaEClgMFavXDRRvJDdi6LkyjqGUqqf0XgRgFg==", + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/openapi-upgrader": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.2.12.tgz", + "integrity": "sha512-oj8O79xVDCHx759owTknwyBAYynaDQ8NGa5wIHduEUAFCob4YnsMEaFDpsconzogchH/whOGzg63BXHST8XPAw==", + "license": "MIT", + "dependencies": { + "@scalar/openapi-types": "0.9.4" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/schemas": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@scalar/schemas/-/schemas-0.8.0.tgz", + "integrity": "sha512-bwu/NCOghZI/cL6Ayti/Oeb5XEMRTncBsyQeHhkFwk4PZsR910me+kZPd5TAp6TqifMfDbAe3xyLSdlzU/KFLA==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/validation": "0.6.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/sidebar": { + "version": "0.9.34", + "resolved": "https://registry.npmjs.org/@scalar/sidebar/-/sidebar-0.9.34.tgz", + "integrity": "sha512-QFVicMkQhudDnBVA5/fFqmIp1nTKiSovSlueeSqgmr+cvd6oKb399PEU5MKuf5kFQTP5Wh3eQfVLwHBwjUeRZg==", + "license": "MIT", + "dependencies": { + "@scalar/components": "0.27.10", + "@scalar/helpers": "0.9.2", + "@scalar/icons": "0.7.5", + "@scalar/themes": "0.17.2", + "@scalar/use-hooks": "0.4.9", + "@scalar/workspace-store": "0.56.0", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/snippetz": { + "version": "0.9.24", + "resolved": "https://registry.npmjs.org/@scalar/snippetz/-/snippetz-0.9.24.tgz", + "integrity": "sha512-ukzC48sWv0cYGzdhGLpZYI9DsL818F0M70OHAQcxlE+kOT0WMrzWQqyt7t5WRWQYd6frK4qp32GcLaWb90cfkQ==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "@scalar/types": "0.17.0", + "js-base64": "^3.7.8", + "stringify-object": "^6.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/themes": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@scalar/themes/-/themes-0.17.2.tgz", + "integrity": "sha512-r/jgXyddfp7oq9o8UQB8+/c0R6rLRlD0ClfFCxivnxUKsuRnBuTs4xWF6DyZJ2M0D2rpUQiVgWeIVdg+T5FInA==", + "license": "MIT", + "dependencies": { + "nanoid": "^5.1.6" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/typebox": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@scalar/typebox/-/typebox-0.1.3.tgz", + "integrity": "sha512-lU055AUccECZMIfGA0z/C1StYmboAYIPJLDFBzOO81yXBi35Pxdq+I4fWX6iUZ8qcoHneiLGk9jAUM1rA93iEg==", + "license": "MIT" + }, + "node_modules/@scalar/types": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@scalar/types/-/types-0.17.0.tgz", + "integrity": "sha512-mj033MX0EFOEwfpO3ch7FGGnMbye1aLlnP6LmTC9Il2AlBCDL41rYPk67jF5ICAMsAES1RQ+8N2bcC0MJnupLQ==", + "license": "MIT", + "dependencies": { + "@scalar/helpers": "0.9.2", + "nanoid": "^5.1.6", + "type-fest": "^5.3.1", + "zod": "^4.3.5" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/use-codemirror": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/@scalar/use-codemirror/-/use-codemirror-0.14.14.tgz", + "integrity": "sha512-A7Exfctudg7d3DeQFSSrZYc6yhrEsLX3Iq6GJ7m7ruqgev9y8Hbx7g8yvZWYRQuMUdFtLH5euP7a1ZwM8OrHKA==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.18.3", + "@codemirror/commands": "^6.7.1", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-html": "^6.4.8", + "@codemirror/lang-json": "^6.0.0", + "@codemirror/lang-xml": "^6.0.0", + "@codemirror/lang-yaml": "^6.1.2", + "@codemirror/language": "^6.10.7", + "@codemirror/lint": "^6.8.4", + "@codemirror/state": "^6.5.0", + "@codemirror/view": "^6.35.3", + "@lezer/common": "^1.2.3", + "@lezer/highlight": "^1.2.1", + "@replit/codemirror-css-color-picker": "^6.3.0", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/use-hooks": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@scalar/use-hooks/-/use-hooks-0.4.9.tgz", + "integrity": "sha512-RnflJ178BPdH7pKY9/YBcRlhyc7uJxtqG4hBbi8IPEM4YkpLHcMmxWKgHAgC3MBc21rpuKKBE+DTJOiYmU+UyA==", + "license": "MIT", + "dependencies": { + "@scalar/use-toasts": "0.10.4", + "@scalar/validation": "0.6.2", + "@vueuse/core": "13.9.0", + "cva": "1.0.0-beta.4", + "tailwind-merge": "3.5.0", + "vue": "^3.5.30" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/use-hooks/node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/@scalar/use-toasts": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@scalar/use-toasts/-/use-toasts-0.10.4.tgz", + "integrity": "sha512-OHXkVfFKV0qx2WpKlzUpvIUkoA/PiloBcXe6soX2S/1z/D042QlKO8rNxkuC3Hlamvyvj8ru8XN17XNl+D0OPg==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.30", + "vue-sonner": "^1.3.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/validation": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@scalar/validation/-/validation-0.6.2.tgz", + "integrity": "sha512-Sc1TkcwGV6aVCO51AyKeaGiP8gpwAHxEtO5d3tZzPV+KsnlC/YokQxFxwBrbIXw73k9hmcExnJyGu3k5i6n6VA==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@scalar/workspace-store": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@scalar/workspace-store/-/workspace-store-0.56.0.tgz", + "integrity": "sha512-Kt6I/eLvyzGrD409Fl5qlNhJSLNVYlJ2T+IgY/J++PAtqcKPmWePL5KKmXZhooXKKBBkzN7CXIRkjEKTKHXx5A==", + "license": "MIT", + "dependencies": { + "@scalar/asyncapi-upgrader": "0.1.4", + "@scalar/helpers": "0.9.2", + "@scalar/json-magic": "0.12.19", + "@scalar/openapi-upgrader": "0.2.12", + "@scalar/schemas": "0.8.0", + "@scalar/snippetz": "0.9.24", + "@scalar/typebox": "0.1.3", + "@scalar/types": "0.17.0", + "@scalar/validation": "0.6.2", + "js-base64": "^3.7.8", + "type-fest": "^5.3.1", + "vue": "^3.5.30", + "yaml": "^2.8.3" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@semantic-release/commit-analyzer": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", + "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^8.0.0", + "conventional-changelog-writer": "^8.0.0", + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.0.0", + "debug": "^4.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=20.8.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/@semantic-release/github": { @@ -4028,6 +4949,12 @@ "node": ">=8" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, "node_modules/@swc/helpers": { "version": "0.5.23", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", @@ -4376,6 +5303,32 @@ "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.7", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.7.tgz", + "integrity": "sha512-bp+v10y65sp2H7WpWfIMyxTNfl8ZVfxFTLRjPIFRryi6FV/J33z4IS53WO4pTk36KlvJ4iLiQz+oaydDC1xbcA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.35", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.35.tgz", + "integrity": "sha512-lOfSPvgPdlaH6Qy+CyIc3XpycitaSQ9GECndGpTuDiu+uDA1am+90yWXwzDSd/20ZM196ggWJLS+Qb6WjVd/OA==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, "node_modules/@toeverything/y-indexeddb": { "version": "0.10.0-canary.9", "resolved": "https://registry.npmjs.org/@toeverything/y-indexeddb/-/y-indexeddb-0.10.0-canary.9.tgz", @@ -4502,6 +5455,12 @@ "@types/estree": "*" } }, + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "license": "MIT" + }, "node_modules/@types/hast": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", @@ -4641,6 +5600,12 @@ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -5083,6 +6048,22 @@ "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, + "node_modules/@unhead/vue": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.1.17.tgz", + "integrity": "sha512-pnC8x9HLV3qQXdvWfylUEU25uhfCAy3ly9nmpQz84j9py818DRfU8jOsQ5wjdWtxyU1vX/fW2udfm4jtxUK8Bg==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1", + "unhead": "2.1.17" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + }, + "peerDependencies": { + "vue": ">=3.5.18" + } + }, "node_modules/@urql/core": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", @@ -5315,95 +6296,321 @@ "integrity": "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==", "license": "MIT", "dependencies": { - "@volar/language-service": "2.4.28", - "@volar/typescript": "2.4.28", - "typesafe-path": "^0.2.2", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" - }, - "peerDependencies": { - "typescript": "*" + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", + "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@volar/language-service": "2.4.28", + "@volar/typescript": "2.4.28", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", + "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "license": "MIT" + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "license": "MIT" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.41.tgz", + "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.41", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz", + "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz", + "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.41", + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-ssr": "3.5.41", + "@vue/shared": "3.5.41", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz", + "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.41.tgz", + "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.41" } }, - "node_modules/@volar/language-core": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", - "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "node_modules/@vue/runtime-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.41.tgz", + "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==", "license": "MIT", "dependencies": { - "@volar/source-map": "2.4.28" + "@vue/reactivity": "3.5.41", + "@vue/shared": "3.5.41" } }, - "node_modules/@volar/language-server": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.28.tgz", - "integrity": "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==", + "node_modules/@vue/runtime-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.41.tgz", + "integrity": "sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==", "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "@volar/language-service": "2.4.28", - "@volar/typescript": "2.4.28", - "path-browserify": "^1.0.1", - "request-light": "^0.7.0", - "vscode-languageserver": "^9.0.1", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "@vue/reactivity": "3.5.41", + "@vue/runtime-core": "3.5.41", + "@vue/shared": "3.5.41", + "csstype": "^3.2.3" } }, - "node_modules/@volar/language-service": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.28.tgz", - "integrity": "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==", + "node_modules/@vue/server-renderer": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.41.tgz", + "integrity": "sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==", "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.8" + "@vue/compiler-ssr": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/shared": "3.5.41" } }, - "node_modules/@volar/source-map": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", "license": "MIT" }, - "node_modules/@volar/typescript": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", - "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "node_modules/@vueuse/core": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz", + "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==", "license": "MIT", "dependencies": { - "@volar/language-core": "2.4.28", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, - "node_modules/@vscode/emmet-helper": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", - "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "node_modules/@vueuse/integrations": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-13.9.0.tgz", + "integrity": "sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ==", "license": "MIT", "dependencies": { - "emmet": "^2.4.3", - "jsonc-parser": "^2.3.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-languageserver-types": "^3.15.1", - "vscode-uri": "^3.0.8" + "@vueuse/core": "13.9.0", + "@vueuse/shared": "13.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7 || ^8", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } } }, - "node_modules/@vscode/emmet-helper/node_modules/jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", - "license": "MIT" + "node_modules/@vueuse/metadata": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", + "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "license": "MIT" + "node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } }, "node_modules/abbrev": { "version": "3.0.1", @@ -5470,6 +6677,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ai": { + "version": "6.0.33", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.33.tgz", + "integrity": "sha512-bVokbmy2E2QF6Efl+5hOJx5MRWoacZ/CZY/y1E+VcewknvGlgaiCzMu8Xgddz6ArFJjiMFNUPHKxAhIePE4rmg==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "3.0.13", + "@ai-sdk/provider": "3.0.2", + "@ai-sdk/provider-utils": "4.0.5", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -6234,7 +7459,6 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -6823,7 +8047,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -6891,6 +8114,12 @@ } } }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -7003,6 +8232,26 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/cva": { + "version": "1.0.0-beta.4", + "resolved": "https://registry.npmjs.org/cva/-/cva-1.0.0-beta.4.tgz", + "integrity": "sha512-F/JS9hScapq4DBVQXcK85l9U91M6ePeXoBMSp7vypzShoefUBxjQTo3g3935PUHgQd+IW77DjbPRIxugy4/GCQ==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + }, + "peerDependencies": { + "typescript": ">= 4.5.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -8308,6 +9557,15 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -8681,7 +9939,6 @@ "version": "3.4.4", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", - "dev": true, "license": "ISC" }, "node_modules/flattie": { @@ -8693,6 +9950,15 @@ "node": ">=8" } }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, "node_modules/fontace": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", @@ -8785,7 +10051,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -8828,6 +10093,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fuse.js": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.5.0.tgz", + "integrity": "sha512-sQtrEfA+ez/3G0cCZecF70oqpCRttCexYUG4mUrtWL49ULUzUyxokt5kyqwtKzj1270RaKih+hcP3qLcumccow==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/krisk" + } + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -8893,6 +10171,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -9076,6 +10366,15 @@ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/guess-json-indent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/guess-json-indent/-/guess-json-indent-3.0.1.tgz", + "integrity": "sha512-LWZ3Vr8BG7DHE3TzPYFqkhjNRw4vYgFSsv2nfMuHklAlOfiy54/EwiDQuQfFVLxENCVv20wpbjfTayooQHrEhQ==", + "license": "MIT", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/h3": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz", @@ -9219,6 +10518,39 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-from-html": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", @@ -9270,6 +10602,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-is-element": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", @@ -9283,6 +10628,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -9296,6 +10658,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-raw": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", @@ -9321,6 +10700,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-sanitize": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", + "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "unist-util-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-select": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", @@ -9527,6 +10921,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hookable": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.1.tgz", + "integrity": "sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==", + "license": "MIT" + }, "node_modules/hosted-git-info": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", @@ -9598,6 +10998,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/htmlparser2": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", @@ -9713,6 +11123,21 @@ "integrity": "sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==", "license": "Apache-2.0" }, + "node_modules/identifier-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/identifier-regex/-/identifier-regex-1.1.0.tgz", + "integrity": "sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==", + "license": "MIT", + "dependencies": { + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -9857,6 +11282,18 @@ "url": "https://github.com/sponsors/brc-dd" } }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -10133,6 +11570,22 @@ "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==", "license": "MIT" }, + "node_modules/is-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-identifier/-/is-identifier-1.1.0.tgz", + "integrity": "sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==", + "license": "MIT", + "dependencies": { + "identifier-regex": "^1.1.0", + "super-regex": "^1.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -10236,6 +11689,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -10467,6 +11932,12 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-base64": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.2.tgz", + "integrity": "sha512-6zayE8QlUdiweYI6cETD/XBSqFcoCUlufn/29PJR99r82x1yDnIprRca0YvAYpAW+ez0GuQkVBC6xG5QkD7OjA==", + "license": "BSD-3-Clause" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10528,6 +11999,12 @@ "dev": true, "license": "MIT" }, + "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==", + "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", @@ -11070,6 +12547,30 @@ "tslib": "^2.0.3" } }, + "node_modules/lowlight": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", + "integrity": "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "highlight.js": "~11.11.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowlight/node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -11100,7 +12601,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", - "dev": true, "license": "MIT", "dependencies": { "p-event": "^6.0.0", @@ -11118,7 +12618,6 @@ "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" @@ -11553,6 +13052,12 @@ "node": ">= 8" } }, + "node_modules/microdiff": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/microdiff/-/microdiff-1.6.0.tgz", + "integrity": "sha512-w7JWt8Bno6I8h0rEqlxr4lNG4UbT1FVtWo42wWosIiaJ+rP3pXh7shCYDnyqBrYx36LJ1CZ64p8A62aVp0sJpQ==", + "license": "MIT" + }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", @@ -12533,6 +14038,12 @@ "node": ">= 10" } }, + "node_modules/neverpanic": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/neverpanic/-/neverpanic-0.0.8.tgz", + "integrity": "sha512-vVdkelrLxaow/fdWDumzNBO+jwm6X8bxeLJc34THtpj70u0C5QBkcV6CRCu2X726km7XD45N0A3QtYCla4RvKw==", + "license": "MIT" + }, "node_modules/nlcst-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", @@ -12920,7 +14431,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", - "dev": true, "license": "MIT", "dependencies": { "p-timeout": "^6.1.2" @@ -12936,7 +14446,6 @@ "version": "6.1.4", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", - "dev": true, "license": "MIT", "engines": { "node": ">=14.16" @@ -13200,7 +14709,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -13748,7 +15256,6 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "dev": true, "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" @@ -13956,6 +15463,122 @@ ], "license": "MIT" }, + "node_modules/radix-vue": { + "version": "1.9.17", + "resolved": "https://registry.npmjs.org/radix-vue/-/radix-vue-1.9.17.tgz", + "integrity": "sha512-mVCu7I2vXt1L2IUYHTt0sZMz7s1K2ZtqKeTIxG3yC5mMFfLBG4FtE1FDeRMpDd+Hhg/ybi9+iXmAP1ISREndoQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.7", + "@floating-ui/vue": "^1.1.0", + "@internationalized/date": "^3.5.4", + "@internationalized/number": "^3.5.3", + "@tanstack/vue-virtual": "^3.8.1", + "@vueuse/core": "^10.11.0", + "@vueuse/shared": "^10.11.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.4", + "fast-deep-equal": "^3.1.3", + "nanoid": "^5.0.7" + }, + "peerDependencies": { + "vue": ">= 3.2.0" + } + }, + "node_modules/radix-vue/node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/radix-vue/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/radix-vue/node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/radix-vue/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/radix-vue/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/radix-vue/node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", @@ -14279,6 +15902,53 @@ "expressive-code": "^0.44.1" } }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -14309,6 +15979,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-sanitize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", + "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-sanitize": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-stringify": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", @@ -14460,6 +16144,18 @@ "node": ">=0.10.0" } }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -15586,6 +17282,24 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-byte-length": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-byte-length/-/string-byte-length-3.0.1.tgz", + "integrity": "sha512-yJ8vP0HMwZ54CcA8S8mKoXbkezpZHANFtmafFo8lGxZThCQcAwRHjdFabuSLgOzxj9OFJcmssmiAvmcOK4O2Hw==", + "license": "MIT", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/string-byte-slice": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-byte-slice/-/string-byte-slice-3.0.1.tgz", + "integrity": "sha512-GWv2K4lYyd2+AhmKH3BV+OVx62xDX+99rSLfKpaqFiQU7uOMaUY1tDjdrRD4gsrCr9lTyjMgjna7tZcCOw+Smg==", + "license": "MIT", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -15697,6 +17411,36 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/stringify-object": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-6.0.0.tgz", + "integrity": "sha512-6f94vIED6vmJJfh3lyVsVWxCYSfI5uM+16ntED/Ql37XIyV6kj0mRAAiTeMMc/QLYIaizC3bUprQ8pQnDDrKfA==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-identifier": "^1.0.1", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15754,6 +17498,12 @@ "anynum": "^1.0.1" } }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, "node_modules/style-to-js": { "version": "1.1.21", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", @@ -15792,7 +17542,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", - "dev": true, "license": "MIT", "dependencies": { "function-timeout": "^1.0.1", @@ -15898,6 +17647,15 @@ "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, + "node_modules/swrv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/swrv/-/swrv-1.2.0.tgz", + "integrity": "sha512-lH/g4UcNyj+7lzK4eRGT4C68Q4EhQ6JtM9otPRIASfhhzfLWtbZPHcMuhuba7S9YVYuxkMUGImwMyGpfbkH07A==", + "license": "Apache-2.0", + "peerDependencies": { + "vue": ">=3.2.26 < 4" + } + }, "node_modules/synckit": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", @@ -15924,7 +17682,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "dev": true, "license": "MIT", "engines": { "node": ">=20" @@ -16064,7 +17821,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "dev": true, "license": "MIT", "dependencies": { "convert-hrtime": "^5.0.0" @@ -16187,6 +17943,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/truncate-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/truncate-json/-/truncate-json-3.0.1.tgz", + "integrity": "sha512-QVsbr1WhGLq2F0oDyYbqtOXcf3gcnL8C9H5EX8bBwAr8ZWvWGJzukpPrDrWgJMrNtgDbo74BIjI4kJu3q2xQWw==", + "license": "MIT", + "dependencies": { + "guess-json-indent": "^3.0.1", + "string-byte-length": "^3.0.1", + "string-byte-slice": "^3.0.1" + }, + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -16232,7 +18002,6 @@ "version": "5.8.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", - "dev": true, "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -16441,6 +18210,18 @@ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "license": "MIT" }, + "node_modules/unhead": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.17.tgz", + "integrity": "sha512-HLMKXOszRhAPBrr6VlqCeVeJq2kbC4kXwzGLEZvvojPLWNYTJw22xG7Bfwhsvs31+IBet3Wl8ADg9dwYdyphfQ==", + "license": "MIT", + "dependencies": { + "hookable": "^6.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/harlan-zw" + } + }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", @@ -17512,6 +19293,39 @@ "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "license": "MIT" }, + "node_modules/vue": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.41.tgz", + "integrity": "sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-sfc": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/server-renderer": "3.5.41", + "@vue/shared": "3.5.41" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.9.tgz", + "integrity": "sha512-3c/UfMe0SqyEfcGTyH7mfshHagJ9QTCbppCb0/uGpHZpFug7+If3GeGZN7I0YheKEExemx3xldQPoO7PQSOLQg==", + "license": "MIT" + }, + "node_modules/vue-sonner": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/vue-sonner/-/vue-sonner-1.3.2.tgz", + "integrity": "sha512-UbZ48E9VIya3ToiRHAZUbodKute/z/M1iT8/3fU8zEbwBRE11AKuHikssv18LMk2gTTr6eMQT4qf6JoLHWuj/A==", + "license": "MIT" + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", @@ -17532,7 +19346,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", - "dev": true, "license": "Apache-2.0" }, "node_modules/webidl-conversions": { diff --git a/package.json b/package.json index f26f377d..cf714cbc 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@keystatic/astro": "5.2.0", "@keystatic/core": "0.6.4", "@pagefind/default-ui": "1.5.2", + "@scalar/api-reference": "1.64.0", "@tabler/icons": "3.46.0", "@tailwindcss/forms": "0.5.11", "@tailwindcss/vite": "4.3.3", diff --git a/public/openapi.yaml b/public/openapi.yaml new file mode 100644 index 00000000..b84c9b32 --- /dev/null +++ b/public/openapi.yaml @@ -0,0 +1,1100 @@ +openapi: 3.1.0 +info: + title: Plumber Platform API (v0 draft) + version: 0.0.1-draft + description: |- + Contract for the Plumber Platform control plane. + + **Proposal notice**: only the core vocabulary is frozen. Everything else below (paths, casing, envelope field names, pagination params) is a proposal and may change before v1 of this API; do not treat a path or field name here as settled unless it is called out as frozen. + + - Frozen: the three status-dimension field names (`deployment_status`, `freshness`, issue `status`) and their exact state strings. + - Frozen: the push-shape principles (`results[]` one-per-policy, `score{letter, points}` with SIGNED points, `effective_config` per result, `collection.collected_at`). + - Frozen: the bare word "status" is reserved for the issue dimension, hence the SSE event is `project.update`, NOT `project.status`. + + **Guarantees** this contract keeps: + + - Never a false verdict: a degraded or missing collection surfaces an honest state, never a fabricated score. + - Forward-tolerant: unknown fields in a request are ignored, and newer schema versions are accepted. +servers: + - url: https://{instance}/api/v1 + variables: + instance: + default: plumber.example.com +security: + - ciOIDC: [] + +paths: + /pushes: + post: + operationId: createPush + summary: Ingest a CLI analysis result (one push carries all policies' results for one run) + description: |- + The CLI pushes at end of job, authenticated by native CI OIDC. Project identity is taken from the VERIFIED OIDC claims (repo claim = attribution / anti-spoof), never from the body. + + The server, in order: + + - Verifies OIDC. + - Applies an idempotency guard (job id) and an ordering guard (pipeline id + timestamps; the displayed result never regresses). + - Accepts each policy score. + - Updates freshness. + - Emits an SSE `project.update` event. + + **Forward-tolerant**: unknown fields are ignored. + security: + - ciOIDC: [] + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/Push' } + responses: + '201': + description: Ingested (new run) - freshness updated, SSE emitted. + content: + application/json: + schema: { $ref: '#/components/schemas/PushAccepted' } + '200': + description: Idempotent replay (same job id) - upserted, no duplicate, no regression. + content: + application/json: + schema: { $ref: '#/components/schemas/PushAccepted' } + '202': + description: > + Accepted but recorded as out-of-order (an older pipeline landed after a newer one): + stored in history, the displayed result does NOT regress. + '401': + description: OIDC verification failed (missing/invalid token, wrong aud, unknown issuer). Project state unchanged. + '422': + description: Envelope invalid (missing schema_version, empty results) - see forward-tolerance rules. + + /projects/{project_path}/context: + get: + operationId: getProjectContext + summary: Resolved policy set + data collection snapshot for a project (one call, at analysis time) + description: |- + Served to the CLI (Bearer OIDC). One call returns the resolved policy set plus the data collection snapshot the CLI needs to evaluate certain controls. + + - The resolved policy set is never empty (falls back to [Plumber default]). + - `snapshot.data` holds the collected project settings (branch protection, MR approval rules, CI variables) and MAY include `merged_yaml`, the resolved CI configuration, with an optional authoritative override from the CLI. + - `snapshot.collected_at` says when the data collection snapshot was collected; it may be a cached read rather than a live call to the provider. + - An authed project ALWAYS gets 200: even with no prior activity for that project, the response is the derived [Plumber default]. There is no 404 for the OIDC-attributed project. + security: + - ciOIDC: [] + parameters: + - { name: project_path, in: path, required: true, schema: { type: string }, description: 'Provider project path or opaque id (proposal).' } + responses: + '200': + description: Resolved context (never empty; falls back to [Plumber default] when no config is assigned yet). + content: + application/json: + schema: { $ref: '#/components/schemas/ProjectContext' } + '401': { description: OIDC verification failed. } + + /events: + get: + operationId: streamEvents + summary: Server-Sent Events stream (one per client; client-side filtering) + description: |- + SSE stream. One stream per client; the client filters. + + - Event name is `project.update`, NOT `project.status`. + - Supports `Last-Event-ID` on reconnect; the server sends heartbeats. + - Response body is `text/event-stream`; the data payload of each event conforms to `ProjectUpdateEvent`. + parameters: + - { name: Last-Event-ID, in: header, required: false, schema: { type: string } } + responses: + '200': + description: Event stream. + content: + text/event-stream: + schema: { $ref: '#/components/schemas/ProjectUpdateEvent' } + + /badge/{project_path}: + get: + operationId: getProjectBadge + summary: Public score badge (SVG) - provider-integrating output, OFF by default + description: |- + Serves the project's score badge (grade A-E). + + - Provider-integrating outputs are OFF by default and must be explicitly enabled. + - The default badge reflects the score-bearing ref (default branch). + - Honest states: a stale/failed/no-result freshness is reflected, never a fabricated grade. + security: [] # public when enabled + parameters: + - { name: project_path, in: path, required: true, schema: { type: string } } + - { name: branch, in: query, required: false, schema: { type: string }, description: 'Optional ref; defaults to the score-bearing ref.' } + - { name: style, in: query, required: false, schema: { type: string }, description: 'Badge style (proposal).' } + responses: + '200': + description: SVG badge. + content: + image/svg+xml: { schema: { type: string } } + '404': { description: No public badge (disabled or project not integrated). } + + /openapi.yaml: + get: + operationId: getOpenApiSpec + summary: Serve this OpenAPI contract itself (Member-gated, raw YAML) + description: |- + Returns this OpenAPI contract verbatim as YAML. Requires an authenticated session at Member level. + + - Response headers include `X-Content-Type-Options: nosniff`, so the response is treated as data, never as HTML. + security: + - sessionCookie: [] + responses: + '200': + description: The OpenAPI contract, verbatim. + content: + application/yaml: + schema: { type: string } + '401': { description: No live session. } + '403': { description: Session role below Member. } + + /settings/instances: + get: + operationId: listSettingsInstances + summary: OrgAdmin instance settings list (org-token + OAuth-app state, never secret material) + description: |- + Lists every configured git instance scoped to the caller's own org. + + - Token/OAuth state is surfaced as metadata and boolean flags only (e.g. token configured, kind api, expires 2027-01-31); the token value itself is never returned. + - Requires an authenticated session at OrgAdmin level. + security: + - sessionCookie: [] + responses: + '200': + description: The caller's org's instances. + content: + application/json: + schema: + type: array + items: { $ref: '#/components/schemas/InstanceSettings' } + '401': { description: No live session. } + '403': { description: Session role below OrgAdmin. } + post: + operationId: createInstance + summary: Create a git instance (OrgAdmin) + description: |- + Registers a new git instance scoped to the caller's own org: provider, instance name, and base_url, with no token or OAuth app configured yet (added afterwards via the two PUT endpoints above). + + - `base_url` MUST be a parseable absolute http(s) URL; this is a scheme/format check only, not a private-range or SSRF check. + - Requires an authenticated session at OrgAdmin level. + security: + - sessionCookie: [] + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/CreateInstanceRequest' } + responses: + '201': + description: Created. + content: + application/json: + schema: { $ref: '#/components/schemas/CreatedID' } + '400': { description: 'Validation failed: provider/instance/base_url empty, or base_url is not a parseable absolute http(s) URL.' } + '401': { description: No live session. } + '403': { description: Session role below OrgAdmin. } + '409': { description: 'An instance with the same (org, provider, instance) already exists.' } + + /sync: + post: + operationId: triggerSync + summary: Manually trigger a sync run for one instance (Maintainer) + description: |- + Triggers an asynchronous sync run for the given `instance_id`, scoped to the caller's own org. Poll `GET /sync/status` or `GET /sync/history` for its progress. + + - `instance_id` must belong to the caller's org (404 otherwise; unknown and foreign-org instances are indistinguishable). + - A run already pending or running for this instance answers 409 rather than queuing a second concurrent run. + - Requires an authenticated session at Maintainer level. + security: + - sessionCookie: [] + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/SyncTriggerRequest' } + responses: + '202': { description: Sync run enqueued. } + '400': { description: Malformed request body or instance_id (not a valid uuid). } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown instance id, or an instance belonging to a different org. } + '409': { description: A sync run is already pending or running for this instance. } + + /sync/status: + get: + operationId: syncStatus + summary: Latest sync run for the caller's org (Member) + description: |- + The most recent sync run across all of the caller's org's instances. + + - `state` is one of `in_progress`, `completed`, or `failed`. + - Includes counts and dates for the run. + - When `state` is `failed`, `error` is a short provider-failure summary; it never includes credentials or other secrets. + - Requires an authenticated session at Member level or above. + security: + - sessionCookie: [] + responses: + '200': + description: The latest sync run. + content: + application/json: + schema: { $ref: '#/components/schemas/SyncStatus' } + '401': { description: No live session. } + '403': { description: Session role below Member. } + '404': { description: No sync run has ever been recorded for this org. } + + /sync/history: + get: + operationId: syncHistory + summary: Sync run history for the caller's org (Member) + description: |- + Every sync run for the caller's org, newest first, capped by `limit` (default 20). + + - Same response shape as `GET /sync/status`; when a run's `state` is `failed`, `error` is a short provider-failure summary and never includes credentials or other secrets. + - Requires an authenticated session at Member level or above. + security: + - sessionCookie: [] + parameters: + - { name: limit, in: query, required: false, schema: { type: integer, default: 20 }, description: 'Max rows returned (proposal).' } + responses: + '200': + description: The org's sync run history, newest first. + content: + application/json: + schema: + type: array + items: { $ref: '#/components/schemas/SyncStatus' } + '401': { description: No live session. } + '403': { description: Session role below Member. } + + /projects: + get: + operationId: listProjects + summary: Visibility-filtered asset inventory (Member) + description: |- + The caller's org's discovered asset inventory, filtered to what the requesting user can see on the provider: a project the caller cannot read on the provider is never returned here, even though this is otherwise an org-wide resource. + + - Requires an authenticated session at Member level or above. + security: + - sessionCookie: [] + parameters: + - { name: deployment_status, in: query, required: false, schema: { $ref: '#/components/schemas/DeploymentStatus' }, description: 'Optional exact-match filter.' } + responses: + '200': + description: The caller's visible slice of the org's asset inventory. + content: + application/json: + schema: + type: array + items: { $ref: '#/components/schemas/InventoryProject' } + '400': { description: 'deployment_status is not one of the frozen vocabulary values.' } + '401': { description: No live session. } + '403': { description: Session role below Member. } + + /settings/instances/{id}/token: + put: + operationId: updateInstanceToken + summary: Rotate an instance's org (analysis) token - validate first, then store (OrgAdmin only) + description: |- + The candidate token is validated with a test call against the git host BEFORE anything is stored. + + - Insufficient scope or an invalid/expired candidate fails validation naming what is wrong; the previously active token is left untouched (no partial switch). + - On success the token is stored and never displayed again. + - `{id}` must belong to the caller's own org (404 otherwise, same surface as "does not exist", never leaking cross-org existence). + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/UpdateInstanceTokenRequest' } + responses: + '204': { description: Validated and stored; the prior token (if any) is replaced. } + '400': { description: 'Candidate rejected: invalid/expired, or insufficient scope (message names the missing scope, e.g. "api or read_api").' } + '401': { description: No live session. } + '403': { description: Session role below OrgAdmin. } + '404': { description: Unknown instance id, or an instance belonging to a different org. } + '409': { description: 'Instance has no base_url configured yet (base_url is set via the oauth-app endpoint above; a token cannot be validated against an unknown host).' } + '502': { description: 'Validation unavailable: the git host could not be reached, or answered with something other than a clear accept/reject.' } + + /settings/instances/{id}/oauth-app: + put: + operationId: updateInstanceOAuthApp + summary: Configure an instance's per-instance OAuth app (OrgAdmin only) + description: |- + Stores the admin-entered OAuth app `client_id`, `client_secret` (never echoed back after this write), and `base_url`. + + - The base URL never comes from a caller again after this write. + - `{id}` must belong to the caller's own org (404 otherwise). + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/UpdateInstanceOAuthAppRequest' } + responses: + '204': { description: Stored. } + '400': { description: Malformed request body. } + '401': { description: No live session. } + '403': { description: Session role below OrgAdmin. } + '404': { description: Unknown instance id, or an instance belonging to a different org. } + + /config/policies: + get: + operationId: listPolicies + summary: List the caller's org's policies (metadata + counts, proposal) + description: |- + Every policy defined for the caller's org. + + - [Plumber default] is never in this list: it is derived, report-only, never persisted, not editable. + - Requires an authenticated session at Member level or above. + security: + - sessionCookie: [] + responses: + '200': + description: The caller's org's policies. + content: + application/json: + schema: + type: array + items: { $ref: '#/components/schemas/PolicySummary' } + '401': { description: No live session. } + '403': { description: Session role below Member. } + post: + operationId: createPolicy + summary: Create a policy (metadata only - content and assignments are separate calls) + description: |- + Creates a policy with no requirements/controls and no assignments yet (added afterwards via `policies/{id}/content` and `policies/{id}/assignments`). + + - `name` is mandatory, non-empty. + - `color` defaults server-side (#3b82f6) when omitted or empty. + - `enforcement` must be `block` or `report`. + - A create never marks anything stale: nothing is assigned to it yet, so there is no downstream effect. + - Requires an authenticated session at Maintainer level. + security: + - sessionCookie: [] + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PolicyMetaRequest' } + responses: + '201': + description: Created. + content: + application/json: + schema: { $ref: '#/components/schemas/CreatedID' } + '400': { description: 'Validation failed, naming the field (e.g. "name is required", "enforcement must be block or report").' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + + /config/policies/{id}: + get: + operationId: getPolicy + summary: Full policy detail - metadata, requirements/controls, and assignments + description: |- + `{id}` must belong to the caller's own org (404 otherwise; unknown ids and ids belonging to a different org are indistinguishable). + + - Requires Member level or above. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + responses: + '200': + description: Full policy detail. + content: + application/json: + schema: { $ref: '#/components/schemas/PolicyDetail' } + '400': { description: Malformed policy id (not a valid uuid). } + '401': { description: No live session. } + '403': { description: Session role below Member. } + '404': { description: Unknown policy id, or a policy belonging to a different org. } + put: + operationId: updatePolicyMeta + summary: Update a policy's metadata (name, description, color, enforcement) + description: |- + Metadata only; requirements/controls and assignments have their own PUT endpoints below. + + - A successful update marks every currently-assigned project stale and emits `project.update` for each. + - Last-save-wins: concurrent edits are not merged, the most recent write wins. + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PolicyMetaRequest' } + responses: + '204': { description: Updated; affected projects staled, project.update emitted for each. } + '400': { description: 'Validation failed, naming the field.' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown policy id, or a policy belonging to a different org. } + delete: + operationId: deletePolicy + summary: Delete a policy (cascades its requirements, controls, and assignments) + description: |- + The affected set is captured before the cascade: every project that was assigned this policy, directly or via a portfolio, goes stale. + + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + responses: + '204': { description: Deleted; affected projects staled, project.update emitted for each. } + '400': { description: Malformed policy id (not a valid uuid). } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown policy id, or a policy belonging to a different org. } + + /config/policies/{id}/content: + put: + operationId: replacePolicyContent + summary: Full replace of a policy's requirements and controls (whole form) + description: |- + The request body is the complete desired state, never a diff; the replace is atomic. + + - Position is derived from array order for both requirements and controls, never a caller-supplied index. + - `control.config` must be valid JSON. + - Control TYPE existence is NOT validated. + - A successful replace marks every currently-assigned project stale: content changed, so every project this policy already covers must re-run. + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PolicyContentRequest' } + responses: + '204': { description: Replaced; affected projects staled, project.update emitted for each. } + '400': { description: 'Validation failed, naming the field (e.g. a requirement with an empty name, or a control with malformed config).' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown policy id, or a policy belonging to a different org. } + + /config/policies/{id}/assignments: + put: + operationId: replacePolicyAssignments + summary: Full-set replace of a policy's project and portfolio assignments + description: |- + The request body is the complete desired assignment set, never a diff. + + - Both directions, entering and leaving, go stale; the caller never computes the diff itself. + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PolicyAssignments' } + responses: + '204': { description: Replaced; the union of entering and leaving projects staled, project.update emitted for each. } + '400': { description: 'Validation failed (e.g. a malformed project or portfolio id).' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown policy id, or a policy belonging to a different org. } + '409': { description: 'A referenced project_id or portfolio_id belongs to a different org than the policy. No partial write; the whole replace rolls back.' } + + /config/portfolios: + get: + operationId: listPortfolios + summary: List the caller's org's portfolios (metadata + counts, proposal) + description: |- + Every portfolio defined for the caller's org. + + - Requires Member level or above. + security: + - sessionCookie: [] + responses: + '200': + description: The caller's org's portfolios. + content: + application/json: + schema: + type: array + items: { $ref: '#/components/schemas/PortfolioSummary' } + '401': { description: No live session. } + '403': { description: Session role below Member. } + post: + operationId: createPortfolio + summary: Create a portfolio (metadata only - members and rules are separate calls) + description: |- + Creates an empty portfolio (no explicit members, no group: rules yet). + + - `name` is mandatory, non-empty. + - `color` defaults server-side (#10b981) when omitted or empty. + - Requires Maintainer. + security: + - sessionCookie: [] + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PortfolioMetaRequest' } + responses: + '201': + description: Created. + content: + application/json: + schema: { $ref: '#/components/schemas/CreatedID' } + '400': { description: 'Validation failed, naming the field (e.g. "name is required").' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + + /config/portfolios/{id}: + get: + operationId: getPortfolio + summary: Full portfolio detail - metadata, members, group rules, and the resolved-project preview + description: |- + `resolved_projects` is the live preview: explicit members UNION every project matching a group: rule, computed at read time. + + - `{id}` must belong to the caller's own org (404 otherwise). + - Requires Member level or above. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + responses: + '200': + description: Full portfolio detail. + content: + application/json: + schema: { $ref: '#/components/schemas/PortfolioDetail' } + '400': { description: Malformed portfolio id (not a valid uuid). } + '401': { description: No live session. } + '403': { description: Session role below Member. } + '404': { description: Unknown portfolio id, or a portfolio belonging to a different org. } + put: + operationId: updatePortfolioMeta + summary: Update a portfolio's metadata (name, color) + description: |- + Metadata only; members and rules have their own PUT endpoints below. + + - Every config edit marks every project the portfolio currently resolves to (explicit members UNION group: rule matches) stale and emits `project.update` for each, same as policy metadata updates. Name/color changes are no exception. + - Last-save-wins: concurrent edits are not merged, the most recent write wins. + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PortfolioMetaRequest' } + responses: + '204': { description: Updated; affected projects staled, project.update emitted for each. } + '400': { description: 'Validation failed, naming the field.' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown portfolio id, or a portfolio belonging to a different org. } + delete: + operationId: deletePortfolio + summary: Delete a portfolio (projects stay onboarded; policy links through it dissolve) + description: |- + Deleting a portfolio never touches the projects that were its members: they stay onboarded. + + - The affected set is captured before the cascade: every project that lost policy coverage because it resolved through this portfolio goes stale. + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + responses: + '204': { description: Deleted; affected projects staled, project.update emitted for each. } + '400': { description: Malformed portfolio id (not a valid uuid). } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown portfolio id, or a portfolio belonging to a different org. } + + /config/portfolios/{id}/members: + put: + operationId: replacePortfolioMembers + summary: Full-set replace of a portfolio's explicit member projects + description: |- + The request body is the complete desired member set, never a diff. + + - Both directions, entering and leaving, go stale (group: rule matches are unaffected by this call and stay resolved independently). + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PortfolioMembersRequest' } + responses: + '204': { description: Replaced; the union of entering and leaving projects staled, project.update emitted for each. } + '400': { description: 'Validation failed (e.g. a malformed project id).' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown portfolio id, or a portfolio belonging to a different org. } + '409': { description: 'A referenced project_id belongs to a different org than the portfolio. No partial write; the whole replace rolls back.' } + + /config/portfolios/{id}/rules: + put: + operationId: replacePortfolioRules + summary: "Full-set replace of a portfolio's group: path rules" + description: |- + A rule is a group path prefix (e.g. `team-a`), not a reference to a group object. A project belongs if its path equals the rule or sits under it: `team-a` matches `team-a/api` and `team-a/sub/web`, but never `team-alpha`. Matching is dynamic: projects that later appear under the path join automatically. + + - A path with a typo is accepted and simply matches nothing. + - Rules track the path string, not the group's identity: if a group is renamed on the provider, the rule stops matching until it is updated to the new path. + - The request body is the complete desired rule set, never a diff. + - Both directions, entering and leaving, go stale (explicit members are unaffected by this call). + - Duplicate `group_path` values collapse rather than causing an error. + - Requires Maintainer. + security: + - sessionCookie: [] + parameters: + - { name: id, in: path, required: true, schema: { type: string, format: uuid } } + requestBody: + required: true + content: + application/json: + schema: { $ref: '#/components/schemas/PortfolioRulesRequest' } + responses: + '204': { description: Replaced; the union of entering and leaving projects staled, project.update emitted for each. } + '400': { description: 'Validation failed (e.g. an empty group_path).' } + '401': { description: No live session. } + '403': { description: Session role below Maintainer. } + '404': { description: Unknown portfolio id, or a portfolio belonging to a different org. } + +components: + securitySchemes: + ciOIDC: + type: http + scheme: bearer + bearerFormat: JWT + description: |- + Native CI OIDC id_token (GitLab id_tokens / GitHub id-token: write). + + - Verified per provider/instance: JWKS signature, aud, and accepted issuer (configured per instance, never hardcoded), plus project identity claims (repo claim = attribution/anti-spoof). + - Multiple identity providers are supported. + - Token lifetimes differ by provider (GitLab 3600s vs GitHub 300s). + sessionCookie: + type: apiKey + in: cookie + name: plumber_session + description: |- + Browser session cookie, set by the OAuth login callback. + + - RBAC-gated endpoints additionally require a minimum role; the settings endpoints here require OrgAdmin. + - This is enforced server-side, not expressible as an OpenAPI scope. + + schemas: + Push: + type: object + required: [schema_version, provider, instance, project, ref, pipeline, results] + properties: + schema_version: { type: integer, minimum: 1, description: 'Ingestion-contract version (>=1). Newer accepted (forward-tolerant).' } + provider: { type: string, description: 'e.g. gitlab | github (proposal). Body is informational for identity; OIDC claims are authoritative.' } + instance: { type: string, description: 'e.g. gitlab.com (proposal).' } + project: + type: object + properties: + path: { type: string } + id: { type: string, description: 'Stable provider id (survives renames).' } + ref: + type: object + properties: + branch: { type: string } + tag: { type: string } + sha: { type: string } + pipeline: + type: object + description: 'Drives the idempotency guard (job_id) and ordering guard (id + timestamps).' + properties: + id: { type: string } + job_id: { type: string } + cli: + type: object + properties: + version: { type: string } + component_version: { type: string } + collection: { $ref: '#/components/schemas/CollectionMeta' } + results: + type: array + description: 'One entry PER POLICY (multi-policy coexistence). Never a merged policy.' + items: { $ref: '#/components/schemas/PolicyResult' } + PolicyResult: + type: object + required: [policy, findings] + properties: + policy: { type: string, description: 'Policy identifier (proposal). [Plumber default] is report-only, never persisted.' } + effective_config: + type: object + description: 'What the CLI actually ran for this policy.' + findings: + type: array + items: { $ref: '#/components/schemas/Finding' } + score: + allOf: + - $ref: '#/components/schemas/Score' + description: "The CLI's pushed score, used as the policy's score." + Finding: + type: object + required: [control, status] + properties: + control: { type: string } + version: { type: string, description: 'Control version; weights and points live in the versioned control definition.' } + requirement: { type: string } + status: + type: string + enum: [pass, fail, not_evaluable] + description: |- + Finding OUTCOME (the enum is `pass | fail | not_evaluable`). + + - `not_evaluable` is EXPLICIT for degraded/silent controls, never omitted: it contributes zero points and is excluded from the denominator, and never closes its issue. + - There is NO per-control fail-mode dial: degraded is single and non-configurable. + - Enforcement (`block | report`) lives on the policy, not the finding. + data: + type: object + description: 'Control-specific payload plus canonical fields (code/severity/message/job/file/line/url). Unknown keys are kept raw rather than dropped.' + Score: + type: object + required: [letter, points] + properties: + letter: { type: string, description: 'Grade A-E. "Compliance %" does not exist in v2.', examples: [A, B, C, D, E] } + points: { type: integer, description: 'SIGNED: negative values are kept, with no clamping at ingestion or storage. Any zero-floor is applied only for display.' } + CollectionMeta: + type: object + description: 'Honest degradation signal.' + properties: + degraded: { type: boolean } + snapshot_collected_at: { type: string, format: date-time, description: 'collected_at of the data collection snapshot the CLI consumed (a cached value, not a live read from the provider).' } + missing_fields: { type: array, items: { type: string } } + PushAccepted: + type: object + properties: + project: { type: string } + freshness: { $ref: '#/components/schemas/Freshness' } + global_score: + allOf: [ { $ref: '#/components/schemas/Score' } ] + description: 'Average of the policies'' points. Display/aggregation only, never used for enforcement.' + recomputed: { type: boolean, description: 'Whether the platform recomputed the score from the pushed findings; false means the pushed score was used as-is.' } + Policy: + type: object + required: [name, enforcement] + properties: + name: { type: string, description: 'Policy identifier/display name. [Plumber default] is the derived, report-only fallback: never persisted, not deletable.' } + enforcement: + type: string + enum: [block, report] + description: 'Enforcement dial: block or report. There is NO fail_mode field: degraded controls are single and non-configurable (see Finding.status).' + ProjectContext: + type: object + required: [schema_version, project, policies, snapshot] + properties: + schema_version: { type: integer } + project: { type: string, description: 'Resolved project path (matches the {project_path} route parameter).' } + policies: + type: array + description: 'Resolved policy set - NEVER empty (falls back to [Plumber default], report-only).' + items: { $ref: '#/components/schemas/Policy' } + snapshot: + type: object + properties: + collected_at: { type: string, format: date-time } + data: + type: object + description: 'The collected project settings: branch protection rules, MR approval rules, CI variables. MAY include `merged_yaml`, the resolved CI configuration, with an optional authoritative override from the CLI.' + properties: + branch_protection: { type: object } + mr_approvals: { type: object } + variables: { type: object } + merged_yaml: { type: string, nullable: true } + ProjectUpdateEvent: + type: object + description: 'Payload of the `project.update` SSE event. NOT `project.status`.' + required: [project] + properties: + project: { type: string } + deployment_status: { $ref: '#/components/schemas/DeploymentStatus' } + freshness: { $ref: '#/components/schemas/Freshness' } + score: + allOf: [ { $ref: '#/components/schemas/Score' } ] + description: 'Present only when it changed.' + previous: + type: object + description: 'Prior deployment_status/freshness/score for transition display.' + DeploymentStatus: + type: string + description: 'Frozen vocabulary: these exact strings are stable and will not change.' + enum: [missing, to integrate, in progress, onboarded, lost, unboarding, unboarded] + Freshness: + type: string + description: 'Frozen vocabulary: these exact strings are stable and will not change. Backend-managed; `running` is never a terminal state.' + enum: [fresh, stale, running, failed, no result received] + InstanceSettings: + type: object + description: 'OrgAdmin settings view of one configured git instance: metadata and flags only, NEVER a secret.' + required: [id, provider, instance, token_set, oauth_app_set] + properties: + id: { type: string, format: uuid } + provider: { type: string } + instance: { type: string } + base_url: { type: string, nullable: true, description: 'Provider instance base URL; null until an OAuth app is configured.' } + token_kind: + type: string + nullable: true + enum: [api, read_api] + description: 'Derived from the validated token''s scopes, never caller input. Null when no token is configured.' + token_expires_at: { type: string, format: date-time, nullable: true } + oauth_client_id: { type: string, nullable: true, description: 'Public OAuth app client id (not a secret); null until configured.' } + token_set: { type: boolean, description: 'True when an org token is configured. The token value itself is never returned.' } + oauth_app_set: { type: boolean, description: 'True when a per-instance OAuth app is configured. The client secret value is never returned.' } + UpdateInstanceTokenRequest: + type: object + required: [token] + properties: + token: { type: string, description: 'Plaintext candidate org token, validated against the git host before storage; never echoed back.' } + UpdateInstanceOAuthAppRequest: + type: object + required: [client_id, client_secret, base_url] + properties: + client_id: { type: string, description: 'Public OAuth app client id.' } + client_secret: { type: string, description: 'Plaintext OAuth app client secret; never echoed back.' } + base_url: { type: string, description: 'Provider instance base URL (e.g. https://gitlab.example.com); the server-side source for OAuth endpoints and token validation.' } + + CreateInstanceRequest: + type: object + description: 'Body of createInstance: registers a git instance with no token or OAuth app configured yet (added afterwards via the existing PUT endpoints).' + required: [provider, instance, base_url] + properties: + provider: { type: string, description: 'e.g. gitlab (GitHub instances are not supported by this endpoint yet).' } + instance: { type: string, description: 'e.g. gitlab.example.com - the instance NAME, distinct from base_url.' } + base_url: { type: string, description: 'Provider instance base URL. MUST be a parseable absolute http(s) URL (a scheme/format check only, not a private-range or SSRF check).' } + SyncTriggerRequest: + type: object + description: 'Body of triggerSync: names the instance to sync.' + required: [instance_id] + properties: + instance_id: { type: string, format: uuid, description: 'Must belong to the caller''s own org (404 otherwise).' } + SyncState: + type: string + description: 'The sync run''s current lifecycle stage.' + enum: [in_progress, completed, failed] + SyncStatus: + type: object + description: 'One sync run''s status.' + required: [id, instance_id, scheduled, state, started_at, updated_at, project_count, group_count] + properties: + id: { type: string, format: uuid } + instance_id: { type: string, format: uuid } + scheduled: { type: boolean, description: 'True for a scheduled run, false for a manually triggered run.' } + state: { $ref: '#/components/schemas/SyncState' } + started_at: { type: string, format: date-time } + updated_at: { type: string, format: date-time } + completed_at: { type: string, format: date-time, nullable: true, description: 'Null while state is in_progress.' } + project_count: { type: integer } + group_count: { type: integer } + error: { type: string, description: 'A short provider-failure summary, present only when state is failed; never includes credentials or other secrets.' } + InventoryProject: + type: object + description: 'One entry in the visibility-filtered asset inventory (see listProjects).' + required: [id, path, deployment_status, freshness, has_plumber_yaml, archived, provider_deleted, score_letter, score_points] + properties: + id: { type: string, format: uuid } + path: { type: string } + deployment_status: { $ref: '#/components/schemas/DeploymentStatus' } + freshness: { $ref: '#/components/schemas/Freshness' } + has_plumber_yaml: { type: boolean, description: 'Discovery flag only: whether a Plumber config file was found. Does not by itself assign any policy.' } + archived: { type: boolean } + provider_deleted: { type: boolean, description: 'True when the project was flagged as removed on the provider; the project is never actually deleted from this inventory.' } + score_letter: { type: string, description: 'Empty string when the project has never been scored.' } + score_points: { type: integer } + + ConfigEnforcement: + type: string + enum: [block, report] + description: 'Enforcement dial: `block` or `report`, same vocabulary as `Policy.enforcement` above. There is NO `fail_mode`: degraded controls are single and non-configurable.' + CreatedID: + type: object + description: 'The 201 body for every config create endpoint below.' + required: [id] + properties: + id: { type: string, format: uuid } + PolicySummary: + type: object + description: 'One row of the policies list: metadata and counts only, never the full requirements/controls (see PolicyDetail).' + required: [id, name, color, enforcement, requirement_count, control_count] + properties: + id: { type: string, format: uuid } + name: { type: string } + description: { type: string } + color: { type: string } + enforcement: { $ref: '#/components/schemas/ConfigEnforcement' } + requirement_count: { type: integer } + control_count: { type: integer, description: 'Total controls across all requirements.' } + assigned_project_count: { type: integer, description: 'Direct project assignments (not counting projects reached only via a portfolio).' } + assigned_portfolio_count: { type: integer } + PolicyMetaRequest: + type: object + description: 'Request body for both createPolicy (POST) and updatePolicyMeta (PUT) - same fields either way.' + required: [name, enforcement] + properties: + name: { type: string, description: 'Mandatory, non-empty.' } + description: { type: string } + color: { type: string, description: 'Optional; server default #3b82f6 applied when omitted or empty.' } + enforcement: { $ref: '#/components/schemas/ConfigEnforcement' } + PolicyDetail: + type: object + description: 'The full getPolicy body: metadata + the requirements/controls tree + resolved assignment id sets.' + required: [id, name, color, enforcement, requirements, assignments] + properties: + id: { type: string, format: uuid } + name: { type: string } + description: { type: string } + color: { type: string } + enforcement: { $ref: '#/components/schemas/ConfigEnforcement' } + created_at: { type: string, format: date-time } + updated_at: { type: string, format: date-time } + requirements: + type: array + items: { $ref: '#/components/schemas/RequirementDetail' } + assignments: { $ref: '#/components/schemas/PolicyAssignments' } + RequirementDetail: + type: object + description: 'One requirement as read back (carries its stable id; contrast RequirementInput, which never does - position is array order, not a caller id).' + required: [id, name, controls] + properties: + id: { type: string, format: uuid } + name: { type: string } + description: { type: string } + controls: + type: array + items: { $ref: '#/components/schemas/ControlDetail' } + ControlDetail: + type: object + description: 'One control instance as read back.' + required: [id, type, version, config] + properties: + id: { type: string, format: uuid } + type: { type: string } + version: { type: string } + config: { type: object } + PolicyContentRequest: + type: object + description: 'Body of replacePolicyContent (PUT .../content): the complete desired requirements/controls tree, never a diff.' + required: [requirements] + properties: + requirements: + type: array + items: { $ref: '#/components/schemas/RequirementInput' } + RequirementInput: + type: object + description: 'One requirement in a content replace. No id: position is derived from array order.' + required: [name, controls] + properties: + name: { type: string, description: 'Mandatory, non-empty.' } + description: { type: string } + controls: + type: array + items: { $ref: '#/components/schemas/ControlInput' } + ControlInput: + type: object + description: 'One control instance in a content replace. Weights and points are not included here; they live in the versioned control library.' + required: [type, version, config] + properties: + type: { type: string, description: 'Control type identifier. Existence is NOT validated at this layer.' } + version: { type: string } + config: { type: object, description: 'Arbitrary control config; must be valid JSON. Not otherwise validated.' } + PolicyAssignments: + type: object + description: 'The full-set-replace body for replacePolicyAssignments, and the assignments field of PolicyDetail on read. Both directions of the diff (entering + leaving) are computed server-side; the caller only ever sends the desired end state.' + required: [project_ids, portfolio_ids] + properties: + project_ids: { type: array, items: { type: string, format: uuid } } + portfolio_ids: { type: array, items: { type: string, format: uuid } } + PortfolioSummary: + type: object + description: 'One row of the portfolios list: metadata and counts only, never the full members/rules (see PortfolioDetail).' + required: [id, name, color, member_count, rule_count, resolved_project_count] + properties: + id: { type: string, format: uuid } + name: { type: string } + color: { type: string } + member_count: { type: integer, description: 'Explicit members only.' } + rule_count: { type: integer, description: 'group: path rules.' } + resolved_project_count: { type: integer, description: 'Live resolution: explicit members UNION every project matching a rule, deduplicated.' } + PortfolioMetaRequest: + type: object + description: 'Request body for both createPortfolio (POST) and updatePortfolioMeta (PUT).' + required: [name] + properties: + name: { type: string, description: 'Mandatory, non-empty.' } + color: { type: string, description: 'Optional; server default #10b981 applied when omitted or empty.' } + ProjectRef: + type: object + description: 'Minimal project identity - id plus its path, enough to render a resolved-preview row without a second lookup.' + required: [id, path] + properties: + id: { type: string, format: uuid } + path: { type: string } + PortfolioDetail: + type: object + description: 'The full getPortfolio body: metadata, explicit member ids, group rules, and the live resolved-project preview.' + required: [id, name, color, members, rules, resolved_projects] + properties: + id: { type: string, format: uuid } + name: { type: string } + color: { type: string } + created_at: { type: string, format: date-time } + updated_at: { type: string, format: date-time } + members: + type: array + items: { type: string, format: uuid } + description: 'Explicit member project ids only (contrast resolved_projects, which also includes rule matches).' + rules: + type: array + items: { type: string } + description: |- + Each rule is a group path prefix (e.g. `team-a`), not a reference to a group object. A project belongs if its path equals the rule or sits under it: `team-a` matches `team-a/api` and `team-a/sub/web`, but never `team-alpha`. Matching is dynamic, so projects that later appear under the path join automatically. + + - A path with a typo is accepted and simply matches nothing. + - Rules track the path string, not the group's identity: if a group is renamed on the provider, the rule stops matching until it is updated to the new path. + resolved_projects: + type: array + items: { $ref: '#/components/schemas/ProjectRef' } + description: 'Live preview: members UNION every project matching a rule, computed at read time, not stored.' + PortfolioMembersRequest: + type: object + description: 'Body of replacePortfolioMembers: the complete desired explicit-member set, never a diff.' + required: [project_ids] + properties: + project_ids: { type: array, items: { type: string, format: uuid } } + PortfolioRulesRequest: + type: object + description: 'Body of replacePortfolioRules: the complete desired rule set, never a diff.' + required: [group_paths] + properties: + group_paths: { type: array, items: { type: string }, description: 'Group path prefixes; see PortfolioDetail.rules for matching semantics. Replaces the complete rule set, never a diff.' } + +# --------------------------------------------------------------------------- +# READ-API SURFACE (frontend Pages): proposed endpoints, entities, filters, +# pagination, and RBAC conventions for the read surface. Every path/field +# here is a PROPOSAL; promoted into path objects above once names are +# confirmed. The read surface is not required for the current walking +# skeleton. RBAC applies to every read. +# --------------------------------------------------------------------------- diff --git a/src/docs/config/en/sidebarNavData.json.ts b/src/docs/config/en/sidebarNavData.json.ts index 92e51a99..4ab5dbcd 100644 --- a/src/docs/config/en/sidebarNavData.json.ts +++ b/src/docs/config/en/sidebarNavData.json.ts @@ -57,6 +57,7 @@ const sidebarNavData: DocsSidebarNavData = { { id: "use-plumber", title: "Use Plumber", + navLinks: [{ text: "API Reference", href: "/docs/api-reference" }], }, ], }, diff --git a/src/pages/docs/api-reference.astro b/src/pages/docs/api-reference.astro new file mode 100644 index 00000000..cfbe4b74 --- /dev/null +++ b/src/pages/docs/api-reference.astro @@ -0,0 +1,127 @@ +--- +/** + * Interactive OpenAPI reference for the Plumber Platform API, rendered with + * Scalar (https://github.com/scalar/scalar). + * + * The spec is read from /openapi.yaml (committed at public/openapi.yaml). This + * repo does not own the spec content: another repository pushes updated + * versions of the file automatically, and this page simply renders whatever is + * currently committed. No build-time fetching, no sync workflow. + * + * Scalar brings its own three-panel layout (sidebar, content, try-it client), + * so the page uses the base docs shell (nav + footer) without the docs + * sidebar, and Scalar fills the full width below the site nav. + */ +import BaseLayoutDocs from "@/docs/layouts/BaseLayoutDocs.astro"; + +const title = "API Reference"; +const description = + "Interactive reference for the Plumber Platform API: browse endpoints, schemas and examples, and try requests directly from the docs."; +--- + + + + + + + The interactive API reference requires JavaScript. + + You can still read the raw OpenAPI specification at + /openapi.yaml. + + + + + + + + +
The interactive API reference requires JavaScript.
+ You can still read the raw OpenAPI specification at + /openapi.yaml. +