diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..1432f56 --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +"@start9labs/start-sdk/prettier.config.json" diff --git a/Makefile b/Makefile index 8315da3..9968bcf 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ ARCHES := x86 arm # overrides to s9pk.mk must precede the include statement +# The type check also runs test/, which checks the networks against satd-init. +TS_CHECK := npm run check include node_modules/@start9labs/start-sdk/s9pk.mk diff --git a/README.md b/README.md index cfa8732..3969f34 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,6 @@ entrypoint: two oneshots run before the daemon on every start. | `satd` | `satd --datadir --chain …` | `satd` | The node. `--rpcauth` is appended once the RPC credential has been set. | `satd-init` is driven by environment: `NETWORK`, `SATD_P2P_PORT`, -`SATD_STACK_SUBNET` (the container bridge, rendered as `rpcallowip`), `SATD_MCP=1`, `SATD_MCP_ALLOWED_HOSTS` and `SATD_TLS_HOSTNAME=satd.startos`. ## Volume and Data Layout @@ -99,7 +98,7 @@ Being a flavor, this package satisfies no other service's dependency on matches `#satd:…`, so Lightning, electrs, Mempool and the rest report Bitcoin as unsatisfied while satd is installed. satd publishes no `rawblock` / `rawtx` ZMQ topics, so that is correct rather than conservative; a dependent -that has verified itself against satd can opt in with `|| #satd:>=0.5.2:0`. +that has verified itself against satd can opt in with `|| #satd:>=0.6.1:0`. ## Network Access and Interfaces @@ -111,7 +110,7 @@ that has verified itself against satd can opt in with `|| #satd:>=0.5.2:0`. | `mcp` | `api` | 8339 | HTTPS, rewrapped by the OS | The MCP server. Bearer token required; `Host` must be listed under **MCP Hostnames**. | | `peer` | `p2p` | 8333 / 38333 / 48333 / 18333 / 18444 | raw TCP | Inbound Bitcoin P2P. The port follows the network. | -satd's own TLS listeners (8336, 50002, 3001) are left unexported. MCP is +satd's own TLS listeners (8336, 50002, 3001, 9336) are left unexported. MCP is the one listener satd insists on serving over its own TLS off-loopback, so the OS terminates the client's connection and opens a fresh one inward with certificate validation disabled — the inward leg presents a certificate from @@ -148,9 +147,10 @@ everything implementation-specific is rebuilt from it: default configuration. **This direction has not been run.** The switch is a full reindex: satd validates every block again and rebuilds -the transaction and address indices. On mainnet that is days, not hours. Do -not stop the service, reboot, or run an action that restarts satd while it -runs — see Limitations. +the transaction and address indices. On mainnet that is days, not hours. +Stopping the service, a reboot or an action that restarts satd interrupts +it safely: satd flushes and exits on SIGTERM, and the next start continues +the reindex from the block files on disk, downloading nothing. ## Actions @@ -220,11 +220,11 @@ network once started. ## Limitations and Differences -1. **A flavor switch that is interrupted re-downloads the rest of the chain.** satd ignores SIGTERM while connecting blocks, so a stop during the reindex becomes a kill after `sigtermTimeout`; on the next start satd does not resume from the block files already on disk but goes back to network IBD from the last flushed tip, writing the re-downloaded blocks into new `blk*.dat` files beside the originals. Both are upstream defects; until they are fixed the switch must run uninterrupted. +1. **The flavor switch is slow.** The reindex replays recent large blocks at a few hundred a minute at the default `dbcache`, so a mainnet switch takes days. It can be stopped and restarted (since satd 0.6.1); the speed is an upstream item for a later release. 2. **No pruning.** Electrum and Esplora both require the transaction and address indices, which are incompatible with pruning; the upstream template runs fully indexed. 3. **Not a drop-in for Core or Knots.** satd speaks Core's JSON-RPC but publishes no `rawblock` / `rawtx` ZMQ topics; see Dependencies for what that means for other services. 4. **No wallet.** satd is a node; wallets connect through the Electrum interface. -5. **satd's own TLS listeners are not exported**, and its metrics endpoint (9332) is not exposed at all. +5. **satd's own TLS listeners are not exported**, and its metrics endpoints (9332 and 9336) are not exposed at all. 6. **One RPC credential**, with the fixed username `satd`; there is no multi-user `rpcauth` management. --- @@ -245,7 +245,6 @@ file_models: startos_managed_env_vars: - NETWORK - SATD_MCP - - SATD_STACK_SUBNET - SATD_TLS_HOSTNAME - SATD_MCP_ALLOWED_HOSTS - SATD_P2P_PORT diff --git a/UPDATING.md b/UPDATING.md index 6144240..e01599d 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -27,8 +27,8 @@ Upstream is tracked as a prebuilt Docker image, `ghcr.io/epochbtc/satd`, pinned and update `test/upstream/SOURCE`; `npm run check` fails if the network list or a P2P port moved. 4. Diff `contrib/stack/satd/satd.conf.tmpl` and `satd-init` between the two tags for anything - `startos/main.ts` relies on: the `NETWORK`, `SATD_P2P_PORT`, `SATD_STACK_SUBNET`, - `SATD_MCP`, `SATD_MCP_ALLOWED_HOSTS` and `SATD_TLS_HOSTNAME` variables, the fixed listener + `startos/main.ts` relies on: the `NETWORK`, `SATD_P2P_PORT`, `SATD_MCP`, + `SATD_MCP_ALLOWED_HOSTS` and `SATD_TLS_HOSTNAME` variables, the fixed listener ports in `startos/utils.ts`, the `secrets/mcp-token` path, and the `rpc-cookie` symlink `sat-cli` is pointed at. Check `docs/manual/src/config-reference.md` for `rpcauth`, which the package passes on the command line. diff --git a/instructions.md b/instructions.md index ede7c4a..aa4e900 100644 --- a/instructions.md +++ b/instructions.md @@ -8,10 +8,9 @@ installed. If you rely on any of them, this is not the node for you. Switching from Core or Knots keeps the block files you already have and rebuilds the rest: satd re-validates every block and builds its own indices, which on -mainnet takes days. **Do not stop the service, restart it, reboot, or change its -settings while that runs** — an interrupted rebuild starts downloading the -remaining chain from the network instead. Switching back to Core or Knots is the -same kind of rebuild on their side. +mainnet takes days. Stopping, restarting or rebooting while it runs is safe: +the next start continues the rebuild from the block files on disk. Switching +back to Core or Knots is the same kind of rebuild on their side. This node runs fully indexed — Electrum and Esplora both need the transaction and address indices, and pruning is incompatible with them — so budget for the diff --git a/package-lock.json b/package-lock.json index b1e5f76..d624e3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,91 +6,13 @@ "": { "name": "satd-startos", "dependencies": { - "@start9labs/start-sdk": "2.0.9" - }, - "devDependencies": { - "@types/node": "^22.19.7", - "@vercel/ncc": "^0.38.4", - "prettier": "^3.8.1", - "typescript": "^6.0.3" - } - }, - "node_modules/@iarna/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==", - "license": "ISC" - }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodable/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/nodable" - } - ], - "license": "MIT" - }, - "node_modules/@start9labs/start-sdk": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-2.0.9.tgz", - "integrity": "sha512-HuSYrS10Bb+f6OyAMlCzd5Qyr+rIauiI0dF8MVh5Ny+eU0gF8/DeFAXlHFgL+9wkSv4UAP5q5yOzlBpXzsNbWQ==", - "bundleDependencies": [ - "@start9labs/start-core", - "eslint", - "typescript-eslint" - ], - "license": "MIT", - "dependencies": { - "@iarna/toml": "^3.0.0", - "@noble/curves": "^1.9.7", - "@noble/hashes": "^1.8.0", - "@start9labs/start-core": "file:./node_modules/@start9labs/start-core", - "@types/ini": "^4.1.1", - "deep-equality-data-structures": "^2.0.0", - "eslint": "^9.39.4", - "fast-xml-parser": "~5.7.0", - "ini": "^5.0.0", - "isomorphic-fetch": "^3.0.0", - "mime": "^4.1.0", - "typescript-eslint": "^8.61.0", - "yaml": "^2.8.3", - "zod": "4.4.3", - "zod-deep-partial": "^1.2.0" + "@start9labs/start-sdk": "3.0.6" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "inBundle": true, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -105,9 +27,10 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -116,17 +39,19 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint-community/regexpp": { + "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-array": { + "node_modules/@eslint/config-array": { "version": "0.21.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", @@ -137,29 +62,10 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.15", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/config-helpers": { + "node_modules/@eslint/config-helpers": { "version": "0.4.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0" @@ -168,9 +74,10 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/core": { + "node_modules/@eslint/core": { "version": "0.17.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -179,9 +86,10 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "inBundle": true, + "node_modules/@eslint/eslintrc": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz", + "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==", "license": "MIT", "dependencies": { "ajv": "^6.14.0", @@ -190,7 +98,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.2", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -201,55 +109,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "inBundle": true, - "license": "Python-2.0" - }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.15", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.2.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/js": { - "version": "9.39.4", - "inBundle": true, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -258,17 +121,19 @@ "url": "https://eslint.org/donate" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/object-schema": { + "node_modules/@eslint/object-schema": { "version": "2.1.7", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@eslint/plugin-kit": { + "node_modules/@eslint/plugin-kit": { "version": "0.4.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0", @@ -278,9 +143,10 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@humanfs/core": { + "node_modules/@humanfs/core": { "version": "0.19.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "license": "Apache-2.0", "dependencies": { "@humanfs/types": "^0.15.0" @@ -289,9 +155,10 @@ "node": ">=18.18.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@humanfs/node": { + "node_modules/@humanfs/node": { "version": "0.16.8", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.2", @@ -302,17 +169,19 @@ "node": ">=18.18.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@humanfs/types": { + "node_modules/@humanfs/types": { "version": "0.15.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@humanwhocodes/module-importer": { + "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -322,9 +191,10 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@start9labs/start-sdk/node_modules/@humanwhocodes/retry": { + "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "license": "Apache-2.0", "engines": { "node": ">=18.18" @@ -334,6 +204,81 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@iarna/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q==", + "license": "ISC" + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodable/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@start9labs/start-sdk": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@start9labs/start-sdk/-/start-sdk-3.0.6.tgz", + "integrity": "sha512-gVLdb5d488yNDZv7e0/FReJfc3klHbwkyleOwnegSt61fCM/AFI9VZmFPagLcbysjGOMLWlfwWUaDI51VKuFLA==", + "bundleDependencies": [ + "@start9labs/start-core" + ], + "license": "MIT", + "dependencies": { + "@iarna/toml": "^3.0.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0", + "@start9labs/start-core": "file:./node_modules/@start9labs/start-core", + "@types/ini": "^4.1.1", + "@types/node": "^22.19.0", + "@vercel/ncc": "^0.38.4", + "deep-equality-data-structures": "^2.0.0", + "eslint": "^9.39.4", + "fast-xml-parser": "~5.7.0", + "ini": "^5.0.0", + "isomorphic-fetch": "^3.0.0", + "mime": "^4.1.0", + "prettier": "3.8.3", + "typescript": "^6.0.3", + "typescript-eslint": "^8.61.0", + "yaml": "^2.8.3", + "zod": "4.4.3", + "zod-deep-partial": "^1.2.0" + } + }, "node_modules/@start9labs/start-sdk/node_modules/@start9labs/start-core": { "inBundle": true, "license": "MIT", @@ -491,26 +436,44 @@ "zod": "^4.1.13" } }, - "node_modules/@start9labs/start-sdk/node_modules/@types/estree": { + "node_modules/@types/estree": { "version": "1.0.9", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/@types/json-schema": { + "node_modules/@types/json-schema": { "version": "7.0.15", - "inBundle": true, + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@types/node": { + "version": "22.20.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.5.tgz", + "integrity": "sha512-U2+DNr+wSjpsTS/wZGYHq7GcwfuSmKiKvoPvK22zwTlRhU91yOniN4qRR5KhIjvif7ysw/dz/hKmfDH0Ris4aA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.2.tgz", + "integrity": "sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ==", "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/type-utils": "8.61.0", - "@typescript-eslint/utils": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/type-utils": "8.71.2", + "@typescript-eslint/utils": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -523,28 +486,30 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.61.0", + "@typescript-eslint/parser": "^8.71.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "inBundle": true, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.12.tgz", + "integrity": "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==", "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/parser": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/parser": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.71.2.tgz", + "integrity": "sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw==", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", "debug": "^4.4.3" }, "engines": { @@ -559,13 +524,14 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/project-service": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/project-service": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.2.tgz", + "integrity": "sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.0", - "@typescript-eslint/types": "^8.61.0", + "@typescript-eslint/tsconfig-utils": "^8.71.2", + "@typescript-eslint/types": "^8.71.2", "debug": "^4.4.3" }, "engines": { @@ -579,13 +545,14 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.2.tgz", + "integrity": "sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0" + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -595,9 +562,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.2.tgz", + "integrity": "sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -610,14 +578,15 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/type-utils": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.71.2.tgz", + "integrity": "sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2", + "@typescript-eslint/utils": "8.71.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -633,9 +602,10 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/types": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/types": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.2.tgz", + "integrity": "sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -645,15 +615,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.2.tgz", + "integrity": "sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==", "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.61.0", - "@typescript-eslint/tsconfig-utils": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", + "@typescript-eslint/project-service": "8.71.2", + "@typescript-eslint/tsconfig-utils": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/visitor-keys": "8.71.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -671,31 +642,34 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "4.0.4", - "inBundle": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", "engines": { "node": "18 || 20 || >=22" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "inBundle": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "inBundle": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -704,26 +678,16 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.3", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/utils": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/utils": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.71.2.tgz", + "integrity": "sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0" + "@typescript-eslint/scope-manager": "8.71.2", + "@typescript-eslint/types": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -737,12 +701,13 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.0", - "inBundle": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.2.tgz", + "integrity": "sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/types": "8.71.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -753,9 +718,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "license": "Apache-2.0", "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -764,28 +730,40 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/acorn": { - "version": "8.16.0", - "inBundle": true, + "node_modules/@vercel/ncc": { + "version": "0.38.4", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz", + "integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==", "license": "MIT", "bin": { - "acorn": "bin/acorn" - }, - "engines": { + "ncc": "dist/ncc/cli.js" + } + }, + "node_modules/acorn": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { "node": ">=0.4.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/acorn-jsx": { + "node_modules/acorn-jsx": { "version": "5.3.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/ajv": { + "node_modules/ajv": { "version": "6.15.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -798,9 +776,10 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@start9labs/start-sdk/node_modules/ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -812,22 +791,53 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@start9labs/start-sdk/node_modules/balanced-match": { + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/balanced-match": { "version": "1.0.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/callsites": { + "node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { "version": "3.1.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/@start9labs/start-sdk/node_modules/chalk": { + "node_modules/chalk": { "version": "4.1.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -840,9 +850,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@start9labs/start-sdk/node_modules/color-convert": { + "node_modules/color-convert": { "version": "2.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -851,19 +862,22 @@ "node": ">=7.0.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/color-name": { + "node_modules/color-name": { "version": "1.1.4", - "inBundle": true, + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/concat-map": { + "node_modules/concat-map": { "version": "0.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.6", - "inBundle": true, + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -874,9 +888,10 @@ "node": ">= 8" } }, - "node_modules/@start9labs/start-sdk/node_modules/debug": { + "node_modules/debug": { "version": "4.4.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -890,14 +905,38 @@ } } }, - "node_modules/@start9labs/start-sdk/node_modules/deep-is": { + "node_modules/deep-equality-data-structures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-2.0.0.tgz", + "integrity": "sha512-qgrUr7MKXq7VRN+WUpQ48QlXVGL0KdibAoTX8KRg18lgOgqbEKMAW1WZsVCtakY4+XX42pbAJzTz/DlXEFM2Fg==", + "license": "MIT", + "dependencies": { + "object-hash": "^3.0.0" + } + }, + "node_modules/deep-is": { "version": "0.1.4", - "inBundle": true, + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/eslint": { - "version": "9.39.4", - "inBundle": true, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", @@ -905,8 +944,8 @@ "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -953,9 +992,10 @@ } } }, - "node_modules/@start9labs/start-sdk/node_modules/eslint-scope": { + "node_modules/eslint-scope": { "version": "8.4.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -968,9 +1008,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/eslint-visitor-keys": { + "node_modules/eslint-visitor-keys": { "version": "4.2.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -979,94 +1020,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/espree": { + "node_modules/espree": { "version": "10.4.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", @@ -1080,9 +1037,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@start9labs/start-sdk/node_modules/esquery": { + "node_modules/esquery": { "version": "1.7.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -1091,9 +1049,10 @@ "node": ">=0.10" } }, - "node_modules/@start9labs/start-sdk/node_modules/esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -1102,40 +1061,83 @@ "node": ">=4.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/esutils": { + "node_modules/esutils": { "version": "2.0.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", - "inBundle": true, + "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/@start9labs/start-sdk/node_modules/fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/fast-levenshtein": { + "node_modules/fast-levenshtein": { "version": "2.0.6", - "inBundle": true, + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/fdir": { + "node_modules/fast-xml-builder": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz", + "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", + "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.7", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fdir": { "version": "6.5.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", "engines": { "node": ">=12.0.0" @@ -1149,9 +1151,10 @@ } } }, - "node_modules/@start9labs/start-sdk/node_modules/file-entry-cache": { + "node_modules/file-entry-cache": { "version": "8.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" @@ -1160,9 +1163,26 @@ "node": ">=16.0.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/flat-cache": { + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { "version": "4.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -1172,14 +1192,28 @@ "node": ">=16" } }, - "node_modules/@start9labs/start-sdk/node_modules/flatted": { - "version": "3.4.2", - "inBundle": true, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "license": "ISC" }, - "node_modules/@start9labs/start-sdk/node_modules/globals": { + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { "version": "14.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", "engines": { "node": ">=18" @@ -1188,25 +1222,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@start9labs/start-sdk/node_modules/has-flag": { + "node_modules/has-flag": { "version": "4.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@start9labs/start-sdk/node_modules/ignore": { + "node_modules/ignore": { "version": "5.3.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/@start9labs/start-sdk/node_modules/import-fresh": { + "node_modules/import-fresh": { "version": "3.3.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -1219,33 +1256,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@start9labs/start-sdk/node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "inBundle": true, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.8.19" } }, - "node_modules/@start9labs/start-sdk/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", "engines": { - "node": ">=0.8.19" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/is-glob": { + "node_modules/is-glob": { "version": "4.0.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -1254,38 +1295,76 @@ "node": ">=0.10.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/isexe": { + "node_modules/isexe": { "version": "2.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/@start9labs/start-sdk/node_modules/json-buffer": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@start9labs/start-sdk/node_modules/json-schema-traverse": { - "version": "0.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@start9labs/start-sdk/node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@start9labs/start-sdk/node_modules/keyv": { - "version": "4.5.4", - "inBundle": true, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" } }, - "node_modules/@start9labs/start-sdk/node_modules/levn": { - "version": "0.4.1", - "inBundle": true, - "license": "MIT", + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1294,24 +1373,99 @@ "node": ">= 0.8.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/lodash.merge": { + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { "version": "4.6.2", - "inBundle": true, + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/ms": { + "node_modules/mime": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.1.tgz", + "integrity": "sha512-YAApRsTpM2+gnUFHhRNGfkX8NK0V5xj1nyQLufGlwEI+eX4xRsTcel2IXDuMEGSGjBvzykNW4VuoEACgwYe7BQ==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { "version": "2.1.3", - "inBundle": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, - "node_modules/@start9labs/start-sdk/node_modules/optionator": { + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { "version": "0.9.4", - "inBundle": true, + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -1325,9 +1479,10 @@ "node": ">= 0.8.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/p-limit": { + "node_modules/p-limit": { "version": "3.1.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -1339,9 +1494,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@start9labs/start-sdk/node_modules/parent-module": { + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { "version": "1.0.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -1350,25 +1521,43 @@ "node": ">=6" } }, - "node_modules/@start9labs/start-sdk/node_modules/path-exists": { + "node_modules/path-exists": { "version": "4.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@start9labs/start-sdk/node_modules/path-key": { + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-key": { "version": "3.1.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@start9labs/start-sdk/node_modules/picomatch": { - "version": "4.0.4", - "inBundle": true, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -1377,25 +1566,64 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@start9labs/start-sdk/node_modules/prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "license": "MIT", "engines": { "node": ">= 0.8.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/punycode": { + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { "version": "2.3.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/@start9labs/start-sdk/node_modules/shebang-command": { + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { "version": "2.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -1404,17 +1632,19 @@ "node": ">=8" } }, - "node_modules/@start9labs/start-sdk/node_modules/shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@start9labs/start-sdk/node_modules/strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", - "inBundle": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", "engines": { "node": ">=8" @@ -1423,9 +1653,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@start9labs/start-sdk/node_modules/supports-color": { + "node_modules/strnum": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.5.1.tgz", + "integrity": "sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, + "node_modules/supports-color": { "version": "7.2.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -1434,9 +1680,10 @@ "node": ">=8" } }, - "node_modules/@start9labs/start-sdk/node_modules/tinyglobby": { + "node_modules/tinyglobby": { "version": "0.2.17", - "inBundle": true, + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -1449,9 +1696,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/@start9labs/start-sdk/node_modules/ts-api-utils": { + "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-api-utils": { "version": "2.5.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "license": "MIT", "engines": { "node": ">=18.12" @@ -1460,9 +1714,10 @@ "typescript": ">=4.8.4" } }, - "node_modules/@start9labs/start-sdk/node_modules/type-check": { + "node_modules/type-check": { "version": "0.4.0", - "inBundle": true, + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -1471,15 +1726,29 @@ "node": ">= 0.8.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/typescript-eslint": { - "version": "8.61.0", - "inBundle": true, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.71.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.71.2.tgz", + "integrity": "sha512-Rz4effbMy2g9wnvOJZG6SbVavX313Lap1vNEbk1RUochzickvzP8P4HB+bkNg5e50eVz1hQGjh9K1omI1xB4Bw==", "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.61.0", - "@typescript-eslint/parser": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0", - "@typescript-eslint/utils": "8.61.0" + "@typescript-eslint/eslint-plugin": "8.71.2", + "@typescript-eslint/parser": "8.71.2", + "@typescript-eslint/typescript-estree": "8.71.2", + "@typescript-eslint/utils": "8.71.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1493,266 +1762,21 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@start9labs/start-sdk/node_modules/uri-js": { - "version": "4.4.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/word-wrap": { - "version": "1.2.5", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@start9labs/start-sdk/node_modules/yocto-queue": { - "version": "0.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@types/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.20.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.2.tgz", - "integrity": "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@vercel/ncc": { - "version": "0.38.4", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.4.tgz", - "integrity": "sha512-8LwjnlP39s08C08J5NstzriPvW1SP8Zfpp1BvC2sI35kPeZnHfxVkCwu4/+Wodgnd60UtT1n8K8zw+Mp7J9JmQ==", - "dev": true, - "license": "MIT", - "bin": { - "ncc": "dist/ncc/cli.js" - } - }, - "node_modules/anynum": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", - "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/deep-equality-data-structures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deep-equality-data-structures/-/deep-equality-data-structures-2.0.0.tgz", - "integrity": "sha512-qgrUr7MKXq7VRN+WUpQ48QlXVGL0KdibAoTX8KRg18lgOgqbEKMAW1WZsVCtakY4+XX42pbAJzTz/DlXEFM2Fg==", - "license": "MIT", - "dependencies": { - "object-hash": "^3.0.0" - } - }, - "node_modules/fast-xml-builder": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz", - "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.6.2", - "xml-naming": "^0.3.0" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.3.tgz", - "integrity": "sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "@nodable/entities": "^2.1.0", - "fast-xml-builder": "^1.1.7", - "path-expression-matcher": "^1.5.0", - "strnum": "^2.2.3" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, - "node_modules/mime": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", - "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "license": "MIT", - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/path-expression-matcher": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", - "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/strnum": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz", - "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "anynum": "^1.0.1" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, + "node_modules/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/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1775,6 +1799,30 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/xml-naming": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", @@ -1791,9 +1839,9 @@ } }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -1805,6 +1853,18 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", diff --git a/package.json b/package.json index 706d504..9fd1eac 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,13 @@ { "name": "satd-startos", "scripts": { - "build": "rm -rf ./javascript && ncc build startos/index.ts -o ./javascript", - "prettier": "prettier --write startos test", "check": "tsc --noEmit && npm run test", "test": "node --experimental-strip-types --test test/*.test.ts" }, "dependencies": { - "@start9labs/start-sdk": "2.0.9" + "@start9labs/start-sdk": "3.0.6" }, "overrides": { "@start9labs/start-sdk": "$@start9labs/start-sdk" - }, - "devDependencies": { - "@types/node": "^22.19.7", - "@vercel/ncc": "^0.38.4", - "prettier": "^3.8.1", - "typescript": "^6.0.3" - }, - "prettier": { - "trailingComma": "all", - "tabWidth": 2, - "semi": false, - "singleQuote": true } } diff --git a/startos/actions/caCertificate.ts b/startos/actions/caCertificate.ts index 90d9c5d..b659ca2 100644 --- a/startos/actions/caCertificate.ts +++ b/startos/actions/caCertificate.ts @@ -51,6 +51,7 @@ export const caCertificate = sdk.Action.withoutInput( copyable: true, qr: false, masked: false, + launchable: false, }, } }, diff --git a/startos/actions/mcpToken.ts b/startos/actions/mcpToken.ts index 5da39c5..ccb8ddf 100644 --- a/startos/actions/mcpToken.ts +++ b/startos/actions/mcpToken.ts @@ -38,6 +38,7 @@ export const mcpToken = sdk.Action.withoutInput( copyable: true, qr: false, masked: true, + launchable: false, }, } }, diff --git a/startos/actions/rpcCredentials.ts b/startos/actions/rpcCredentials.ts index aec4284..c80081b 100644 --- a/startos/actions/rpcCredentials.ts +++ b/startos/actions/rpcCredentials.ts @@ -50,6 +50,7 @@ export const rpcCredentials = sdk.Action.withoutInput( description: null, value: rpcUsername, masked: false, + launchable: false, copyable: true, qr: false, }, @@ -59,6 +60,7 @@ export const rpcCredentials = sdk.Action.withoutInput( description: null, value: password, masked: true, + launchable: false, copyable: true, qr: false, }, diff --git a/startos/dependencies.ts b/startos/dependencies.ts index f77d698..c6fa8b9 100644 --- a/startos/dependencies.ts +++ b/startos/dependencies.ts @@ -1,3 +1,4 @@ import { sdk } from './sdk' -export const setDependencies = sdk.setupDependencies(async () => ({})) +// None: satd needs no other service. +export const dependencies = sdk.Dependencies.of() diff --git a/startos/fileModels/store.json.ts b/startos/fileModels/store.json.ts index 2e01844..c99f604 100644 --- a/startos/fileModels/store.json.ts +++ b/startos/fileModels/store.json.ts @@ -3,7 +3,7 @@ import { sdk } from '../sdk' // The network is a command-line argument, never a config line: satd accepts a // `signet=1` line in bitcoin.conf and then runs mainnet regardless. -export const shape = z.object({ +export const shape = z.looseObject({ network: z .enum(['mainnet', 'signet', 'testnet4', 'testnet', 'regtest']) .catch('mainnet'), diff --git a/startos/index.ts b/startos/index.ts index 7af589b..e882576 100644 --- a/startos/index.ts +++ b/startos/index.ts @@ -8,4 +8,5 @@ export { actions } from './actions' import { buildManifest } from '@start9labs/start-sdk' import { manifest as sdkManifest } from './manifest' import { versionGraph } from './versions' -export const manifest = buildManifest(versionGraph, sdkManifest) +import { dependencies } from './dependencies' +export const manifest = buildManifest(versionGraph, sdkManifest, dependencies) diff --git a/startos/init/index.ts b/startos/init/index.ts index 0f6cb49..8c65590 100644 --- a/startos/init/index.ts +++ b/startos/init/index.ts @@ -1,6 +1,6 @@ import { actions } from '../actions' import { restoreInit } from '../backups' -import { setDependencies } from '../dependencies' +import { dependencies } from '../dependencies' import { setInterfaces } from '../interfaces' import { sdk } from '../sdk' import { versionGraph } from '../versions' @@ -11,7 +11,7 @@ export const init = sdk.setupInit( versionGraph, seedFiles, setInterfaces, - setDependencies, + dependencies, actions, ) diff --git a/startos/main.ts b/startos/main.ts index ee9c963..b96fb2b 100644 --- a/startos/main.ts +++ b/startos/main.ts @@ -4,7 +4,6 @@ import { storeJson } from './fileModels/store.json' import { i18n } from './i18n' import { sdk } from './sdk' import { - bridgeSubnet, GetBlockchainInfo, networks, p2pPorts, @@ -95,7 +94,6 @@ export const main = sdk.setupMain(async ({ effects }) => { env: { NETWORK: network, SATD_MCP: '1', - SATD_STACK_SUBNET: bridgeSubnet, SATD_TLS_HOSTNAME: 'satd.startos', SATD_MCP_ALLOWED_HOSTS: mcpHostnames, SATD_P2P_PORT: String(p2pPorts[network]), diff --git a/startos/manifest/index.ts b/startos/manifest/index.ts index f6acf87..14ccbd7 100644 --- a/startos/manifest/index.ts +++ b/startos/manifest/index.ts @@ -13,9 +13,8 @@ export const manifest = setupManifest({ volumes: ['main'], images: { satd: { - source: { dockerTag: 'ghcr.io/epochbtc/satd:0.5.2' }, + source: { dockerTag: 'ghcr.io/epochbtc/satd:0.6.1' }, arch: ['x86_64', 'aarch64'], }, }, - dependencies: {}, }) diff --git a/startos/utils.ts b/startos/utils.ts index caa5862..f36d186 100644 --- a/startos/utils.ts +++ b/startos/utils.ts @@ -26,10 +26,6 @@ export const esploraInterfaceId = 'esplora' export const mcpInterfaceId = 'mcp' export const peerInterfaceId = 'peer' -// lxcbr0: satd-init renders it as rpcallowip, and the OS reverse proxy and -// every other package arrive from it. -export const bridgeSubnet = '10.0.3.0/24' - export const rpcUsername = 'satd' export const satdMounts = sdk.Mounts.of().mountVolume({ diff --git a/startos/versions/current.ts b/startos/versions/current.ts index d4a4529..01a47b1 100644 --- a/startos/versions/current.ts +++ b/startos/versions/current.ts @@ -34,13 +34,18 @@ const fromCore = { } export const current = VersionInfo.of({ - version: '#satd:0.5.2:0', + version: '#satd:0.6.1:0', releaseNotes: { - en_US: 'Initial release for StartOS', - es_ES: 'Lanzamiento inicial para StartOS', - de_DE: 'Erstveröffentlichung für StartOS', - pl_PL: 'Pierwsze wydanie dla StartOS', - fr_FR: 'Version initiale pour StartOS', + en_US: + 'Initial release for StartOS, on satd 0.6.1. A switch from Bitcoin Core or Knots that is stopped or interrupted now continues from the block files on disk on the next start instead of downloading the rest of the chain, and stopping the service during the rebuild exits cleanly. Updating an existing satd 0.5.x datadir automatically rebuilds its chainstate and indexes from local block files; allow days on mainnet. Full upstream changes: https://github.com/epochbtc/satd/compare/v0.5.2...v0.6.1', + es_ES: + 'Lanzamiento inicial para StartOS, con satd 0.6.1. Un cambio desde Bitcoin Core o Knots que se detiene o se interrumpe ahora continúa en el siguiente arranque a partir de los archivos de bloques en disco, en lugar de descargar el resto de la cadena, y detener el servicio durante la reconstrucción termina limpiamente. Al actualizar un directorio de datos de satd 0.5.x, su estado de cadena e índices se reconstruyen automáticamente a partir de los archivos de bloques locales; en la red principal puede tardar días. Todos los cambios de upstream: https://github.com/epochbtc/satd/compare/v0.5.2...v0.6.1', + de_DE: + 'Erstveröffentlichung für StartOS, mit satd 0.6.1. Ein Wechsel von Bitcoin Core oder Knots, der gestoppt oder unterbrochen wird, setzt beim nächsten Start mit den Blockdateien auf der Festplatte fort, statt den Rest der Blockchain herunterzuladen, und das Stoppen des Dienstes während des Neuaufbaus beendet ihn sauber. Beim Update eines vorhandenen satd-0.5.x-Datenverzeichnisses werden Chainstate und Indizes automatisch aus den lokalen Blockdateien neu aufgebaut; im Mainnet dauert dies unter Umständen Tage. Alle Upstream-Änderungen: https://github.com/epochbtc/satd/compare/v0.5.2...v0.6.1', + pl_PL: + 'Pierwsze wydanie dla StartOS, z satd 0.6.1. Przejście z Bitcoin Core lub Knots, które zostanie zatrzymane lub przerwane, przy następnym uruchomieniu jest kontynuowane z plików bloków na dysku zamiast pobierać resztę łańcucha, a zatrzymanie usługi podczas odbudowy kończy ją poprawnie. Aktualizacja istniejącego katalogu danych satd 0.5.x automatycznie odbudowuje stan łańcucha i indeksy z lokalnych plików bloków; w sieci głównej może to potrwać kilka dni. Wszystkie zmiany upstream: https://github.com/epochbtc/satd/compare/v0.5.2...v0.6.1', + fr_FR: + "Version initiale pour StartOS, avec satd 0.6.1. Un passage depuis Bitcoin Core ou Knots arrêté ou interrompu reprend désormais au démarrage suivant à partir des fichiers de blocs sur le disque au lieu de télécharger le reste de la chaîne, et l'arrêt du service pendant la reconstruction se termine proprement. La mise à jour d'un répertoire de données satd 0.5.x existant reconstruit automatiquement son état de chaîne et ses index à partir des fichiers de blocs locaux ; prévoir plusieurs jours sur le réseau principal. Tous les changements en amont : https://github.com/epochbtc/satd/compare/v0.5.2...v0.6.1", }, migrations: { up: async ({ effects }) => {}, diff --git a/test/upstream/SOURCE b/test/upstream/SOURCE index 42e88fc..cc09866 100644 --- a/test/upstream/SOURCE +++ b/test/upstream/SOURCE @@ -1 +1 @@ -Vendored from epochbtc/satd v0.5.2-5-g37b4ffb8 (37b4ffb8205a381fd212875f0c6772f8ff64779d) by contrib/packaging/sync-store.sh. +Vendored from epochbtc/satd v0.6.1 (fef5294efef0785e6f32d4e034a9d3db69f1ee06). diff --git a/test/upstream/satd-init b/test/upstream/satd-init index 63953b3..3184cea 100755 --- a/test/upstream/satd-init +++ b/test/upstream/satd-init @@ -26,13 +26,19 @@ TEMPLATE="${SATD_CONF_TEMPLATE:-/etc/satd/satd.conf.tmpl}" MKCA="${SATD_MKCA:-/usr/local/bin/satd-mkca}" NETWORK="${NETWORK:-signet}" -SUBNET="${SATD_STACK_SUBNET:-10.77.0.0/24}" TLS_HOSTNAME="${SATD_TLS_HOSTNAME:-$(hostname)}" MCP_ENABLED="${SATD_MCP:-0}" # Further names to put in MCP's Host allowlist, comma-separated. The names # derived below cover the install's own hostname; this is for a reverse proxy # or a DNS alias in front of it, which satd-init cannot know about. MCP_EXTRA_HOSTS="${SATD_MCP_ALLOWED_HOSTS:-}" +# The status page on the metrics listener. Off in the plain stack, on in the +# appliance and the app-store packages. SATD_STATUS_ADVERTISE is the +# connection strings it shows, whitespace-separated `surface=url` values; see +# satd's `statusadvertise`. +STATUS_PAGE="${SATD_STATUSPAGE:-0}" +STATUS_ADVERTISE="${SATD_STATUS_ADVERTISE:-}" +SATD_BIN="${SATD_BIN:-satd}" # Fixed inside the stack, on every network. Publishing and client # configuration therefore do not change when the network does; only the P2P @@ -45,6 +51,7 @@ ELECTRUM_TLS_PORT=50002 ESPLORA_PORT=3000 ESPLORA_TLS_PORT=3001 METRICS_PORT=9332 +METRICS_TLS_PORT=9336 ZMQ_PORT=28332 MCP_PORT=8339 @@ -99,7 +106,6 @@ render() { -e "s|@ESPLORA_TLS_PORT@|$ESPLORA_TLS_PORT|g" \ -e "s|@METRICS_PORT@|$METRICS_PORT|g" \ -e "s|@ZMQ_PORT@|$ZMQ_PORT|g" \ - -e "s|@SUBNET@|$SUBNET|g" \ -e "s|@TLS_DIR@|$TLS_DIR|g" \ "$TEMPLATE" } @@ -189,6 +195,61 @@ MCPCONF done fi +# The status page. Only for a satd that has it: satd refuses a config key it +# does not know, so writing `statuspage=1` for an older binary would stop the +# node from starting, and satd-init can run beside a satd that is not the one +# it shipped with (the appliance installs a released binary next to this +# script). An older satd gets no page, and says so here. +if [[ "$STATUS_PAGE" == "1" ]]; then + if "$SATD_BIN" --help 2>/dev/null | grep -q -- '--statuspage'; then + { + printf '\n# --- status page ------------------------------------------------------------\n' + printf '# /status on the metrics listener above. Unauthenticated, like /metrics, and\n' + printf '# built to carry nothing secret.\n' + printf 'statuspage=1\n' + # An array, not an unquoted expansion: a URL may carry `?` or + # `*`, which the shell would glob. + read -r -a advertise <<< "$STATUS_ADVERTISE" + for a in ${advertise[@]+"${advertise[@]}"}; do + printf 'statusadvertise=%s\n' "$a" + done + } >> "$CONF.new" + else + echo "satd-init: SATD_STATUSPAGE=1, but $SATD_BIN has no status page; leaving it off" >&2 + fi +fi + +# The metrics listener over TLS, for the same reason and with the same guard +# as the status page: the keys are new in 0.6.0 and an older satd refuses +# them. On for every satd that has them, like the other TLS listeners in the +# template — this is what makes the status page and /metrics reachable from +# another machine without a proxy in front. +if "$SATD_BIN" --help 2>/dev/null | grep -q -- '--metricstlsbind'; then + { + printf '\n# --- metrics over TLS --------------------------------------------------------\n' + printf 'metricstlsbind=0.0.0.0:%s\n' "$METRICS_TLS_PORT" + printf 'metricstlscert=%s/fullchain.crt\n' "$TLS_DIR" + printf 'metricstlskey=%s/leaf.key\n' "$TLS_DIR" + } >> "$CONF.new" +fi + +# Chainstate upgrades. A release that changes the chainstate format (0.6.0's +# schema 7) would otherwise refuse to start until someone ran +# --reindex-chainstate by hand, which an app-store user has no way to do. +# With this, satd rebuilds the chainstate from the block files it already has +# on the first start after such an update, restarts a rebuild that a power +# cut interrupted, and otherwise does nothing; nothing is downloaded, and the +# status page shows the progress. Guarded like the keys above: an older satd +# refuses a key it does not know. +if "$SATD_BIN" --help 2>/dev/null | grep -q -- '--upgradechainstate'; then + { + printf '\n# --- chainstate upgrades ---------------------------------------------------\n' + printf '# Rebuild the chainstate from the block files when a release changes its\n' + printf '# format, or when a rebuild was interrupted. A no-op otherwise.\n' + printf 'upgradechainstate=1\n' + } >> "$CONF.new" +fi + # Operator additions, appended last so they win where satd takes the last # value. Documented in the README; absent by default. LOCAL_CONF="$DATADIR/conf.d/local.conf"