diff --git a/.dockerignore b/.dockerignore index d764ebf..add1a31 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,3 +4,9 @@ javascript .git *.s9pk pkg + +# StartOS packaging — not part of the app image, and excluding it keeps a +# packaging-only edit from invalidating the image build cache. +startos +tsconfig.startos.json +Makefile diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 955da6a..299d282 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,100 +1,24 @@ name: Release +# This fork maintains only the StartOS wrapper. The Docker image is built and +# published by upstream (heatpunk/blisspoint); we pack an s9pk against the tag +# named in startos/manifest/index.ts and never push an image of our own. + on: push: tags: - 'v*.*.*' workflow_dispatch: - inputs: - version: - description: 'Version (e.g. 0.1.1)' - required: true - -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} jobs: - docker: - name: Build & push Docker image - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - outputs: - version: ${{ steps.meta.outputs.version }} - steps: - - uses: actions/checkout@v5 - - - name: Log in to GHCR - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Resolve version - id: resolve - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "version=${{ github.event.inputs.version }}" >> "$GITHUB_OUTPUT" - else - echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" - fi - - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=raw,value=${{ steps.resolve.outputs.version }} - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - s9pk: name: Build s9pk & create release runs-on: ubuntu-latest - needs: docker permissions: contents: write - packages: read steps: - uses: actions/checkout@v5 - - name: Log in to GHCR - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get version - id: ver - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "version=${{ github.event.inputs.version }}" >> "$GITHUB_OUTPUT" - else - echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" - fi - - name: Install squashfs-tools-ng run: sudo apt-get update && sudo apt-get install -y squashfs-tools-ng @@ -108,11 +32,19 @@ jobs: cd "$GITHUB_WORKSPACE/.." "$HOME/.local/bin/start-cli" s9pk init-workspace - - name: Install sdk-build deps - run: npm --prefix sdk-build install + - uses: actions/setup-node@v5 + with: + node-version: '20' + cache: 'npm' + + - name: Install deps + run: npm ci - - name: Build SDK JavaScript - run: cd sdk-build && npm run build + - name: Typecheck and bundle the StartOS package + run: | + npm run startos:check + node node_modules/@start9labs/start-sdk/lint.mjs + npm run startos:build - name: Generate developer key run: | @@ -123,21 +55,30 @@ jobs: run: | echo "127.0.0.1 dev-vm.local" | sudo tee -a /etc/hosts start-cli s9pk pack \ - --javascript "$GITHUB_WORKSPACE/sdk-build/javascript" \ + --javascript "$GITHUB_WORKSPACE/javascript" \ --icon startos/icon.png \ --instructions startos/instructions.md \ --license LICENSE \ - --no-assets \ + --assets "$GITHUB_WORKSPACE/assets" \ -o blisspoint.s9pk - name: Inspect manifest run: start-cli s9pk inspect blisspoint.s9pk manifest + - name: Resolve package version + id: ver + run: | + v=$(start-cli s9pk inspect blisspoint.s9pk manifest | jq -r .version) + # git refs cannot contain ':', so the tag form replaces it with '_' + echo "version=$v" >> "$GITHUB_OUTPUT" + echo "tag=v${v//:/_}" >> "$GITHUB_OUTPUT" + echo "Packaged $v" + - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: - tag_name: v${{ steps.ver.outputs.version }} - name: v${{ steps.ver.outputs.version }} + tag_name: ${{ github.ref_type == 'tag' && github.ref_name || steps.ver.outputs.tag }} + name: ${{ github.ref_type == 'tag' && github.ref_name || steps.ver.outputs.tag }} files: blisspoint.s9pk generate_release_notes: true fail_on_unmatched_files: true diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 68bed6b..759c42f 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -1,80 +1,29 @@ name: Test build (s9pk artifact) # Builds a sideloadable blisspoint.s9pk and uploads it as a workflow ARTIFACT — -# no public GitHub Release, no git tag. For testing this branch before merge. -# Download the artifact from the run's summary page, unzip, sideload in StartOS. -# The version is read from startos/manifest (the dockerTag), so it always matches. +# no GitHub Release, no git tag. For testing wrapper changes before merge: +# download the artifact from the run's summary page, unzip, sideload in StartOS. +# +# This fork maintains only the StartOS wrapper. The image is built and published +# by upstream (heatpunk/blisspoint); we pack against the tag named in +# startos/manifest/index.ts and never push an image of our own. on: push: - branches: [main, feature/rename-to-blisspoint] + branches: [main] + pull_request: + branches: [main] workflow_dispatch: -env: - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - jobs: - docker: - name: Build & push Docker image - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - outputs: - version: ${{ steps.ver.outputs.version }} - steps: - - uses: actions/checkout@v5 - - - name: Resolve version from manifest - id: ver - run: | - v=$(grep -oP "blisspoint:\K[0-9]+\.[0-9]+\.[0-9]+" startos/manifest/index.ts | head -1) - echo "version=$v" >> "$GITHUB_OUTPUT" - echo "Building version $v" - - - name: Log in to GHCR - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - platforms: linux/amd64 - push: true - tags: | - ghcr.io/${{ github.repository_owner }}/blisspoint:${{ steps.ver.outputs.version }} - ghcr.io/${{ github.repository_owner }}/blisspoint:latest - cache-from: type=gha - cache-to: type=gha,mode=max - s9pk: name: Build s9pk & upload artifact runs-on: ubuntu-latest - needs: docker permissions: contents: read - packages: read steps: - uses: actions/checkout@v5 - - name: Log in to GHCR - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: Install squashfs-tools-ng run: sudo apt-get update && sudo apt-get install -y squashfs-tools-ng @@ -88,11 +37,19 @@ jobs: cd "$GITHUB_WORKSPACE/.." "$HOME/.local/bin/start-cli" s9pk init-workspace - - name: Install sdk-build deps - run: npm --prefix sdk-build install + - uses: actions/setup-node@v5 + with: + node-version: '20' + cache: 'npm' + + - name: Install deps + run: npm ci - - name: Build SDK JavaScript - run: cd sdk-build && npm run build + - name: Typecheck and bundle the StartOS package + run: | + npm run startos:check + node node_modules/@start9labs/start-sdk/lint.mjs + npm run startos:build - name: Generate developer key run: | @@ -103,20 +60,26 @@ jobs: run: | echo "127.0.0.1 dev-vm.local" | sudo tee -a /etc/hosts start-cli s9pk pack \ - --javascript "$GITHUB_WORKSPACE/sdk-build/javascript" \ + --javascript "$GITHUB_WORKSPACE/javascript" \ --icon startos/icon.png \ --instructions startos/instructions.md \ --license LICENSE \ - --no-assets \ + --assets "$GITHUB_WORKSPACE/assets" \ -o blisspoint.s9pk - name: Inspect manifest run: start-cli s9pk inspect blisspoint.s9pk manifest + - name: Resolve package version + id: ver + run: | + v=$(start-cli s9pk inspect blisspoint.s9pk manifest | jq -r .version) + echo "version=${v//:/_}" >> "$GITHUB_OUTPUT" + - name: Upload s9pk artifact uses: actions/upload-artifact@v5 with: - name: blisspoint-${{ needs.docker.outputs.version }}-s9pk + name: blisspoint-${{ steps.ver.outputs.version }}-s9pk path: blisspoint.s9pk retention-days: 14 if-no-files-found: error diff --git a/.gitignore b/.gitignore index 91e1ee4..7dfe9c7 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,6 @@ dist-ssr # StartOS build artifacts *.s9pk -sdk-build/javascript/ -sdk-build/node_modules/ +javascript +ncc-cache __pycache__/ diff --git a/CLAUDE.md b/CLAUDE.md index d93b6e1..e33d4ea 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -27,13 +27,14 @@ säger till när filen finns att ladda ner." ## Projekt -ASIC-miner-monitor byggd i React/Vite med en Node.js-proxy mot CGMiner (port 4028). +ASIC-miner-monitor byggd i React/Vite. En Rust-tjänst (`proxy-rs`) sköter all +kommunikation med minern via biblioteket asic-rs och lyssnar på 127.0.0.1:8081; +`server/serve.cjs` serverar gränssnittet och skickar `/api/*` vidare dit. ## Releaseflöde -1. Bumpa version i `startos/versions/current.ts` och `startos/manifest/index.ts` (Docker-taggen). -2. Uppdatera `IMAGE`-variabeln i `Makefile`. -2b. Bumpa `version` i `umbrel/blisspoint/umbrel-app.yml` + image-taggen i `umbrel/blisspoint/docker-compose.yml`, och spegla till repot `heatpunk/umbrel-app-store`. -2c. Bumpa `version` i `blisspoint-addon/config.yaml` (Home Assistant hämtar imagen med versionen som tagg) och i `custom_components/blisspoint/manifest.json`. -3. Committa och pusha till `main`. -4. Trigga `release.yml` via `workflow_dispatch` med versionsnumret som input – det bygger Docker-imagen, packar `blisspoint.s9pk` och skapar en GitHub Release automatiskt. +1. Bumpa version i `startos/versions/current.ts` och Docker-taggen i `startos/manifest/index.ts`. +2. Bumpa `version` i `umbrel/blisspoint/umbrel-app.yml` + image-taggen i `umbrel/blisspoint/docker-compose.yml`, och spegla till repot `heatpunk/umbrel-app-store`. +3. Bumpa `version` i `blisspoint-addon/config.yaml` (Home Assistant hämtar imagen med versionen som tagg) och i `custom_components/blisspoint/manifest.json`. +4. Committa och pusha till `main`. +5. Trigga `release.yml` via `workflow_dispatch` – den packar `blisspoint.s9pk` mot den redan publicerade imagen och skapar en GitHub Release automatiskt. Den bygger ingen Docker-image. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fd124f0..466dd1d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,6 +25,7 @@ npm run lint # ESLint npm test # Vitest (UI utils) cargo test --manifest-path proxy-rs/Cargo.toml # proxy-rs tests cargo clippy --manifest-path proxy-rs/Cargo.toml --all-targets -- -D warnings +npm run startos:check # StartOS packaging typecheck ``` CI runs all of these on every PR. @@ -36,9 +37,16 @@ CI runs all of these on every PR. | `src/` | React/Vite UI | | `server/serve.cjs` | Serves the built UI and reverse-proxies `/api/*` | | `proxy-rs/` | Rust service; all miner communication via [asic-rs](https://github.com/256foundation/asic-rs) | -| `startos/` | StartOS (Start9) packaging | +| `startos/` | StartOS (Start9) packaging — see [startos/README.md](startos/README.md) | +| `umbrel/`, `blisspoint-addon/`, `custom_components/` | Umbrel and Home Assistant packaging | | `.github/workflows/` | CI, release, and test-build pipelines | +### Building the StartOS package locally + +`make x86` (or `make arm`) typechecks `startos/`, bundles it with `ncc`, and +packs a sideloadable `blisspoint_.s9pk`. It pulls the already-published +image named in `startos/manifest/index.ts` — it never builds one. + ## Firmware support Blisspoint does not implement per-firmware protocols itself — that lives upstream in **asic-rs**. If a miner isn't detected or a control action (power/pause) isn't supported, the gap is usually in asic-rs. Mappings from asic-rs data to the API are documented in [`proxy-rs/MAPPING.md`](proxy-rs/MAPPING.md). @@ -51,7 +59,9 @@ Blisspoint does not implement per-firmware protocols itself — that lives upstr ## Releasing -Releases are cut from `main` via the `release.yml` workflow (bump the version in `startos/versions/current.ts`, `startos/manifest/index.ts` and the `Makefile`, then run the workflow). The s9pk and GitHub Release are produced automatically. +Releases are cut from `main` via the `release.yml` workflow: bump the version in `startos/versions/current.ts` and, when adopting a newer app build, the image tag in `startos/manifest/index.ts`. Then run the workflow. It packs the s9pk against the published image and creates the GitHub Release; it does **not** build or push a container image. + +`startos/versions/current.ts` carries a two-part version, `:`. Bump the upstream part when adopting a new app version; bump only the revision when the change is packaging-only. The `Makefile` reads the package id from the manifest and needs no edit. The Umbrel packaging is version-pinned too: bump `version` in `umbrel/blisspoint/umbrel-app.yml` and the image tag in `umbrel/blisspoint/docker-compose.yml`, then mirror the changes to [heatpunk/umbrel-app-store](https://github.com/heatpunk/umbrel-app-store) so the community store serves the new version. diff --git a/Makefile b/Makefile index b30dccd..8a75d7f 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +1,45 @@ -PKG = blisspoint.s9pk +# Blisspoint is an application repo that also ships StartOS packaging, so it +# cannot use the SDK's s9pk.mk: that expects `npm run build` to be the ncc +# bundle step, and here it is the Vite build. The packaging equivalents are +# `npm run startos:check` and `npm run startos:build`. -.PHONY: all pack clean +PKG_ID := blisspoint -all: pack +.PHONY: all x86 x86_64 arm arm64 aarch64 install clean check-deps -# Generate manifest -manifest.json: - @echo "Generating manifest.json..." - @echo '{"type": "commonjs"}' > sdk-build/javascript/package.json - @node -e "const m = require('./sdk-build/javascript/index.js'); const manifest = m.manifest || m.parsedManifest || m.default; if (!manifest) { console.error('No manifest found in bundle'); process.exit(1); } console.log(JSON.stringify(manifest, null, 2))" > manifest.json +all: x86 -pack: manifest.json - @echo "Packing s9pk..." - @mkdir -p assets - @rm -rf ./javascript - @cp -r sdk-build/javascript ./javascript - @echo '{"type": "commonjs"}' > ./javascript/package.json +x86 x86_64: $(PKG_ID)_x86_64.s9pk +arm arm64 aarch64: $(PKG_ID)_aarch64.s9pk + +javascript/index.js: $(shell find startos -type f) node_modules + npm run startos:check + node node_modules/@start9labs/start-sdk/lint.mjs + npm run startos:build + +node_modules: package-lock.json package.json + npm ci + +$(PKG_ID)_%.s9pk: javascript/index.js startos/icon.png startos/instructions.md LICENSE | check-deps start-cli s9pk pack \ --javascript $(CURDIR)/javascript \ --icon startos/icon.png \ --instructions startos/instructions.md \ --license LICENSE \ --assets $(CURDIR)/assets \ - -o $(PKG) - @rm -rf ./javascript + --arch=$* \ + -o $@ + @start-cli s9pk inspect $@ manifest | jq -r '"\n✅ \(.title) v\(.version) [\([.images[].arch] | flatten | unique | join(", "))] sdk \(.sdkVersion)\n"' + +install: | check-deps + @S9PK=$$(start-cli s9pk select) || exit 1; \ + printf "\n🚀 Installing %s ...\n" "$$S9PK"; \ + start-cli package install -s "$$S9PK" + +check-deps: + @command -v start-cli >/dev/null || \ + (echo "Error: start-cli not found. See https://docs.start9.com/packaging/environment-setup.html" && exit 1) + @command -v jq >/dev/null || (echo "Error: jq not found." && exit 1) clean: - rm -f $(PKG) manifest.json - rm -rf sdk-build/javascript sdk-build/node_modules ./javascript + rm -rf $(PKG_ID)_x86_64.s9pk $(PKG_ID)_aarch64.s9pk javascript diff --git a/README.md b/README.md index 1420ba5..eb808b9 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Blisspoint turns an ASIC miner into an ordinary appliance: open it on your phone, see how much heat it's making, and slide it up or down. No mining knowledge required. It's made for the people you share a home with — your partner, your kids, a friend — not for the person who set the miner up. -It installs in one tap on **StartOS (Start9)**, with **Umbrel** and **Home Assistant** on the way. +It installs in one tap on **StartOS (Start9)**, and also packages for **Umbrel** and **Home Assistant** — see [Install](#install). ## Features diff --git a/assets/.gitkeep b/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/eslint.config.js b/eslint.config.js index c1f8a70..8d3c15d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -5,7 +5,7 @@ import reactRefresh from "eslint-plugin-react-refresh"; import tseslint from "typescript-eslint"; export default tseslint.config( - { ignores: ["dist", ".claude", "sdk-build"] }, + { ignores: ["dist", ".claude", "javascript"] }, { extends: [js.configs.recommended, ...tseslint.configs.recommended], files: ["**/*.{ts,tsx}"], diff --git a/package-lock.json b/package-lock.json index b6fe21d..3eb1245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "@radix-ui/react-toggle": "^1.1.9", "@radix-ui/react-toggle-group": "^1.1.10", "@radix-ui/react-tooltip": "^1.2.7", + "@start9labs/start-sdk": "2.0.9", "@tanstack/query-core": "^5.100.7", "@tanstack/react-query": "^5.83.0", "class-variance-authority": "^0.7.1", @@ -68,6 +69,7 @@ "@types/node": "^22.16.5", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", + "@vercel/ncc": "^0.38.4", "@vitejs/plugin-react-swc": "^3.11.0", "autoprefixer": "^10.4.21", "eslint": "^9.32.0", @@ -533,7 +535,6 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -552,7 +553,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -565,7 +565,6 @@ "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -575,7 +574,6 @@ "version": "0.21.0", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", @@ -590,7 +588,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -600,7 +597,6 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -613,7 +609,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -637,7 +632,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -650,7 +644,6 @@ "version": "9.32.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -663,7 +656,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -673,7 +665,6 @@ "version": "0.3.4", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.15.1", @@ -734,7 +725,6 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18.0" @@ -744,7 +734,6 @@ "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", @@ -758,7 +747,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -772,7 +760,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -786,7 +773,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -796,6 +782,12 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@iarna/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==", + "license": "ISC" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -861,6 +853,45 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodable/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2453,52 +2484,1387 @@ ], "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@start9labs/start-sdk": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-2.0.9.tgz", + "integrity": "sha512-HuSYrS10Bb+f6OyAMlCzd5Qyr+rIauiI0dF8MVh5Ny+eU0gF8/DeFAXlHFgL+9wkSv4UAP5q5yOzlBpXzsNbWQ==", + "bundleDependencies": [ + "@start9labs/start-core", + "eslint", + "typescript-eslint" + ], + "license": "MIT", + "dependencies": { + "@iarna/toml": "^3.0.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0", + "@start9labs/start-core": "file:./node_modules/@start9labs/start-core", + "@types/ini": "^4.1.1", + "deep-equality-data-structures": "^2.0.0", + "eslint": "^9.39.4", + "fast-xml-parser": "~5.7.0", + "ini": "^5.0.0", + "isomorphic-fetch": "^3.0.0", + "mime": "^4.1.0", + "typescript-eslint": "^8.61.0", + "yaml": "^2.8.3", + "zod": "4.4.3", + "zod-deep-partial": "^1.2.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-array": { + "version": "0.21.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/core": { + "version": "0.17.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "inBundle": true, + "license": "Python-2.0" + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/js": { + "version": "9.39.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/object-schema": { + "version": "2.1.7", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@humanfs/core": { + "version": "0.19.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@humanfs/node": { + "version": "0.16.8", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@humanfs/types": { + "version": "0.15.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@types/estree": { + "version": "1.0.9", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/@types/json-schema": { + "version": "7.0.15", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/type-utils": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.61.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/parser": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/project-service": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.61.0", + "@typescript-eslint/types": "^8.61.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/type-utils": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.3", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/utils": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.61.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/acorn": { + "version": "8.16.0", + "inBundle": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/acorn-jsx": { + "version": "5.3.2", + "inBundle": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/ajv": { + "version": "6.15.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/callsites": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/chalk": { + "version": "4.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/cross-spawn": { + "version": "7.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/debug": { + "version": "4.4.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@start9labs/start-sdk/node_modules/deep-is": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint": { + "version": "9.39.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint-scope": { + "version": "8.4.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/espree": { + "version": "10.4.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/esquery": { + "version": "1.7.0", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/esrecurse": { + "version": "4.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/estraverse": { + "version": "5.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/esutils": { + "version": "2.0.3", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/fast-levenshtein": { + "version": "2.0.6", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/fdir": { + "version": "6.5.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@start9labs/start-sdk/node_modules/file-entry-cache": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/flat-cache": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/flatted": { + "version": "3.4.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@start9labs/start-sdk/node_modules/globals": { + "version": "14.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/has-flag": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/ignore": { + "version": "5.3.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/import-fresh": { + "version": "3.3.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/is-extglob": { + "version": "2.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/is-glob": { + "version": "4.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/@start9labs/start-sdk/node_modules/json-buffer": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/json-schema-traverse": { + "version": "0.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/keyv": { + "version": "4.5.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/levn": { + "version": "0.4.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/lodash.merge": { + "version": "4.6.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/natural-compare": { + "version": "1.4.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk/node_modules/optionator": { + "version": "0.9.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/p-limit": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/parent-module": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/path-exists": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/picomatch": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/prelude-ls": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/punycode": { + "version": "2.3.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/strip-json-comments": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/supports-color": { + "version": "7.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/tinyglobby": { + "version": "0.2.17", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/ts-api-utils": { + "version": "2.5.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/type-check": { + "version": "0.4.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/typescript-eslint": { + "version": "8.61.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.61.0", + "@typescript-eslint/parser": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@start9labs/start-sdk/node_modules/word-wrap": { + "version": "1.2.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@start9labs/start-sdk/node_modules/yocto-queue": { + "version": "0.1.0", + "inBundle": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@start9labs/start-sdk/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@start9labs/start-sdk/node_modules/zod-deep-partial": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/zod-deep-partial/-/zod-deep-partial-1.4.4.tgz", + "integrity": "sha512-aWkPl7hVStgE01WzbbSxCgX4O+sSpgt8JOjvFUtMTF75VgL6MhWQbiZi+AWGN85SfSTtI9gsOtL1vInoqfDVaA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peerDependencies": { + "zod": "^4.1.13" + } }, "node_modules/@swc/core": { "version": "1.13.2", @@ -2970,14 +4336,18 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, + "license": "MIT" + }, + "node_modules/@types/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==", "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, "license": "MIT" }, "node_modules/@types/node": { @@ -3022,7 +4392,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", @@ -3052,7 +4421,6 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -3062,7 +4430,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.38.0", @@ -3087,7 +4454,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.38.0", @@ -3109,7 +4475,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.38.0", @@ -3127,7 +4492,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3144,7 +4508,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.38.0", @@ -3169,7 +4532,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", - "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3183,7 +4545,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/project-service": "8.38.0", @@ -3212,7 +4573,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -3222,7 +4582,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -3238,7 +4597,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", @@ -3262,7 +4620,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.38.0", @@ -3276,6 +4633,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vercel/ncc": { + "version": "0.38.4", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz", + "integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==", + "dev": true, + "license": "MIT", + "bin": { + "ncc": "dist/ncc/cli.js" + } + }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz", @@ -3417,7 +4784,6 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3441,7 +4807,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3477,7 +4842,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3536,6 +4900,18 @@ "node": ">= 8" } }, + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -3546,7 +4922,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/aria-hidden": { @@ -3648,7 +5023,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3728,7 +5102,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3785,7 +5158,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -3924,7 +5296,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { @@ -4142,7 +5513,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4179,11 +5549,19 @@ "node": ">=6" } }, + "node_modules/deep-equality-data-structures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-2.0.0.tgz", + "integrity": "sha512-qgrUr7MKXq7VRN+WUpQ48QlXVGL0KdibAoTX8KRg18lgOgqbEKMAW1WZsVCtakY4+XX42pbAJzTz/DlXEFM2Fg==", + "license": "MIT", + "dependencies": { + "object-hash": "^3.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, "license": "MIT" }, "node_modules/delayed-stream": { @@ -4440,7 +5818,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -4475,7 +5852,6 @@ "version": "9.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", - "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -4559,7 +5935,6 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -4576,7 +5951,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4589,7 +5963,6 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", @@ -4621,7 +5994,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -4634,7 +6006,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -4647,7 +6018,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4667,7 +6037,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -4693,7 +6062,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-equals": { @@ -4737,16 +6105,51 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, "license": "MIT" }, + "node_modules/fast-xml-builder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", + "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -4760,7 +6163,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" @@ -4785,7 +6187,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -4802,7 +6203,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -4816,7 +6216,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, "license": "ISC" }, "node_modules/foreground-child": { @@ -5023,14 +6422,12 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5136,7 +6533,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -5146,7 +6542,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -5163,7 +6558,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -5179,6 +6573,15 @@ "node": ">=8" } }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/input-otp": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", @@ -5277,6 +6680,16 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -5311,7 +6724,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5370,28 +6782,24 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -5401,7 +6809,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -5433,7 +6840,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -5467,7 +6873,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/loose-envify": { @@ -5556,6 +6961,21 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -5593,7 +7013,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -5615,7 +7034,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/mz": { @@ -5651,7 +7069,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, "license": "MIT" }, "node_modules/next-themes": { @@ -5664,6 +7081,48 @@ "react-dom": "^16.8 || ^17 || ^18" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -5719,7 +7178,6 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -5737,7 +7195,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -5753,7 +7210,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -5775,7 +7231,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -5801,12 +7256,26 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6038,7 +7507,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -6127,7 +7595,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -6458,7 +7925,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -6566,7 +8032,6 @@ "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6772,7 +8237,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6801,6 +8265,21 @@ "dev": true, "license": "MIT" }, + "node_modules/strnum": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", + "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -6827,7 +8306,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7075,7 +8553,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=18.12" @@ -7100,7 +8577,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -7113,7 +8589,6 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -7127,7 +8602,6 @@ "version": "8.38.0", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", - "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/eslint-plugin": "8.38.0", @@ -7199,7 +8673,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -7515,6 +8988,12 @@ "node": ">=12" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -7575,7 +9054,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7701,6 +9179,21 @@ "node": ">=12" } }, + "node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -7709,22 +9202,24 @@ "license": "MIT" }, "node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" diff --git a/package.json b/package.json index 481e6df..803329d 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,13 @@ "lint": "eslint .", "preview": "vite preview", "test": "vitest run", - "test:watch": "vitest" + "test:watch": "vitest", + "startos:check": "tsc -p startos/tsconfig.json --noEmit", + "startos:build": "rm -rf ./javascript && cd startos && ncc build index.ts -o ../javascript && echo '{\"type\":\"commonjs\"}' > ../javascript/package.json" }, "dependencies": { "@hookform/resolvers": "^3.10.0", + "@start9labs/start-sdk": "2.0.9", "@radix-ui/react-accordion": "^1.2.11", "@radix-ui/react-alert-dialog": "^1.1.14", "@radix-ui/react-aspect-ratio": "^1.1.7", @@ -67,8 +70,12 @@ "zod": "^3.25.76", "zustand": "^5.0.12" }, + "overrides": { + "@start9labs/start-sdk": "$@start9labs/start-sdk" + }, "devDependencies": { "@eslint/js": "^9.32.0", + "@vercel/ncc": "^0.38.4", "@tailwindcss/typography": "^0.5.16", "@testing-library/jest-dom": "^6.6.0", "@testing-library/react": "^16.0.0", diff --git a/sdk-build/actions/index.ts b/sdk-build/actions/index.ts deleted file mode 100644 index c82cb95..0000000 --- a/sdk-build/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { sdk } from '../sdk' - -export const actions = sdk.Actions.of() diff --git a/sdk-build/backups.ts b/sdk-build/backups.ts deleted file mode 100644 index 0a90b1e..0000000 --- a/sdk-build/backups.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { sdk } from './sdk' - -export const { createBackup, restoreInit } = sdk.setupBackups( - async ({ effects }) => sdk.Backups.ofVolumes('main'), -) diff --git a/sdk-build/dependencies.ts b/sdk-build/dependencies.ts deleted file mode 100644 index 7221c4b..0000000 --- a/sdk-build/dependencies.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { sdk } from './sdk' - -export const setDependencies = sdk.setupDependencies( - async ({ effects }) => ({}), -) diff --git a/sdk-build/i18n/dictionaries/default.ts b/sdk-build/i18n/dictionaries/default.ts deleted file mode 100644 index d12e344..0000000 --- a/sdk-build/i18n/dictionaries/default.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const DEFAULT_LANG = 'en_US' - -const dict = { - 'Starting Blisspoint': 0, - 'Web Interface': 1, - 'The web interface is ready': 2, - 'The web interface is not ready': 3, - 'Web UI': 4, - 'Blisspoint web interface': 5, -} as const - -export type I18nKey = keyof typeof dict -export type LangDict = Record<(typeof dict)[I18nKey], string> -export default dict diff --git a/sdk-build/i18n/dictionaries/translations.ts b/sdk-build/i18n/dictionaries/translations.ts deleted file mode 100644 index 98f9348..0000000 --- a/sdk-build/i18n/dictionaries/translations.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { LangDict } from './default' - -export default {} satisfies Record diff --git a/sdk-build/i18n/index.ts b/sdk-build/i18n/index.ts deleted file mode 100644 index 1849d6d..0000000 --- a/sdk-build/i18n/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { setupI18n } from '@start9labs/start-sdk' -import defaultDict, { DEFAULT_LANG } from './dictionaries/default' -import translations from './dictionaries/translations' - -export const i18n = setupI18n(defaultDict, translations, DEFAULT_LANG) diff --git a/sdk-build/index.ts b/sdk-build/index.ts deleted file mode 100644 index c3b88a8..0000000 --- a/sdk-build/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -export { createBackup } from './backups' -export { main } from './main' -export { init, uninit } from './init' -export { actions } from './actions' -import { buildManifest } from '@start9labs/start-sdk' -import { manifest as sdkManifest } from './manifest' -import { versionGraph } from './versions' -export const manifest = buildManifest(versionGraph, sdkManifest) -import { i18n } from './i18n' -import { sdk } from './sdk' -import { uiPort } from './utils' - -export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => { - const uiMulti = sdk.MultiHost.of(effects, 'ui-multi') - const uiMultiOrigin = await uiMulti.bindPort(uiPort, { - protocol: 'http', - }) - const ui = sdk.createInterface(effects, { - name: i18n('Web UI'), - id: 'ui', - description: i18n('Blisspoint web interface'), - type: 'ui', - masked: false, - schemeOverride: null, - username: null, - path: '', - query: {}, - }) - - const uiReceipt = await uiMultiOrigin.export([ui]) - - return [uiReceipt] -}) diff --git a/sdk-build/init/index.ts b/sdk-build/init/index.ts deleted file mode 100644 index 2e671e5..0000000 --- a/sdk-build/init/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { sdk } from '../sdk' -import { setDependencies } from '../dependencies' -import { setInterfaces } from '../interfaces' -import { versionGraph } from '../versions' -import { actions } from '../actions' -import { restoreInit } from '../backups' - -export const init = sdk.setupInit( - restoreInit, - versionGraph, - setInterfaces, - setDependencies, - actions, -) - -export const uninit = sdk.setupUninit(versionGraph) diff --git a/sdk-build/interfaces.ts b/sdk-build/interfaces.ts deleted file mode 100644 index febaab9..0000000 --- a/sdk-build/interfaces.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { i18n } from './i18n' -import { sdk } from './sdk' -import { uiPort } from './utils' - -export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => { - const uiMulti = sdk.MultiHost.of(effects, 'ui-multi') - const uiMultiOrigin = await uiMulti.bindPort(uiPort, { - protocol: 'http', - }) - const ui = sdk.createInterface(effects, { - name: i18n('Web UI'), - id: 'ui', - description: i18n('Blisspoint web interface'), - type: 'ui', - masked: false, - schemeOverride: null, - username: null, - path: '', - query: {}, - }) - - const uiReceipt = await uiMultiOrigin.export([ui]) - - return [uiReceipt] -}) diff --git a/sdk-build/main.ts b/sdk-build/main.ts deleted file mode 100644 index fc4d752..0000000 --- a/sdk-build/main.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { i18n } from './i18n' -import { sdk } from './sdk' -import { uiPort } from './utils' - -export const main = sdk.setupMain(async ({ effects }) => { - console.info(i18n('Starting Blisspoint')) - - return sdk.Daemons.of(effects).addDaemon('primary', { - subcontainer: await sdk.SubContainer.of( - effects, - { imageId: 'blisspoint' }, - sdk.Mounts.of().mountVolume({ - volumeId: 'main', - subpath: null, - mountpoint: '/data', - readonly: false, - }), - 'blisspoint-sub', - ), - exec: { - command: ['sh', '-c', 'proxy-rs & node server/serve.cjs'], - }, - ready: { - display: i18n('Web Interface'), - fn: () => - sdk.healthCheck.checkPortListening(effects, uiPort, { - successMessage: i18n('The web interface is ready'), - errorMessage: i18n('The web interface is not ready'), - }), - }, - requires: [], - }) -}) diff --git a/sdk-build/manifest/i18n.ts b/sdk-build/manifest/i18n.ts deleted file mode 100644 index 5b6a6e0..0000000 --- a/sdk-build/manifest/i18n.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const short = { - en_US: 'Monitor and control your LAN bitcoin miners.', -} - -export const long = { - en_US: - 'Minimalist, mobile-first panel for monitoring and controlling bitcoin miners on your local network (BraiinsOS+ / CGMiner API). Watch live hashrate, power, and temperature; pause and resume mining.', -} diff --git a/sdk-build/manifest/index.ts b/sdk-build/manifest/index.ts deleted file mode 100644 index 79330d0..0000000 --- a/sdk-build/manifest/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { setupManifest } from '@start9labs/start-sdk' -import { long, short } from './i18n' - -export const manifest = setupManifest({ - id: 'blisspoint', - title: 'Blisspoint', - license: 'MIT', - packageRepo: 'https://github.com/heatpunk/blisspoint', - upstreamRepo: 'https://github.com/heatpunk/blisspoint', - marketingUrl: 'https://github.com/heatpunk/blisspoint', - donationUrl: null, - description: { short, long }, - volumes: ['main'], - images: { - blisspoint: { - source: { dockerTag: 'ghcr.io/heatpunk/blisspoint:0.5.2' }, - arch: ['x86_64'], - }, - }, - alerts: { - install: null, - update: null, - uninstall: null, - restore: null, - start: null, - stop: null, - }, - dependencies: {}, -}) diff --git a/sdk-build/package-lock.json b/sdk-build/package-lock.json deleted file mode 100644 index ea09282..0000000 --- a/sdk-build/package-lock.json +++ /dev/null @@ -1,357 +0,0 @@ -{ - "name": "blisspoint-startos-sdk-build", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "blisspoint-startos-sdk-build", - "dependencies": { - "@start9labs/start-sdk": "1.5.3" - }, - "devDependencies": { - "@types/node": "^22.0.0", - "@vercel/ncc": "^0.38.4", - "typescript": "^5.9.3" - } - }, - "node_modules/@iarna/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==", - "license": "ISC" - }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodable/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/nodable" - } - ], - "license": "MIT" - }, - "node_modules/@start9labs/start-sdk": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-1.5.3.tgz", - "integrity": "sha512-OyHe9J6hMvyA5ZavcLkxdVQvZcuTH9J9kagV6NDI83eAG/YpJFIq62gP/n/2PPNdHWwNSXVQmSwnsvsV8Gyg+A==", - "license": "MIT", - "dependencies": { - "@iarna/toml": "^3.0.0", - "@noble/curves": "^1.9.7", - "@noble/hashes": "^1.8.0", - "@types/ini": "^4.1.1", - "deep-equality-data-structures": "^2.0.0", - "fast-xml-parser": "~5.7.0", - "ini": "^5.0.0", - "isomorphic-fetch": "^3.0.0", - "mime": "^4.1.0", - "yaml": "^2.8.3", - "zod": "4.3.6", - "zod-deep-partial": "^1.2.0" - } - }, - "node_modules/@types/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.19.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.21.tgz", - "integrity": "sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@vercel/ncc": { - "version": "0.38.4", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz", - "integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==", - "dev": true, - "license": "MIT", - "bin": { - "ncc": "dist/ncc/cli.js" - } - }, - "node_modules/anynum": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", - "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/deep-equality-data-structures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-2.0.0.tgz", - "integrity": "sha512-qgrUr7MKXq7VRN+WUpQ48QlXVGL0KdibAoTX8KRg18lgOgqbEKMAW1WZsVCtakY4+XX42pbAJzTz/DlXEFM2Fg==", - "license": "MIT", - "dependencies": { - "object-hash": "^3.0.0" - } - }, - "node_modules/fast-xml-builder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", - "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.5.0", - "xml-naming": "^0.1.0" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", - "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "@nodable/entities": "^2.1.0", - "fast-xml-builder": "^1.1.7", - "path-expression-matcher": "^1.5.0", - "strnum": "^2.2.3" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, - "node_modules/mime": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", - "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "license": "MIT", - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/path-expression-matcher": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/strnum": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", - "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "anynum": "^1.0.1" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/xml-naming": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-deep-partial": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/zod-deep-partial/-/zod-deep-partial-1.4.4.tgz", - "integrity": "sha512-aWkPl7hVStgE01WzbbSxCgX4O+sSpgt8JOjvFUtMTF75VgL6MhWQbiZi+AWGN85SfSTtI9gsOtL1vInoqfDVaA==", - "license": "MIT", - "peerDependencies": { - "zod": "^4.1.13" - } - } - } -} diff --git a/sdk-build/package.json b/sdk-build/package.json deleted file mode 100644 index 3ebe2de..0000000 --- a/sdk-build/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "blisspoint-startos-sdk-build", - "private": true, - "scripts": { - "build": "rm -rf ./javascript && ( cd ../startos && find . -name '*.ts' -exec cp --parents -f {} ../sdk-build/ ';' ) && ncc build index.ts -o ./javascript", - "check": "tsc --noEmit" - }, - "dependencies": { - "@start9labs/start-sdk": "2.0.6" - }, - "devDependencies": { - "@types/node": "^20.19.33", - "@vercel/ncc": "^0.38.4", - "typescript": "^5.9.3" - } -} diff --git a/sdk-build/sdk.ts b/sdk-build/sdk.ts deleted file mode 100644 index 4bf7c2c..0000000 --- a/sdk-build/sdk.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { StartSdk } from '@start9labs/start-sdk' -import { manifest } from './manifest' - -export const sdk = StartSdk.of().withManifest(manifest).build(true) diff --git a/sdk-build/tsconfig.json b/sdk-build/tsconfig.json deleted file mode 100644 index 99ccb1d..0000000 --- a/sdk-build/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "include": ["./**/*.ts", "node_modules/**/startos"], - "compilerOptions": { - "target": "ES2018", - "module": "CommonJS", - "moduleResolution": "node", - "esModuleInterop": true, - "strict": true, - "skipLibCheck": true - } -} diff --git a/sdk-build/utils.ts b/sdk-build/utils.ts deleted file mode 100644 index 0b17d7c..0000000 --- a/sdk-build/utils.ts +++ /dev/null @@ -1 +0,0 @@ -export const uiPort = 80 diff --git a/sdk-build/versions/current.ts b/sdk-build/versions/current.ts deleted file mode 100644 index a8fa959..0000000 --- a/sdk-build/versions/current.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' - -export const current = VersionInfo.of({ - version: '0.1.1:0', - releaseNotes: { - en_US: 'UX improvements: slider range rounded to nearest 50, removed arrow from footer dropdown.', - }, - migrations: { - up: async ({ effects }) => {}, - down: IMPOSSIBLE, - }, -}) diff --git a/sdk-build/versions/index.ts b/sdk-build/versions/index.ts deleted file mode 100644 index e596b0c..0000000 --- a/sdk-build/versions/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { VersionGraph } from '@start9labs/start-sdk' -import { current } from './current' - -export const versionGraph = VersionGraph.of({ - current, - other: [], -}) diff --git a/startos/README.md b/startos/README.md index 9079578..02b53eb 100644 --- a/startos/README.md +++ b/startos/README.md @@ -1,24 +1,204 @@ -# Blisspoint - StartOS package (s9pk) +

+ Blisspoint Logo +

-Scaffold to package Blisspoint for **StartOS 0.4.0.x**. +# Blisspoint on StartOS -## Layout -- `../Dockerfile` - build (Vite -> dist) + runtime (proxy :8081 + UI/`/api` :80). -- `../server/serve.cjs` - production server: serves `dist/` and reverse-proxies `/api/*` -> `127.0.0.1:8081`. -- `manifest.yaml` - package manifest **(TEMPLATE - verify against the 0.4.0.x SDK schema)**. -- `icon.png` - app icon. -- `instructions.md` - post-install instructions. +> **Upstream docs:** +> +> The application is developed at [heatpunk/blisspoint]; this repository is the +> StartOS packaging fork of it. Anything not described in this document behaves +> exactly as the upstream README and the app itself describe. -## Build & publish (from repo root) - start-cli s9pk pack . -o blisspoint.s9pk --icon startos/icon.png - start-cli s9pk inspect manifest blisspoint.s9pk - start-cli s9pk publish blisspoint.s9pk +[heatpunk/blisspoint]: https://github.com/heatpunk/blisspoint -(or `make pack` / `make publish`) +Blisspoint is a deliberately simple UI for running a bitcoin ASIC miner as a +space heater: one slider for heat output, a live readout, and a pause button. +It is built for the people you share a home with rather than for the person who +set the miner up. This document covers what the StartOS package adds and how it +is wired. -## Verify on your node -1. Confirm the manifest format: `start-cli s9pk pack --help` (0.4.0.x differs from 0.3.x). -2. Build the image; confirm the container can reach miners on the LAN (port 4028) - StartOS network policy may need to allow LAN access. -3. Install the .s9pk and open the Web UI. +--- -Docs: https://docs.start9.com/start-os/0.4.0.x/cli-reference.html +## Table of Contents + +- [Image and Container Runtime](#image-and-container-runtime) +- [Volume and Data Layout](#volume-and-data-layout) +- [Installation and First-Run Flow](#installation-and-first-run-flow) +- [Configuration Management](#configuration-management) +- [Network Access and Interfaces](#network-access-and-interfaces) +- [Actions](#actions) +- [Backups and Restore](#backups-and-restore) +- [Health Checks](#health-checks) +- [Dependencies](#dependencies) +- [Limitations and Differences](#limitations-and-differences) +- [What Is Unchanged from Upstream](#what-is-unchanged-from-upstream) +- [Contributing](#contributing) +- [Quick Reference for AI Consumers](#quick-reference-for-ai-consumers) + +--- + +## Image and Container Runtime + +| What | Detail | +| ------------- | -------------------------------------------------------------------------------------------- | +| Image source | `ghcr.io/heatpunk/blisspoint`, published by upstream from the `Dockerfile` in this tree | +| Architectures | `x86_64`, `aarch64` | +| Entrypoint | The image's own `CMD`, via `sdk.useEntrypoint()` | + +The `Dockerfile` builds in three stages: `proxy-rs` as a static musl binary +(`rust:alpine`), the Vite/React UI to static assets on the build platform, and a +`node:20-alpine` runtime carrying both. The container runs two processes — the +Node server on port 80 and `proxy-rs` on loopback — from a single `sh -c` +command. `startos/main.ts` does not restate that command; it defers to the image +so the two cannot drift apart. + +## Volume and Data Layout + +| Volume | Mount point | +| ------ | ----------- | +| `main` | `/data` | + +The Node server persists all user state to `/data/state.json` — the miner list, +per-miner names, the captured power ceiling, saved miner API passwords, and the +theme. Writes go to a temporary file and are then renamed, so an interrupted +write cannot truncate the saved settings. + +The browser keeps a `localStorage` copy under `blisspoint.state.v2` as a cache +and as a fallback when the server endpoint is unreachable, but the server copy +is authoritative: on load the UI prefers `/data/state.json` and falls back to +`localStorage` only if the request fails. + +> [!IMPORTANT] +> Miner API passwords are stored in `/data/state.json` in plaintext, and are +> therefore included in backups. See +> [Limitations](#limitations-and-differences). + +## Installation and First-Run Flow + +There is no setup wizard, no generated credential, and no first-run task. Once +the service is started the web interface is immediately usable, and opens on an +empty miner list. The user adds a miner by IP address, or runs a LAN scan from +within the UI. + +The power ceiling for each miner is captured from that miner's own reported +power target the first time it connects, and then frozen. Raising it is +deliberately not possible from Blisspoint; the miner must be removed and +re-added after its target is changed in the miner's own interface. + +## Configuration Management + +| StartOS-Managed | Upstream-Managed | +| --------------- | --------------------------------------------------------------------- | +| Nothing | Every setting, via the Blisspoint web interface, saved to `/data` | + +The package defines no file models, no environment variables, and no +configuration actions. `startos/fileModels/` is intentionally empty. + +## Network Access and Interfaces + +| Interface | ID | Port | Protocol | Purpose | +| --------- | ---- | ---- | -------- | ------------------------ | +| Web UI | `ui` | 80 | HTTP | The entire Blisspoint UI | + +The interface is bound through a `MultiHost` (`ui-multi`), so the user chooses +where it is reachable from using the normal StartOS interface controls. + +Two things are **not** exposed: + +- `proxy-rs` listens on `127.0.0.1:8081` inside the container only. The Node + server reverse-proxies `/api/*` to it; nothing else can reach it. +- The miner API itself is never exposed. Blisspoint talks outbound to miners. + +**Outbound LAN access is required.** The container must be able to reach the +miners on the local network on their firmware's API port. This is the single +network requirement of the service, and the one thing that makes it useless if +unavailable. + +## Actions + +None. The package ships an empty `sdk.Actions.of()`. + +## Backups and Restore + +The `main` volume is included in backups via `sdk.Backups.ofVolumes('main')`, +which captures `/data/state.json` — the miner list, per-miner names, captured +power ceilings, saved miner API passwords, and the theme. + +A restored install comes back with its miners already configured. Because the +saved passwords are part of that file, **a backup of this service contains +miner API credentials in plaintext**; treat it with the same care as any other +service backup. + +Nothing else is stored: live readings are polled from the miners on each +refresh and are not persisted. + +## Health Checks + +| Daemon | Check | Grace period | +| --------- | ------------------------------ | ------------ | +| `primary` | `checkPortListening` on port 80 | SDK default | + +Success message: "The web interface is ready". +Failure message: "The web interface is not ready". + +The check confirms only that the UI server is accepting connections. It does not +verify that any miner is reachable — a Blisspoint install with no miners +configured is healthy. + +## Dependencies + +None. + +## Limitations and Differences + +1. **Miner API passwords are stored in plaintext on the server.** Passwords + entered for pause/resume or power control are written to `/data/state.json` + as given, and are consequently included in every backup of this service. +2. **Last write wins across devices.** Each browser saves the whole state + object, so two people editing from different phones at the same time will + have one overwrite the other's change. There is no merge or conflict + prompt. +3. **The LAN scan guesses the subnet.** It derives the `/24` to sweep from the + first configured miner's IP address, falling back to `192.168.1.0/24` when no + miner is configured yet. On any other subnet, add one miner by IP address + first; subsequent scans then target the right range. +4. **Control support is narrower than monitoring support.** Reading live stats + works across the firmwares `asic-rs` supports; setting a power target and + pausing/resuming only work where the firmware exposes them. +5. **No StartOS actions.** Everything is driven from the web interface. + +## What Is Unchanged from Upstream + +The StartOS package runs the image published by upstream — the same one the +Docker, Umbrel, and Home Assistant installs use — with no StartOS-specific +patches to the UI, the Node server, or `proxy-rs`. This fork's changes are +confined to `startos/`, the build files, and the CI workflows. Miner +communication, the power-ceiling capture rule, the theme set, and the API +surface documented in the upstream README all behave identically here. + +## Contributing + +See [CONTRIBUTING.md](../CONTRIBUTING.md) in the repository root for +prerequisites, checks, and the release flow. + +--- + +## Quick Reference for AI Consumers + +```yaml +package_id: blisspoint +architectures: [x86_64, aarch64] +volumes: + main: /data +ports: + ui: 80 +dependencies: none +startos_managed_env_vars: [] +actions: [] +notes: + - user state persists to /data/state.json; browser localStorage is a cache/fallback + - that file holds miner API passwords in plaintext and is included in backups + - requires outbound LAN reachability to miners + - proxy-rs is internal only, on 127.0.0.1:8081 +``` diff --git a/startos/i18n/dictionaries/translations.ts b/startos/i18n/dictionaries/translations.ts index 98f9348..db5d6b4 100644 --- a/startos/i18n/dictionaries/translations.ts +++ b/startos/i18n/dictionaries/translations.ts @@ -1,3 +1,36 @@ import { LangDict } from './default' -export default {} satisfies Record +export default { + es_ES: { + 0: 'Iniciando Blisspoint', + 1: 'Interfaz web', + 2: 'La interfaz web está lista', + 3: 'La interfaz web no está lista', + 4: 'Interfaz web', + 5: 'La interfaz web de Blisspoint', + }, + de_DE: { + 0: 'Starte Blisspoint', + 1: 'Weboberfläche', + 2: 'Die Weboberfläche ist bereit', + 3: 'Die Weboberfläche ist nicht bereit', + 4: 'Weboberfläche', + 5: 'Die Weboberfläche von Blisspoint', + }, + pl_PL: { + 0: 'Uruchamianie Blisspoint', + 1: 'Interfejs webowy', + 2: 'Interfejs webowy jest gotowy', + 3: 'Interfejs webowy nie jest gotowy', + 4: 'Interfejs webowy', + 5: 'Interfejs webowy Blisspoint', + }, + fr_FR: { + 0: 'Démarrage de Blisspoint', + 1: 'Interface web', + 2: "L'interface web est prête", + 3: "L'interface web n'est pas prête", + 4: 'Interface web', + 5: "L'interface web de Blisspoint", + }, +} satisfies Record diff --git a/startos/index.ts b/startos/index.ts index c3b88a8..7af589b 100644 --- a/startos/index.ts +++ b/startos/index.ts @@ -1,3 +1,6 @@ +/** + * Plumbing. DO NOT EDIT. + */ export { createBackup } from './backups' export { main } from './main' export { init, uninit } from './init' @@ -6,28 +9,3 @@ import { buildManifest } from '@start9labs/start-sdk' import { manifest as sdkManifest } from './manifest' import { versionGraph } from './versions' export const manifest = buildManifest(versionGraph, sdkManifest) -import { i18n } from './i18n' -import { sdk } from './sdk' -import { uiPort } from './utils' - -export const setInterfaces = sdk.setupInterfaces(async ({ effects }) => { - const uiMulti = sdk.MultiHost.of(effects, 'ui-multi') - const uiMultiOrigin = await uiMulti.bindPort(uiPort, { - protocol: 'http', - }) - const ui = sdk.createInterface(effects, { - name: i18n('Web UI'), - id: 'ui', - description: i18n('Blisspoint web interface'), - type: 'ui', - masked: false, - schemeOverride: null, - username: null, - path: '', - query: {}, - }) - - const uiReceipt = await uiMultiOrigin.export([ui]) - - return [uiReceipt] -}) diff --git a/startos/instructions.md b/startos/instructions.md index 61cdad4..3913e33 100644 --- a/startos/instructions.md +++ b/startos/instructions.md @@ -1,32 +1,70 @@ # Blisspoint -Run your ASIC miner as a space heater — simple enough for anyone in the house. +## Documentation -## Getting started +- [Blisspoint on GitHub](https://github.com/heatpunk/blisspoint#readme) — the + project's own README: features, the API the UI talks to, and development notes. +- [asic-rs](https://github.com/256foundation/asic-rs) — the 256 Foundation + library Blisspoint uses to speak to miners, and the source of truth for which + models and firmwares are supported. -1. Open **Blisspoint** from your StartOS services and launch the Web UI (LAN), - preferably on a phone or tablet on the same network as your miner. -2. Open the miner menu at the bottom and tap **Scan LAN** to find miners - automatically — or add a miner's IP address manually in Settings. -3. Tap a miner to see live hashrate, power draw, chip temperature and fan speed. +## What you get on StartOS -## Controlling the heat +A single web interface, meant for a phone. It shows one miner at a time with its +hashrate, power draw, chip temperature and fan speed, refreshed every few +seconds, and gives you one slider for heat and one button for pause/resume. -- Drag the **power slider** and release to set the miner's power target — more - power, more heat. -- The slider's maximum is captured from the miner's own power target the first - time it connects, and locked: nobody can push the machine harder than it was - set up for. To change the ceiling, adjust the target in the miner's own - interface, then remove and re-add the miner here. -- Use **Pause/Resume** to stop and start mining with one tap. Some firmwares - ask for the miner's password (username `root`) the first time; it is stored - only in your browser. +Your miner list and settings are saved on your server, so they are included in +your StartOS backups and are there whichever phone or browser you open +Blisspoint from. -## Supported miners +## Getting set up -Miner communication is handled by the 256 Foundation's open -[asic-rs](https://github.com/256foundation/asic-rs) library. Monitoring works -across Antminer (stock), Whatsminer, Avalon, BraiinsOS+, LuxOS, Vnish, ePIC, -Marathon, Bitaxe and more, with power control wherever the firmware exposes it. +Your server and your miners must be on the same local network; Blisspoint +reaches the miners directly. -**Network:** the StartOS node must be on the same LAN as your miners. +1. Open the **Web UI** — ideally on a phone or tablet connected to that same + network, since that is what the layout is designed for. +2. Open the miner menu at the bottom and tap **Scan LAN**. If nothing is found, + add the miner's IP address by hand in **Settings** — a scan with no miners + configured yet only sweeps `192.168.1.x`, so on any other network you need to + add the first miner manually. +3. Tap the miner to select it. Its live readings appear at the top. + +On the first successful connection Blisspoint reads the miner's own power target +and locks that in as the maximum the slider will ever allow. This is deliberate: +nobody in the house can drive the machine harder than you set it up for. + +## Using Blisspoint + +### Setting the heat + +Drag the power slider and release. More power means more heat. The slider runs +from the miner's minimum up to the ceiling captured on first connect. + +To raise that ceiling you have to change the power target in the miner's own +interface, then remove and re-add the miner here. There is no way to raise it +from Blisspoint. + +### Pausing + +The pause/resume button stops and restarts mining. Some firmwares ask for the +miner's own API password the first time — the username is `root`. The password +is saved in your browser so you are not asked again on that device. + +### Adding more miners + +Repeat the scan or add further IP addresses in **Settings**. The menu at the +bottom switches between them. + +## Limitations + +- **Your miner passwords are kept in your backups.** Any miner password you + enter is saved on the server as ordinary text so it survives restarts, which + means it is also inside every backup of Blisspoint. Keep those backups + somewhere you trust. +- **Two people editing at once will overwrite each other.** If you change + settings on two phones at the same moment, whichever saves last wins. +- **Control depends on the firmware.** Live monitoring works across a wide range + of miners. Setting a power target and pausing only work where the firmware + supports it — check the asic-rs link above if a button does nothing. diff --git a/startos/main.ts b/startos/main.ts index fc4d752..3b34b26 100644 --- a/startos/main.ts +++ b/startos/main.ts @@ -18,7 +18,7 @@ export const main = sdk.setupMain(async ({ effects }) => { 'blisspoint-sub', ), exec: { - command: ['sh', '-c', 'proxy-rs & node server/serve.cjs'], + command: sdk.useEntrypoint(), }, ready: { display: i18n('Web Interface'), diff --git a/startos/manifest/i18n.ts b/startos/manifest/i18n.ts index 5b6a6e0..507c337 100644 --- a/startos/manifest/i18n.ts +++ b/startos/manifest/i18n.ts @@ -1,8 +1,20 @@ export const short = { - en_US: 'Monitor and control your LAN bitcoin miners.', + en_US: 'Run your bitcoin miner as a space heater, with one simple slider.', + es_ES: 'Usa tu minero de bitcoin como calefactor, con un solo deslizador.', + de_DE: 'Nutze deinen Bitcoin-Miner mit einem Schieberegler als Heizung.', + pl_PL: 'Używaj koparki bitcoin jako grzejnika — jednym suwakiem.', + fr_FR: 'Utilisez votre mineur bitcoin comme chauffage, avec un curseur.', } export const long = { en_US: - 'Minimalist, mobile-first panel for monitoring and controlling bitcoin miners on your local network (BraiinsOS+ / CGMiner API). Watch live hashrate, power, and temperature; pause and resume mining.', + 'Blisspoint turns a bitcoin ASIC miner into an ordinary household appliance. Open it on your phone, see how much heat the miner is making, and slide its power up or down. The ceiling is captured from the miner on first connect and locked, so nobody can push the machine past how it was set up. Hashrate, power draw, chip temperature and fan speed refresh every few seconds, and one tap pauses or resumes mining. Many firmwares are supported through the open asic-rs library.', + es_ES: + 'Blisspoint convierte un minero ASIC de bitcoin en un electrodoméstico más. Ábrelo en el móvil, mira cuánto calor genera el minero y sube o baja su potencia. El máximo se toma del minero en la primera conexión y queda bloqueado, así nadie puede exigirle más de lo previsto. Hashrate, consumo, temperatura del chip y velocidad del ventilador se actualizan cada pocos segundos, y un toque pausa o reanuda la minería. Compatible con muchos firmwares mediante la librería abierta asic-rs.', + de_DE: + 'Blisspoint macht aus einem Bitcoin-ASIC-Miner ein ganz normales Haushaltsgerät. Öffne es auf dem Handy, sieh wie viel Wärme der Miner erzeugt, und regle seine Leistung hoch oder runter. Das Maximum wird beim ersten Verbinden vom Miner übernommen und gesperrt, damit niemand das Gerät über seine Einrichtung hinaus treibt. Hashrate, Verbrauch, Chiptemperatur und Lüfterdrehzahl aktualisieren sich laufend, ein Tipp pausiert oder startet das Mining. Viele Firmwares werden über asic-rs unterstützt.', + pl_PL: + 'Blisspoint zamienia koparkę ASIC bitcoin w zwykłe domowe urządzenie. Otwórz ją na telefonie, sprawdź ile ciepła wytwarza koparka i zwiększ lub zmniejsz jej moc. Maksimum jest odczytywane z koparki przy pierwszym połączeniu i blokowane, więc nikt nie przeciąży urządzenia ponad jego konfigurację. Hashrate, pobór mocy, temperatura układu i obroty wentylatora odświeżają się na bieżąco, a jedno dotknięcie wstrzymuje lub wznawia kopanie. Wiele firmware’ów obsługuje otwarta biblioteka asic-rs.', + fr_FR: + "Blisspoint transforme un mineur ASIC bitcoin en appareil ordinaire. Ouvrez-le sur votre téléphone, voyez la chaleur produite et ajustez sa puissance. Le plafond est relevé sur le mineur à la première connexion puis verrouillé, afin que personne n'aille au-delà de sa configuration. Hashrate, consommation, température des puces et vitesse des ventilateurs se rafraîchissent en continu, et une pression met en pause ou relance le minage. De nombreux firmwares sont gérés via asic-rs.", } diff --git a/startos/manifest/index.ts b/startos/manifest/index.ts index 00d3427..29d9311 100644 --- a/startos/manifest/index.ts +++ b/startos/manifest/index.ts @@ -5,7 +5,7 @@ export const manifest = setupManifest({ id: 'blisspoint', title: 'Blisspoint', license: 'MIT', - packageRepo: 'https://github.com/heatpunk/blisspoint', + packageRepo: 'https://github.com/Start9-Community/blisspoint', upstreamRepo: 'https://github.com/heatpunk/blisspoint', marketingUrl: 'https://github.com/heatpunk/blisspoint', donationUrl: null, @@ -13,17 +13,9 @@ export const manifest = setupManifest({ volumes: ['main'], images: { blisspoint: { - source: { dockerTag: 'ghcr.io/heatpunk/blisspoint:0.5.3' }, - arch: ['x86_64'], + source: { dockerTag: 'ghcr.io/heatpunk/blisspoint:0.5.4' }, + arch: ['x86_64', 'aarch64'], }, }, - alerts: { - install: null, - update: null, - uninstall: null, - restore: null, - start: null, - stop: null, - }, dependencies: {}, }) diff --git a/startos/package.json b/startos/package.json new file mode 100644 index 0000000..5bbefff --- /dev/null +++ b/startos/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/startos/tsconfig.json b/startos/tsconfig.json new file mode 100644 index 0000000..5b5c2a6 --- /dev/null +++ b/startos/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@start9labs/start-sdk/tsconfig.base.json", + "include": ["**/*.ts", "../node_modules/**/startos"] +} diff --git a/startos/versions/current.ts b/startos/versions/current.ts index 66eefb6..f049499 100644 --- a/startos/versions/current.ts +++ b/startos/versions/current.ts @@ -1,9 +1,18 @@ import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' export const current = VersionInfo.of({ - version: '0.5.3:0', + version: '0.5.4:0', releaseNotes: { - en_US: 'Testing build with Blisspoint rename and CI fixes.', + en_US: + 'Your miners are now saved on the server instead of only in the browser, so your setup is included in backups and appears on every device you open Blisspoint from. Blisspoint also installs on ARM servers now, not just x86_64.', + es_ES: + 'Tus mineros ahora se guardan en el servidor y no solo en el navegador, así tu configuración se incluye en las copias de seguridad y aparece en todos los dispositivos desde los que abras Blisspoint. Blisspoint también se instala en servidores ARM, no solo x86_64.', + de_DE: + 'Deine Miner werden jetzt auf dem Server gespeichert statt nur im Browser. Deine Einrichtung ist damit in Backups enthalten und erscheint auf jedem Gerät, von dem aus du Blisspoint öffnest. Blisspoint lässt sich außerdem auf ARM-Servern installieren, nicht nur auf x86_64.', + pl_PL: + 'Twoje koparki są teraz zapisywane na serwerze, a nie tylko w przeglądarce, więc konfiguracja trafia do kopii zapasowych i pojawia się na każdym urządzeniu, z którego otworzysz Blisspoint. Blisspoint instaluje się też na serwerach ARM, nie tylko x86_64.', + fr_FR: + "Vos mineurs sont désormais enregistrés sur le serveur et non plus seulement dans le navigateur : votre configuration est incluse dans les sauvegardes et apparaît sur tous les appareils depuis lesquels vous ouvrez Blisspoint. Blisspoint s'installe également sur les serveurs ARM, et plus seulement x86_64.", }, migrations: { up: async ({ effects }) => {}, diff --git a/startos/versions/index.ts b/startos/versions/index.ts index c8128c6..9372568 100644 --- a/startos/versions/index.ts +++ b/startos/versions/index.ts @@ -1,11 +1,7 @@ import { VersionGraph } from '@start9labs/start-sdk' import { current } from './current' -import { v0_5_2 } from './v0_5_2' -import { v0_5_0 } from './v0_5_0' -import { v0_4_7 } from './v0_4_7' -import { v0_4_2 } from './v0_4_2' export const versionGraph = VersionGraph.of({ current, - other: [v0_5_2, v0_5_0, v0_4_7, v0_4_2], + other: [], // Add historical versions here so migrations run when upgrading through them }) diff --git a/startos/versions/v0_4_2.ts b/startos/versions/v0_4_2.ts deleted file mode 100644 index 76d58e6..0000000 --- a/startos/versions/v0_4_2.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' - -export const v0_4_2 = VersionInfo.of({ - version: '0.4.2:0', - releaseNotes: { - en_US: - 'Visual update: the power slider is reborn as a glass capsule, and the app ships a complete new icon set — home-screen/app icon, browser favicon and a proper app name. Everything from 0.4.1 is unchanged: the slider still sets the miner’s whole-machine power target via the open asic-rs library (Antminer/stock, Whatsminer, Avalon, BraiinsOS, LuxOS, Vnish, ePIC, Marathon, Bitaxe and more), with the first-connect ceiling captured as a locked maximum.', - }, - migrations: { - up: async ({ effects }) => {}, - down: IMPOSSIBLE, - }, -}) diff --git a/startos/versions/v0_4_7.ts b/startos/versions/v0_4_7.ts deleted file mode 100644 index 7e4babe..0000000 --- a/startos/versions/v0_4_7.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' - -export const v0_4_7 = VersionInfo.of({ - version: '0.4.7:0', - releaseNotes: { - en_US: - 'Glass redesign: the play/pause and settings buttons are now clear glass that lets the background show through, with the icons frosted into the glass, in both light and dark themes. New subtle themed backgrounds — pearl marble in light mode and near-black leather in dark mode. The settings icon is now a proper filled cog. The power slider’s minimum is the miner’s real minimum power target (read from BraiinsOS+ when exposed, otherwise one third of the maximum) instead of zero. Live readouts at the top now refresh more frequently.', - }, - migrations: { - up: async ({ effects }) => {}, - down: IMPOSSIBLE, - }, -}) diff --git a/startos/versions/v0_5_0.ts b/startos/versions/v0_5_0.ts deleted file mode 100644 index 7a9430f..0000000 --- a/startos/versions/v0_5_0.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' - -export const v0_5_0 = VersionInfo.of({ - version: '0.5.0:0', - releaseNotes: { - en_US: - 'Blisspoint now installs on Umbrel (community app store) and Home Assistant (add-on repository), alongside StartOS. No changes to the app itself.', - }, - migrations: { - up: async ({ effects }) => {}, - down: IMPOSSIBLE, - }, -}) diff --git a/startos/versions/v0_5_2.ts b/startos/versions/v0_5_2.ts deleted file mode 100644 index da876ac..0000000 --- a/startos/versions/v0_5_2.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' - -export const v0_5_2 = VersionInfo.of({ - version: '0.5.2:0', - releaseNotes: { - en_US: - 'The pause/play button and status dot now reflect the miner’s real state instead of guessing from hashrate — no more false PAUSED while a miner restarts or spins up. Powered by the 256 Foundation’s asic-rs 0.7.2, where the mining state is reported explicitly by the firmware.', - }, - migrations: { - up: async ({ effects }) => {}, - down: IMPOSSIBLE, - }, -})