diff --git a/.github/workflows/generated-check.yml b/.github/workflows/generated-check.yml
deleted file mode 100644
index 6df385e9..00000000
--- a/.github/workflows/generated-check.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: Generated Scripts Check
-
-on:
- pull_request:
- branches:
- - dev
- - main
-
-jobs:
- check-schema:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Setup Node
- uses: actions/setup-node@v4
- with:
- node-version: 22
- cache: npm
-
- - name: Install deps
- run: npm ci
-
- - name: Run generation scripts
- run: npm run gen:all
-
- - name: Fail if diff is present
- run: |
- if [ -n "$(git diff --exit-code)" ]; then
- echo "Generated files have changed. Please regenerate the files and commit the changes using the following command:"
- echo "npm run gen:all"
- exit 1
- else
- echo "No changes detected in generated files."
- fi
diff --git a/.github/workflows/pullpreview.yml b/.github/workflows/pullpreview.yml
deleted file mode 100644
index 31e299ee..00000000
--- a/.github/workflows/pullpreview.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-name: PullPreview
-on:
- push:
- branches:
- - dev
- pull_request:
- types: [labeled, unlabeled, synchronize, closed, reopened]
-
-jobs:
- deploy:
- if: github.event_name == 'push' || github.event.label.name == 'pullpreview' || contains(github.event.pull_request.labels.*.name, 'pullpreview')
- runs-on: ubuntu-latest
- timeout-minutes: 30
- permissions:
- contents: read # to fetch code (actions/checkout)
- deployments: write # to delete deployments
- pull-requests: write # to remove labels
- statuses: write # to create commit status
- strategy:
- matrix:
- node-version: [22.x]
- # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
- steps:
- - uses: actions/checkout@v4
- with:
- submodules: 'recursive'
- - run: npm ci
- - run: npm run gen:curated
- - run: npm run docs:build
- - uses: pullpreview/action@v5
- with:
- # Those GitHub users will have SSH access to the servers
- admins: eschultz
- # Use the cidrs option to restrict access to the live environments to specific IP ranges
- cidrs: "0.0.0.0/0"
- # PullPreview will use these files when running docker-compose up
- compose_files: docker-compose.pullpreview.yml
- # The preview URL will target this port
- default_port: 443
- # Use a 512MB RAM instance type instead of the default 2GB
- instance_type: nano
- # Ports to open on the server
- ports: 443
- # custom dns
- dns: preview.hexos.com
- # self-terminate after 10days
- ttl: 10d
- env:
- AWS_ACCESS_KEY_ID: "${{ secrets.AWS_ACCESS_KEY_ID }}"
- AWS_SECRET_ACCESS_KEY: "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
- AWS_REGION: "us-west-2"
\ No newline at end of file
diff --git a/.husky/pre-commit b/.husky/pre-commit
deleted file mode 100644
index 24908876..00000000
--- a/.husky/pre-commit
+++ /dev/null
@@ -1,2 +0,0 @@
-npm run gen:all
-git add .
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 00000000..9a871551
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,631 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 0,
+ "workspaces": {
+ "": {
+ "name": "hexos-docs",
+ "devDependencies": {
+ "mermaid": "^11.10.0",
+ "vitepress": "^1.3.0",
+ "vitepress-plugin-mermaid": "^2.0.17",
+ },
+ },
+ },
+ "packages": {
+ "@algolia/abtesting": ["@algolia/abtesting@1.1.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow=="],
+
+ "@algolia/autocomplete-core": ["@algolia/autocomplete-core@1.17.7", "", { "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" } }, "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q=="],
+
+ "@algolia/autocomplete-plugin-algolia-insights": ["@algolia/autocomplete-plugin-algolia-insights@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A=="],
+
+ "@algolia/autocomplete-preset-algolia": ["@algolia/autocomplete-preset-algolia@1.17.7", "", { "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA=="],
+
+ "@algolia/autocomplete-shared": ["@algolia/autocomplete-shared@1.17.7", "", { "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg=="],
+
+ "@algolia/client-abtesting": ["@algolia/client-abtesting@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ=="],
+
+ "@algolia/client-analytics": ["@algolia/client-analytics@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw=="],
+
+ "@algolia/client-common": ["@algolia/client-common@5.35.0", "", {}, "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w=="],
+
+ "@algolia/client-insights": ["@algolia/client-insights@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA=="],
+
+ "@algolia/client-personalization": ["@algolia/client-personalization@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA=="],
+
+ "@algolia/client-query-suggestions": ["@algolia/client-query-suggestions@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w=="],
+
+ "@algolia/client-search": ["@algolia/client-search@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg=="],
+
+ "@algolia/ingestion": ["@algolia/ingestion@1.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA=="],
+
+ "@algolia/monitoring": ["@algolia/monitoring@1.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw=="],
+
+ "@algolia/recommend": ["@algolia/recommend@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ=="],
+
+ "@algolia/requester-browser-xhr": ["@algolia/requester-browser-xhr@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0" } }, "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw=="],
+
+ "@algolia/requester-fetch": ["@algolia/requester-fetch@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0" } }, "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ=="],
+
+ "@algolia/requester-node-http": ["@algolia/requester-node-http@5.35.0", "", { "dependencies": { "@algolia/client-common": "5.35.0" } }, "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ=="],
+
+ "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="],
+
+ "@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
+
+ "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="],
+
+ "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="],
+
+ "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="],
+
+ "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="],
+
+ "@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="],
+
+ "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="],
+
+ "@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="],
+
+ "@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="],
+
+ "@docsearch/css": ["@docsearch/css@3.8.2", "", {}, "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ=="],
+
+ "@docsearch/js": ["@docsearch/js@3.8.2", "", { "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" } }, "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ=="],
+
+ "@docsearch/react": ["@docsearch/react@3.8.2", "", { "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", "@docsearch/css": "3.8.2", "algoliasearch": "^5.14.2" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0", "search-insights": ">= 1 < 3" }, "optionalPeers": ["@types/react", "react", "react-dom"] }, "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
+
+ "@iconify-json/simple-icons": ["@iconify-json/simple-icons@1.2.48", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-EACOtZMoPJtERiAbX1De0asrrCtlwI27+03c9OJlYWsly9w1O5vcD8rTzh+kDPjo+K8FOVnq2Qy+h/CzljSKDA=="],
+
+ "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
+
+ "@iconify/utils": ["@iconify/utils@2.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", "debug": "^4.4.0", "globals": "^15.14.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "mlly": "^1.7.4" } }, "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@mermaid-js/mermaid-mindmap": ["@mermaid-js/mermaid-mindmap@9.3.0", "", { "dependencies": { "@braintree/sanitize-url": "^6.0.0", "cytoscape": "^3.23.0", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.1.0", "d3": "^7.0.0", "khroma": "^2.0.0", "non-layered-tidy-tree-layout": "^2.0.2" } }, "sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw=="],
+
+ "@mermaid-js/parser": ["@mermaid-js/parser@0.6.2", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.46.3", "", { "os": "android", "cpu": "arm" }, "sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.46.3", "", { "os": "android", "cpu": "arm64" }, "sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.46.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.46.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.46.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.46.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.46.3", "", { "os": "linux", "cpu": "arm" }, "sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.46.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.46.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.46.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w=="],
+
+ "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.46.3", "", { "os": "linux", "cpu": "none" }, "sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.46.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.46.3", "", { "os": "linux", "cpu": "none" }, "sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.46.3", "", { "os": "linux", "cpu": "none" }, "sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.46.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.46.3", "", { "os": "linux", "cpu": "x64" }, "sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.46.3", "", { "os": "linux", "cpu": "x64" }, "sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.46.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.46.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.46.3", "", { "os": "win32", "cpu": "x64" }, "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ=="],
+
+ "@shikijs/core": ["@shikijs/core@2.5.0", "", { "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg=="],
+
+ "@shikijs/engine-javascript": ["@shikijs/engine-javascript@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^3.1.0" } }, "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w=="],
+
+ "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw=="],
+
+ "@shikijs/langs": ["@shikijs/langs@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w=="],
+
+ "@shikijs/themes": ["@shikijs/themes@2.5.0", "", { "dependencies": { "@shikijs/types": "2.5.0" } }, "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw=="],
+
+ "@shikijs/transformers": ["@shikijs/transformers@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" } }, "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg=="],
+
+ "@shikijs/types": ["@shikijs/types@2.5.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw=="],
+
+ "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
+
+ "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="],
+
+ "@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="],
+
+ "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="],
+
+ "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="],
+
+ "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="],
+
+ "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="],
+
+ "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="],
+
+ "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="],
+
+ "@types/d3-dispatch": ["@types/d3-dispatch@3.0.7", "", {}, "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA=="],
+
+ "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="],
+
+ "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="],
+
+ "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="],
+
+ "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="],
+
+ "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="],
+
+ "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="],
+
+ "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="],
+
+ "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="],
+
+ "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="],
+
+ "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="],
+
+ "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="],
+
+ "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="],
+
+ "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="],
+
+ "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
+
+ "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="],
+
+ "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="],
+
+ "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="],
+
+ "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
+
+ "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="],
+
+ "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="],
+
+ "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="],
+
+ "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="],
+
+ "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="],
+
+ "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "@types/mdurl": ["@types/mdurl@2.0.0", "", {}, "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="],
+
+ "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+ "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="],
+
+ "@vue/compiler-core": ["@vue/compiler-core@3.5.18", "", { "dependencies": { "@babel/parser": "^7.28.0", "@vue/shared": "3.5.18", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw=="],
+
+ "@vue/compiler-dom": ["@vue/compiler-dom@3.5.18", "", { "dependencies": { "@vue/compiler-core": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A=="],
+
+ "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.18", "", { "dependencies": { "@babel/parser": "^7.28.0", "@vue/compiler-core": "3.5.18", "@vue/compiler-dom": "3.5.18", "@vue/compiler-ssr": "3.5.18", "@vue/shared": "3.5.18", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA=="],
+
+ "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.18", "", { "dependencies": { "@vue/compiler-dom": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g=="],
+
+ "@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="],
+
+ "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="],
+
+ "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="],
+
+ "@vue/reactivity": ["@vue/reactivity@3.5.18", "", { "dependencies": { "@vue/shared": "3.5.18" } }, "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg=="],
+
+ "@vue/runtime-core": ["@vue/runtime-core@3.5.18", "", { "dependencies": { "@vue/reactivity": "3.5.18", "@vue/shared": "3.5.18" } }, "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w=="],
+
+ "@vue/runtime-dom": ["@vue/runtime-dom@3.5.18", "", { "dependencies": { "@vue/reactivity": "3.5.18", "@vue/runtime-core": "3.5.18", "@vue/shared": "3.5.18", "csstype": "^3.1.3" } }, "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw=="],
+
+ "@vue/server-renderer": ["@vue/server-renderer@3.5.18", "", { "dependencies": { "@vue/compiler-ssr": "3.5.18", "@vue/shared": "3.5.18" }, "peerDependencies": { "vue": "3.5.18" } }, "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA=="],
+
+ "@vue/shared": ["@vue/shared@3.5.18", "", {}, "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA=="],
+
+ "@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="],
+
+ "@vueuse/integrations": ["@vueuse/integrations@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" }, "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" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g=="],
+
+ "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="],
+
+ "@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="],
+
+ "acorn": ["acorn@8.15.0", "", { "bin": "bin/acorn" }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+ "algoliasearch": ["algoliasearch@5.35.0", "", { "dependencies": { "@algolia/abtesting": "1.1.0", "@algolia/client-abtesting": "5.35.0", "@algolia/client-analytics": "5.35.0", "@algolia/client-common": "5.35.0", "@algolia/client-insights": "5.35.0", "@algolia/client-personalization": "5.35.0", "@algolia/client-query-suggestions": "5.35.0", "@algolia/client-search": "5.35.0", "@algolia/ingestion": "1.35.0", "@algolia/monitoring": "1.35.0", "@algolia/recommend": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg=="],
+
+ "birpc": ["birpc@2.5.0", "", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="],
+
+ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="],
+
+ "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
+
+ "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
+
+ "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="],
+
+ "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="],
+
+ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
+
+ "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="],
+
+ "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="],
+
+ "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="],
+
+ "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="],
+
+ "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
+
+ "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="],
+
+ "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="],
+
+ "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="],
+
+ "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
+
+ "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="],
+
+ "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="],
+
+ "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="],
+
+ "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="],
+
+ "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="],
+
+ "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
+
+ "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="],
+
+ "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="],
+
+ "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="],
+
+ "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
+
+ "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="],
+
+ "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
+
+ "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
+
+ "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="],
+
+ "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="],
+
+ "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="],
+
+ "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="],
+
+ "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
+
+ "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="],
+
+ "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="],
+
+ "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
+
+ "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
+
+ "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
+
+ "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
+
+ "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="],
+
+ "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="],
+
+ "dagre-d3-es": ["dagre-d3-es@7.0.11", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw=="],
+
+ "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="],
+
+ "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
+
+ "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="],
+
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "dompurify": ["dompurify@3.2.6", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ=="],
+
+ "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="],
+
+ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": "bin/esbuild" }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
+
+ "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
+
+ "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="],
+
+ "focus-trap": ["focus-trap@7.6.5", "", { "dependencies": { "tabbable": "^6.2.0" } }, "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="],
+
+ "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="],
+
+ "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="],
+
+ "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
+
+ "is-what": ["is-what@4.1.16", "", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="],
+
+ "katex": ["katex@0.16.22", "", { "dependencies": { "commander": "^8.3.0" }, "bin": "cli.js" }, "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg=="],
+
+ "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="],
+
+ "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="],
+
+ "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="],
+
+ "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="],
+
+ "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="],
+
+ "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="],
+
+ "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
+
+ "mark.js": ["mark.js@8.11.1", "", {}, "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ=="],
+
+ "marked": ["marked@16.2.0", "", { "bin": "bin/marked.js" }, "sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg=="],
+
+ "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="],
+
+ "mermaid": ["mermaid@11.10.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.0.4", "@iconify/utils": "^2.1.33", "@mermaid-js/parser": "^0.6.2", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.13", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.0.0", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-oQsFzPBy9xlpnGxUqLbVY8pvknLlsNIJ0NWwi8SUJjhbP1IT0E0o1lfhU4iYV3ubpy+xkzkaOyDUQMn06vQElQ=="],
+
+ "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "minisearch": ["minisearch@7.1.2", "", {}, "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA=="],
+
+ "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="],
+
+ "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "non-layered-tidy-tree-layout": ["non-layered-tidy-tree-layout@2.0.2", "", {}, "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw=="],
+
+ "oniguruma-to-es": ["oniguruma-to-es@3.1.1", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ=="],
+
+ "package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="],
+
+ "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="],
+
+ "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="],
+
+ "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="],
+
+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+ "preact": ["preact@10.27.1", "", {}, "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ=="],
+
+ "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="],
+
+ "regex": ["regex@6.0.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA=="],
+
+ "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
+
+ "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="],
+
+ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
+
+ "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="],
+
+ "rollup": ["rollup@4.46.3", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.46.3", "@rollup/rollup-android-arm64": "4.46.3", "@rollup/rollup-darwin-arm64": "4.46.3", "@rollup/rollup-darwin-x64": "4.46.3", "@rollup/rollup-freebsd-arm64": "4.46.3", "@rollup/rollup-freebsd-x64": "4.46.3", "@rollup/rollup-linux-arm-gnueabihf": "4.46.3", "@rollup/rollup-linux-arm-musleabihf": "4.46.3", "@rollup/rollup-linux-arm64-gnu": "4.46.3", "@rollup/rollup-linux-arm64-musl": "4.46.3", "@rollup/rollup-linux-loongarch64-gnu": "4.46.3", "@rollup/rollup-linux-ppc64-gnu": "4.46.3", "@rollup/rollup-linux-riscv64-gnu": "4.46.3", "@rollup/rollup-linux-riscv64-musl": "4.46.3", "@rollup/rollup-linux-s390x-gnu": "4.46.3", "@rollup/rollup-linux-x64-gnu": "4.46.3", "@rollup/rollup-linux-x64-musl": "4.46.3", "@rollup/rollup-win32-arm64-msvc": "4.46.3", "@rollup/rollup-win32-ia32-msvc": "4.46.3", "@rollup/rollup-win32-x64-msvc": "4.46.3", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw=="],
+
+ "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="],
+
+ "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="],
+
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "search-insights": ["search-insights@2.17.3", "", {}, "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ=="],
+
+ "shiki": ["shiki@2.5.0", "", { "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", "@shikijs/langs": "2.5.0", "@shikijs/themes": "2.5.0", "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "speakingurl": ["speakingurl@14.0.1", "", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="],
+
+ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
+
+ "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="],
+
+ "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="],
+
+ "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="],
+
+ "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="],
+
+ "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="],
+
+ "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="],
+
+ "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
+
+ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="],
+
+ "uuid": ["uuid@11.1.0", "", { "bin": "dist/esm/bin/uuid" }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
+
+ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": "bin/vite.js" }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="],
+
+ "vitepress": ["vitepress@1.6.4", "", { "dependencies": { "@docsearch/css": "3.8.2", "@docsearch/js": "3.8.2", "@iconify-json/simple-icons": "^1.2.21", "@shikijs/core": "^2.1.0", "@shikijs/transformers": "^2.1.0", "@shikijs/types": "^2.1.0", "@types/markdown-it": "^14.1.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.0", "@vue/shared": "^3.5.13", "@vueuse/core": "^12.4.0", "@vueuse/integrations": "^12.4.0", "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", "shiki": "^2.1.0", "vite": "^5.4.14", "vue": "^3.5.13" }, "peerDependencies": { "markdown-it-mathjax3": "^4", "postcss": "^8" }, "optionalPeers": ["markdown-it-mathjax3"], "bin": "bin/vitepress.js" }, "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg=="],
+
+ "vitepress-plugin-mermaid": ["vitepress-plugin-mermaid@2.0.17", "", { "optionalDependencies": { "@mermaid-js/mermaid-mindmap": "^9.3.0" }, "peerDependencies": { "mermaid": "10 || 11", "vitepress": "^1.0.0 || ^1.0.0-alpha" } }, "sha512-IUzYpwf61GC6k0XzfmAmNrLvMi9TRrVRMsUyCA8KNXhg/mQ1VqWnO0/tBVPiX5UoKF1mDUwqn5QV4qAJl6JnUg=="],
+
+ "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="],
+
+ "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="],
+
+ "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="],
+
+ "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="],
+
+ "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="],
+
+ "vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="],
+
+ "vue": ["vue@3.5.18", "", { "dependencies": { "@vue/compiler-dom": "3.5.18", "@vue/compiler-sfc": "3.5.18", "@vue/runtime-dom": "3.5.18", "@vue/server-renderer": "3.5.18", "@vue/shared": "3.5.18" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA=="],
+
+ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+ "@mermaid-js/mermaid-mindmap/@braintree/sanitize-url": ["@braintree/sanitize-url@6.0.4", "", {}, "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A=="],
+
+ "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="],
+
+ "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="],
+
+ "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="],
+
+ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
+
+ "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
+
+ "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="],
+
+ "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="],
+
+ "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="],
+
+ "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+ }
+}
diff --git a/docs/.vitepress/sidebar.ts b/docs/.vitepress/sidebar.ts
index 4aa4c165..979edfab 100644
--- a/docs/.vitepress/sidebar.ts
+++ b/docs/.vitepress/sidebar.ts
@@ -43,6 +43,7 @@ const sidebar: DefaultTheme.SidebarItem[] = [
{ text: 'Curated Scripts', link: '/features/apps/install-scripts/curated/' },
{ text: 'Contributing', link: '/features/apps/install-scripts/contributing' },
{ text: 'Schema Reference', link: '/features/apps/install-scripts/reference/schema' },
+ { text: 'Hooks Reference', link: '/features/apps/install-scripts/reference/hooks' },
{ text: 'Macros Reference', link: '/features/apps/install-scripts/reference/macros' },
{ text: 'Debugging', link: '/features/apps/install-scripts/advanced/debugging' },
]
@@ -129,6 +130,7 @@ const sidebar: DefaultTheme.SidebarItem[] = [
collapsed: true,
items: [
{ text: 'All Posts', link: '/blog/' },
+ { text: 'App Preconfiguration', link: '/blog/2026-06-18' },
{ text: '1.0 Local Rollout Complete', link: '/blog/2026-04-21' },
{ text: 'HexOS 1.0 Has Arrived', link: '/blog/2026-04-02' },
{ text: 'Apps Overhaul', link: '/blog/2025-12-26' },
diff --git a/docs/blog/2026-06-18.md b/docs/blog/2026-06-18.md
new file mode 100644
index 00000000..e3624e83
--- /dev/null
+++ b/docs/blog/2026-06-18.md
@@ -0,0 +1,72 @@
+# Stop Configuring. Start Using. HexOS Now Preconfigures Your Apps For You.
+**June 18, 2026**
+
+*By Jon Panozzo*
+
+Maybe you've heard about home servers. Maybe a friend won't stop talking about how they cut their streaming subscriptions and built their own private media library. Maybe you watched a YouTube video that made it look incredible — your movies, your music, your photos, all in one place, accessible from anywhere, completely under your control.
+
+And then you tried to actually set one up. And it wasn't like the video made it look.
+
+That gap — between how exciting the idea sounds and how overwhelming the reality feels — is exactly what HexOS was built to close. This week, we're taking one of our biggest steps yet toward that goal. We got to demo it live during the **June 12th LinusTechTips WAN Show**. If you missed it, keep reading.
+
+## First, Some Honest Talk About Home Servers
+
+Here's something the enthusiast community doesn't always say out loud: setting up a home server is hard. Not impossible, but genuinely, surprisingly hard — especially when you're doing it for the first time.
+
+Installing the hardware or the operating system is just the beginning. Every application you want to run has its own setup process. And unlike installing an app on your phone, home server apps don't just work out of the box. They expect you to know things. Things like what Docker is. What an environment variable is. What a port mapping is. What a file path looks like and why it matters.
+
+If none of those terms mean anything to you, that's completely normal. Most people getting into home servers for the first time feel exactly the same way. And that's a problem, because none of those things are what you actually wanted when you decided to build a home server. You wanted the apps. You wanted the experience. You wanted the control and the privacy that comes with owning your own setup.
+
+The technical concepts are just obstacles standing between you and that.
+
+## Introducing Application Preconfiguration
+
+Today, HexOS is introducing **Application Preconfiguration**: a feature that automatically handles the post-install setup of select apps on your behalf, so that when you open an app for the first time, it's already configured and ready to use.
+
+Not every app supports this yet. We're rolling it out starting with the apps where setup friction is highest and the payoff for eliminating it is greatest. The first three are **Plex**, **Jellyfin**, and **Emby**, three of the most popular media servers in the home server community. More apps will follow. But to understand why this matters, it helps to understand what setting up one of these apps normally involves.
+
+## What Installing a Media Server Actually Feels Like
+
+Let's say you've decided to try Plex. You've heard great things. You install it on HexOS, you click launch, and now Plex is staring at you, waiting.
+
+The first thing it wants you to do is sign in to a Plex account to "claim" your server. Okay, you make an account, you sign in, and you're sent back to a dashboard. Now Plex wants you to name your server. Fine. But then it asks you to create your media libraries, and this is where things start to get confusing.
+
+A "library" in Plex is essentially a folder on your system that Plex monitors for content. You need one for Movies, one for TV Shows, one for Music, one for Photos. For each library, Plex needs you to point it to the exact folder path on your system where that content lives. But if you're new to this, you're now asking yourself questions you didn't expect to be asking: *Do these folders exist yet? Where are they supposed to be? Am I supposed to have created them already? What does this path even mean?*
+
+So you open a second browser tab to look it up. The first guide you find is from 2021 and references a version of Plex that looks nothing like what's on your screen. You try another. That one assumes you already know what a mount point is. You're now three tabs deep, reading forum posts, trying to figure out a prerequisite to a prerequisite, and you haven't even gotten the app working yet.
+
+This is what cognitive overload feels like in practice. It's not one hard thing. It's a cascade of unfamiliar concepts, each one blocking the next, each one pulling your attention further from the reason you started. And for a lot of people, this is the moment they close the laptop and decide home servers just aren't for them.
+
+That's the moment we're trying to eliminate.
+
+## How Preconfiguration Works
+
+Rather than walk through it in text, here's a short video that shows exactly what the experience looks like:
+
+
+
+## Why We Started With Plex (And Then Kept Going)
+
+Plex was the natural starting point for preconfiguration. It's one of the most requested apps in the HexOS community, and its setup process is a textbook example of the friction we're trying to eliminate.
+
+But when Plex announced plans to significantly raise their lifetime license pricing ahead of July, we moved fast. We didn't want our users to feel like they only had one option. So alongside Plex, we immediately prioritized preconfiguration support for **Jellyfin**, a fully open-source alternative that requires no Plex account at all, and **Emby**, giving you a real choice of media server, all with the same seamless setup experience.
+
+All three launch this Thursday.
+
+## This Is What HexOS Is For
+
+The appeal of a home server is real: more control over your data, more privacy, software that works for you instead of the other way around. But for too long, the cost of entry has been a steep and discouraging learning curve that has nothing to do with any of that.
+
+HexOS exists to change that equation. We handle the infrastructure, the complexity, the configuration — so you can focus on the part that actually matters: using your apps and experiencing what your home server can do.
+
+Application preconfiguration is that philosophy applied directly to the apps themselves. Not just making them easy to install, but making them genuinely ready to use the moment installation is done. No second browser tab. No forum posts. No wondering if you did it right.
+
+Just open the app and go.
+
+This is the first of many apps we'll be bringing this experience to. Anywhere we see an opportunity to take something off your plate and get you to that *"wait, this is actually incredible"* moment faster, we're going to take it.
+
+Because that moment is worth it. You just shouldn't have to fight for it.
+
+**Application preconfiguration for Plex, Jellyfin, and Emby is available now.** If you've been curious about home servers but intimidated by where to start, this is exactly the kind of thing HexOS was built for.
diff --git a/docs/blog/index.md b/docs/blog/index.md
index 41bb43ed..da35de11 100644
--- a/docs/blog/index.md
+++ b/docs/blog/index.md
@@ -4,6 +4,7 @@ Stay up to date with the latest news and updates from the HexOS team.
## 2026
+- [HexOS Now Preconfigures Your Apps For You - June 18, 2026](/blog/2026-06-18)
- [HexOS 1.0 Local Rollout Complete - April 21, 2026](/blog/2026-04-21)
- [HexOS 1.0 Has Arrived - April 2, 2026](/blog/2026-04-02)
diff --git a/docs/features/apps/install-scripts/advanced/debugging.md b/docs/features/apps/install-scripts/advanced/debugging.md
index a8e6efd4..b2934aaf 100644
--- a/docs/features/apps/install-scripts/advanced/debugging.md
+++ b/docs/features/apps/install-scripts/advanced/debugging.md
@@ -1,17 +1,35 @@
## Debugging Workflow : Troubleshooting Failed Installations
-If an install scripts fails, this will help:
+If an install script fails, this will help:
### 1. Check HexOS Task Failure
1. In the HexOS UI, check your notifications for an app install failure
2. Click the notification to view the error message
-### 2. Check TrueNAS Job Failure
+### 2. Check Hook Failures (V5 Scripts)
+
+If your install script uses lifecycle hooks, hook tasks appear as children of the main install task in the HexOS activity center:
+
+1. Open the **Activity Center** (bell icon) in the HexOS UI
+2. Expand the install task to see individual hook steps
+3. Each hook shows its checkpoints and current status
+4. If a hook failed:
+ - Click **View Details** to see structured error context (endpoint, status code, etc.)
+ - Click **Retry** to re-run the hook from the failed checkpoint
+ - Click **Skip** to skip the hook and continue (if allowed)
+
+**Common hook failure causes:**
+- **App not ready** — the container hasn't finished starting. Increase the hook's `timeout` or add a longer delay in `waitForApp()`
+- **Network unreachable** — the hook can't reach the app's HTTP endpoint. Check that the port is correct and the app binds to `0.0.0.0`
+- **OAuth timeout** — the user didn't complete the OAuth flow within the time limit. Retry the hook to get a fresh OAuth prompt
+- **Missing input** — a required hook input wasn't provided. Check your `inputs` declarations
+
+### 3. Check TrueNAS Job Failure
1. Navigate to the TrueNAS web interface (e.g., `https://10.0.1.13`)
2. Go to **Jobs** section to view the installation job details
3. Look for error messages in the detailed job output
-### 3. Check Application Logs (if app installed but won't start)
+### 4. Check Application Logs (if app installed but won't start)
**Option A: TrueNAS Apps UI (if container is running)**
1. Navigate to `https://10.0.1.13/ui/apps/installed`
2. Click on the app, under `Workloads > Containers`, click the "View Logs" button
@@ -23,7 +41,7 @@ If an install scripts fails, this will help:
3. Copy the container ID
4. Run `sudo docker logs ` to view detailed logs
-### 3. Common Issues and Solutions
+### 5. Common Issues and Solutions
#### Permission Errors
- **Symptom**: App fails to start, logs show permission denied errors
@@ -38,5 +56,12 @@ If an install scripts fails, this will help:
- **Symptom**: TrueNAS job fails with validation errors
- **Solution**: Compare your `app_values` structure with the official TrueNAS app schema
+#### Hook Script Errors
+- **Symptom**: Hook task shows `AWAITING_RETRY` with an error message
+- **Solution**: Check the error context details for the specific failure. Common fixes:
+ - Ensure the `entrypoint` function name matches what's exported in your script
+ - Verify the app's API endpoint path is correct
+ - Confirm all `await` keywords are present on async calls
+
### Future Improvements
The current debugging workflow requires accessing the TrueNAS interface directly, in the future we plan to expose more of this debugging workflow within HexOS's UI.
diff --git a/docs/features/apps/install-scripts/contributing.md b/docs/features/apps/install-scripts/contributing.md
index 3e1ae316..a57af2dd 100644
--- a/docs/features/apps/install-scripts/contributing.md
+++ b/docs/features/apps/install-scripts/contributing.md
@@ -1,10 +1,77 @@
-# Contributing a new app
+# Contributing a New App
-Want to add your app curation to the official HexOS catalog? Follow these steps to contribute your install script, or share it in our forums first to get community feedback:
+Want to add your app curation to the official HexOS catalog? Install scripts now live in the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repository — this is the single source of truth for all curated and community install scripts.
-1. Test your custom curation in HexOS and verify it works reliably
-2. Click [Here](https://github.com/eshtek/hexos-docs/new/main/docs/public/install-scripts) to start the contribution process
-3. Click the green "Fork this repository" button
-4. Paste the contents of your install script into the editor and press the green "Commit Changes"
-5. Click the green "Create pull request" on the following page
-6. In your PR description, include any special requirements (unique mounts, GPU usage, special environment variables, etc.)
+## Contribution Steps
+
+1. **Test your install script** in HexOS using Custom Install (Expert Mode) and verify it works reliably
+2. **Fork** the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repository
+3. **Add your install script** as a JSON file named after the TrueNAS app (e.g., `myapp.json`)
+4. **If your script includes hooks** (V5), add the hook `.ts` files in a subdirectory (e.g., `myapp/myapp_hook.ts`) — or use inline `scriptContent` for simpler hooks
+5. **Submit a Pull Request** with a description of:
+ - What the app does
+ - Any special requirements (unique mounts, GPU usage, special environment variables)
+ - What the hooks do (if V5)
+
+## Repository Structure
+
+```
+hexos-app-catalog/
+├── _lib/
+│ └── hook_context.ts # HookContext type stubs (import for autocompletion)
+├── myapp.json # Your install script (V4 or V5)
+├── myapp/ # Hook scripts directory (V5 only, optional)
+│ └── myapp_hook.ts # Hook implementation
+├── plex.json # Example: first-party V5 with hooks
+├── plex/
+│ └── plex_hook.ts
+├── jellyfin.json # Example: V4 script (no hooks)
+└── ...
+```
+
+## Script Format
+
+- **V4**: Standard install scripts without hooks. Set `"version": 4`.
+- **V5**: Install scripts with lifecycle hooks. Set `"version": 5` and add a `hooks` array. See the [Hooks Reference](/features/apps/install-scripts/reference/hooks) for details.
+
+Both formats are fully supported. Use V5 only if your app benefits from post-install automation.
+
+## Using Inline Hooks (`scriptContent`)
+
+Community contributors who don't need separate `.ts` files can embed hook code directly in the JSON using the `scriptContent` field. This keeps everything in a single file:
+
+```json
+{
+ "version": 5,
+ "custom": true,
+ "metadata": { "name": "My App", "description": "...", "icon": "...", "version": "1.0.0" },
+ "hooks": [
+ {
+ "id": "health-check",
+ "event": "onAfterInstall",
+ "scriptContent": "export async function setup(ctx) {\n await ctx.waitForApp('/health');\n await ctx.emitCheckpoint('ready');\n}",
+ "entrypoint": "setup",
+ "timeout": 60,
+ "description": "Post-install health check",
+ "optional": true
+ }
+ ]
+}
+```
+
+::: tip Testing with Custom Install
+You can test inline hook scripts using **Custom Install in Expert Mode** — paste your V5 JSON with `scriptContent` hooks directly into the editor and run it. This is useful for development and testing before submitting a PR. Inline scripts should not be part of a PR submission for testing purposes only — submit them when they're ready for production use.
+:::
+
+## Best Practices
+
+- Use the [Schema Reference](/features/apps/install-scripts/reference/schema) and [Macros Reference](/features/apps/install-scripts/reference/macros) to understand all available fields and template variables
+- Browse existing scripts in the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) for real-world examples
+- Test thoroughly before submitting — both fresh installs and upgrades
+- Keep hooks focused and use `optional: true` for non-critical automation
+- Use `$LOCATION()` macros instead of hardcoded paths
+- Declare `owner` on directories that need specific permissions
+
+## Sharing Before Contributing
+
+Not ready for a PR? Share your install script JSON in the [HexOS Community Forums](https://forums.hexos.com) to get feedback from other users first.
diff --git a/docs/features/apps/install-scripts/curated/index.md b/docs/features/apps/install-scripts/curated/index.md
index 5970eec2..f480253e 100644
--- a/docs/features/apps/install-scripts/curated/index.md
+++ b/docs/features/apps/install-scripts/curated/index.md
@@ -1,34 +1,17 @@
# Apps (Curated Scripts)
-
-| App | Download | Size | Last Modified |
-|---|---|---:|---|
-| `bazarr` | [bazarr.json](/install-scripts/bazarr.json) | 1.4 KB | 2026-05-15 |
-| `blinko` | [blinko.json](/install-scripts/blinko.json) | 1.3 KB | 2026-05-20 |
-| `dozzle` | [dozzle.json](/install-scripts/dozzle.json) | 614 B | 2026-05-18 |
-| `drawio` | [drawio.json](/install-scripts/drawio.json) | 634 B | 2026-05-15 |
-| `emby` | [emby.json](/install-scripts/emby.json) | 2.3 KB | 2026-05-15 |
-| `excalidraw` | [excalidraw.json](/install-scripts/excalidraw.json) | 614 B | 2026-05-18 |
-| `fladder` | [fladder.json](/install-scripts/fladder.json) | 566 B | 2026-05-24 |
-| `handbrake` | [handbrake.json](/install-scripts/handbrake.json) | 1.9 KB | 2026-05-15 |
-| `home-assistant` | [home-assistant.json](/install-scripts/home-assistant.json) | 1.4 KB | 2026-05-15 |
-| `immich` | [immich.json](/install-scripts/immich.json) | 1.6 KB | 2026-05-15 |
-| `jellyfin` | [jellyfin.json](/install-scripts/jellyfin.json) | 2.3 KB | 2026-05-15 |
-| `jellystat` | [jellystat.json](/install-scripts/jellystat.json) | 1.6 KB | 2026-05-28 |
-| `lidarr` | [lidarr.json](/install-scripts/lidarr.json) | 1.4 KB | 2026-05-15 |
-| `lubelogger` | [lubelogger.json](/install-scripts/lubelogger.json) | 1.5 KB | 2026-05-18 |
-| `mkvtoolnix` | [mkvtoolnix.json](/install-scripts/mkvtoolnix.json) | 2.2 KB | 2026-06-05 |
-| `navidrome` | [navidrome.json](/install-scripts/navidrome.json) | 5.1 KB | 2026-05-18 |
-| `nextcloud` | [nextcloud.json](/install-scripts/nextcloud.json) | 3.4 KB | 2026-05-20 |
-| `peanut` | [peanut.json](/install-scripts/peanut.json) | 911 B | 2026-05-15 |
-| `plex` | [plex.json](/install-scripts/plex.json) | 3.4 KB | 2026-05-15 |
-| `portracker` | [portracker.json](/install-scripts/portracker.json) | 894 B | 2026-05-18 |
-| `prowlarr` | [prowlarr.json](/install-scripts/prowlarr.json) | 781 B | 2026-05-15 |
-| `qbittorrent` | [qbittorrent.json](/install-scripts/qbittorrent.json) | 1.0 KB | 2026-05-15 |
-| `qui` | [qui.json](/install-scripts/qui.json) | 865 B | 2026-06-05 |
-| `radarr` | [radarr.json](/install-scripts/radarr.json) | 1.3 KB | 2026-05-15 |
-| `scrutiny` | [scrutiny.json](/install-scripts/scrutiny.json) | 1.4 KB | 2026-05-15 |
-| `seerr` | [seerr.json](/install-scripts/seerr.json) | 924 B | 2026-05-22 |
-| `sonarr` | [sonarr.json](/install-scripts/sonarr.json) | 1.3 KB | 2026-05-15 |
-| `syncthing` | [syncthing.json](/install-scripts/syncthing.json) | 2.6 KB | 2026-05-15 |
-
+Curated install scripts are maintained in the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repository. This is the single source of truth — scripts are synced from this repo to HexOS automatically.
+
+::: info Repository Migration
+Install scripts have moved from this documentation site to the dedicated [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repository. All contributions, bug fixes, and new scripts should be submitted there. See [Contributing](/features/apps/install-scripts/contributing) for details.
+:::
+
+## Browse Scripts
+
+**[Browse hexos-app-catalog on GitHub](https://github.com/eshtek/hexos-app-catalog)**
+
+Each `.json` file in the repository root is an install script. Apps with lifecycle hooks (V5) also have a subdirectory containing their hook `.ts` files (e.g., `plex/plex_hook.ts`).
+
+## Want to Contribute?
+
+See the [Contributing Guide](/features/apps/install-scripts/contributing) for how to submit your own install script to the catalog.
diff --git a/docs/features/apps/install-scripts/overview.md b/docs/features/apps/install-scripts/overview.md
index ce75fcbd..ab603719 100644
--- a/docs/features/apps/install-scripts/overview.md
+++ b/docs/features/apps/install-scripts/overview.md
@@ -9,6 +9,7 @@ Install scripts are a curated, turnkey solution for installing applications thro
- **Best practices built-in** - All configurations follow recommended settings
- **One-click installation** - Simplified installation process
- **Curated experience** - Apps are pre-tested and optimized
+- **Post-install automation** - Lifecycle hooks can handle app setup after installation (V5)
### Current Capabilities
- Configures all fields that TrueNAS exposes during app installation
@@ -16,9 +17,15 @@ Install scripts are a curated, turnkey solution for installing applications thro
- Configures resource allocation (CPU, memory, GPU)
- Sets up networking and port mappings
- Manages storage mounts and paths
+- **Lifecycle hooks** — run automated setup steps before or after install and upgrade (V5)
-### Future Capabilities (Local UI)
-Once the Local UI feature is complete, these install scripts are able to do much more; ultimately bypassing any post-installation setup of these apps entirely.
+### What's New in V5: Lifecycle Hooks
+
+V5 install scripts introduce **lifecycle hooks** — TypeScript functions that execute at specific points during app install and upgrade. Hooks enable post-install automation like health checks, service configuration, OAuth login, and more — all without the user needing to open the app's own UI.
+
+V5 is a strict superset of V4. The only new field is `hooks`. An existing V4 script can be promoted to V5 by changing `"version": 4` to `"version": 5` and optionally adding a `hooks` array.
+
+For full details, see the [Hooks Reference](/features/apps/install-scripts/reference/hooks).
## How to Use Install Scripts
@@ -34,6 +41,7 @@ For supported applications, the installation process is streamlined:
- Allocate appropriate system resources
- Mount required storage paths
- Handle any app-specific requirements
+ - Run lifecycle hooks for post-install setup (V5 apps)
### Custom Installation
For apps not yet curated or when you need to customize the configuration:
@@ -49,17 +57,21 @@ For apps not yet curated or when you need to customize the configuration:
### Best Practices and Common Pitfalls
#### Best Practices
-- **Use V4 format** — all new install scripts must use `"version": 4`
+- **Use V5 format for new scripts with hooks**, or **V4 for scripts without hooks** — both are fully supported
- **Always use `$LOCATION()` macros** for paths instead of hardcoded paths
- **Use `$HOST_PATH()` and `$MOUNTED_HOST_PATH()`** for storage configuration instead of manual object creation
-- **All directory entries must be objects** — bare strings in `ensure_directories_exists` are no longer supported in V4
+- **All directory entries must be objects** — bare strings in `ensure_directories_exists` are no longer supported
- **Declare ownership** with the `owner` field for apps that require specific user/group ownership (e.g., `"postgres"`, `"apps"`)
- **Add `snapshot` config** on data and config directories to enable automatic pre-update ZFS snapshots
- **Use `$MEMORY()` for dynamic memory allocation** to ensure apps work across different system configurations
- **Reference TrueNAS app schemas** from the [official apps repository](https://github.com/truenas/apps) for `app_values` structure
+- **Keep hook scripts focused** — each hook should do one thing (health check, configuration, library setup)
+- **Use `optional: true`** on hooks that are nice-to-have but shouldn't block app installation if they fail
#### Common Pitfalls
- **Permission issues** are the most common cause of failures - both during installation and at runtime
- **Hardcoded paths** break when users have custom location preferences
- **Missing directory creation** can cause apps to fail during installation
-- **Incorrect `app_values` structure** for the specific TrueNAS app version
\ No newline at end of file
+- **Incorrect `app_values` structure** for the specific TrueNAS app version
+- **Missing `await`** in hook scripts — all `ctx` methods are async and must be awaited
+- **Hook timeout too short** — apps can take 30-60 seconds to become responsive after container creation; use `ctx.waitForApp()` with appropriate timeouts
\ No newline at end of file
diff --git a/docs/features/apps/install-scripts/reference/hooks.md b/docs/features/apps/install-scripts/reference/hooks.md
new file mode 100644
index 00000000..779512bd
--- /dev/null
+++ b/docs/features/apps/install-scripts/reference/hooks.md
@@ -0,0 +1,445 @@
+# Lifecycle Hooks Reference
+
+Lifecycle hooks are TypeScript functions that execute at specific points during app install and upgrade. They enable post-install automation like health checks, service configuration, OAuth login, library creation, and more.
+
+Hooks are a **V5** feature. To use hooks, set `"version": 5` in your install script and add a `hooks` array.
+
+## Hook Events
+
+| Event | When it fires |
+|---|---|
+| `onBeforeInstall` | Before `app.create` is called on TrueNAS |
+| `onAfterInstall` | After `app.create` completes successfully |
+| `onBeforeUpgrade` | Before `app.upgrade` is called on TrueNAS |
+| `onAfterUpgrade` | After `app.upgrade` completes successfully |
+
+## Hook Declaration
+
+Each entry in the `hooks` array is a hook declaration:
+
+```json
+{
+ "id": "setup-myapp",
+ "event": "onAfterInstall",
+ "script": "myapp/myapp_hook.ts",
+ "entrypoint": "afterInstall",
+ "timeout": 120,
+ "description": "Setting up MyApp",
+ "optional": false,
+ "retries": 1
+}
+```
+
+### Declaration Properties
+
+| Property | Type | Required | Description |
+|---|---|---|---|
+| `id` | string | Yes | Unique identifier within the script |
+| `event` | string | Yes | One of the [hook events](#hook-events) above |
+| `script` | string | No | Path to a `.ts` file in the catalog repo (e.g., `"myapp/myapp_hook.ts"`) |
+| `scriptContent` | string | No | Inline TypeScript code embedded directly in the JSON |
+| `entrypoint` | string | Yes | Name of the exported async function to call |
+| `timeout` | number | No | Maximum execution time in seconds (default: 300) |
+| `description` | string | No | Human-readable label shown in the HexOS activity center |
+| `optional` | boolean | No | If `true`, hook failure is non-blocking — the app install continues |
+| `retries` | number | No | Number of automatic retry attempts on failure (default: 0) |
+| `condition` | object | No | Version-based guards for upgrade hooks (see [Conditions](#version-conditions)) |
+| `inputs` | array | No | OAuth or question inputs to collect from the user before execution (see [Inputs](#hook-inputs)) |
+| `userOptional` | object | No | Allows the user to opt out of this hook during install (see [User Optional](#user-optional-hooks)) |
+
+::: warning script vs scriptContent
+Every hook must have exactly one of `script` or `scriptContent` — never both, never neither. The schema enforces this with a validation rule.
+
+- **`script`** — references an external `.ts` file in the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repo. Used by first-party curated hooks.
+- **`scriptContent`** — embeds the TypeScript code directly in the JSON. Used by community contributions for self-contained simplicity.
+:::
+
+## Writing a Hook Script
+
+Hook scripts are TypeScript files that export an async function. The function receives a `HookContext` object with methods for interacting with the app and reporting progress.
+
+### File-Based Hook (first-party)
+
+Create a directory for your app in the catalog repo with a `.ts` file:
+
+```
+hexos-app-catalog/
+├── myapp/
+│ └── myapp_hook.ts
+└── myapp.json
+```
+
+```typescript
+// myapp/myapp_hook.ts
+import type { HookContext } from "../_lib/hook_context";
+
+export async function afterInstall(ctx: HookContext) {
+ await ctx.registerCheckpoints([
+ { id: "ready", message: "Waiting for app to start" },
+ { id: "configured", message: "Configuring app" },
+ ]);
+
+ await ctx.waitForApp("/health");
+ await ctx.emitCheckpoint("ready");
+
+ // Do configuration via the app's API...
+ await ctx.emitCheckpoint("configured");
+}
+```
+
+Reference it in the install script JSON:
+
+```json
+{
+ "version": 5,
+ "hooks": [
+ {
+ "id": "configure-myapp",
+ "event": "onAfterInstall",
+ "script": "myapp/myapp_hook.ts",
+ "entrypoint": "afterInstall",
+ "timeout": 120,
+ "description": "Setting up MyApp"
+ }
+ ]
+}
+```
+
+### Inline Hook (community `scriptContent`)
+
+Embed the code directly in the JSON — no external files needed:
+
+```json
+{
+ "version": 5,
+ "custom": true,
+ "metadata": {
+ "name": "My App",
+ "description": "A custom community app",
+ "icon": "https://example.com/icon.svg",
+ "version": "1.0.0"
+ },
+ "hooks": [
+ {
+ "id": "health-check",
+ "event": "onAfterInstall",
+ "scriptContent": "export async function setup(ctx) {\n await ctx.waitForApp('/health');\n ctx.log('App is ready');\n await ctx.emitCheckpoint('ready');\n}",
+ "entrypoint": "setup",
+ "timeout": 60,
+ "description": "Post-install health check"
+ }
+ ]
+}
+```
+
+::: tip Testing inline hooks
+The `scriptContent` field is useful for **testing hooks via Custom Install in Expert Mode** — you can paste a V5 JSON with inline hooks directly into the editor and run it immediately. This is a development and testing workflow only; inline scripts submitted via PR go through the same review process as file-based hooks.
+:::
+
+## HookContext API
+
+The `HookContext` object is passed to your hook function. It provides everything needed to interact with the installed app, report progress, and handle errors.
+
+### Properties
+
+| Property | Type | Description |
+|---|---|---|
+| `resourceType` | `string` | Always `"app"` (future: `"vm"`, etc.) |
+| `resourceId` | `string` | The app ID (e.g., `"plex"`) |
+| `event` | `string` | The triggering event (e.g., `"onAfterInstall"`) |
+| `fromVersion` | `string?` | Previous app version (upgrade only) |
+| `toVersion` | `string?` | Target app version (upgrade only) |
+| `host` | `string?` | TrueNAS LAN IP address |
+| `port` | `number?` | App's primary exposed port |
+| `baseUrl` | `string` | `http://{host}:{port}` — empty string if unavailable |
+| `inputs` | `Record` | User-collected input values from [hook inputs](#hook-inputs) |
+
+### Methods
+
+#### Checkpoint Management
+
+Checkpoints represent progress steps shown to the user in the HexOS activity center.
+
+| Method | Description |
+|---|---|
+| `registerCheckpoints(checkpoints)` | Register all checkpoints upfront for UI display. Each checkpoint has `{ id, message }`. |
+| `emitCheckpoint(id, message?, progress?)` | Mark a checkpoint as completed. Optionally update its message and set a progress percentage. |
+| `updateCheckpointMessage(id, message)` | Update a checkpoint's message without completing it. |
+| `skipCheckpoint(id, message?)` | Mark a checkpoint as skipped. |
+
+#### Utilities
+
+| Method | Description |
+|---|---|
+| `log(message)` | Log a message to the backend logger (not shown to the user). |
+| `sleep(ms)` | Async delay for the given number of milliseconds. |
+| `waitForApp(path, opts?)` | Poll the app's HTTP endpoint until it responds. Uses exponential backoff (40 attempts by default). Options: `{ timeout?, retries?, method?, expectedStatus? }` |
+
+#### Error Handling
+
+| Method | Description |
+|---|---|
+| `fail(message, context?)` | Throw a structured error. `context` is an array of `{ label, value }` pairs for diagnostic display. |
+| `awaitCheckpointRetry(checkpointId, error, context?)` | Pause the hook at a failed checkpoint and wait for the user to click Retry or Skip. Returns `"retry"` or `"skip"`. |
+
+#### Input Access
+
+| Method | Description |
+|---|---|
+| `getInput(inputId, schema?)` | Type-safe accessor for user-collected inputs. Throws if the input is missing. |
+
+## Version Conditions
+
+Hooks can be restricted to specific version transitions during upgrades:
+
+```json
+{
+ "id": "migrate-config",
+ "event": "onBeforeUpgrade",
+ "condition": {
+ "fromVersionRange": "< 2.0.0",
+ "toVersionRange": ">= 2.0.0"
+ },
+ "script": "myapp/migrate.ts",
+ "entrypoint": "migrateConfig",
+ "description": "Migrating config for v2"
+}
+```
+
+Both `fromVersionRange` and `toVersionRange` use [semver range syntax](https://www.npmjs.com/package/semver#ranges). The hook only fires if both conditions match (when both are specified).
+
+## Hook Inputs
+
+Hooks can declare inputs that are collected from the user before the hook runs. The HexOS UI shows an input dialog when the hook enters the `AWAITING_INPUT` state.
+
+### OAuth Input
+
+```json
+{
+ "inputs": [
+ {
+ "type": "oauth",
+ "id": "plex_login",
+ "name": "Sign in to Plex",
+ "description": "Required for server claim and library setup",
+ "provider": "plex",
+ "flow": {
+ "type": "pin",
+ "pinUrl": "https://plex.tv/api/v2/pins",
+ "authUrl": "https://app.plex.tv/auth#?clientID={clientId}&code={code}",
+ "pollUrl": "https://plex.tv/api/v2/pins/{pinId}",
+ "clientId": "your-client-id",
+ "tokenField": "authToken",
+ "headers": { "Accept": "application/json" }
+ }
+ }
+ ]
+}
+```
+
+### Question Input
+
+```json
+{
+ "inputs": [
+ {
+ "type": "question",
+ "id": "library_name",
+ "question": {
+ "question": "Library Name",
+ "description": "Name for the media library to create",
+ "type": "text",
+ "key": "library_name",
+ "default": "Movies"
+ }
+ }
+ ]
+}
+```
+
+Access input values in your hook script:
+
+```typescript
+const { authToken } = ctx.getInput<{ authToken: string }>("plex_login");
+const libraryName = ctx.getInput("library_name");
+```
+
+## User Optional Hooks
+
+Hooks with `userOptional` show a toggle switch in the install dialog, letting the user decide whether to run the hook:
+
+```json
+{
+ "id": "auto-setup",
+ "event": "onAfterInstall",
+ "userOptional": {
+ "label": "Automatically configure MyApp",
+ "description": "Signs in and sets up your libraries. You can do this manually later.",
+ "default": true
+ }
+}
+```
+
+### userOptional Properties
+
+| Property | Type | Required | Description |
+|---|---|---|---|
+| `label` | string | Yes | Short label displayed next to the toggle switch |
+| `description` | string | No | Explanatory text shown below the toggle |
+| `default` | boolean | No | Whether the toggle is on by default (default: `true`) |
+| `link` | object | No | A link rendered inline at the end of the description (see below) |
+
+### Adding a Link
+
+Use the `link` property to display a clickable link after the description text. This is useful when your hook performs an action that requires the user to acknowledge external terms of service or documentation.
+
+```json
+{
+ "id": "configure-plex",
+ "event": "onAfterInstall",
+ "userOptional": {
+ "label": "Pre-configure Plex",
+ "description": "Sign in to your Plex account to automatically claim your server, set preferences, and create media libraries. By enabling this, you agree that HexOS will accept the Plex Terms of Service on your behalf.",
+ "default": true,
+ "link": {
+ "url": "https://www.plex.tv/about/privacy-legal/plex-terms-of-service/",
+ "label": "Plex Terms of Service"
+ }
+ }
+}
+```
+
+| Property | Type | Required | Description |
+|---|---|---|---|
+| `link.url` | string | Yes | Fully qualified URL (must pass URL validation) |
+| `link.label` | string | Yes | Clickable text displayed as the link |
+
+The link opens in a new tab. It renders inline at the end of the description paragraph, styled as a branded underlined link.
+
+::: tip When to use a link
+If your hook accepts terms, agrees to a EULA, or performs an action governed by a third-party service's policies on behalf of the user, include a `link` to the relevant terms so the user can review them before opting in.
+:::
+
+During upgrades, `userOptional` hooks are automatically excluded — only non-optional hooks run.
+
+## Hook Execution Flow
+
+### Install
+
+1. User confirms install (with optional hook opt-ins)
+2. `onBeforeInstall` hooks run sequentially (blocks app creation)
+3. TrueNAS `app.create` executes
+4. `onAfterInstall` hooks run sequentially (blocks task completion)
+5. Parent install task completes when all required hooks finish
+
+### Upgrade
+
+Same pattern with `onBeforeUpgrade` and `onAfterUpgrade`. Only hooks matching the version [conditions](#version-conditions) run. `userOptional` hooks are excluded.
+
+### Failure Handling
+
+When a non-optional hook fails after all auto-retries:
+
+1. The hook task enters `AWAITING_RETRY` state
+2. The user sees Retry and Skip buttons in the activity center
+3. **Retry** re-executes the hook from the beginning (or from the failed checkpoint if using `awaitCheckpointRetry`)
+4. **Skip** marks the hook as skipped and allows the parent task to complete
+
+Optional hooks (`optional: true`) are automatically skipped on failure without blocking the install.
+
+## Checkpoint Retry Pattern
+
+For hooks with multiple steps, use `awaitCheckpointRetry` to let users retry individual steps without restarting the entire hook:
+
+```typescript
+export async function afterInstall(ctx: HookContext) {
+ await ctx.registerCheckpoints([
+ { id: "movies", message: "Creating Movies library" },
+ { id: "shows", message: "Creating Shows library" },
+ ]);
+
+ // Create Movies library
+ try {
+ await createLibrary("Movies");
+ await ctx.emitCheckpoint("movies");
+ } catch (err) {
+ const action = await ctx.awaitCheckpointRetry("movies", err.message, [
+ { label: "Endpoint", value: "POST /library/sections" },
+ { label: "Status", value: err.status },
+ ]);
+ if (action === "skip") {
+ await ctx.skipCheckpoint("movies", "Skipped by user");
+ } else {
+ // Retry logic...
+ }
+ }
+}
+```
+
+## Custom App Metadata
+
+When `custom: true`, the `metadata` field is required:
+
+```json
+{
+ "version": 5,
+ "custom": true,
+ "metadata": {
+ "name": "My Custom App",
+ "description": "A brief description of what the app does",
+ "icon": "https://example.com/icon.svg",
+ "version": "1.0.0"
+ }
+}
+```
+
+Custom apps appear in the HexOS app store alongside standard TrueNAS catalog apps. The `internal: true` flag hides them in production (useful for test apps).
+
+## Complete V5 Example
+
+```json
+{
+ "version": 5,
+ "script": {
+ "version": "1.0.0",
+ "changeLog": "Initial release with post-install health check"
+ },
+ "requirements": {
+ "locations": ["ApplicationsPerformance"],
+ "specifications": ["1CORE", "200MB"],
+ "permissions": ["READ_WRITE_LOCATIONS"],
+ "ports": [8080]
+ },
+ "ensure_directories_exists": [
+ {
+ "path": "$LOCATION(ApplicationsPerformance)/myapp/config",
+ "owner": { "user": "apps" },
+ "snapshot": { "id": "config" }
+ }
+ ],
+ "app_values": {
+ "storage": {
+ "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/myapp/config)"
+ },
+ "network": {
+ "web_port": { "port_number": 8080 }
+ },
+ "resources": {
+ "limits": {
+ "memory": "$MEMORY(5%, 200)"
+ }
+ }
+ },
+ "hooks": [
+ {
+ "id": "health-check",
+ "event": "onAfterInstall",
+ "scriptContent": "export async function afterInstall(ctx) {\n await ctx.registerCheckpoints([\n { id: 'ready', message: 'Waiting for app' }\n ]);\n await ctx.waitForApp('/health');\n await ctx.emitCheckpoint('ready');\n}",
+ "entrypoint": "afterInstall",
+ "timeout": 120,
+ "description": "Checking app health",
+ "optional": true
+ }
+ ]
+}
+```
diff --git a/docs/features/apps/install-scripts/reference/schema.md b/docs/features/apps/install-scripts/reference/schema.md
index b7ea6dbd..5867f747 100644
--- a/docs/features/apps/install-scripts/reference/schema.md
+++ b/docs/features/apps/install-scripts/reference/schema.md
@@ -2,9 +2,16 @@
Install scripts are JSON objects with the following structure. Scripts can use various macros (template variables) that are dynamically replaced during processing.
+::: tip Source of Truth
+Install scripts live in the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repository. See [Contributing](/features/apps/install-scripts/contributing) for how to submit new scripts.
+:::
+
## Root Properties
-- **`version`** (required): Schema version. Must be `4` (current required version). Versions 1-3 are deprecated.
+- **`version`** (required): Schema version. Must be `4` or `5`. Versions 1-3 are deprecated. Use `5` if your script includes lifecycle hooks; otherwise `4` is fine.
+- **`custom`** (optional): Set to `true` for community/custom apps that aren't in the default TrueNAS catalog
+- **`internal`** (optional): Set to `true` for dev/test apps — hidden in production
+- **`metadata`** (required if `custom: true`): Custom app metadata (see [Custom App Metadata](#custom-app-metadata))
- **`script`** (required): Metadata about the install script itself
- **`version`** (required): Semantic version of this install script (e.g., "1.0.0", "2.1.3")
- **`updateCompatibility`** (optional): Semver range expression defining which script versions can update to this version (e.g., ">=1.0.0" allows updates from any version 1.0.0 or higher, "^2.0.0" allows updates from 2.x.x versions). Supports all [semver range syntax](https://www.npmjs.com/package/semver#ranges) including `>=`, `>`, `<`, `<=`, `^`, `~`, and complex ranges like `">=1.0.0 <3.0.0"`
@@ -13,6 +20,7 @@ Install scripts are JSON objects with the following structure. Scripts can use v
- **`installation_questions`** (optional): Array of questions to ask the user during installation
- **`ensure_directories_exists`** (optional): Array of directory entry objects to create before installation, with optional ownership and snapshot declarations
- **`app_values`** (required): Configuration object passed directly to TrueNAS API
+- **`hooks`** (optional, V5 only): Array of lifecycle hook declarations. See [Hooks Reference](/features/apps/install-scripts/reference/hooks)
## Available Macros
@@ -42,9 +50,20 @@ Install scripts support various macros that are replaced dynamically during scri
For detailed macro documentation and examples, see the [Macros Reference](/features/apps/install-scripts/reference/macros).
+## Custom App Metadata
+
+When `custom: true`, the `metadata` object is required:
+
+| Property | Type | Required | Description |
+|---|---|---|---|
+| `name` | string | Yes | Display name in the HexOS app store |
+| `description` | string | Yes | Brief description of what the app does |
+| `icon` | string | Yes | URL to the app's icon (SVG or PNG) |
+| `version` | string | Yes | Semantic version of the custom app |
+
## Example Structure
-For complete, working examples of install scripts, please refer to the [curated install scripts](/features/apps/install-scripts/curated/). These production-ready scripts demonstrate best practices and real-world usage patterns for popular applications like Plex, Jellyfin, Immich, and more.
+For complete, working examples of install scripts, browse the [hexos-app-catalog](https://github.com/eshtek/hexos-app-catalog) repository. These production-ready scripts demonstrate best practices and real-world usage patterns for popular applications like Plex, Jellyfin, Immich, and more.
## Requirements
diff --git a/docs/public/install-scripts/bazarr.json b/docs/public/install-scripts/bazarr.json
deleted file mode 100644
index df200379..00000000
--- a/docs/public/install-scripts/bazarr.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "Downloads",
- "Movies",
- "Shows"
- ],
- "specifications": [
- "2CORE",
- "512MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30046]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/bazarr/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/bazarr/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Downloads), /downloads)",
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /movies)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /tv)"
- ]
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30046
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/blinko.json b/docs/public/install-scripts/blinko.json
deleted file mode 100644
index 00ca08e7..00000000
--- a/docs/public/install-scripts/blinko.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity"],
- "specifications": ["2CORE", "256MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [30412]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsCapacity)/blinko/data", "owner": { "user": "apps" }, "snapshot": { "id": "data" } },
- { "path": "$LOCATION(ApplicationsPerformance)/blinko/postgres_data", "owner": { "user": "netdata", "group": "docker" }, "snapshot": { "id": "db" } }
- ],
- "app_values": {
- "blinko": {
- "db_password": "$RANDOM_STRING(7)",
- "nextauth_secret": "$RANDOM_STRING(7)",
- "additional_envs": []
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30412
- }
- },
- "storage": {
- "data": "$HOST_PATH($LOCATION(ApplicationsCapacity)/blinko/data)",
- "postgres_data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/blinko/postgres_data)"
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 4096)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/dozzle.json b/docs/public/install-scripts/dozzle.json
deleted file mode 100644
index b1dc57b1..00000000
--- a/docs/public/install-scripts/dozzle.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "initial"
- },
- "requirements": {
- "locations": [],
- "specifications": ["2CORE", "1024MB"],
- "permissions": [],
- "ports": [30064]
- },
- "ensure_directories_exists": [],
- "app_values": {
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30064
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/drawio.json b/docs/public/install-scripts/drawio.json
deleted file mode 100644
index 4cfd27e5..00000000
--- a/docs/public/install-scripts/drawio.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [],
- "specifications": ["2CORE", "1024MB"],
- "permissions": [],
- "ports": [30090, 30091]
- },
- "ensure_directories_exists": [],
- "app_values": {
- "network": {
- "http_port": {
- "bind_mode": "published",
- "port_number": 30090
- },
- "https_port": {
- "bind_mode": "published",
- "port_number": 30091
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/emby.json b/docs/public/install-scripts/emby.json
deleted file mode 100644
index 04e84b7b..00000000
--- a/docs/public/install-scripts/emby.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity", "Media", "Photos", "Music", "Movies", "Shows", "Videos"],
- "specifications": ["2CORE", "512MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [9096, 8920]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Photos)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Music)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Videos)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/emby/config", "snapshot": { "id": "config" } },
- { "path": "$LOCATION(ApplicationsPerformance)/emby/cache" },
- { "path": "$LOCATION(ApplicationsPerformance)/emby/transcode" }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/emby/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Media), /media)",
- "$MOUNTED_HOST_PATH($LOCATION(Photos), /photos)",
- "$MOUNTED_HOST_PATH($LOCATION(Music), /music)",
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /movies)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /shows)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /videos)",
- "$MOUNTED_HOST_PATH($LOCATION(ApplicationsPerformance)/emby/transcode, /transcode)",
- "$MOUNTED_HOST_PATH($LOCATION(ApplicationsPerformance)/emby/cache, /cache)"
- ]
- },
- "network": {
- "http_port": {
- "bind_mode": "published",
- "port_number": 9096
- },
- "https_port": {
- "bind_mode": "published",
- "port_number": 8920
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 4096)"
- },
- "gpus": "$GPU_CONFIG()"
- }
- }
-}
diff --git a/docs/public/install-scripts/excalidraw.json b/docs/public/install-scripts/excalidraw.json
deleted file mode 100644
index 85abbb10..00000000
--- a/docs/public/install-scripts/excalidraw.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "initial"
- },
- "requirements": {
- "locations": [],
- "specifications": ["2CORE", "1024MB"],
- "permissions": [],
- "ports": [30255]
- },
- "ensure_directories_exists": [],
- "app_values": {
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30255
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/fladder.json b/docs/public/install-scripts/fladder.json
deleted file mode 100644
index 86700705..00000000
--- a/docs/public/install-scripts/fladder.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial script"
- },
- "requirements": {
- "locations": [],
- "specifications": ["2CORE", "200MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [30387]
- },
- "app_values": {
- "fladder": {
- "jellyfin_base_url": "http://$SERVER_LAN_IP:30013"
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30387
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/handbrake.json b/docs/public/install-scripts/handbrake.json
deleted file mode 100644
index 9913aa4e..00000000
--- a/docs/public/install-scripts/handbrake.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "Media",
- "Movies",
- "Shows",
- "Videos"
- ],
- "specifications": [
- "2CORE", "2048MB"],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30089, 30044]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Videos)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/handbrake/config",
- "snapshot": { "id": "config" }
- },
- {
- "path": "$LOCATION(Media)/HandBrake/Output"
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/handbrake/config)",
- "storage": "$HOST_PATH($LOCATION(Media)/HandBrake)",
- "output": "$HOST_PATH($LOCATION(Media)/HandBrake/Output)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /movies)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /shows)",
- "$MOUNTED_HOST_PATH($LOCATION(Downloads), /downloads)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /videos)"
- ]
- },
- "network": {
- "web_port": {
- "port_number": 30089
- },
- "vnc_port": {
- "port_number": 30044
- }
- },
- "resources": {
- "limits": {
- "cpus": 4,
- "memory": "$MEMORY(10%, 4096)"
- },
- "gpus": {
- "use_all_gpus": true
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/home-assistant.json b/docs/public/install-scripts/home-assistant.json
deleted file mode 100644
index 303ff2ad..00000000
--- a/docs/public/install-scripts/home-assistant.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "Media"],
- "specifications": ["2CORE", "256MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [8123]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/home-assistant/config", "owner": { "user": "apps" }, "snapshot": { "id": "config" } },
- { "path": "$LOCATION(ApplicationsPerformance)/home-assistant/postgres_data", "owner": { "user": "netdata", "group": "docker" }, "snapshot": { "id": "db" } },
- { "path": "$LOCATION(Media)/home-assistant" }
- ],
- "app_values": {
- "home_assistant": {
- "db_password": "$RANDOM_STRING(7)"
- },
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/home-assistant/config)",
- "media": "$HOST_PATH($LOCATION(Media)/home-assistant)",
- "postgres_data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/home-assistant/postgres_data)"
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 8123
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/immich.json b/docs/public/install-scripts/immich.json
deleted file mode 100644
index 6f06878d..00000000
--- a/docs/public/install-scripts/immich.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "Photos"],
- "specifications": ["2CORE", "256MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [2283]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Photos)",
- "network_share": true
- },
- { "path": "$LOCATION(Photos)/immich", "owner": { "user": "apps" }, "snapshot": { "id": "data" } },
- { "path": "$LOCATION(ApplicationsPerformance)/immich/postgres_data", "owner": { "user": "netdata", "group": "docker" }, "snapshot": { "id": "db" } }
- ],
- "app_values": {
- "release_name": "immich",
- "immich": {
- "enable_ml": true,
- "ml_image_selector": "ml_image",
- "db_password": "$RANDOM_STRING(7)",
- "redis_password": "$RANDOM_STRING(7)",
- "log_level": "log",
- "hugging_face_endpoint": "",
- "db_storage_type": "SSD",
- "additional_envs": []
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 2283
- }
- },
- "storage": {
- "data": "$HOST_PATH($LOCATION(Photos)/immich)",
- "ml_cache": {
- "type": "temporary"
- },
- "postgres_data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/immich/postgres_data)"
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 4096)"
- },
- "gpus": "$GPU_CONFIG()"
- }
- }
-}
diff --git a/docs/public/install-scripts/jellyfin.json b/docs/public/install-scripts/jellyfin.json
deleted file mode 100644
index 65f43b00..00000000
--- a/docs/public/install-scripts/jellyfin.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity", "Media", "Photos", "Music", "Movies", "Shows", "Videos"],
- "specifications": ["2CORE", "256MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [30013, 30014]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Photos)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Music)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Videos)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/jellyfin/config", "snapshot": { "id": "config" } },
- { "path": "$LOCATION(ApplicationsCapacity)/jellyfin/cache" },
- { "path": "$LOCATION(ApplicationsPerformance)/jellyfin/transcodes" }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/jellyfin/config)",
- "cache": "$HOST_PATH($LOCATION(ApplicationsCapacity)/jellyfin/cache)",
- "transcodes": "$HOST_PATH($LOCATION(ApplicationsPerformance)/jellyfin/transcodes)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Media), /media)",
- "$MOUNTED_HOST_PATH($LOCATION(Photos), /photos)",
- "$MOUNTED_HOST_PATH($LOCATION(Music), /music)",
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /movies)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /shows)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /videos)"
- ]
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30013
- },
- "https_port": {
- "bind_mode": "published",
- "port_number": 30014
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 4096)"
- },
- "gpus": "$GPU_CONFIG()"
- }
- }
-}
diff --git a/docs/public/install-scripts/jellystat.json b/docs/public/install-scripts/jellystat.json
deleted file mode 100644
index 058ba0c8..00000000
--- a/docs/public/install-scripts/jellystat.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial"
- },
- "installation_questions": [
- {
- "question": "Are you using Jellyfin or Emby?",
- "type": "select",
- "key": "is_emby_api",
- "required": true,
- "options": [
- {
- "text": "Jellyfin",
- "value": "false"
- },
- {
- "text": "Emby",
- "value": "true"
- }
- ],
- "default": "false"
- }
- ],
- "requirements": {
- "locations": ["ApplicationsPerformance"],
- "specifications": ["2CORE", "256MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [30176]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/jellystat/backup", "snapshot": { "id": "backup" } },
- { "path": "$LOCATION(ApplicationsPerformance)/jellystat/postgres_data", "owner": { "user": "netdata", "group": "docker" }, "snapshot": { "id": "db" } }
- ],
-
- "app_values": {
- "jellystat": {
- "db_password": "$RANDOM_STRING(7)",
- "jwt_secret": "$RANDOM_STRING(7)",
- "is_emby_api": "$QUESTION(is_emby_api)",
- "additional_envs": []
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30176
- }
- },
- "storage": {
- "backup": "$HOST_PATH($LOCATION(ApplicationsPerformance)/jellystat/backup)",
- "postgres_data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/jellystat/postgres_data)"
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 4096)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/lidarr.json b/docs/public/install-scripts/lidarr.json
deleted file mode 100644
index 7b20e650..00000000
--- a/docs/public/install-scripts/lidarr.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "ApplicationsCapacity",
- "Downloads",
- "Music"
- ],
- "specifications": [
- "2CORE",
- "512MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30071]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Music)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)/qbittorrent"
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/lidarr/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/lidarr/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Downloads)/qbittorrent, /config/Downloads)",
- "$MOUNTED_HOST_PATH($LOCATION(Music), /music)"
- ]
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30071
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/lubelogger.json b/docs/public/install-scripts/lubelogger.json
deleted file mode 100644
index 74faebf2..00000000
--- a/docs/public/install-scripts/lubelogger.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial Script"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity"],
- "specifications": ["2CORE", "256MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [30350]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/lubelogger/postgres", "owner": { "user": "netdata", "group": "docker" }, "snapshot": { "id": "db" } },
- { "path": "$LOCATION(ApplicationsCapacity)/lubelogger/data", "owner": { "user": "apps" }, "snapshot": { "id": "data" } },
- { "path": "$LOCATION(ApplicationsPerformance)/lubelogger/keys", "owner": { "user": "apps" }, "snapshot": { "id": "keys" } }
- ],
- "app_values": {
- "lubelogger": {
- "db_password": "$RANDOM_STRING(7)"
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30350
- }
- },
- "storage": {
- "data": "$HOST_PATH($LOCATION(ApplicationsCapacity)/lubelogger/data)",
- "protection_keys": "$HOST_PATH($LOCATION(ApplicationsPerformance)/lubelogger/keys)",
- "postgres_data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/lubelogger/postgres)"
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/mkvtoolnix.json b/docs/public/install-scripts/mkvtoolnix.json
deleted file mode 100644
index c95ed968..00000000
--- a/docs/public/install-scripts/mkvtoolnix.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial Install script"
- },
- "installation_questions": [
- {
- "question": "Enable Dark mode",
- "type": "select",
- "key": "DARK_MODE",
- "required": true,
- "options": [
- {
- "text": "Yes",
- "value": "1"
- },
- {
- "text": "No",
- "value": "0"
- }
- ]
- }
- ],
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "Videos",
- "Documents",
- "Media",
- "Shows",
- "Movies"
- ],
- "specifications": [
- "2CORE", "1024MB"],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30309]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Documents)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Videos)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/mkvtoolnix/config", "owner": { "user": "apps" }, "snapshot": { "id": "data" } },
- { "path": "$LOCATION(Documents)/mkvtoolnix"}
- ],
- "app_values": {
- "mkvtoolnix": {
- "additional_envs": [
- {
- "name": "DARK_MODE",
- "value": "$QUESTION(DARK_MODE)"
- }
- ]
- },
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/mkvtoolnix/config)",
- "storage": "$HOST_PATH($LOCATION(Documents)/mkvtoolnix)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Media), /Media)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /Videos)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /Shows)",
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /Movies)"
- ]
- },
- "network": {
- "web_port": {
- "port_number": 30309
- }
- },
- "resources": {
- "limits": {
- "cpus": 4,
- "memory": "$MEMORY(10%, 4096)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/navidrome.json b/docs/public/install-scripts/navidrome.json
deleted file mode 100644
index 09008fef..00000000
--- a/docs/public/install-scripts/navidrome.json
+++ /dev/null
@@ -1,228 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial Install Script"
- },
- "installation_questions": [
- {
- "question": "Select a welcome message (Optional)",
- "description": "This message is shown at the login screen of Navidrome",
- "type": "text",
- "key": "welcome_message",
- "required": false,
- "default": "Welcome to Navidrome"
- },
- {
- "question": "Select the default language",
- "description": "If the wrong language is showing you may have to clear your browser cookies.",
- "type": "select",
- "key": "default_language",
- "required": true,
- "options": [
- {
- "text": "English",
- "value": "en"
- },
- {
- "text": "Arabic (العربية)",
- "value": "ar"
- },
- {
- "text": "Bulgarian (Български)",
- "value": "bg"
- },
- {
- "text": "Bosnian (Bosanski)",
- "value": "bs"
- },
- {
- "text": "Catalan (Català)",
- "value": "ca"
- },
- {
- "text": "Czech (Čeština)",
- "value": "cs"
- },
- {
- "text": "Danish (Dansk)",
- "value": "da"
- },
- {
- "text": "German (Deutsch)",
- "value": "de"
- },
- {
- "text": "Greek (Ελληνικά)",
- "value": "el"
- },
- {
- "text": "Esperanto",
- "value": "eo"
- },
- {
- "text": "Spanish (Español)",
- "value": "es"
- },
- {
- "text": "Euskara",
- "value": "eu"
- },
- {
- "text": "Persian (فارسی)",
- "value": "fa"
- },
- {
- "text": "Finnish (Suomi)",
- "value": "fi"
- },
- {
- "text": "French (Français)",
- "value": "fr"
- },
- {
- "text": "Galician (Galego)",
- "value": "gl"
- },
- {
- "text": "Hindi (हिंदी)",
- "value": "hi"
- },
- {
- "text": "Hungarian (Magyar)",
- "value": "hu"
- },
- {
- "text": "Indonesian (Bahasa Indonesia)",
- "value": "id"
- },
- {
- "text": "Italian (Italiano)",
- "value": "it"
- },
- {
- "text": "Japanese (日本語)",
- "value": "ja"
- },
- {
- "text": "Korean (한국어)",
- "value": "ko"
- },
- {
- "text": "Nederlands",
- "value": "nl"
- },
- {
- "text": "Norwegian (Norsk)",
- "value": "no"
- },
- {
- "text": "Polish (Polski)",
- "value": "pl"
- },
- {
- "text": "brazilian Portuguese (Português (Brasil))",
- "value": "pt-br"
- },
- {
- "text": "Russian (Русский)",
- "value": "ru"
- },
- {
- "text": "Slovak (Slovenčina)",
- "value": "sk"
- },
- {
- "text": "slovenian (Slovenščina)",
- "value": "sl"
- },
- {
- "text": "Serbian (српски)",
- "value": "sr"
- },
- {
- "text": "Swedish (Svenska)",
- "value": "sv"
- },
- {
- "text": "Thai (ไทย)",
- "value": "th"
- },
- {
- "text": "Turkish (Türkçe)",
- "value": "tr"
- },
- {
- "text": "Ukrainian (Українська)",
- "value": "uk"
- },
- {
- "text": "Simplified Chinese (简体中文)",
- "value": "zh-Hans"
- },
- {
- "text": "Traditional Chinese (繁體中文)",
- "value": "zh-Hant"
- }
- ],
- "default": "en"
- }
- ],
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "Media",
- "Music"
- ],
- "specifications": [
- "2CORE", "1024MB"],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30043]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Music)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/navidrome/data", "owner": { "user": "apps" }, "snapshot": { "id": "config" } }
- ],
- "app_values": {
- "navidrome": {
- "welcome_message": "$QUESTION(welcome_message)",
- "additional_envs": [
- {
- "name": "ND_DEFAULTLANGUAGE",
- "value": "$QUESTION(default_language)"
- }
- ]
- },
- "storage": {
- "data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/navidrome/data)",
- "music": "$HOST_PATH($LOCATION(Music))",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Media), /Media)"
- ]
- },
- "network": {
- "web_port": {
- "port_number": 30043
- }
- },
- "resources": {
- "limits": {
- "cpus": 4,
- "memory": "$MEMORY(10%, 4096)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/nextcloud.json b/docs/public/install-scripts/nextcloud.json
deleted file mode 100644
index 7c335e7d..00000000
--- a/docs/public/install-scripts/nextcloud.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "ApplicationsCapacity"
- ],
- "specifications": [
- "2CORE",
- "2048MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30027]
- },
- "installation_questions": [
- {
- "question": "Nextcloud Username",
- "description": "Create a username for the admin account. You'll use this to log in via web and mobile apps.",
- "type": "text",
- "key": "admin_user",
- "required": true
- },
- {
- "question": "Nextcloud Password",
- "description": "Create a password for the admin account. You'll need this to log in via web browser and mobile apps. Choose something secure but memorable!",
- "type": "text",
- "key": "admin_password",
- "required": true
- },
- {
- "question": "Default Phone Region",
- "description": "Two-letter country code (US, CA, GB, DE, FR, AU, etc.). This helps format phone numbers correctly. Common codes: US (United States), CA (Canada), GB (United Kingdom), DE (Germany), FR (France), AU (Australia). Leave blank if unsure.",
- "type": "text",
- "key": "phone_region",
- "required": false,
- "default": "US"
- }
- ],
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/nextcloud/html", "owner": { "user": "www-data" }, "snapshot": { "id": "html" } },
- { "path": "$LOCATION(ApplicationsPerformance)/nextcloud/postgres_data", "owner": { "user": "netdata", "group": "docker" }, "snapshot": { "id": "db" } },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsCapacity)/nextcloud/data", "snapshot": { "id": "data" } }
- ],
- "app_values": {
- "nextcloud": {
- "admin_user": "$QUESTION(admin_user)",
- "admin_password": "$QUESTION(admin_password)",
- "redis_password": "$RANDOM_STRING(16)",
- "db_password": "$RANDOM_STRING(16)",
- "host": "$SERVER_LAN_IP",
- "postgres_image_selector": "postgres_17_image",
- "apt_packages": [
- "ffmpeg",
- "smbclient",
- "ocrmypdf",
- "libreoffice"
- ],
- "tesseract_languages": [
- "eng",
- "spa",
- "fra",
- "deu",
- "por",
- "ita",
- "nld",
- "pol",
- "rus",
- "jpn",
- "chi_sim",
- "ara"
- ],
- "imaginary": {
- "enabled": true
- },
- "cron": {
- "enabled": true,
- "schedule": "*/5 * * * *"
- },
- "additional_envs": [
- {
- "name": "NC_default_phone_region",
- "value": "$QUESTION(phone_region)"
- },
- {
- "name": "NC_maintenance_window_start",
- "value": "1"
- }
- ]
- },
- "storage": {
- "html": "$HOST_PATH($LOCATION(ApplicationsPerformance)/nextcloud/html)",
- "data": "$HOST_PATH($LOCATION(ApplicationsCapacity)/nextcloud/data)",
- "postgres_data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/nextcloud/postgres_data)"
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30027
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/peanut.json b/docs/public/install-scripts/peanut.json
deleted file mode 100644
index e47b917e..00000000
--- a/docs/public/install-scripts/peanut.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance"
- ],
- "specifications": [
- "2CORE",
- "1024MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30224]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/peanut/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/peanut/config)"
- }
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30224
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
-}
diff --git a/docs/public/install-scripts/plex.json b/docs/public/install-scripts/plex.json
deleted file mode 100644
index 3cba5050..00000000
--- a/docs/public/install-scripts/plex.json
+++ /dev/null
@@ -1,117 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "installation_questions": [
- {
- "question": "Claim Token (Optional)",
- "description": "The claim token is used to automatically login to Plex. You can obtain a claim token to login your server to your Plex account by visiting https://www.plex.tv/claim.",
- "placeholder": "claim-xxxxxxxxxxxxxxxxxxxxx",
- "type": "text",
- "key": "plex_claim_token",
- "required": false,
- "default": ""
- },
- {
- "question": "Do you have Plex Pass?",
- "description": "Plex Pass is required to unlock certain features.",
- "type": "select",
- "key": "image_selector",
- "required": true,
- "options": [
- {
- "text": "No, I don't have Plex Pass",
- "value": "image"
- },
- {
- "text": "Yes, I have Plex Pass",
- "value": "plex_pass_image"
- }
- ],
- "default": "image"
- }
- ],
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity", "Media", "Photos", "Music", "Movies", "Shows", "Videos"],
- "specifications": ["2CORE", "200MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [32400]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Photos)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Music)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Videos)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/plex/data", "owner": { "user": "apps" }, "snapshot": { "id": "data" } },
- { "path": "$LOCATION(ApplicationsPerformance)/plex/config", "owner": { "user": "apps" }, "snapshot": { "id": "config" } },
- { "path": "$LOCATION(ApplicationsCapacity)/plex/logs" },
- { "path": "$LOCATION(ApplicationsPerformance)/plex/transcode" }
- ],
- "app_values": {
- "plex": {
- "claim_token": "$QUESTION(plex_claim_token)",
- "image_selector": "$QUESTION(image_selector)",
- "additional_envs": [
- {
- "name": "ADVERTISE_IP",
- "value": "http://$SERVER_LAN_IP:32400"
- }
- ]
- },
- "run_as": {
- "user": 568,
- "group": 568
- },
- "storage": {
- "data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/plex/data)",
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/plex/config)",
- "logs": "$HOST_PATH($LOCATION(ApplicationsCapacity)/plex/logs)",
- "transcode": "$HOST_PATH($LOCATION(ApplicationsPerformance)/plex/transcode)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Media), /media)",
- "$MOUNTED_HOST_PATH($LOCATION(Photos), /photos)",
- "$MOUNTED_HOST_PATH($LOCATION(Music), /music)",
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /movies)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /shows)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /videos)"
- ]
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- },
- "gpus": "$GPU_CONFIG()"
- }
- }
-}
diff --git a/docs/public/install-scripts/portracker.json b/docs/public/install-scripts/portracker.json
deleted file mode 100644
index c3ea6673..00000000
--- a/docs/public/install-scripts/portracker.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance"
- ],
- "specifications": [
- "2CORE",
- "1024MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30233]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/portracker/data", "owner": { "user": "apps" }, "snapshot": { "id": "data" } }
- ],
- "app_values": {
- "storage": {
- "data": "$HOST_PATH($LOCATION(ApplicationsPerformance)/portracker/data)"
- }
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30233
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/prowlarr.json b/docs/public/install-scripts/prowlarr.json
deleted file mode 100644
index 9e7eedf2..00000000
--- a/docs/public/install-scripts/prowlarr.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance"],
- "specifications": ["2CORE", "200MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [9696]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/prowlarr/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/prowlarr/config)"
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/qbittorrent.json b/docs/public/install-scripts/qbittorrent.json
deleted file mode 100644
index b54b1d2c..00000000
--- a/docs/public/install-scripts/qbittorrent.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity", "Downloads"],
- "specifications": ["2CORE", "200MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [8080, 6881]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)/qbittorrent"
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/qbittorrent/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/qbittorrent/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Downloads)/qbittorrent, /config/Downloads)"
- ]
- }
- }
-}
diff --git a/docs/public/install-scripts/qui.json b/docs/public/install-scripts/qui.json
deleted file mode 100644
index e6c795fd..00000000
--- a/docs/public/install-scripts/qui.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial Script"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance"
- ],
- "specifications": [
- "2CORE",
- "256MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30318]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/qui/config", "snapshot": { "id": "config" } }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/qui/config)"
- }
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30318
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(5%, 1024)"
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/radarr.json b/docs/public/install-scripts/radarr.json
deleted file mode 100644
index 6fc787ca..00000000
--- a/docs/public/install-scripts/radarr.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity", "Downloads", "Movies"],
- "specifications": ["2CORE", "200MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [7878]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)/qbittorrent"
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/radarr/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/radarr/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Downloads)/qbittorrent, /config/Downloads)",
- "$MOUNTED_HOST_PATH($LOCATION(Movies), /movies)"
- ]
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/scrutiny.json b/docs/public/install-scripts/scrutiny.json
deleted file mode 100644
index 24454892..00000000
--- a/docs/public/install-scripts/scrutiny.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance"
- ],
- "specifications": [
- "2CORE",
- "1024MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [31054, 31055]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/scrutiny/config", "snapshot": { "id": "config" } },
- { "path": "$LOCATION(ApplicationsPerformance)/scrutiny/influxdb", "snapshot": { "id": "influxdb" } }
- ],
- "app_values": {
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 31054
- },
- "influxdb_port": {
- "bind_mode": "published",
- "port_number": 31055
- },
- "host_network": false
- },
- "storage": {
- "config": {
- "type": "host_path",
- "host_path_config": {
- "acl_enable": false,
- "path": "$LOCATION(ApplicationsPerformance)/scrutiny/config"
- }
- },
- "influxdb": {
- "type": "host_path",
- "host_path_config": {
- "acl_enable": false,
- "path": "$LOCATION(ApplicationsPerformance)/scrutiny/influxdb"
- }
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": 2048
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/seerr.json b/docs/public/install-scripts/seerr.json
deleted file mode 100644
index a8a82a8c..00000000
--- a/docs/public/install-scripts/seerr.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.0.0",
- "changeLog": "Initial Script"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance"
- ],
- "specifications": [
- "2CORE",
- "1024MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [30357]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/seerr/config", "owner": { "user": "apps" }, "snapshot": { "id": "config" } }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/seerr/config)"
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 30357
- }
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/docs/public/install-scripts/sonarr.json b/docs/public/install-scripts/sonarr.json
deleted file mode 100644
index 1d32126a..00000000
--- a/docs/public/install-scripts/sonarr.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": ["ApplicationsPerformance", "ApplicationsCapacity", "Downloads", "Shows"],
- "specifications": ["2CORE", "200MB"],
- "permissions": ["READ_WRITE_LOCATIONS"],
- "ports": [8989]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)/qbittorrent"
- },
- {
- "path": "$LOCATION(ApplicationsPerformance)/sonarr/config",
- "snapshot": { "id": "config" }
- }
- ],
- "app_values": {
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/sonarr/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Downloads)/qbittorrent, /config/Downloads)",
- "$MOUNTED_HOST_PATH($LOCATION(Shows), /shows)"
- ]
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/install-scripts/syncthing.json b/docs/public/install-scripts/syncthing.json
deleted file mode 100644
index f9560c89..00000000
--- a/docs/public/install-scripts/syncthing.json
+++ /dev/null
@@ -1,112 +0,0 @@
-{
- "version": 4,
- "script": {
- "version": "1.1.0",
- "changeLog": "Upgraded to V4 install script format"
- },
- "requirements": {
- "locations": [
- "ApplicationsPerformance",
- "ApplicationsCapacity",
- "Documents",
- "Downloads",
- "Photos",
- "Music",
- "Videos",
- "Media",
- "Movies",
- "Shows"
- ],
- "specifications": [
- "2CORE",
- "512MB"
- ],
- "permissions": [
- "READ_WRITE_LOCATIONS"
- ],
- "ports": [20910, 20978, 20970]
- },
- "ensure_directories_exists": [
- {
- "path": "$LOCATION(ApplicationsPerformance)",
- "network_share": true
- },
- {
- "path": "$LOCATION(ApplicationsCapacity)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Documents)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Downloads)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Photos)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Videos)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Music)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Media)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Movies)",
- "network_share": true
- },
- {
- "path": "$LOCATION(Shows)",
- "network_share": true
- },
- { "path": "$LOCATION(ApplicationsPerformance)/syncthing/config", "snapshot": { "id": "config" } }
- ],
- "app_values": {
- "run_as": {
- "user": 568,
- "group": 568
- },
- "storage": {
- "config": "$HOST_PATH($LOCATION(ApplicationsPerformance)/syncthing/config)",
- "additional_storage": [
- "$MOUNTED_HOST_PATH($LOCATION(Documents), /sync/Documents)",
- "$MOUNTED_HOST_PATH($LOCATION(Downloads), /sync/Downloads)",
- "$MOUNTED_HOST_PATH($LOCATION(Photos), /sync/Photos)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /sync/Videos)",
- "$MOUNTED_HOST_PATH($LOCATION(Music), /sync/Music)",
- "$MOUNTED_HOST_PATH($LOCATION(Photos), /sync/Media)",
- "$MOUNTED_HOST_PATH($LOCATION(Videos), /sync/Movies)",
- "$MOUNTED_HOST_PATH($LOCATION(Music), /sync/Shows)"
- ]
- },
- "network": {
- "web_port": {
- "bind_mode": "published",
- "port_number": 20910
- },
- "tcp_port": {
- "bind_mode": "published",
- "port_number": 20978
- },
- "udp_port": {
- "bind_mode": "published",
- "port_number": 20970
- },
- "host_network": false
- },
- "resources": {
- "limits": {
- "cpus": 2,
- "memory": "$MEMORY(10%, 2048)"
- }
- }
- }
-}
diff --git a/docs/public/videos/hexos-apps-preconfig.mp4 b/docs/public/videos/hexos-apps-preconfig.mp4
new file mode 100644
index 00000000..9d072f29
Binary files /dev/null and b/docs/public/videos/hexos-apps-preconfig.mp4 differ
diff --git a/package.json b/package.json
index 43fa5c68..35932599 100644
--- a/package.json
+++ b/package.json
@@ -4,19 +4,16 @@
"private": true,
"type": "module",
"scripts": {
- "gen:curated": "node scripts/generateCuratedIndex.mjs",
"gen:release-notes": "node scripts/generateReleaseNotesIndex.mjs",
- "gen:all": "npm run gen:curated && npm run gen:release-notes",
+ "gen:all": "npm run gen:release-notes",
"docs:dev": "npm run gen:all && vitepress dev docs",
"dev": "npm run docs:dev",
- "docs:dev:here": "DOCS_DIR=. node scripts/generateCuratedIndex.mjs && node scripts/generateReleaseNotesIndex.mjs && vitepress dev .",
+ "docs:dev:here": "node scripts/generateReleaseNotesIndex.mjs && vitepress dev .",
"docs:build": "npm run gen:all && vitepress build docs",
"docs:serve": "vitepress serve docs",
- "build": "npm run docs:build",
- "prepare": "husky"
+ "build": "npm run docs:build"
},
"devDependencies": {
- "husky": "^9.1.7",
"mermaid": "^11.10.0",
"vitepress": "^1.3.0",
"vitepress-plugin-mermaid": "^2.0.17"
diff --git a/scripts/generateCuratedIndex.mjs b/scripts/generateCuratedIndex.mjs
deleted file mode 100644
index 355906f6..00000000
--- a/scripts/generateCuratedIndex.mjs
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/env node
-import fs from 'fs'
-import path from 'path'
-import { fileURLToPath } from 'url'
-import { execSync } from 'child_process'
-
-const __dirname = path.dirname(fileURLToPath(import.meta.url))
-const DOCS_DIR = process.env.DOCS_DIR || 'docs'
-
-const PUBLIC_DIR = path.resolve(__dirname, '..', DOCS_DIR, 'public', 'install-scripts')
-const APPS_MD = path.resolve(__dirname, '..', DOCS_DIR, 'features/apps/install-scripts/curated', 'index.md')
-
-const START = ''
-const END = ''
-
-function humanFileSize(bytes) {
- const thresh = 1024
- if (Math.abs(bytes) < thresh) return bytes + ' B'
- const units = ['KB', 'MB', 'GB', 'TB']
- let u = -1
- do { bytes /= thresh; ++u } while (Math.abs(bytes) >= thresh && u < units.length - 1)
- return bytes.toFixed(1) + ' ' + units[u]
-}
-
-function getGitLastModified(filePath) {
- try {
- // Get the last commit date for the specific file
- const gitCommand = `git log -1 --format=%ci "${filePath}"`
- const result = execSync(gitCommand, {
- cwd: path.dirname(filePath),
- encoding: 'utf8'
- }).trim()
-
- if (result) {
- return new Date(result).toISOString().split('T')[0]
- }
- } catch (error) {
- console.warn(`Could not get git date for ${filePath}, falling back to fs date`)
- }
-
- // Fallback to filesystem date if git fails
- try {
- const stat = fs.statSync(filePath)
- return new Date(stat.mtime).toISOString().split('T')[0]
- } catch (error) {
- return 'Unknown'
- }
-}
-
-function buildTable(files) {
- const lines = []
- lines.push('| App | Download | Size | Last Modified |')
- lines.push('|---|---|---:|---|')
- for (const file of files) {
- const p = path.join(PUBLIC_DIR, file)
- const stat = fs.statSync(p)
- const size = humanFileSize(stat.size)
- const mtime = getGitLastModified(p)
- const app = path.basename(file, '.json')
- const href = `/install-scripts/${file}`
- lines.push(`| \`${app}\` | [${file}](${href}) | ${size} | ${mtime} |`)
- }
- return lines.join('\n')
-}
-
-function ensureAppsPage() {
- if (!fs.existsSync(APPS_MD)) {
- fs.mkdirSync(path.dirname(APPS_MD), { recursive: true })
- const boilerplate =
-`# Apps (Curated Scripts)
-
-${START}
-_No curated scripts yet._
-${END}
-`
- fs.writeFileSync(APPS_MD, boilerplate)
- }
-}
-
-function updateAppsPage() {
- ensureAppsPage()
- let md = fs.readFileSync(APPS_MD, 'utf8')
-
- if (!md.includes(START) || !md.includes(END)) {
- // If markers missing, append a fresh block to the end
- md += `\n\n${START}\n${END}\n`
- }
-
- fs.mkdirSync(PUBLIC_DIR, { recursive: true })
- const files = fs.readdirSync(PUBLIC_DIR).filter(f => f.endsWith('.json')).sort()
-
- const content = files.length === 0
- ? '_No curated scripts found yet — add JSON files under `docs/public/install-scripts/` and run `npm run gen:curated`._'
- : buildTable(files)
-
- const before = md.slice(0, md.indexOf(START) + START.length)
- const after = md.slice(md.indexOf(END))
- const next = `${before}\n${content}\n${after}`
-
- fs.writeFileSync(APPS_MD, next)
- console.log('Wrote', APPS_MD)
-}
-
-updateAppsPage()