From d6f108d81815724c167c950fdc6e557036b2dd4b Mon Sep 17 00:00:00 2001 From: archipelago Date: Fri, 12 Jun 2026 03:00:15 -0400 Subject: [PATCH] chore: snapshot release workspace --- CHANGELOG.md | 14 +- INSTALL.sh | 2 +- README.md | 4 +- app-catalog/catalog.json | 2 +- apps/DEVELOPMENT.md | 3 +- apps/PORTS.md | 2 - apps/QUICKSTART.md | 6 +- apps/README.md | 2 - apps/bitcoin-core/manifest.yml | 2 +- apps/bitcoin-knots/manifest.yml | 2 +- apps/did-wallet/manifest.yml | 3 - apps/did-wallet/src/index.ts | 1 - apps/electrumx/manifest.yml | 4 +- apps/portainer/manifest.yml | 2 +- apps/web5-dwn/.dockerignore | 6 - apps/web5-dwn/Dockerfile | 38 - apps/web5-dwn/README.md | 35 - apps/web5-dwn/manifest.yml | 55 - apps/web5-dwn/package-lock.json | 2747 ----------------- apps/web5-dwn/package.json | 21 - apps/web5-dwn/src/index.ts | 34 - apps/web5-dwn/tsconfig.json | 16 - core/archipelago/src/api/rpc/analytics.rs | 24 + core/archipelago/src/api/rpc/bitcoin_relay.rs | 22 +- core/archipelago/src/api/rpc/container.rs | 1 - core/archipelago/src/api/rpc/interfaces.rs | 67 +- core/archipelago/src/api/rpc/lnd/wallet.rs | 51 +- .../archipelago/src/api/rpc/package/config.rs | 34 +- core/archipelago/src/api/rpc/update.rs | 4 + .../src/container/docker_packages.rs | 8 - .../src/container/image_versions.rs | 3 - core/archipelago/src/federation/sync.rs | 75 +- core/archipelago/src/monitoring/telemetry.rs | 41 +- core/archipelago/src/update.rs | 50 +- core/container/src/podman_client.rs | 1 - docs/1.8-alpha-improvements-tracker.md | 19 +- docs/bitcoin-rpc-relay.md | 13 +- .../configs/archipelago-kiosk-launcher.sh | 98 +- neode-ui/DEV-SCRIPTS.md | 4 +- neode-ui/README.md | 2 +- neode-ui/src/App.vue | 24 + neode-ui/src/locales/en.json | 4 +- neode-ui/src/locales/es.json | 4 +- neode-ui/src/router/index.ts | 20 +- neode-ui/src/stores/appLauncher.ts | 2 - neode-ui/src/style.css | 15 + neode-ui/src/views/Discover.vue | 4 +- neode-ui/src/views/Home.vue | 131 +- neode-ui/src/views/Kiosk.vue | 11 +- neode-ui/src/views/MarketplaceAppDetails.vue | 9 +- neode-ui/src/views/Server.vue | 31 +- .../src/views/appSession/appSessionConfig.ts | 1 - .../appSession/generatedAppSessionConfig.ts | 2 - neode-ui/src/views/apps/AppCard.vue | 2 +- neode-ui/src/views/apps/appsConfig.ts | 2 +- neode-ui/src/views/discover/curatedApps.ts | 1 - neode-ui/src/views/fleet/FleetNodeDetail.vue | 16 +- neode-ui/src/views/fleet/FleetNodeGrid.vue | 7 +- .../fleet/__tests__/useFleetData.test.ts | 48 +- neode-ui/src/views/fleet/useFleetData.ts | 19 +- .../__tests__/homeRecommendations.test.ts | 8 +- .../src/views/home/homeRecommendations.ts | 15 +- .../views/marketplace/MarketplaceAppCard.vue | 4 + .../__tests__/MarketplaceAppCard.test.ts | 9 +- .../src/views/marketplace/marketplaceData.ts | 26 +- neode-ui/src/views/server/ServerModals.vue | 19 +- neode-ui/src/views/web5/Web5.vue | 4 - neode-ui/src/views/web5/Web5DWN.vue | 284 -- .../src/views/web5/__tests__/Web5DWN.test.ts | 94 - releases/manifest.json | 3 +- scripts/container-specs.sh | 2 +- scripts/deploy-tailscale.sh | 26 + scripts/deploy-to-target.sh | 27 + scripts/image-versions.sh | 3 +- scripts/self-update.sh | 9 +- tests/lifecycle/remote-lifecycle.sh | 1 - 76 files changed, 792 insertions(+), 3613 deletions(-) delete mode 100644 apps/web5-dwn/.dockerignore delete mode 100644 apps/web5-dwn/Dockerfile delete mode 100644 apps/web5-dwn/README.md delete mode 100644 apps/web5-dwn/manifest.yml delete mode 100644 apps/web5-dwn/package-lock.json delete mode 100644 apps/web5-dwn/package.json delete mode 100644 apps/web5-dwn/src/index.ts delete mode 100644 apps/web5-dwn/tsconfig.json delete mode 100644 neode-ui/src/views/web5/Web5DWN.vue delete mode 100644 neode-ui/src/views/web5/__tests__/Web5DWN.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 55f5ac69..caad5204 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,21 @@ # Changelog +## v1.7.85-alpha (2026-06-12) + +- ElectrumX now runs with less cache pressure and more memory headroom, reducing the restart loop seen during sync catch-up. +- Portainer is pinned to `2.19.4` instead of `latest`, avoiding schema-drift restarts from surprise image updates. +- LND receive-address creation now asks for a native SegWit address and returns clearer wallet/readiness failures when an address is not available. +- Fleet telemetry now carries server name, hostname, and server URL, and the Fleet dashboard shows those names instead of hashed node ids. +- Trusted federation peers are still auto-added transitively, but the local node no longer imports itself back into the fleet list. +- Validation passed locally for the touched frontend helpers, `git diff --check`, and Rust formatting. + ## v1.7.84-alpha (2026-06-11) - Bitcoin trusted-node relay approvals now generate restricted `txrelay` RPC credentials when needed and restart the active Bitcoin backend so bitcoind loads the new `rpcauth` whitelist. -- Bitcoin Core now matches Bitcoin Knots for restricted relay RPC support, including the txrelay secret injection and sendrawtransaction-focused whitelist. +- Kiosk mode now includes a browser safe-area path for HDMI displays that crop edges, and self-update refreshes kiosk launcher/systemd files so display fixes ship to existing nodes. The experimental X11 scaling safe-area is opt-in to avoid stretching TV output. +- Wi-Fi setup now reports scan errors instead of showing an empty network list, supports retrying scans from the modal, parses escaped `nmcli` SSIDs correctly, and can join open networks without forcing a WPA password. +- Bitcoin Core now matches Bitcoin Knots for restricted relay RPC support, including the txrelay secret injection and transaction broadcast whitelist. +- The restricted Bitcoin relay whitelist now includes `submitpackage` and `gettxout`, covering newer wallet/package-relay broadcast flows without opening wallet/admin RPC. - The Bitcoin UI companion image is pinned to `1.7.84-alpha` across release metadata and the Quadlet fallback path, avoiding stale `latest` detection during OTA updates. - Container scanning now uses an RAII in-flight guard so timeout and error paths cannot leave the scanner stuck in a permanently busy state. - Validation passed with `cargo fmt`, `cargo check -p archipelago`, `git diff --check`, and focused source review of the relay message/approval path. diff --git a/INSTALL.sh b/INSTALL.sh index 14336fc5..0ff7ad93 100755 --- a/INSTALL.sh +++ b/INSTALL.sh @@ -122,7 +122,7 @@ echo "" # Install custom app dependencies echo "Installing custom app dependencies..." -for app in did-wallet endurain morphos-server router web5-dwn; do +for app in did-wallet endurain morphos-server router; do if [ -d "apps/$app" ]; then echo " - Installing $app dependencies..." cd "apps/$app" diff --git a/README.md b/README.md index e0e1360c..cafea0d2 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,8 @@ - **Mempool** block explorer and fee estimator - **Fedimint** federation guardian and gateway -### Self-Hosted Apps (30) -Bitcoin (ThunderHub), Storage (FileBrowser, Immich, Nextcloud), Productivity (Penpot, Vaultwarden), Media (Jellyfin, PhotoPrism), Search (SearXNG), AI (Ollama), Network (Tailscale, Nginx Proxy Manager), Home (Home Assistant), Nostr (nostr-rs-relay, Nostrudel), Dev (Grafana, Portainer), and more. +### Self-Hosted Apps (29) +Bitcoin, Storage (FileBrowser, Immich, Nextcloud), Productivity (Penpot, Vaultwarden), Media (Jellyfin, PhotoPrism), Search (SearXNG), AI (Ollama), Network (Tailscale, Nginx Proxy Manager), Home (Home Assistant), Nostr (nostr-rs-relay, Nostrudel), Dev (Grafana, Portainer), and more. ### Decentralized Identity - Ed25519 node identity with DID Documents (did:key) diff --git a/app-catalog/catalog.json b/app-catalog/catalog.json index cd4088f0..e410d4e5 100644 --- a/app-catalog/catalog.json +++ b/app-catalog/catalog.json @@ -425,7 +425,7 @@ "author": "Portainer", "category": "development", "tier": "optional", - "dockerImage": "146.59.87.168:3000/lfg2025/portainer:latest", + "dockerImage": "146.59.87.168:3000/lfg2025/portainer:2.19.4", "repoUrl": "https://github.com/portainer/portainer", "containerConfig": { "ports": [ diff --git a/apps/DEVELOPMENT.md b/apps/DEVELOPMENT.md index 85984406..62728a74 100644 --- a/apps/DEVELOPMENT.md +++ b/apps/DEVELOPMENT.md @@ -8,7 +8,6 @@ | bitcoin-knots | 8332 (RPC), 8333 (P2P) | v28.1 | | lnd | 9735 (P2P), 10009 (gRPC), 8080 (REST) | v0.17.4-beta | | btcpay-server | 23000 (HTTP) | v1.13.5 | -| thunderhub | 3010 (HTTP) | v0.13.31 | | mempool | 4080 (HTTP) | v2.5.0 | | electrumx | 50001 (TCP), 50002 (SSL) | latest | | fedimint | 8173 (API), 8174 (Web) | v0.10.0 | @@ -43,7 +42,7 @@ cd apps ./build.sh # Build specific app ``` -Custom apps with local source: `router`, `did-wallet`, `web5-dwn`. All other apps use official container images. +Custom apps with local source: `router`, `did-wallet`. All other apps use official container images. ## App Structure diff --git a/apps/PORTS.md b/apps/PORTS.md index 03d0194b..d3fc4f0f 100644 --- a/apps/PORTS.md +++ b/apps/PORTS.md @@ -24,7 +24,6 @@ This document lists all port assignments for Archipelago apps. | strfry | 8082 | TCP | HTTP/WebSocket | 18082 | | did-wallet | 8083 | TCP | Web UI | 18083 | | router | 8084, 5353, 1900 | TCP/UDP | Web UI, mDNS, SSDP | 18084, 15353, 11900 | -| web5-dwn | 3000 | TCP | HTTP API | 13000 | | meshtastic | 4403, 1883 | TCP | HTTP API, MQTT | 14403, 11883 | ## Development Ports (Offset: +10000) @@ -53,7 +52,6 @@ In development mode, all ports are offset by 10000 to avoid conflicts with produ | Strfry | http://localhost:18082 | | DID Wallet | http://localhost:18083 | | Router | http://localhost:18084 | -| Web5 DWN | http://localhost:13000 | | Meshtastic | http://localhost:14403 | ## Port Conflict Resolution diff --git a/apps/QUICKSTART.md b/apps/QUICKSTART.md index 8b8c4160..46863db0 100644 --- a/apps/QUICKSTART.md +++ b/apps/QUICKSTART.md @@ -30,14 +30,13 @@ cd apps ./build.sh ``` -This will build all apps that have Dockerfiles. Standard apps (bitcoin-core, lnd, etc.) will use their official images, while custom apps (router, did-wallet, web5-dwn) will be built from source. +This will build all apps that have Dockerfiles. Standard apps (bitcoin-core, lnd, etc.) will use their official images, while custom apps (router, did-wallet) will be built from source. ### Build Specific App ```bash ./build.sh router ./build.sh did-wallet -./build.sh web5-dwn ``` ## Running Apps via Archipelago @@ -64,7 +63,6 @@ In development mode, apps are accessible on offset ports: - **Router**: http://localhost:18084 - **DID Wallet**: http://localhost:18083 -- **Web5 DWN**: http://localhost:13000 - **Nostr RS Relay**: http://localhost:18081 - **Strfry**: http://localhost:18082 @@ -72,7 +70,7 @@ See [PORTS.md](./PORTS.md) for complete port mapping. ## Development Workflow -### For Custom Apps (router, did-wallet, web5-dwn) +### For Custom Apps (router, did-wallet) 1. **Make changes** to source code in `apps//src/` 2. **Rebuild** the container: diff --git a/apps/README.md b/apps/README.md index 5d4ccf6e..9cc55b76 100644 --- a/apps/README.md +++ b/apps/README.md @@ -8,7 +8,6 @@ Containerized applications for the Archipelago Bitcoin Node OS. All apps run in - **bitcoin-knots** — Full Bitcoin node (v28.1) - **lnd** — Lightning Network Daemon (v0.17.4-beta) - **btcpay-server** — Payment processor (v1.13.5) -- **thunderhub** — Lightning management UI (v0.13.31) - **mempool** — Block explorer and fee estimator (v2.5.0) - **electrumx** — Electrum server - **fedimint** — Federated Bitcoin minting (v0.10.0) @@ -18,7 +17,6 @@ Containerized applications for the Archipelago Bitcoin Node OS. All apps run in - **nostrudel** — Nostr web client (v0.40.0) ### Web5 & Identity -- **web5-dwn** — Decentralized Web Node (v0.4.0) - **did-wallet** — Web5 DID Wallet ### Self-Hosted Services diff --git a/apps/bitcoin-core/manifest.yml b/apps/bitcoin-core/manifest.yml index accc3004..6493ce93 100644 --- a/apps/bitcoin-core/manifest.yml +++ b/apps/bitcoin-core/manifest.yml @@ -33,7 +33,7 @@ app: RPC_HEADROOM="-rpcthreads=16 -rpcworkqueue=256"; RPC_TXRELAY_FLAGS="-rpcwhitelistdefault=0"; if [ -n "$RPC_TXRELAY_AUTH" ]; then - RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblockheader,getrawtransaction,decoderawtransaction,decodescript,estimatesmartfee"; + RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips"; fi; if [ "${DISK_GB_VALUE:-0}" -lt 1000 ]; then exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -noconf -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=1024 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser="$RPC_USER" -rpcpassword="$RPC_PASS"; diff --git a/apps/bitcoin-knots/manifest.yml b/apps/bitcoin-knots/manifest.yml index 23001742..7cf9fa0f 100644 --- a/apps/bitcoin-knots/manifest.yml +++ b/apps/bitcoin-knots/manifest.yml @@ -33,7 +33,7 @@ app: RPC_HEADROOM="-rpcthreads=16 -rpcworkqueue=256"; RPC_TXRELAY_FLAGS="-rpcwhitelistdefault=0"; if [ -n "$RPC_TXRELAY_AUTH" ]; then - RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblockheader,getrawtransaction,decoderawtransaction,decodescript,estimatesmartfee"; + RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips"; fi; if [ "${DISK_GB_VALUE:-0}" -lt 1000 ]; then exec "$BITCOIND" -datadir=/home/bitcoin/.bitcoin -noconf -server=1 -prune=550 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0:8332 -listen=1 -bind=0.0.0.0:8333 -dbcache=2048 -par=0 -maxconnections=125 $RPC_HEADROOM $RPC_TXRELAY_FLAGS -rpcuser="$RPC_USER" -rpcpassword="$RPC_PASS"; diff --git a/apps/did-wallet/manifest.yml b/apps/did-wallet/manifest.yml index 00aa770b..d00974b1 100644 --- a/apps/did-wallet/manifest.yml +++ b/apps/did-wallet/manifest.yml @@ -10,8 +10,6 @@ app: pull_policy: if-not-present dependencies: - - app_id: web5-dwn - version: ">=1.0.0" - storage: 2Gi resources: @@ -40,7 +38,6 @@ app: options: [rw] environment: - - DWN_ENDPOINT=http://web5-dwn:3000 - WALLET_STORAGE=/app/wallet health_check: diff --git a/apps/did-wallet/src/index.ts b/apps/did-wallet/src/index.ts index 1525bbc8..dfd2c02a 100644 --- a/apps/did-wallet/src/index.ts +++ b/apps/did-wallet/src/index.ts @@ -34,5 +34,4 @@ app.post('/api/wallet/did/create', async (req, res) => { // Start server app.listen(port, '0.0.0.0', () => { console.log(`DID Wallet listening on port ${port}`); - console.log(`DWN endpoint: ${process.env.DWN_ENDPOINT || 'http://web5-dwn:3000'}`); }); diff --git a/apps/electrumx/manifest.yml b/apps/electrumx/manifest.yml index e765754a..20eb7a30 100644 --- a/apps/electrumx/manifest.yml +++ b/apps/electrumx/manifest.yml @@ -25,7 +25,7 @@ app: resources: cpu_limit: 0 - memory_limit: 4Gi + memory_limit: 6Gi disk_limit: 50Gi security: @@ -48,7 +48,7 @@ app: - COIN=Bitcoin - DB_DIRECTORY=/data - SERVICES=tcp://:50001,rpc://0.0.0.0:8000 - - CACHE_MB=3072 + - CACHE_MB=1024 - MAX_SEND=10000000 health_check: diff --git a/apps/portainer/manifest.yml b/apps/portainer/manifest.yml index 96e63f1e..2307b504 100644 --- a/apps/portainer/manifest.yml +++ b/apps/portainer/manifest.yml @@ -6,7 +6,7 @@ app: category: development container: - image: 146.59.87.168:3000/lfg2025/portainer:latest + image: 146.59.87.168:3000/lfg2025/portainer:2.19.4 pull_policy: if-not-present data_uid: "1000:1000" diff --git a/apps/web5-dwn/.dockerignore b/apps/web5-dwn/.dockerignore deleted file mode 100644 index e052d6d1..00000000 --- a/apps/web5-dwn/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -dist -*.log -.git -.gitignore -README.md diff --git a/apps/web5-dwn/Dockerfile b/apps/web5-dwn/Dockerfile deleted file mode 100644 index 2683ad4f..00000000 --- a/apps/web5-dwn/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -FROM node:20-alpine AS builder - -WORKDIR /app - -# Copy package files -COPY package*.json ./ -RUN npm ci - -# Copy source code -COPY . . - -# Build the application -RUN npm run build - -# Production stage -FROM node:20-alpine - -WORKDIR /app - -# Copy built application -COPY --from=builder /app/dist ./dist -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/package.json ./ - -# Create non-root user -RUN addgroup -g 1000 appuser && \ - adduser -D -u 1000 -G appuser appuser && \ - mkdir -p /app/data && \ - chown -R appuser:appuser /app - -USER appuser - -EXPOSE 3000 - -ENV DWN_STORAGE_PATH=/app/data -ENV DID_METHOD=key - -CMD ["node", "dist/index.js"] diff --git a/apps/web5-dwn/README.md b/apps/web5-dwn/README.md deleted file mode 100644 index 9758229f..00000000 --- a/apps/web5-dwn/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Web5 DWN (Decentralized Web Node) - -Personal data store for Web5. Store and sync your decentralized data across devices. - -## Building - -```bash -# From the apps directory -./build.sh web5-dwn - -# Or manually -cd web5-dwn -docker build -t archipelago/web5-dwn:latest . -``` - -## Development - -```bash -cd web5-dwn -npm install -npm run dev -``` - -## Ports - -- **3000**: HTTP API (dev: 13000) - -## Running Locally - -```bash -docker run -p 3000:3000 \ - -v /tmp/archipelago-dev/web5-dwn:/app/data \ - -e DWN_STORAGE_PATH=/app/data \ - archipelago/web5-dwn:latest -``` diff --git a/apps/web5-dwn/manifest.yml b/apps/web5-dwn/manifest.yml deleted file mode 100644 index ef564d2d..00000000 --- a/apps/web5-dwn/manifest.yml +++ /dev/null @@ -1,55 +0,0 @@ -app: - id: web5-dwn - name: Decentralized Web Node - version: 1.0.0 - description: Personal data store for Web5. Store and sync your decentralized data across devices. - - container: - image: archipelago/web5-dwn:1.0.0 - image_signature: cosign://... - pull_policy: if-not-present - - dependencies: - - storage: 5Gi - - resources: - cpu_limit: 1 - memory_limit: 512Mi - disk_limit: 5Gi - - security: - capabilities: [] - readonly_root: true - no_new_privileges: true - user: 1000 - seccomp_profile: default - network_policy: isolated - apparmor_profile: web5-dwn - - ports: - - host: 3000 - container: 3000 - protocol: tcp # HTTP API - - volumes: - - type: bind - source: /var/lib/archipelago/web5-dwn - target: /app/data - options: [rw] - - environment: - - DWN_STORAGE_PATH=/app/data - - DID_METHOD=key - - health_check: - type: http - endpoint: http://localhost:3000 - path: /health - interval: 30s - timeout: 5s - retries: 3 - - web5_integration: - did_support: true - dwn_protocol: true - sync_enabled: true diff --git a/apps/web5-dwn/package-lock.json b/apps/web5-dwn/package-lock.json deleted file mode 100644 index 22c28f4f..00000000 --- a/apps/web5-dwn/package-lock.json +++ /dev/null @@ -1,2747 +0,0 @@ -{ - "name": "web5-dwn", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "web5-dwn", - "version": "1.0.0", - "dependencies": { - "@web5/api": "^0.9.0", - "express": "^4.18.2" - }, - "devDependencies": { - "@types/express": "^4.17.21", - "@types/node": "^20.10.0", - "ts-node": "^10.9.2", - "typescript": "^5.3.3" - } - }, - "node_modules/@assemblyscript/loader": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.9.4.tgz", - "integrity": "sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==", - "license": "Apache-2.0" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@decentralized-identity/ion-sdk": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@decentralized-identity/ion-sdk/-/ion-sdk-1.0.4.tgz", - "integrity": "sha512-pOWrlTH5ChxUKRHOgfG2ZeTioWEFJXADyErCQOJ0BqYNDKfP+CM09Vss+9ei6PNOABQlcDn0mEDFZtpO+DXl8A==", - "license": "Apache-2.0", - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@noble/secp256k1": "^2.0.0", - "canonicalize": "^2.0.0", - "multiformats": "^12.1.3", - "uri-js": "^4.4.1" - } - }, - "node_modules/@decentralized-identity/ion-sdk/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@dnsquery/dns-packet": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@dnsquery/dns-packet/-/dns-packet-6.1.1.tgz", - "integrity": "sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.4", - "utf8-codec": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@ipld/dag-cbor": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.3.tgz", - "integrity": "sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "cborg": "^2.0.1", - "multiformats": "^12.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-cbor/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.1.5.tgz", - "integrity": "sha512-w4PZ2yPqvNmlAir7/2hsCRMqny1EY5jj26iZcSgxREJexmbAc2FI21jp26MqiNdfgAxvkCnf2N/TJI18GaDNwA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.1.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@ipld/dag-pb/node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@js-temporal/polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", - "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", - "license": "ISC", - "dependencies": { - "jsbi": "^4.3.0", - "tslib": "^2.4.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@multiformats/murmur3": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@multiformats/murmur3/-/murmur3-2.2.0.tgz", - "integrity": "sha512-G5qVQxMWJ/Rja7hAx7cgyPcqnFmuOm0aHJ6TgJ+1odbdMu5BxpCCKH9y/Kw5spNbO9aYk8Jf41NbHkoHYDyZHQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@multiformats/murmur3/node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/@noble/ciphers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.4.1.tgz", - "integrity": "sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/ed25519": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.0.0.tgz", - "integrity": "sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-2.0.0.tgz", - "integrity": "sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", - "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@tbd54566975/dwn-sdk-js/-/dwn-sdk-js-0.3.5.tgz", - "integrity": "sha512-1OZFxZSSpMpA186wqPOMbvhE7GJAZ5agVjGusC2KF2FQ4HxM26nlW6ZVigYVnfN/ddrrrey3t3hE7BiGQ9m2yg==", - "license": "Apache-2.0", - "dependencies": { - "@ipld/dag-cbor": "9.0.3", - "@js-temporal/polyfill": "0.4.4", - "@noble/ciphers": "0.5.3", - "@noble/ed25519": "2.0.0", - "@noble/secp256k1": "2.0.0", - "@web5/dids": "1.1.0", - "abstract-level": "1.0.3", - "ajv": "8.12.0", - "blockstore-core": "4.2.0", - "cross-fetch": "4.0.0", - "eciesjs": "0.4.5", - "interface-blockstore": "5.2.3", - "interface-store": "5.1.2", - "ipfs-unixfs-exporter": "13.1.5", - "ipfs-unixfs-importer": "15.1.5", - "level": "8.0.0", - "lodash": "4.17.21", - "lru-cache": "9.1.2", - "ms": "2.1.3", - "multiformats": "11.0.2", - "randombytes": "2.1.0", - "readable-stream": "4.5.2", - "ulidx": "2.1.0", - "uuid": "8.3.2", - "varint": "6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js/node_modules/@noble/ciphers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.5.3.tgz", - "integrity": "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@tbd54566975/dwn-sdk-js/node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", - "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@web5/agent": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@web5/agent/-/agent-0.3.8.tgz", - "integrity": "sha512-uQLHqlYzAuO/y/l24oDHoTFjxsq3RF6sYt8iGsqUZr6OxDo3YaSBQiu/3Kd/dRv3wXDe1neeu6aoCG5Lp6x48g==", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "0.4.1", - "@scure/bip39": "1.2.2", - "@tbd54566975/dwn-sdk-js": "0.3.5", - "@web5/common": "1.0.0", - "@web5/crypto": "1.0.0", - "@web5/dids": "1.1.0", - "abstract-level": "1.0.4", - "ed25519-keygen": "0.4.11", - "isomorphic-ws": "^5.0.0", - "level": "8.0.0", - "ms": "2.1.3", - "readable-web-to-node-stream": "3.0.2", - "ulidx": "2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/api": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@web5/api/-/api-0.9.4.tgz", - "integrity": "sha512-ubAvlEkiXMgpkagSmh4RAch5RqdH587Sd9By3eLHpbI7pqJVCTi3rrSIhCJ3I3PLswRlXx78Llb+7nRHB2rvpQ==", - "license": "Apache-2.0", - "dependencies": { - "@web5/agent": "0.3.8", - "@web5/common": "1.0.0", - "@web5/crypto": "1.0.0", - "@web5/dids": "1.1.0", - "@web5/user-agent": "0.3.8" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/common": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@web5/common/-/common-1.0.0.tgz", - "integrity": "sha512-3JHF6X5o0h+3oAVQeBC4XpMoZeEYZYdEmQdgpOfKv/rnSru2yHQSAM+0wbIvEFcSCmelBT3u7rUAcpJjelLB0w==", - "license": "Apache-2.0", - "dependencies": { - "@isaacs/ttlcache": "1.4.1", - "level": "8.0.0", - "multiformats": "11.0.2", - "readable-stream": "4.4.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/common/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@web5/crypto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@web5/crypto/-/crypto-1.0.0.tgz", - "integrity": "sha512-z1CsgycTqiXEsS6pPlJDDLGAeGsgzfdBeWvyxLXTgh08Q8ACULmEGRXjSsgWHFn6DO6MpWFn55h/hF4wZZRxvA==", - "license": "Apache-2.0", - "dependencies": { - "@noble/ciphers": "0.4.1", - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@web5/common": "1.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@web5/dids/-/dids-1.1.0.tgz", - "integrity": "sha512-d9pKf/DW+ziUiV5g3McC71utyAhQyT1tYGPbQSYWt2ji6FHGNC6tffHMfLXXK/W+vbwV3eNTn06JqTXRaYhxBA==", - "license": "Apache-2.0", - "dependencies": { - "@decentralized-identity/ion-sdk": "1.0.4", - "@dnsquery/dns-packet": "6.1.1", - "@web5/common": "1.0.0", - "@web5/crypto": "1.0.0", - "abstract-level": "1.0.4", - "bencode": "4.0.0", - "buffer": "6.0.3", - "level": "8.0.1", - "ms": "2.1.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web5/dids/node_modules/level": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.1.tgz", - "integrity": "sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==", - "license": "MIT", - "dependencies": { - "abstract-level": "^1.0.4", - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/@web5/user-agent": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@web5/user-agent/-/user-agent-0.3.8.tgz", - "integrity": "sha512-gGkahalx5WBuMW23WrWX7b0EWHnAxWj+ZSPoGiK5i5TiXUi5B/LEHAH4kmD8OZBlNua6SefK5rAz0AY4nEGZ8A==", - "license": "Apache-2.0", - "dependencies": { - "@web5/agent": "0.3.8", - "@web5/common": "1.0.0", - "@web5/crypto": "1.0.0", - "@web5/dids": "1.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abort-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/abort-error/-/abort-error-1.0.1.tgz", - "integrity": "sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/abstract-level": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", - "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "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" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bencode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", - "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", - "license": "MIT", - "dependencies": { - "uint8-util": "^2.2.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blockstore-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.2.0.tgz", - "integrity": "sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "err-code": "^3.0.1", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "license": "MIT", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/canonicalize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.1.0.tgz", - "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", - "license": "Apache-2.0", - "bin": { - "canonicalize": "bin/canonicalize.js" - } - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cborg": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-2.0.5.tgz", - "integrity": "sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==", - "license": "Apache-2.0", - "bin": { - "cborg": "cli.js" - } - }, - "node_modules/classic-level": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", - "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eciesjs": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.5.tgz", - "integrity": "sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==", - "license": "MIT", - "dependencies": { - "@noble/ciphers": "^0.3.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/eciesjs/node_modules/@noble/ciphers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.3.0.tgz", - "integrity": "sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ed25519-keygen": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/ed25519-keygen/-/ed25519-keygen-0.4.11.tgz", - "integrity": "sha512-UKxebk/eoW/0yy6BcyCkgAvN2/VzwVXiMVHgKNYBMX6T0fJRAE3WWvH2inyuBvMIJaOqlkc3utylUvL8yW6SOg==", - "deprecated": "Switch to micro-key-producer: the package has been merged into it", - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.3.0", - "@noble/hashes": "~1.3.3", - "@scure/base": "~1.1.5", - "micro-packed": "~0.5.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fast-deep-equal": { - "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==", - "license": "MIT" - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hamt-sharding": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/hamt-sharding/-/hamt-sharding-3.0.6.tgz", - "integrity": "sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "sparse-array": "^1.3.1", - "uint8arrays": "^5.0.1" - } - }, - "node_modules/hamt-sharding/node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/hamt-sharding/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/interface-blockstore": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.3.tgz", - "integrity": "sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "interface-store": "^5.0.0", - "multiformats": "^11.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/interface-store": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.2.tgz", - "integrity": "sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipfs-unixfs": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.5.tgz", - "integrity": "sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "protons-runtime": "^5.5.0", - "uint8arraylist": "^2.4.8" - } - }, - "node_modules/ipfs-unixfs-exporter": { - "version": "13.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-exporter/-/ipfs-unixfs-exporter-13.1.5.tgz", - "integrity": "sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@ipld/dag-cbor": "^9.0.0", - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "ipfs-unixfs": "^11.0.0", - "it-filter": "^3.0.2", - "it-last": "^3.0.2", - "it-map": "^3.0.3", - "it-parallel": "^3.0.0", - "it-pipe": "^3.0.1", - "it-pushable": "^3.1.0", - "multiformats": "^11.0.0", - "p-queue": "^7.3.0", - "progress-events": "^1.0.0", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ipfs-unixfs-importer": { - "version": "15.1.5", - "resolved": "https://registry.npmjs.org/ipfs-unixfs-importer/-/ipfs-unixfs-importer-15.1.5.tgz", - "integrity": "sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "@ipld/dag-pb": "^4.0.0", - "@multiformats/murmur3": "^2.0.0", - "err-code": "^3.0.1", - "hamt-sharding": "^3.0.0", - "interface-blockstore": "^5.0.0", - "interface-store": "^5.0.1", - "ipfs-unixfs": "^11.0.0", - "it-all": "^3.0.2", - "it-batch": "^3.0.2", - "it-first": "^3.0.2", - "it-parallel-batch": "^3.0.1", - "multiformats": "^11.0.0", - "progress-events": "^1.0.0", - "rabin-wasm": "^0.1.4", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/it-all": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.9.tgz", - "integrity": "sha512-fz1oJJ36ciGnu2LntAlE6SA97bFZpW7Rnt0uEc1yazzR2nKokZLr8lIRtgnpex4NsmaBcvHF+Z9krljWFy/mmg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-batch": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-batch/-/it-batch-3.0.9.tgz", - "integrity": "sha512-z6p89Q8gm2urBtF3JcpnbJogacijWk3m1uc3xZYI3x0eJUoYLUbgF8IxJ2fnuVObV7yRv3SixfwGCufaZY1NCg==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-filter": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.1.4.tgz", - "integrity": "sha512-80kWEKgiFEa4fEYD3mwf2uygo1dTQ5Y5midKtL89iXyjinruA/sNXl6iFkTcdNedydjvIsFhWLiqRPQP4fAwWQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-first": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.9.tgz", - "integrity": "sha512-ZWYun273Gbl7CwiF6kK5xBtIKR56H1NoRaiJek2QzDirgen24u8XZ0Nk+jdnJSuCTPxC2ul1TuXKxu/7eK6NuA==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-last": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-last/-/it-last-3.0.9.tgz", - "integrity": "sha512-AtfUEnGDBHBEwa1LjrpGHsJMzJAWDipD6zilvhakzJcm+BCvNX8zlX2BsHClHJLLTrsY4lY9JUjc+TQV4W7m1w==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-map": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.1.4.tgz", - "integrity": "sha512-QB9PYQdE9fUfpVFYfSxBIyvKynUCgblb143c+ktTK6ZuKSKkp7iH58uYFzagqcJ5HcqIfn1xbfaralHWam+3fg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-peekable": "^3.0.0" - } - }, - "node_modules/it-merge": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.12.tgz", - "integrity": "sha512-nnnFSUxKlkZVZD7c0jYw6rDxCcAQYcMsFj27thf7KkDhpj0EA0g9KHPxbFzHuDoc6US2EPS/MtplkNj8sbCx4Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-queueless-pushable": "^2.0.0" - } - }, - "node_modules/it-parallel": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.13.tgz", - "integrity": "sha512-85PPJ/O8q97Vj9wmDTSBBXEkattwfQGruXitIzrh0RLPso6RHfiVqkuTqBNufYYtB1x6PSkh0cwvjmMIkFEPHA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "p-defer": "^4.0.1" - } - }, - "node_modules/it-parallel-batch": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/it-parallel-batch/-/it-parallel-batch-3.0.9.tgz", - "integrity": "sha512-TszXWqqLG8IG5DUEnC4cgH9aZI6CsGS7sdkXTiiacMIj913bFy7+ohU3IqsFURCcZkpnXtNLNzrYnXISsKBhbQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-batch": "^3.0.0" - } - }, - "node_modules/it-peekable": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.8.tgz", - "integrity": "sha512-7IDBQKSp/dtBxXV3Fj0v3qM1jftJ9y9XrWLRIuU1X6RdKqWiN60syNwP0fiDxZD97b8SYM58dD3uklIk1TTQAw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/it-pipe": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", - "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "it-merge": "^3.0.0", - "it-pushable": "^3.1.2", - "it-stream-types": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/it-pushable": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.2.3.tgz", - "integrity": "sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "p-defer": "^4.0.0" - } - }, - "node_modules/it-queueless-pushable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/it-queueless-pushable/-/it-queueless-pushable-2.0.3.tgz", - "integrity": "sha512-USa5EzTvmQswOcVE7+o6qsj2o2G+6KHCxSogPOs23sGYkDWFidhqVO7dAvv6ve/Z+Q+nvxpEa9rrRo6VEK7w4Q==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "abort-error": "^1.0.1", - "p-defer": "^4.0.1", - "race-signal": "^2.0.0" - } - }, - "node_modules/it-stream-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.2.tgz", - "integrity": "sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/jsbi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.2.tgz", - "integrity": "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==", - "license": "Apache-2.0" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/layerr": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/layerr/-/layerr-2.1.0.tgz", - "integrity": "sha512-xDD9suWxfBYeXgqffRVH/Wqh+mqZrQcqPRn0I0ijl7iJQ7vu8gMGPt1Qop59pEW/jaIDNUN7+PX1Qk40+vuflg==", - "license": "MIT" - }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "license": "MIT", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micro-packed": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.5.3.tgz", - "integrity": "sha512-zWRoH+qUb/ZMp9gVZhexvRGCENDM5HEQF4sflqpdilUHWK2/zKR7/MT8GBctnTwbhNJwy1iuk5q6+TYP7/twYA==", - "license": "MIT", - "dependencies": { - "@scure/base": "~1.1.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multiformats": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", - "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/p-defer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.1.tgz", - "integrity": "sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", - "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^5.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/progress-events": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.1.tgz", - "integrity": "sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/protons-runtime": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", - "integrity": "sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8-varint": "^2.0.2", - "uint8arraylist": "^2.4.3", - "uint8arrays": "^5.0.1" - } - }, - "node_modules/protons-runtime/node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/protons-runtime/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/rabin-wasm": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.5.tgz", - "integrity": "sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==", - "license": "MIT", - "dependencies": { - "@assemblyscript/loader": "^0.9.4", - "bl": "^5.0.0", - "debug": "^4.3.1", - "minimist": "^1.2.5", - "node-fetch": "^2.6.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "rabin-wasm": "cli/bin.js" - } - }, - "node_modules/rabin-wasm/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/rabin-wasm/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/race-signal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/race-signal/-/race-signal-2.0.0.tgz", - "integrity": "sha512-P31bLhE4ByBX/70QDXMutxnqgwrF1WUXea1O8DXuviAgkdbQ1iQMQotNgzJIBC9yUSn08u/acZrMUhgw7w6GpA==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sparse-array": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/sparse-array/-/sparse-array-1.3.2.tgz", - "integrity": "sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==", - "license": "ISC" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uint8-util": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.6.tgz", - "integrity": "sha512-r+ZjS8CzPhtPF771ROOadUoqC40OVdiMKBI8lTfJQWb4W7+73sMBwMYmai/uvNcmZ7tBJJyZSad03yMWIt3RQg==", - "license": "MIT", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uint8-varint": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-2.0.4.tgz", - "integrity": "sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8arraylist": "^2.0.0", - "uint8arrays": "^5.0.0" - } - }, - "node_modules/uint8-varint/node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/uint8-varint/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/uint8arraylist": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.8.tgz", - "integrity": "sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "uint8arrays": "^5.0.1" - } - }, - "node_modules/uint8arraylist/node_modules/multiformats": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-13.4.2.tgz", - "integrity": "sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==", - "license": "Apache-2.0 OR MIT" - }, - "node_modules/uint8arraylist/node_modules/uint8arrays": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-5.1.0.tgz", - "integrity": "sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^13.0.0" - } - }, - "node_modules/uint8arrays": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz", - "integrity": "sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==", - "license": "Apache-2.0 OR MIT", - "dependencies": { - "multiformats": "^12.0.1" - } - }, - "node_modules/uint8arrays/node_modules/multiformats": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz", - "integrity": "sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==", - "license": "Apache-2.0 OR MIT", - "engines": { - "node": ">=16.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/ulidx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.1.0.tgz", - "integrity": "sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==", - "license": "MIT", - "dependencies": { - "layerr": "^2.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-codec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utf8-codec/-/utf8-codec-1.0.0.tgz", - "integrity": "sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==", - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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-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/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/apps/web5-dwn/package.json b/apps/web5-dwn/package.json deleted file mode 100644 index c789ac3c..00000000 --- a/apps/web5-dwn/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "web5-dwn", - "version": "1.0.0", - "description": "Decentralized Web Node for Web5", - "main": "dist/index.js", - "scripts": { - "build": "tsc", - "start": "node dist/index.js", - "dev": "ts-node src/index.ts" - }, - "dependencies": { - "express": "^4.18.2", - "@web5/api": "^0.9.0" - }, - "devDependencies": { - "@types/express": "^4.17.21", - "@types/node": "^20.10.0", - "typescript": "^5.3.3", - "ts-node": "^10.9.2" - } -} diff --git a/apps/web5-dwn/src/index.ts b/apps/web5-dwn/src/index.ts deleted file mode 100644 index df8ef632..00000000 --- a/apps/web5-dwn/src/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import express from 'express'; - -const app = express(); -const port = 3000; - -// Middleware -app.use(express.json()); - -// Health check endpoint -app.get('/health', (req, res) => { - res.json({ status: 'ok', service: 'web5-dwn' }); -}); - -// DWN API endpoints -app.post('/dwn', async (req, res) => { - // Placeholder for DWN protocol implementation - res.json({ - status: 'ok', - message: 'DWN protocol endpoint (placeholder)' - }); -}); - -app.get('/dwn', async (req, res) => { - res.json({ - status: 'ok', - message: 'DWN query endpoint (placeholder)' - }); -}); - -// Start server -app.listen(port, '0.0.0.0', () => { - console.log(`Web5 DWN listening on port ${port}`); - console.log(`Storage path: ${process.env.DWN_STORAGE_PATH || '/app/data'}`); -}); diff --git a/apps/web5-dwn/tsconfig.json b/apps/web5-dwn/tsconfig.json deleted file mode 100644 index fa8ee324..00000000 --- a/apps/web5-dwn/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "module": "commonjs", - "lib": ["ES2020"], - "outDir": "./dist", - "rootDir": "./src", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/core/archipelago/src/api/rpc/analytics.rs b/core/archipelago/src/api/rpc/analytics.rs index 817e9f41..4f0c5968 100644 --- a/core/archipelago/src/api/rpc/analytics.rs +++ b/core/archipelago/src/api/rpc/analytics.rs @@ -227,6 +227,9 @@ impl RpcHandler { let report = serde_json::json!({ "node_id": node_id, + "node_name": data.server_info.name.clone().filter(|n| !n.trim().is_empty()), + "hostname": system_hostname().await, + "server_url": local_server_url(&self.config.host_ip), "version": data.server_info.version, "uptime_secs": uptime_secs, "cpu_cores": cpu_cores, @@ -507,3 +510,24 @@ impl RpcHandler { })) } } + +async fn system_hostname() -> Option { + let output = tokio::process::Command::new("hostname") + .output() + .await + .ok()?; + if !output.status.success() { + return None; + } + let hostname = String::from_utf8_lossy(&output.stdout).trim().to_string(); + (!hostname.is_empty()).then_some(hostname) +} + +fn local_server_url(host_ip: &str) -> Option { + let host_ip = host_ip.trim(); + if host_ip.is_empty() || host_ip == "127.0.0.1" { + None + } else { + Some(format!("https://{host_ip}")) + } +} diff --git a/core/archipelago/src/api/rpc/bitcoin_relay.rs b/core/archipelago/src/api/rpc/bitcoin_relay.rs index 4a29a170..57a222e0 100644 --- a/core/archipelago/src/api/rpc/bitcoin_relay.rs +++ b/core/archipelago/src/api/rpc/bitcoin_relay.rs @@ -659,8 +659,8 @@ async fn ensure_txrelay_credentials(data_dir: &Path) -> Result value, - None => { + Some(value) if rpcauth_matches_password(&value, TXRELAY_USER, &password) => value, + _ => { let generated = generate_rpcauth(TXRELAY_USER, &password); write_secret_file(&rpcauth_path, &generated).await?; generated @@ -729,6 +729,24 @@ fn generate_rpcauth(username: &str, password: &str) -> String { format!("{username}:{salt_hex}${hash_hex}") } +fn rpcauth_matches_password(rpcauth: &str, username: &str, password: &str) -> bool { + let Some(rest) = rpcauth.strip_prefix(&format!("{username}:")) else { + return false; + }; + let Some((salt_hex, expected_hash)) = rest.split_once('$') else { + return false; + }; + if salt_hex.is_empty() || expected_hash.is_empty() { + return false; + } + let Ok(mut mac) = Hmac::::new_from_slice(salt_hex.as_bytes()) else { + return false; + }; + mac.update(password.as_bytes()); + let hash_hex = hex::encode(mac.finalize().into_bytes()); + hash_hex.eq_ignore_ascii_case(expected_hash) +} + fn preferred_endpoint(settings: &BitcoinRelaySettings) -> Option { if settings.allow_https { if let Some(endpoint) = settings.https_endpoint.clone() { diff --git a/core/archipelago/src/api/rpc/container.rs b/core/archipelago/src/api/rpc/container.rs index 9446bc00..ef642e70 100644 --- a/core/archipelago/src/api/rpc/container.rs +++ b/core/archipelago/src/api/rpc/container.rs @@ -731,7 +731,6 @@ fn health_probe_url_for_app(app_id: &str) -> Option { "bitcoin-ui" => 8334, "botfights" => 9100, "btcpay-server" | "btcpay" | "btcpayserver" => 23000, - "dwn" => 3100, "electrumx" | "electrs" | "mempool-electrs" | "electrs-ui" => 50002, "fedimint" | "fedimintd" => 8175, "filebrowser" => 8083, diff --git a/core/archipelago/src/api/rpc/interfaces.rs b/core/archipelago/src/api/rpc/interfaces.rs index 51567ef7..2e5b7fd3 100644 --- a/core/archipelago/src/api/rpc/interfaces.rs +++ b/core/archipelago/src/api/rpc/interfaces.rs @@ -31,7 +31,7 @@ impl RpcHandler { let password = params .get("password") .and_then(|v| v.as_str()) - .ok_or_else(|| anyhow::anyhow!("Missing required parameter: password"))?; + .unwrap_or(""); // Validate SSID (prevent command injection) if ssid.len() > 64 || ssid.contains('\0') { @@ -284,7 +284,7 @@ async fn scan_wifi() -> Result> { let networks: Vec = stdout .lines() .filter_map(|line| { - let parts: Vec<&str> = line.splitn(3, ':').collect(); + let parts = split_nmcli_escaped(line, 3); if parts.len() < 3 { return None; } @@ -305,6 +305,28 @@ async fn scan_wifi() -> Result> { Ok(networks) } +fn split_nmcli_escaped(line: &str, limit: usize) -> Vec { + let mut fields = Vec::new(); + let mut current = String::new(); + let mut chars = line.chars(); + + while let Some(ch) = chars.next() { + if ch == '\\' { + if let Some(next) = chars.next() { + current.push(next); + } + } else if ch == ':' && fields.len() + 1 < limit { + fields.push(current); + current = String::new(); + } else { + current.push(ch); + } + } + + fields.push(current); + fields +} + /// Connect to a WiFi network using nmcli. async fn connect_wifi(ssid: &str, password: &str) -> Result<()> { let conn_name = format!("archipelago-wifi-{ssid}"); @@ -321,27 +343,28 @@ async fn connect_wifi(ssid: &str, password: &str) -> Result<()> { .output() .await; + let mut args = vec![ + "connection", + "add", + "type", + "wifi", + "con-name", + &conn_name, + "ifname", + "*", + "ssid", + ssid, + "ipv4.method", + "auto", + "ipv6.method", + "auto", + ]; + if !password.is_empty() { + args.extend(["wifi-sec.key-mgmt", "wpa-psk", "wifi-sec.psk", password]); + } + let output = tokio::process::Command::new("nmcli") - .args([ - "connection", - "add", - "type", - "wifi", - "con-name", - &conn_name, - "ifname", - "*", - "ssid", - ssid, - "wifi-sec.key-mgmt", - "wpa-psk", - "wifi-sec.psk", - password, - "ipv4.method", - "auto", - "ipv6.method", - "auto", - ]) + .args(args) .output() .await .context("Failed to run nmcli wifi profile create")?; diff --git a/core/archipelago/src/api/rpc/lnd/wallet.rs b/core/archipelago/src/api/rpc/lnd/wallet.rs index dc560930..e93fa91f 100644 --- a/core/archipelago/src/api/rpc/lnd/wallet.rs +++ b/core/archipelago/src/api/rpc/lnd/wallet.rs @@ -13,18 +13,33 @@ impl RpcHandler { let resp = client .get(format!("{LND_REST_BASE_URL}/v1/newaddress")) + .query(&[("type", "WITNESS_PUBKEY_HASH")]) .header("Grpc-Metadata-macaroon", &macaroon_hex) .send() .await .context("LND REST connection failed")?; + let status = resp.status(); let body: serde_json::Value = resp .json() .await .context("Failed to parse newaddress response")?; - if let Some(error) = body.get("error").and_then(|v| v.as_str()) { - anyhow::bail!("LND could not generate an address: {}", error); + if !status.is_success() { + let message = lnd_error_message(&body); + anyhow::bail!( + "LND could not generate a Bitcoin address ({}): {}", + status, + message + ); + } + + if let Some(error) = body + .get("error") + .or_else(|| body.get("message")) + .and_then(|v| v.as_str()) + { + anyhow::bail!("LND could not generate a Bitcoin address: {}", error); } let address = body @@ -548,3 +563,35 @@ impl RpcHandler { })) } } + +fn lnd_error_message(body: &serde_json::Value) -> String { + body.get("message") + .or_else(|| body.get("error")) + .and_then(|v| v.as_str()) + .filter(|s| !s.trim().is_empty()) + .unwrap_or("unknown LND error") + .to_string() +} + +#[cfg(test)] +mod tests { + use super::lnd_error_message; + + #[test] + fn lnd_error_message_prefers_message_field() { + let body = serde_json::json!({ + "error": "grpc proxy error", + "message": "wallet locked", + }); + + assert_eq!(lnd_error_message(&body), "wallet locked"); + } + + #[test] + fn lnd_error_message_falls_back_to_unknown() { + assert_eq!( + lnd_error_message(&serde_json::json!({})), + "unknown LND error" + ); + } +} diff --git a/core/archipelago/src/api/rpc/package/config.rs b/core/archipelago/src/api/rpc/package/config.rs index 9aaab545..16e01472 100644 --- a/core/archipelago/src/api/rpc/package/config.rs +++ b/core/archipelago/src/api/rpc/package/config.rs @@ -312,11 +312,6 @@ pub(super) fn get_health_check_args(app_id: &str, _rpc_pass: &str) -> Vec ( - "curl -sf http://localhost:3000/health || exit 1", - "30s", - "3", - ), "portainer" => return vec![], "ollama" => ("curl -sf http://localhost:11434/ || exit 1", "30s", "3"), "fedimint" => ("curl -sf http://localhost:8175/ || exit 1", "60s", "3"), @@ -360,10 +355,10 @@ pub(super) fn get_memory_limit(app_id: &str) -> &'static str { // memory + I/O. 4g caused OOM-cascades during IBD. 8g is the // floor; ideally this would be host-RAM aware (next pass). "bitcoin" | "bitcoin-core" | "bitcoin-knots" => "8g", - // ElectrumX: large cache materially speeds initial history indexing. - // CACHE_MB=3072 below needs container headroom for Python, rocksdb, - // socket buffers, and reorg/indexing spikes. - "electrumx" | "mempool-electrs" | "electrs" => "4g", + // ElectrumX indexing spikes above its cache size due Python, + // RocksDB, socket buffers, and reorg/history work. Keep cache + // conservative and give the process headroom to avoid restart loops. + "electrumx" | "mempool-electrs" | "electrs" => "6g", "cryptpad" => "512m", "ollama" => "4g", // Medium apps @@ -384,7 +379,6 @@ pub(super) fn get_memory_limit(app_id: &str) -> &'static str { "uptime-kuma" => "256m", "filebrowser" => "256m", "searxng" => "512m", - "dwn" => "256m", "portainer" => "256m", "nostr-rs-relay" | "nostr-relay" => "256m", "routstr" => "512m", @@ -789,11 +783,9 @@ pub(super) async fn get_app_config( "COIN=Bitcoin".to_string(), "DB_DIRECTORY=/data".to_string(), "SERVICES=tcp://:50001,rpc://0.0.0.0:8000".to_string(), - // Sync-speed: bigger LRU/write cache during initial - // history index. Default is 1200MB; the container gets - // 4g (config.rs::get_memory_limit) so 3072 fits with - // headroom. - "CACHE_MB=3072".to_string(), + // Keep cache below the container limit; high values + // have caused OOM/restart loops during catch-up. + "CACHE_MB=1024".to_string(), // Block-fetcher concurrency — defaults are conservative // for shared hosts; 4 is plenty for one bitcoind backend. "MAX_SEND=10000000".to_string(), @@ -1129,18 +1121,6 @@ pub(super) async fn get_app_config( None, ) } - "dwn" => ( - vec!["3100:3000".to_string()], - vec!["/var/lib/archipelago/dwn:/dwn/data".to_string()], - vec![ - "DS_PORT=3000".to_string(), - "DS_MESSAGES_STORE_URI=level://data/messages".to_string(), - "DS_DATA_STORE_URI=level://data/data".to_string(), - "DS_EVENT_LOG_URI=level://data/events".to_string(), - ], - None, - None, - ), "botfights" => { let jwt_secret = read_or_generate_secret("botfights-jwt").await; ( diff --git a/core/archipelago/src/api/rpc/update.rs b/core/archipelago/src/api/rpc/update.rs index fc95ae02..61f83753 100644 --- a/core/archipelago/src/api/rpc/update.rs +++ b/core/archipelago/src/api/rpc/update.rs @@ -133,6 +133,10 @@ impl RpcHandler { /// Apply git-based update: runs self-update.sh which pulls, builds, and restarts. pub(super) async fn handle_update_git_apply(&self) -> Result { + if std::env::var("ARCHIPELAGO_GIT_UPDATES").is_err() { + anyhow::bail!("git/self-build updates are disabled; use manifest OTA updates instead"); + } + let script = std::path::PathBuf::from( std::env::var("HOME").unwrap_or_else(|_| "/home/archipelago".to_string()), ) diff --git a/core/archipelago/src/container/docker_packages.rs b/core/archipelago/src/container/docker_packages.rs index 97dfbe03..2931a393 100644 --- a/core/archipelago/src/container/docker_packages.rs +++ b/core/archipelago/src/container/docker_packages.rs @@ -276,7 +276,6 @@ fn get_app_tier(app_id: &str) -> &'static str { "core" } "btcpay" | "btcpay-server" | "btcpayserver" => "core", - "dwn" => "core", "filebrowser" => "core", // Recommended: enhanced functionality "fedimint" | "fedimint-gateway" => "recommended", @@ -518,13 +517,6 @@ fn get_app_metadata(app_id: &str) -> AppMetadata { repo: "https://github.com/indeedhub/indeedhub".to_string(), tier: "", }, - "dwn" => AppMetadata { - title: "Decentralized Web Node".to_string(), - description: "Store and sync personal data with DID-based access control".to_string(), - icon: "/assets/img/app-icons/dwn.svg".to_string(), - repo: "https://github.com/TBD54566975/dwn-server".to_string(), - tier: "", - }, "tor" | "archy-tor" => AppMetadata { title: "Tor".to_string(), description: "Anonymous overlay network for privacy".to_string(), diff --git a/core/archipelago/src/container/image_versions.rs b/core/archipelago/src/container/image_versions.rs index 47812fcb..6d9a8221 100644 --- a/core/archipelago/src/container/image_versions.rs +++ b/core/archipelago/src/container/image_versions.rs @@ -187,9 +187,6 @@ fn image_var_for_app(app_id: &str) -> Option<&'static str> { // Penpot (primary = frontend) "penpot" | "penpot-frontend" => Some("PENPOT_FRONTEND_IMAGE"), - // DWN - "dwn" => Some("DWN_SERVER_IMAGE"), - // AI "routstr" => Some("ROUTSTR_IMAGE"), diff --git a/core/archipelago/src/federation/sync.rs b/core/archipelago/src/federation/sync.rs index fa96c032..38427c95 100644 --- a/core/archipelago/src/federation/sync.rs +++ b/core/archipelago/src/federation/sync.rs @@ -66,7 +66,9 @@ pub async fn sync_with_peer( // hop. Only runs when the source is Trusted — Observer-level peers // don't get to expand our federation on their own authority. if peer.trust_level == TrustLevel::Trusted { - if let Err(e) = merge_transitive_peers(data_dir, &peer.did, &state.federated_peers).await { + if let Err(e) = + merge_transitive_peers(data_dir, &peer.did, local_did, &state.federated_peers).await + { tracing::warn!( peer_did = %peer.did, error = %e, @@ -109,6 +111,7 @@ pub async fn sync_with_peer_by_did(data_dir: &Path, peer_did: &str) -> Result Result<()> { if hints.is_empty() { @@ -119,8 +122,9 @@ async fn merge_transitive_peers( let mut refreshed = 0u32; for hint in hints { - // Don't import our own DID (a peer advertising us back). - if hint.did == source_did { + // Don't import the source peer advertising itself, or our own DID + // when the source advertises us back as one of its trusted peers. + if hint.did == source_did || hint.did == local_did { continue; } if let Some(existing) = nodes.iter_mut().find(|n| n.did == hint.did) { @@ -359,4 +363,69 @@ mod tests { Some("npub1a") ); } + + #[tokio::test] + async fn merge_transitive_peers_skips_source_and_local_node() { + let dir = tempfile::tempdir().unwrap(); + super::super::storage::save_nodes( + dir.path(), + &[FederatedNode { + did: "did:key:zSource".into(), + pubkey: "aa".into(), + onion: "source.onion".into(), + name: Some("Source".into()), + trust_level: TrustLevel::Trusted, + added_at: "now".into(), + last_seen: None, + last_state: None, + fips_npub: None, + last_transport: None, + last_transport_at: None, + }], + ) + .await + .unwrap(); + + merge_transitive_peers( + dir.path(), + "did:key:zSource", + "did:key:zLocal", + &[ + FederationPeerHint { + did: "did:key:zSource".into(), + pubkey: "aa".into(), + onion: "source.onion".into(), + name: Some("Source".into()), + fips_npub: None, + }, + FederationPeerHint { + did: "did:key:zLocal".into(), + pubkey: "bb".into(), + onion: "local.onion".into(), + name: Some("Local".into()), + fips_npub: None, + }, + FederationPeerHint { + did: "did:key:zPeer".into(), + pubkey: "cc".into(), + onion: "peer.onion".into(), + name: Some("Kitchen".into()), + fips_npub: Some("npub1peer".into()), + }, + ], + ) + .await + .unwrap(); + + let nodes = super::super::storage::load_nodes(dir.path()).await.unwrap(); + assert_eq!(nodes.len(), 2); + assert!(nodes.iter().all(|n| n.did != "did:key:zLocal")); + let peer = nodes + .iter() + .find(|n| n.did == "did:key:zPeer") + .expect("trusted transitive peer should be added"); + assert_eq!(peer.name.as_deref(), Some("Kitchen")); + assert_eq!(peer.trust_level, TrustLevel::Trusted); + assert_eq!(peer.fips_npub.as_deref(), Some("npub1peer")); + } } diff --git a/core/archipelago/src/monitoring/telemetry.rs b/core/archipelago/src/monitoring/telemetry.rs index 2cc1a6ce..8a0d0f16 100644 --- a/core/archipelago/src/monitoring/telemetry.rs +++ b/core/archipelago/src/monitoring/telemetry.rs @@ -71,7 +71,7 @@ async fn build_telemetry_report( data_dir: &std::path::Path, ) -> anyhow::Result { // Anonymous node ID — truncated SHA-256 hash of pubkey - let (node_id, version, container_count, running_count, peer_count, containers) = + let (node_id, node_name, version, container_count, running_count, peer_count, containers) = if let Some(ref sm) = state { let (data, _) = sm.get_snapshot().await; let id = { @@ -98,6 +98,10 @@ async fn build_telemetry_report( .count(); ( id, + data.server_info + .name + .clone() + .filter(|n| !n.trim().is_empty()), data.server_info.version.clone(), data.package_data.len(), running, @@ -107,6 +111,7 @@ async fn build_telemetry_report( } else { ( "unknown".to_string(), + None, "unknown".to_string(), 0, 0, @@ -125,6 +130,8 @@ async fn build_telemetry_report( .and_then(|s| s.split_whitespace().next()?.parse::().ok()) .map(|f| f as u64) .unwrap_or(0); + let hostname = system_hostname().await; + let server_url = local_server_url(data_dir).await; // Latest metrics snapshot let latest = store.latest().await; @@ -166,6 +173,9 @@ async fn build_telemetry_report( Ok(serde_json::json!({ "node_id": node_id, + "node_name": node_name, + "hostname": hostname, + "server_url": server_url, "version": version, "uptime_secs": uptime_secs, "cpu_cores": cpu_cores, @@ -181,6 +191,35 @@ async fn build_telemetry_report( })) } +async fn system_hostname() -> Option { + let output = tokio::process::Command::new("hostname") + .output() + .await + .ok()?; + if !output.status.success() { + return None; + } + let hostname = String::from_utf8_lossy(&output.stdout).trim().to_string(); + (!hostname.is_empty()).then_some(hostname) +} + +async fn local_server_url(data_dir: &std::path::Path) -> Option { + let _ = data_dir; + let output = tokio::process::Command::new("hostname") + .arg("-I") + .output() + .await + .ok()?; + if !output.status.success() { + return None; + } + let ip = String::from_utf8_lossy(&output.stdout) + .split_whitespace() + .find(|ip| !ip.starts_with("127.") && ip.contains('.'))? + .to_string(); + Some(format!("https://{ip}")) +} + /// POST a telemetry report to the central collector. async fn post_telemetry_report(url: &str, report: &serde_json::Value) -> anyhow::Result<()> { let client = reqwest::Client::builder() diff --git a/core/archipelago/src/update.rs b/core/archipelago/src/update.rs index 417a95d1..3971a72a 100644 --- a/core/archipelago/src/update.rs +++ b/core/archipelago/src/update.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use std::path::Path; use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; use tokio::fs; -use tracing::{debug, info}; +use tracing::{debug, info, warn}; /// Live download progress counters. Updated by download_component_resumable /// as bytes arrive and read by the update.status RPC so the UI can show @@ -502,6 +502,8 @@ pub async fn load_state(data_dir: &Path) -> Result { .context("Reading update state")?; let mut state: UpdateState = serde_json::from_str(&data).context("Parsing update state")?; + let mut changed = false; + // Keep current_version in sync with the binary. Sideloaded nodes // (ssh + cp /usr/local/bin/archipelago) don't touch the state file, // so without this the running 1.7.0-alpha binary would keep seeing @@ -517,11 +519,36 @@ pub async fn load_state(data_dir: &Path) -> Result { // if there's genuinely something newer. state.available_update = None; state.manifest_mirror = None; + changed = true; + } + + // `update_in_progress` means a manifest OTA is downloaded and staged, + // ready for apply. Older git/self-build update paths could leave this + // flag stuck true without a staging directory, which traps the UI in an + // unrecoverable state. Heal that on every state load. + if state.update_in_progress && !has_staged_update(data_dir).await { + warn!( + staging = %data_dir.join("update-staging").display(), + "Clearing stale update_in_progress without staged OTA files" + ); + state.update_in_progress = false; + changed = true; + } + + if changed { save_state(data_dir, &state).await?; } Ok(state) } +async fn has_staged_update(data_dir: &Path) -> bool { + let staging_dir = data_dir.join("update-staging"); + let Ok(mut entries) = fs::read_dir(&staging_dir).await else { + return false; + }; + matches!(entries.next_entry().await, Ok(Some(_))) +} + pub async fn save_state(data_dir: &Path, state: &UpdateState) -> Result<()> { let path = data_dir.join(UPDATE_STATE_FILE); let data = serde_json::to_string_pretty(state)?; @@ -1764,6 +1791,11 @@ mod tests { #[tokio::test] async fn test_save_and_load_state_roundtrip() { let dir = tempfile::tempdir().unwrap(); + let staging = dir.path().join("update-staging"); + tokio::fs::create_dir_all(&staging).await.unwrap(); + tokio::fs::write(staging.join("archipelago"), b"staged") + .await + .unwrap(); let state = UpdateState { current_version: "1.0.0".to_string(), last_check: Some("2025-06-15T12:00:00Z".to_string()), @@ -1800,6 +1832,22 @@ mod tests { assert!(loaded.available_update.is_none()); } + #[tokio::test] + async fn test_load_state_clears_stale_in_progress_without_staging() { + let dir = tempfile::tempdir().unwrap(); + let state = UpdateState { + update_in_progress: true, + ..UpdateState::default() + }; + save_state(dir.path(), &state).await.unwrap(); + + let loaded = load_state(dir.path()).await.unwrap(); + + assert!(!loaded.update_in_progress); + let persisted = load_state(dir.path()).await.unwrap(); + assert!(!persisted.update_in_progress); + } + #[tokio::test] async fn test_dismiss_update_clears_available() { let dir = tempfile::tempdir().unwrap(); diff --git a/core/container/src/podman_client.rs b/core/container/src/podman_client.rs index 2eeef47e..35fcad36 100644 --- a/core/container/src/podman_client.rs +++ b/core/container/src/podman_client.rs @@ -123,7 +123,6 @@ impl PodmanClient { "immich_server" | "immich" => "http://localhost:2283", "nginx-proxy-manager" => "http://localhost:8081", "fedimint-gateway" => "http://localhost:8176", - "dwn" => "http://localhost:3100", "endurain" => "http://localhost:8080", "netbird" => "http://localhost:8087", "electrs" | "archy-electrs-ui" => "http://localhost:50002", diff --git a/docs/1.8-alpha-improvements-tracker.md b/docs/1.8-alpha-improvements-tracker.md index d98a8446..dcfc6302 100644 --- a/docs/1.8-alpha-improvements-tracker.md +++ b/docs/1.8-alpha-improvements-tracker.md @@ -1,6 +1,6 @@ # 1.8-alpha Improvements Tracker -Last updated: 2026-06-11 00:17 EDT +Last updated: 2026-06-12 01:15 EDT This tracks the user-facing improvement list that must land with the `1.8-alpha` container migration release and the next ISO cut produced from that release. It @@ -116,6 +116,19 @@ header gap; and removed the My Apps desktop category dropdown. Focused Marketplace/App config tests, type-check, and scoped `git diff --check` passed. Browser smoke against the already-running local Vite/mock session is still next. +Active-session update, 2026-06-12 01:15 EDT: system update UX hardening landed +locally. `load_state()` now clears stale `update_in_progress` when no staged OTA +files exist, so failed legacy update attempts cannot leave the update screen +permanently stuck. Direct `update.git-apply` is gated behind +`ARCHIPELAGO_GIT_UPDATES`, preventing production nodes from accidentally entering +the local git/self-build path that requires `cargo`. `.116` was recovered from a +failed self-build attempt by applying its already-staged manifest OTA; it is now +on `1.7.84-alpha`, backend health is OK, nginx is active/config-valid, HTTP UI +returns `200`, `update_in_progress=false`, and staging was removed. Validation: +`cargo fmt --check`, `cargo check -p archipelago`, and scoped `git diff --check` +passed; focused `cargo test` was blocked by a local `rust-lld` undefined hidden +symbol linker failure unrelated to the updater patch. + Done criteria for this tracker: - Code/UI items: implemented, covered by targeted test or manual smoke check, @@ -148,6 +161,7 @@ Done criteria for this tracker: | Fix BTCPay issue from desktop file "BTCPay Issues" | blocked | Need file contents or path to that desktop artifact. | | Check Nostr Discoverable Nodes and get it working correctly | in-progress | Discover modal now keeps discovered rows visible during relay refresh/failure and shows `Searching relays...` instead of dropping to an empty state. Covered by `DiscoverModal.test.ts`, local type-check, and `git diff --check`. Needs live relay/trust validation before marking done. | | Make sure update password is working properly | done | Backend now returns separate SSH update status so a successful web password change is not reported as a full failure when optional SSH password update fails. Settings modal shows success plus SSH warning and stays open for review. Covered by local type-check, focused modal/RPC tests, auth unit test, `cargo check -p archipelago`, and `git diff --check`. | +| Prevent System Update screen from getting permanently stuck | done | Update state loading now reconciles `update_in_progress` with the actual manifest OTA staging directory and clears stale stuck state when no staged files exist. Direct git/self-build apply is disabled unless `ARCHIPELAGO_GIT_UPDATES` is explicitly set, so production nodes cannot fall into the old `self-update.sh` path that requires local `cargo`. `.116` was recovered by applying its valid staged manifest OTA and verified on `1.7.84-alpha` with backend health OK, nginx active/config-valid, HTTP UI `200`, `update_in_progress=false`, and staging removed. Validated locally with `cargo fmt --check`, `cargo check -p archipelago`, and scoped `git diff --check`; focused `cargo test` was blocked by a local `rust-lld` linker artifact failure unrelated to the updater patch. | | Do UI performance and general performance improvements | todo | Needs profiling target; start with obvious loading/render issues. | | Make sure companion app is all working well, had issues with tab apps | in-progress | Mobile app-session now keeps apps that require a new tab inside the session fallback instead of auto-opening an external tab and closing immediately. Covered by `AppSessionMobileNewTab.test.ts`, existing app-session config tests, app launcher tests, local type-check, and `git diff --check`. Broader companion smoke test still needed before marking done. | | Even though performance is better, on reboot/restart backend/update show checking-containers notification instead of no apps | done | My Apps now shows a dedicated `Checking containers` card when initial backend data has loaded but `server-info.status-info.containers-scanned` is still false and no apps are ready to render, instead of falling through to the no-apps empty state. A follow-up UI pass preserves the last known app list when a later scanner/backoff update reports an empty package map with `containers-scanned=false`, and shows a refresh status banner above the grid. Validated by local type-check, targeted tests, and `git diff --check`; follow-up validation passed `npm test -- --run src/views/apps/__tests__/appPackageCache.test.ts` and `npm run type-check`. | @@ -194,7 +208,7 @@ Done criteria for this tracker: | Work on setup screens function and flows | in-progress | Onboarding setup choice now shows only usable paths: Fresh Start and Restore from Seed. Removed the disabled `Connect Existing (Coming Soon)` option, and covered default Fresh routing plus Restore routing with `OnboardingOptions.test.ts`; `useOnboarding.test.ts`, local type-check, and `git diff --check` passed. Broader onboarding/setup audit still needed before marking done. | | Work on Easy Mode experience | in-progress | Easy Mode goal configure steps now route to their owning app/screen instead of silently completing without navigation; verify steps now expose a `Check & Continue` action; configure/info/verify actions start goal progress before completing the active step. Covered by `goalStepActions.test.ts`, existing goal store tests, local type-check, and `git diff --check`. Broader Easy Mode product scope still needed before marking done. | | Update My Apps homescreen to show most-used apps instead of hardcoded | done | App launches are recorded locally through the app launcher, and the Home My Apps card now shows the top three installed user apps by launch count/recency with a running-app/name fallback when there is no history. Covered by `appUsage.test.ts`, existing app launcher tests, local type-check, targeted tests, and `git diff --check`. | -| Improve Full Archive Node dependent apps UX | todo | Already partly represented by Bitcoin-pruned install block; needs broader dependency UX. | +| Improve Full Archive Node dependent apps UX | in-progress | Electrum-style apps already block install on pruned Bitcoin nodes; Marketplace/App Store cards now surface an inline warning that a full archive Bitcoin node is required instead of only showing a terse `Bitcoin Pruned` button. Covered by `MarketplaceAppCard.test.ts` and local type-check. Broader dependency UX remains. | | Fix incorrect modals that are wrong color and are not full-screen overlay | done | Custom Teleport modals that still used the old light `bg-black/10` overlay now use the same full-screen `bg-black/60` overlay treatment as BaseModal/newer modals. Verified no fixed modal overlays retain `bg-black/10`; validated by local type-check, targeted tests, and `git diff --check`. | | Prevent modals from allowing background scroll | done | Added shared scroll-lock composable, root-level body lock, wheel/touch containment, and explicit dashboard route-panel locking. User validated the background no longer scrolls behind modal overlays. | | Look over gamepad navigation | todo | Needs focused controller-nav pass. | @@ -206,6 +220,7 @@ Done criteria for this tracker: | Delete app data option and uninstall warning | done | Uninstall dialogs in My Apps and App Details now include a clear warning plus a `Delete app data and reset it` choice. Leaving it off preserves app data for later reinstall; checking it passes `preserve_data=false` through `package.uninstall` so the app is fully reset. Covered by `AppsUninstallModal.test.ts`, `rpc-client.test.ts`, local type-check, targeted tests, and `git diff --check`. | | Add App Store container with recommended apps that change to Home Screen | done | Home now shows up to three uninstalled core/recommended App Store apps and routes clicks through the existing Marketplace App Details handoff. Installed aliases are honored, so recommendations disappear once the app is installed and the app moves into normal My Apps/Home behavior. Follow-up layout polish moved Cloud back into the second card slot, moved Recommended Apps into Cloud's previous slot, and placed Quick Start inside the grid next to Wallet to avoid an odd-width row. Covered by `homeRecommendations.test.ts`, local type-check, `git diff --check`, and Playwright Home dashboard smoke against local Vite/mock backend. | | Add QR code to download mobile companion app in login-triggered modal and improve modal | done | Companion intro modal now renders a QR code on desktop and a direct download button on mobile. It reads `VITE_COMPANION_APK_URL` and falls back to `/packages/archipelago-companion.apk.zip`; the APK zip is now published at `neode-ui/public/packages/archipelago-companion.apk.zip` so the modal can serve it immediately. Covered by local type-check, `git diff --check`, and manual file placement verification. | +| Fix TV HDMI overscan clipping in kiosk mode | in-progress | Kiosk launcher now passes a browser safe-area fallback through `/kiosk?safe_area=...`; `/kiosk` now persists the safe-area value during redirect; self-update and deploy paths refresh kiosk launcher/services. The X11 safe-area attempt is opt-in because it stretched the live TV output on `100.66.157.120`. Wi-Fi UI fixes are included in the same OTA patch: scan errors are visible, scans can be retried, escaped SSIDs parse correctly, and open networks do not require a password. Needs live validation on HDMI node `100.66.157.120` after applying the visible OTA update. | | Video calling Picture-in-Picture | blocked | Need referenced document or desired provider/library. | | Card-based loading visuals on App Store pages | done | Discover and Marketplace now show app-card skeleton grids while community/Nostr catalog data is loading and no cards are available yet, instead of a centered spinner/empty state. Validated by local type-check, targeted tests, and `git diff --check`. | diff --git a/docs/bitcoin-rpc-relay.md b/docs/bitcoin-rpc-relay.md index a71fc371..8c6d7857 100644 --- a/docs/bitcoin-rpc-relay.md +++ b/docs/bitcoin-rpc-relay.md @@ -27,6 +27,7 @@ Allowed RPC methods: ```text sendrawtransaction +submitpackage testmempoolaccept getmempoolinfo getrawmempool @@ -37,6 +38,7 @@ getblockcount getblockhash getblockheader getrawtransaction +gettxout decoderawtransaction decodescript estimatesmartfee @@ -113,7 +115,7 @@ The Bitcoin Knots app should add the restricted user only when the secret exists RPC_TXRELAY_AUTH="$(printenv BITCOIN_RPC_TXRELAY_RPCAUTH || true)" RPC_TXRELAY_FLAGS="-rpcwhitelistdefault=0" if [ -n "$RPC_TXRELAY_AUTH" ]; then - RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblockheader,getrawtransaction,decoderawtransaction,decodescript,estimatesmartfee" + RPC_TXRELAY_FLAGS="$RPC_TXRELAY_FLAGS -rpcauth=$RPC_TXRELAY_AUTH -rpcwhitelist=txrelay:sendrawtransaction,submitpackage,testmempoolaccept,getmempoolinfo,getrawmempool,getmempoolentry,getnetworkinfo,getblockchaininfo,getblockcount,getblockhash,getblock,getblockheader,getrawtransaction,gettxout,gettxspendingprevout,decoderawtransaction,decodescript,estimatesmartfee,uptime,ping,getconnectioncount,getpeerinfo,getindexinfo,getdeploymentinfo,getchaintips" fi ``` @@ -245,6 +247,15 @@ curl -sS --user "$BITCOIN_RPC_TXRELAY_USER:$BITCOIN_RPC_TXRELAY_PASSWORD" \ Expected result is a Bitcoin RPC validation error such as `TX decode failed`, which confirms the request reached `sendrawtransaction`. +If a wallet verifies the connection but reports `RPC Forbidden` during +broadcast, the credentials authenticated but the broadcast method was outside +the loaded `txrelay` whitelist. Restart the active Bitcoin backend after +updating the whitelist, then test both `sendrawtransaction` and, for newer +package-relay clients, `submitpackage`. Also confirm the public reverse proxy +passes the wallet's `Authorization` header through to `127.0.0.1:8332`; do not +point public wallet traffic at the Bitcoin UI `/bitcoin-rpc/` helper, because +that helper injects the local dashboard credential. + Check that wallet/admin RPC is blocked: ```sh diff --git a/image-recipe/configs/archipelago-kiosk-launcher.sh b/image-recipe/configs/archipelago-kiosk-launcher.sh index 2683d755..17a60203 100644 --- a/image-recipe/configs/archipelago-kiosk-launcher.sh +++ b/image-recipe/configs/archipelago-kiosk-launcher.sh @@ -1,37 +1,87 @@ #!/bin/bash -# Start X server in the background -/usr/bin/Xorg :0 -nocursor vt1 -nolisten tcp -keeptty & -XPID=$! -sleep 2 -# Check if X started -if ! kill -0 $XPID 2>/dev/null; then - echo 'ERROR: Xorg failed to start' - exit 1 -fi +# Start a dedicated X server for the attached kiosk display. +/usr/bin/Xorg :0 vt1 -nolisten tcp -keeptty & +XPID=$! export DISPLAY=:0 export HOME=/home/archipelago -# Allow archipelago user to connect -xhost +SI:localuser:archipelago 2>/dev/null +X_READY=false +for _ in $(seq 1 30); do + if kill -0 "$XPID" 2>/dev/null && xrandr --query >/tmp/archipelago-kiosk-xrandr.txt 2>/dev/null; then + X_READY=true + break + fi + sleep 0.5 +done -# Disable screen blanking -xset s off 2>/dev/null -xset -dpms 2>/dev/null -xset s noblank 2>/dev/null +if [ "$X_READY" != "true" ]; then + echo 'ERROR: Xorg failed to become ready' + kill "$XPID" 2>/dev/null || true + exit 1 +fi -# Hide cursor -unclutter -idle 3 -root & +KIOSK_SAFE_AREA_X_PX=${ARCHIPELAGO_KIOSK_SAFE_AREA_X_PX:-} +KIOSK_SAFE_AREA_Y_PX=${ARCHIPELAGO_KIOSK_SAFE_AREA_Y_PX:-} -# Kill any stale Chromium instances before starting -pkill -u archipelago -f 'chromium.*kiosk' 2>/dev/null +configure_display() { + command -v xrandr >/dev/null 2>&1 || return 0 + + local output mode internal width height + output=$(awk '/ connected/ && $1 !~ /^eDP|^LVDS/{print $1; exit}' /tmp/archipelago-kiosk-xrandr.txt) + [ -n "$output" ] || output=$(awk '/ connected/{print $1; exit}' /tmp/archipelago-kiosk-xrandr.txt) + [ -n "$output" ] || return 0 + + mode=$(awk -v out="$output" ' + $1 == out { active = 1; next } + active && /^[[:space:]]+[0-9]+x[0-9]+/ { + if ($0 ~ /\*/) { print $1; exit } + if (!first) first = $1 + } + active && /^[^[:space:]]/ { active = 0 } + END { if (first) print first } + ' /tmp/archipelago-kiosk-xrandr.txt) + [ -n "$mode" ] || mode=1920x1080 + + # Kiosk should use one native output. A spanning desktop makes Chromium land + # on the laptop panel or stretch across both outputs. + for internal in $(awk '/ connected/ && $1 ~ /^eDP|^LVDS/{print $1}' /tmp/archipelago-kiosk-xrandr.txt); do + [ "$internal" = "$output" ] || xrandr --output "$internal" --off 2>/dev/null || true + done + + xrandr --output "$output" \ + --primary \ + --mode "$mode" \ + --pos 0x0 \ + --scale 1x1 \ + --panning 0x0 \ + --transform none 2>/dev/null || true + + width=${mode%x*} + height=${mode#*x} + case "$width:$height" in *[!0-9:]*|:*) width=1920; height=1080 ;; esac + + # Browser safe-area fallback for TVs that crop edges. Driver underscan is + # preferable, but many Intel HDMI outputs do not expose that property. + KIOSK_SAFE_AREA_X_PX=${KIOSK_SAFE_AREA_X_PX:-$((width * 3 / 100))} + KIOSK_SAFE_AREA_Y_PX=${KIOSK_SAFE_AREA_Y_PX:-$((height * 3 / 100))} +} + +configure_display + +xhost +SI:localuser:archipelago 2>/dev/null || true +xsetroot -solid black 2>/dev/null || true +xset s off 2>/dev/null || true +xset -dpms 2>/dev/null || true +xset s noblank 2>/dev/null || true + +pkill -u archipelago -f 'chromium.*localhost' 2>/dev/null || true sleep 1 -# Run Chromium as archipelago user in a restart loop while true; do sudo -u archipelago env DISPLAY=:0 HOME=/home/archipelago chromium --kiosk \ - --app=http://localhost/kiosk \ + --app=http://localhost/kiosk?safe_area_x=${KIOSK_SAFE_AREA_X_PX:-0}\&safe_area_y=${KIOSK_SAFE_AREA_Y_PX:-0} \ --noerrdialogs \ --disable-infobars \ --disable-translate \ @@ -45,9 +95,10 @@ while true; do --enable-gpu-rasterization \ --num-raster-threads=2 \ --renderer-process-limit=2 \ - --window-size=9999,9999 \ + --window-size=1920,1080 \ --window-position=0,0 \ --start-fullscreen \ + --force-device-scale-factor=1 \ --disable-background-networking \ --disable-background-timer-throttling \ --disable-backgrounding-occluded-windows \ @@ -60,5 +111,4 @@ while true; do sleep 3 done -# Cleanup -kill $XPID 2>/dev/null +kill "$XPID" 2>/dev/null || true diff --git a/neode-ui/DEV-SCRIPTS.md b/neode-ui/DEV-SCRIPTS.md index 1fb457fb..1dd7f790 100644 --- a/neode-ui/DEV-SCRIPTS.md +++ b/neode-ui/DEV-SCRIPTS.md @@ -110,7 +110,7 @@ tail -f /tmp/neode-dev.log - **Docker Optional** - Apps run for real if Docker/Podman is available, otherwise simulated - **Auto-Detection** - Automatically detects container runtime and adapts - **WebSocket Support** - Real-time state updates via JSON patches -- **Pre-loaded Apps** - 8 apps always visible in My Apps +- **Pre-loaded Apps** - 7 apps always visible in My Apps ### Pre-installed Apps (always running in mock mode) - `bitcoin` - Bitcoin Core (port 8332) @@ -119,7 +119,6 @@ tail -f /tmp/neode-dev.log - `mempool` - Blockchain explorer (port 4080) - `filebrowser` - Web file manager (port 8083) - `lorabell` - LoRa doorbell (no UI port) -- `thunderhub` - Lightning node management (port 3010) - `fedimint` - Federated Bitcoin mint (port 8175) Additional apps can be installed from the Marketplace (30+ available). @@ -226,4 +225,3 @@ The warning is non-fatal - Vite still works, but upgrading is recommended. --- Happy coding! 🎨⚡ - diff --git a/neode-ui/README.md b/neode-ui/README.md index 64aa91c0..41f89556 100644 --- a/neode-ui/README.md +++ b/neode-ui/README.md @@ -55,7 +55,7 @@ The mock backend supports multiple startup modes via `VITE_DEV_MODE`: The mock backend (`mock-backend.js`) simulates the full Rust backend for local development: **Pre-installed apps** (always visible in My Apps): -- Bitcoin Core, LND, Electrs, Mempool, FileBrowser, LoraBell, ThunderHub, Fedimint +- Bitcoin Core, LND, Electrs, Mempool, FileBrowser, LoraBell, Fedimint **Marketplace**: 30+ curated apps with Docker images, install/uninstall simulation diff --git a/neode-ui/src/App.vue b/neode-ui/src/App.vue index 665c89a0..11f59657 100644 --- a/neode-ui/src/App.vue +++ b/neode-ui/src/App.vue @@ -102,6 +102,26 @@ const toastMessage = messageToast.toastMessage useControllerNav() +function syncKioskSafeArea() { + if (typeof document === 'undefined') return + const isKiosk = localStorage.getItem('kiosk') === 'true' + || new URLSearchParams(window.location.search).has('kiosk') + const rawSafeArea = localStorage.getItem('archipelago_kiosk_safe_area_px') || '0' + const safeArea = /^\d{1,3}$/.test(rawSafeArea) ? Number(rawSafeArea) : 0 + const rawSafeAreaX = localStorage.getItem('archipelago_kiosk_safe_area_x_px') || rawSafeArea + const rawSafeAreaY = localStorage.getItem('archipelago_kiosk_safe_area_y_px') || rawSafeArea + const safeAreaX = /^\d{1,3}$/.test(rawSafeAreaX) ? Number(rawSafeAreaX) : safeArea + const safeAreaY = /^\d{1,3}$/.test(rawSafeAreaY) ? Number(rawSafeAreaY) : safeArea + document.documentElement.classList.toggle('kiosk-safe-area', isKiosk && (safeAreaX > 0 || safeAreaY > 0)) + if (isKiosk && (safeAreaX > 0 || safeAreaY > 0)) { + document.documentElement.style.setProperty('--kiosk-safe-area-x', `${safeAreaX}px`) + document.documentElement.style.setProperty('--kiosk-safe-area-y', `${safeAreaY}px`) + } else { + document.documentElement.style.removeProperty('--kiosk-safe-area-x') + document.documentElement.style.removeProperty('--kiosk-safe-area-y') + } +} + // Start/stop message polling and remote relay when auth state changes watch(() => appStore.isAuthenticated, (authenticated) => { if (authenticated) { @@ -330,6 +350,7 @@ function onVisibilityChange() { } onMounted(async () => { + syncKioskSafeArea() document.addEventListener('visibilitychange', onVisibilityChange) window.addEventListener('keydown', onKeyDown, true) window.addEventListener('mousemove', onUserActivity) @@ -393,6 +414,9 @@ onMounted(async () => { }) onBeforeUnmount(() => { + document.documentElement.classList.remove('kiosk-safe-area') + document.documentElement.style.removeProperty('--kiosk-safe-area-x') + document.documentElement.style.removeProperty('--kiosk-safe-area-y') document.removeEventListener('visibilitychange', onVisibilityChange) window.removeEventListener('keydown', onKeyDown, true) window.removeEventListener('mousemove', onUserActivity) diff --git a/neode-ui/src/locales/en.json b/neode-ui/src/locales/en.json index ddf81c90..a08b535a 100644 --- a/neode-ui/src/locales/en.json +++ b/neode-ui/src/locales/en.json @@ -463,9 +463,6 @@ "noIdentities": "No identities yet", "createFirstIdentity": "Create your first sovereign digital identity.", "deleting": "Deleting...", - "decentralizedWebNode": "Decentralized Web Node", - "dwnDescription": "Personal data store with DID-based access control", - "manageDwn": "Manage DWN", "syncing": "Syncing...", "syncNow": "Sync Now", "verifiableCredentials": "Verifiable Credentials", @@ -590,6 +587,7 @@ }, "marketplaceDetails": { "backToStore": "Back to App Store", + "backToHome": "Back to Home", "screenshots": "Screenshots", "screenshotPlaceholder": "Screenshot placeholders - images coming soon", "about": "About {name}", diff --git a/neode-ui/src/locales/es.json b/neode-ui/src/locales/es.json index ee54c0fe..8aa8f475 100644 --- a/neode-ui/src/locales/es.json +++ b/neode-ui/src/locales/es.json @@ -463,9 +463,6 @@ "noIdentities": "A\u00fan no hay identidades", "createFirstIdentity": "Cree su primera identidad digital soberana.", "deleting": "Eliminando...", - "decentralizedWebNode": "Nodo web descentralizado", - "dwnDescription": "Almac\u00e9n de datos personal con control de acceso basado en DID", - "manageDwn": "Administrar DWN", "syncing": "Sincronizando...", "syncNow": "Sincronizar ahora", "verifiableCredentials": "Credenciales verificables", @@ -589,6 +586,7 @@ }, "marketplaceDetails": { "backToStore": "Volver a la tienda", + "backToHome": "Volver al inicio", "screenshots": "Capturas de pantalla", "screenshotPlaceholder": "Capturas de pantalla de ejemplo \u2014 im\u00e1genes disponibles pronto", "about": "Acerca de {name}", diff --git a/neode-ui/src/router/index.ts b/neode-ui/src/router/index.ts index 59d2379c..6ad001e6 100644 --- a/neode-ui/src/router/index.ts +++ b/neode-ui/src/router/index.ts @@ -86,11 +86,26 @@ const router = createRouter({ { path: '/kiosk', name: 'kiosk', - redirect: '/', - beforeEnter: () => { + component: () => import('../views/Kiosk.vue'), + beforeEnter: (to) => { // Persist kiosk mode before redirect so App.vue can skip the remote relay // (relay duplicates xdotool input on the kiosk display) localStorage.setItem('kiosk', 'true') + const safeArea = to.query.safe_area + const safeAreaPx = Array.isArray(safeArea) ? safeArea[0] : safeArea + if (safeAreaPx && /^\d{1,3}$/.test(safeAreaPx)) { + localStorage.setItem('archipelago_kiosk_safe_area_px', safeAreaPx) + } + const safeAreaX = to.query.safe_area_x + const safeAreaXPx = Array.isArray(safeAreaX) ? safeAreaX[0] : safeAreaX + if (safeAreaXPx && /^\d{1,3}$/.test(safeAreaXPx)) { + localStorage.setItem('archipelago_kiosk_safe_area_x_px', safeAreaXPx) + } + const safeAreaY = to.query.safe_area_y + const safeAreaYPx = Array.isArray(safeAreaY) ? safeAreaY[0] : safeAreaY + if (safeAreaYPx && /^\d{1,3}$/.test(safeAreaYPx)) { + localStorage.setItem('archipelago_kiosk_safe_area_y_px', safeAreaYPx) + } }, }, { @@ -386,4 +401,3 @@ router.afterEach((to) => { }) export default router - diff --git a/neode-ui/src/stores/appLauncher.ts b/neode-ui/src/stores/appLauncher.ts index 2201f5d1..85956def 100644 --- a/neode-ui/src/stores/appLauncher.ts +++ b/neode-ui/src/stores/appLauncher.ts @@ -111,10 +111,8 @@ const PORT_TO_APP_ID: Record = { '4080': 'mempool', '8175': 'fedimint', '8176': 'fedimint-gateway', - '3100': 'dwn', '7778': 'indeedhub', '50002': 'electrumx', - '3010': 'thunderhub', } const APP_ID_TO_PORT: Record = { diff --git a/neode-ui/src/style.css b/neode-ui/src/style.css index 0ebbaac8..412ecf7d 100644 --- a/neode-ui/src/style.css +++ b/neode-ui/src/style.css @@ -1294,6 +1294,21 @@ body { min-height: 100dvh; } +html.kiosk-safe-area, +html.kiosk-safe-area body { + width: 100vw; + height: 100vh; + overflow: hidden; + background: #000; +} + +html.kiosk-safe-area #app { + width: 100vw; + height: 100vh; + min-height: 0; + overflow: hidden; +} + /* Custom scrollbar for glass containers */ .custom-scrollbar::-webkit-scrollbar { width: 10px; diff --git a/neode-ui/src/views/Discover.vue b/neode-ui/src/views/Discover.vue index 6cfcbd37..7ea73652 100644 --- a/neode-ui/src/views/Discover.vue +++ b/neode-ui/src/views/Discover.vue @@ -416,8 +416,8 @@ function isStartingUp(appId: string): boolean { } function getAppTier(appId: string): string { - const core = ['bitcoin-knots', 'bitcoin', 'lnd', 'mempool', 'btcpay-server', 'dwn', 'filebrowser'] - const recommended = ['fedimint', 'thunderhub', 'vaultwarden', 'uptime-kuma', 'grafana', 'searxng', 'tailscale', 'netbird', 'portainer'] + const core = ['bitcoin-knots', 'bitcoin', 'lnd', 'mempool', 'btcpay-server', 'filebrowser'] + const recommended = ['fedimint', 'vaultwarden', 'uptime-kuma', 'grafana', 'searxng', 'tailscale', 'netbird', 'portainer'] if (core.includes(appId)) return 'core' if (recommended.includes(appId)) return 'recommended' return 'optional' diff --git a/neode-ui/src/views/Home.vue b/neode-ui/src/views/Home.vue index 059e73d3..581652a0 100644 --- a/neode-ui/src/views/Home.vue +++ b/neode-ui/src/views/Home.vue @@ -125,55 +125,21 @@ - -
-
-
-
-
-

{{ t('home.recommendedApps') }}

-

{{ t('home.recommendedAppsDesc') }}

-
- - - -
-
- -
-
- {{ t('home.browseStore') }} -
-
-
-
+ +
@@ -213,21 +179,54 @@
- - + +
+
+
+
+
+

{{ t('home.recommendedApps') }}

+

{{ t('home.recommendedAppsDesc') }}

+
+ + + +
+
+ +
+
+ {{ t('home.browseStore') }} +
+
+
+
getHomeRecommendedApps(getCuratedAppL function viewRecommendedApp(app: MarketplaceApp) { setCurrentApp(app) - router.push({ name: 'marketplace-app-detail', params: { id: app.id } }).catch(() => {}) + router.push({ name: 'marketplace-app-detail', params: { id: app.id }, query: { from: 'home' } }).catch(() => {}) } function marketplaceDescription(app: MarketplaceApp) { diff --git a/neode-ui/src/views/Kiosk.vue b/neode-ui/src/views/Kiosk.vue index 47149a2f..ada7fa81 100644 --- a/neode-ui/src/views/Kiosk.vue +++ b/neode-ui/src/views/Kiosk.vue @@ -107,7 +107,6 @@ const launchableApps = computed(() => { 'tailscale': '/app/tailscale/', 'fedimint': '/app/fedimint/', 'fedimint-gateway': '/app/fedimint-gateway/', - 'dwn': '/app/dwn/', 'indeedhub': 'http://localhost:7778', 'botfights': 'http://localhost:9100', 'nwnn': 'https://nwnn.l484.com', @@ -172,7 +171,10 @@ onUnmounted(() => {