diff --git a/package-lock.json b/package-lock.json index 5a1f691..a724017 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,292 +9,934 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@akashnetwork/akash-api": "^1.4.0", - "@akashnetwork/akashjs": "^0.11.1", - "@cosmjs/proto-signing": "^0.32.4", - "@cosmjs/stargate": "^0.32.4", + "@akashnetwork/chain-sdk": "^1.0.0-alpha.18", + "@cosmjs/proto-signing": "^0.33.1", + "@cosmjs/stargate": "^0.33.1", "@modelcontextprotocol/sdk": "^1.8.0", "fs": "0.0.1-security", "https": "^1.0.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "path": "^0.12.7", + "ws": "^8.18.3", "zod": "^3.22.4" }, "devDependencies": { "@eslint/js": "^9.23.0", "@types/js-yaml": "^4.0.9", "@types/node": "^22.13.14", + "@types/ws": "^8.18.1", "@typescript-eslint/eslint-plugin": "^8.29.0", "@typescript-eslint/parser": "^8.29.0", + "@vitest/coverage-v8": "^4.0.13", "eslint": "^9.23.0", "eslint-config-prettier": "^10.1.1", "prettier": "^3.5.3", "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "typescript": "^5.8.2", - "typescript-eslint": "^8.29.0" + "typescript-eslint": "^8.29.0", + "vitest": "^4.0.13" + }, + "engines": { + "node": ">=22.0.0" } }, - "node_modules/@akashnetwork/akash-api": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@akashnetwork/akash-api/-/akash-api-1.4.0.tgz", - "integrity": "sha512-xJTHjkSLHQRk2z1s+pk/fSTXQrJCTyzUzWHn+TvvJapjEsDPT0+AW2YhrmYLOpS0n4s/8GnoGB9swRuzgYYLbg==", + "node_modules/@akashnetwork/chain-sdk": { + "version": "1.0.0-alpha.18", + "resolved": "https://registry.npmjs.org/@akashnetwork/chain-sdk/-/chain-sdk-1.0.0-alpha.18.tgz", + "integrity": "sha512-HQEhAUih0Nv8CLtGJOrjsSgqofF+BsoYLixB37kiT7Vf9u3WaCdJ55XzGqfA+9kJ+5eWXkGaEpvLi5SmOdjygw==", + "license": "Apache-2.0", "dependencies": { - "rxjs": "^7.8.1" - }, - "peerDependencies": { - "@grpc/grpc-js": "^1.10.6" - } - }, - "node_modules/@akashnetwork/akashjs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@akashnetwork/akashjs/-/akashjs-0.11.1.tgz", - "integrity": "sha512-0fQwcOuQgwGq81jVJzgkReX3dToCwO2WNWoHBGPGjEEg1ellxmzq9eT7eUAMSJT+KbZTcJgE5rJkijLsznw23w==", - "dependencies": { - "@akashnetwork/akash-api": "^1.4.0", - "@cosmjs/amino": "^0.32.4", - "@cosmjs/launchpad": "^0.27.0", - "@cosmjs/proto-signing": "^0.32.4", - "@cosmjs/stargate": "^0.32.4", - "@cosmjs/tendermint-rpc": "^0.32.4", - "asn1js": "^2.1.1", - "atob": "^2.1.2", - "axios": "^1.8.3", - "console-browserify": "^1.2.0", - "dotenv": "^16.4.7", + "@bufbuild/protobuf": "^2.2.3", + "@connectrpc/connect": "^2.0.1", + "@connectrpc/connect-node": "^2.0.1", + "@cosmjs/amino": "~0.36.1", + "@cosmjs/math": "~0.36.1", + "@cosmjs/proto-signing": "~0.36.1", + "@cosmjs/stargate": "~0.36.1", + "base64-js": "^1.5.1", "js-yaml": "^4.1.0", - "json-stable-stringify": "^1.0.2", + "json-stable-stringify": "^1.3.0", "jsrsasign": "^11.1.0", - "keytar": "^7.7.0", - "lodash": "^4.17.21", - "node-fetch": "2", - "pkijs": "^3.0.0", - "process": "^0.11.10", - "pvutils": "^1.0.17", - "simple-jsonrpc-js": "^1.2.0", - "sort-json": "^2.0.1" + "long": "^5.3.2" + }, + "engines": { + "node": "22.14.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/amino": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.36.2.tgz", + "integrity": "sha512-r4yV1bhl412gwHGlyaUaJHIJnmldtyGsAwyz3oHHVxduiECj06Rv6wqeyLZfQa9W6hU+MlZwy7LabSUkkyGwjA==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/crypto": "^0.36.2", + "@cosmjs/encoding": "^0.36.2", + "@cosmjs/math": "^0.36.2", + "@cosmjs/utils": "^0.36.2" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/crypto": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.36.2.tgz", + "integrity": "sha512-QL4NHtcqR6DEKIN200aLeR8gKO433K0f5avKV0TVFP/g12UtnEGSk79PJq5Gv1PLc9GtATHgLLQI/3D8TEe+ig==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/encoding": "^0.36.2", + "@cosmjs/math": "^0.36.2", + "@cosmjs/utils": "^0.36.2", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.2", + "@noble/hashes": "^1.8.0", + "hash-wasm": "^4.12.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/encoding": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.36.2.tgz", + "integrity": "sha512-i3+P1EKYoLcONAsmpJPhDAc3Wh3ajZNRHt/hczi/JEQXmleTJLVzv2mXUyllM6Qa+B6ybbr3Z2lnEFa8L3yLqg==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/json-rpc": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.36.2.tgz", + "integrity": "sha512-3IRamylHVCxBevXGlnIoWUdJCLsP5LwHbXYUsBnC9T8UttZ5oYRN5gDf6+2dQEPk+p9xOv2i8xrCwNWxo7675Q==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/stream": "^0.36.2", + "xstream": "^11.14.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/math": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.36.2.tgz", + "integrity": "sha512-uJZRzxqnBk3MgxFgeyUwLgUzWkAIcmznWSB/tgGCjGCnUNebzI+44dA3ncEDCMqQysi/MZ+cSwAcDU7IY2PFeA==", + "license": "Apache-2.0" + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/proto-signing": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.36.2.tgz", + "integrity": "sha512-dyZsgZBQgGkaE4cazHVX8GDwrRJVKUVDnrODkyFXVNbxMnm4t6nxpK1qwgY9GHlWUhck3Dh9NT3BoMbXiMYTZQ==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/amino": "^0.36.2", + "@cosmjs/crypto": "^0.36.2", + "@cosmjs/encoding": "^0.36.2", + "@cosmjs/math": "^0.36.2", + "@cosmjs/utils": "^0.36.2", + "cosmjs-types": "^0.10.1" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/socket": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.36.2.tgz", + "integrity": "sha512-Pb7JcTFWnq6yfY0IEejHrpSxNDJYcqjjAa1D29a6b/obk4qa4o3oIV5bIx6zAbdRq8uLoBfvWs0bHTNnVuBWJg==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/stream": "^0.36.2", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/stargate": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.36.2.tgz", + "integrity": "sha512-vnNK4dXF+s2v1aKPfYxKVrvXPcnBQb8rPoBScnTpPWnRt3XXbLw7Oo6fTQQWwKYNKQzi6DOApeEB+bCYcaPAAw==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/amino": "^0.36.2", + "@cosmjs/encoding": "^0.36.2", + "@cosmjs/math": "^0.36.2", + "@cosmjs/proto-signing": "^0.36.2", + "@cosmjs/stream": "^0.36.2", + "@cosmjs/tendermint-rpc": "^0.36.2", + "@cosmjs/utils": "^0.36.2", + "cosmjs-types": "^0.10.1" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/stream": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.36.2.tgz", + "integrity": "sha512-FlZx2Buovem837LdTLPkPFcxzuQ7zierAqSXwMPr/MG3k+qMxHNfLFTTCXMNWQ4ZlbYedud8ZqCL3/HKdS5mig==", + "license": "Apache-2.0", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.36.2.tgz", + "integrity": "sha512-76Z99C1NVf/Yv/1bWU0wul8MhRwVdqiZxqU5bcHqvJLoQ2nKUfGpSSYRdbMHfZ63J8ryRqQ95uPvPTfrBb+agw==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/crypto": "^0.36.2", + "@cosmjs/encoding": "^0.36.2", + "@cosmjs/json-rpc": "^0.36.2", + "@cosmjs/math": "^0.36.2", + "@cosmjs/socket": "^0.36.2", + "@cosmjs/stream": "^0.36.2", + "@cosmjs/utils": "^0.36.2", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/@cosmjs/utils": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.36.2.tgz", + "integrity": "sha512-OOr2HU/Ph+/GI1Fx2UCf3LOyX9YTCP51d2HitTOjjEJRYnkfKXP3lMBl1FZo5QaFWxnfuBc+Cj+cSoiQUJRyzQ==", + "license": "Apache-2.0" + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/cosmjs-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.10.1.tgz", + "integrity": "sha512-CENXb4O5GN+VyB68HYXFT2SOhv126Z59631rZC56m8uMWa6/cSlFeai8BwZGT1NMepw0Ecf+U8XSOnBzZUWh9Q==", + "license": "Apache-2.0" + }, + "node_modules/@akashnetwork/chain-sdk/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">18.0.0" + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.1.tgz", + "integrity": "sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@connectrpc/connect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.1.1.tgz", + "integrity": "sha512-JzhkaTvM73m2K1URT6tv53k2RwngSmCXLZJgK580qNQOXRzZRR/BCMfZw3h+90JpnG6XksP5bYT+cz0rpUzUWQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@bufbuild/protobuf": "^2.7.0" + } + }, + "node_modules/@connectrpc/connect-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@connectrpc/connect-node/-/connect-node-2.1.1.tgz", + "integrity": "sha512-s3TfsI1XF+n+1z6MBS9rTnFsxxR4Rw5wmdEnkQINli81ESGxcsfaEet8duzq8LVuuCupmhUsgpRo0Nv9pZkufg==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@bufbuild/protobuf": "^2.7.0", + "@connectrpc/connect": "2.1.1" + } + }, + "node_modules/@cosmjs/proto-signing": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.33.1.tgz", + "integrity": "sha512-Sv4W+MxX+0LVnd+2rU4Fw1HRsmMwSVSYULj7pRkij3wnPwUlTVoJjmKFgKz13ooIlfzPrz/dnNjGp/xnmXChFQ==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/amino": "^0.33.1", + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "cosmjs-types": "^0.9.0" } }, - "node_modules/@confio/ics23": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", - "integrity": "sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==", - "deprecated": "Unmaintained. The codebase for this package was moved to https://github.com/cosmos/ics23 but then the JS implementation was removed in https://github.com/cosmos/ics23/pull/353. Please consult the maintainers of https://github.com/cosmos for further assistance.", + "node_modules/@cosmjs/proto-signing/node_modules/@cosmjs/amino": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.33.1.tgz", + "integrity": "sha512-WfWiBf2EbIWpwKG9AOcsIIkR717SY+JdlXM/SL/bI66BdrhniAF+/ZNis9Vo9HF6lP2UU5XrSmFA4snAvEgdrg==", + "license": "Apache-2.0", "dependencies": { - "@noble/hashes": "^1.0.0", - "protobufjs": "^6.8.8" + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1" } }, - "node_modules/@cosmjs/amino": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.4.tgz", - "integrity": "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==", + "node_modules/@cosmjs/proto-signing/node_modules/@cosmjs/crypto": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.33.1.tgz", + "integrity": "sha512-U4kGIj/SNBzlb2FGgA0sMR0MapVgJUg8N+oIAiN5+vl4GZ3aefmoL1RDyTrFS/7HrB+M+MtHsxC0tvEu4ic/zA==", + "deprecated": "This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk.", + "license": "Apache-2.0", "dependencies": { - "@cosmjs/crypto": "^0.32.4", - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/utils": "^0.32.4" + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.6.1", + "libsodium-wrappers-sumo": "^0.7.11" } }, - "node_modules/@cosmjs/crypto": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.4.tgz", - "integrity": "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==", + "node_modules/@cosmjs/proto-signing/node_modules/@cosmjs/encoding": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.33.1.tgz", + "integrity": "sha512-nuNxf29fUcQE14+1p//VVQDwd1iau5lhaW/7uMz7V2AH3GJbFJoJVaKvVyZvdFk+Cnu+s3wCqgq4gJkhRCJfKw==", + "license": "Apache-2.0", "dependencies": { - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/utils": "^0.32.4", + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@cosmjs/proto-signing/node_modules/@cosmjs/math": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.33.1.tgz", + "integrity": "sha512-ytGkWdKFCPiiBU5eqjHNd59djPpIsOjbr2CkNjlnI1Zmdj+HDkSoD9MUGpz9/RJvRir5IvsXqdE05x8EtoQkJA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@cosmjs/proto-signing/node_modules/@cosmjs/utils": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.33.1.tgz", + "integrity": "sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==", + "license": "Apache-2.0" + }, + "node_modules/@cosmjs/stargate": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.33.1.tgz", + "integrity": "sha512-CnJ1zpSiaZgkvhk+9aTp5IPmgWn2uo+cNEBN8VuD9sD6BA0V4DMjqe251cNFLiMhkGtiE5I/WXFERbLPww3k8g==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/amino": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/proto-signing": "^0.33.1", + "@cosmjs/stream": "^0.33.1", + "@cosmjs/tendermint-rpc": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "cosmjs-types": "^0.9.0" + } + }, + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/amino": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.33.1.tgz", + "integrity": "sha512-WfWiBf2EbIWpwKG9AOcsIIkR717SY+JdlXM/SL/bI66BdrhniAF+/ZNis9Vo9HF6lP2UU5XrSmFA4snAvEgdrg==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1" + } + }, + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/crypto": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.33.1.tgz", + "integrity": "sha512-U4kGIj/SNBzlb2FGgA0sMR0MapVgJUg8N+oIAiN5+vl4GZ3aefmoL1RDyTrFS/7HrB+M+MtHsxC0tvEu4ic/zA==", + "deprecated": "This uses elliptic for cryptographic operations, which contains several security-relevant bugs. To what degree this affects your application is something you need to carefully investigate. See https://github.com/cosmos/cosmjs/issues/1708 for further pointers. Starting with version 0.34.0 the cryptographic library has been replaced. However, private keys might still be at risk.", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/utils": "^0.33.1", "@noble/hashes": "^1", "bn.js": "^5.2.0", - "elliptic": "^6.5.4", + "elliptic": "^6.6.1", "libsodium-wrappers-sumo": "^0.7.11" } }, - "node_modules/@cosmjs/encoding": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.4.tgz", - "integrity": "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==", + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/encoding": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.33.1.tgz", + "integrity": "sha512-nuNxf29fUcQE14+1p//VVQDwd1iau5lhaW/7uMz7V2AH3GJbFJoJVaKvVyZvdFk+Cnu+s3wCqgq4gJkhRCJfKw==", + "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, - "node_modules/@cosmjs/json-rpc": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.4.tgz", - "integrity": "sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==", + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/json-rpc": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.33.1.tgz", + "integrity": "sha512-T6VtWzecpmuTuMRGZWuBYHsMF/aznWCYUt/cGMWNSz7DBPipVd0w774PKpxXzpEbyt5sr61NiuLXc+Az15S/Cw==", + "license": "Apache-2.0", "dependencies": { - "@cosmjs/stream": "^0.32.4", + "@cosmjs/stream": "^0.33.1", "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/launchpad": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.27.1.tgz", - "integrity": "sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==", - "dependencies": { - "@cosmjs/amino": "0.27.1", - "@cosmjs/crypto": "0.27.1", - "@cosmjs/encoding": "0.27.1", - "@cosmjs/math": "0.27.1", - "@cosmjs/utils": "0.27.1", - "axios": "^0.21.2", - "fast-deep-equal": "^3.1.3" + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/math": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.33.1.tgz", + "integrity": "sha512-ytGkWdKFCPiiBU5eqjHNd59djPpIsOjbr2CkNjlnI1Zmdj+HDkSoD9MUGpz9/RJvRir5IvsXqdE05x8EtoQkJA==", + "license": "Apache-2.0", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/socket": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.33.1.tgz", + "integrity": "sha512-KzAeorten6Vn20sMiM6NNWfgc7jbyVo4Zmxev1FXa5EaoLCZy48cmT3hJxUJQvJP/lAy8wPGEjZ/u4rmF11x9A==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/stream": "^0.33.1", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/stream": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.33.1.tgz", + "integrity": "sha512-bMUvEENjeQPSTx+YRzVsWT1uFIdHRcf4brsc14SOoRQ/j5rOJM/aHfsf/BmdSAnYbdOQ3CMKj/8nGAQ7xUdn7w==", + "license": "Apache-2.0", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.33.1.tgz", + "integrity": "sha512-22klDFq2MWnf//C8+rZ5/dYatr6jeGT+BmVbutXYfAK9fmODbtFcumyvB6uWaEORWfNukl8YK1OLuaWezoQvxA==", + "license": "Apache-2.0", + "dependencies": { + "@cosmjs/crypto": "^0.33.1", + "@cosmjs/encoding": "^0.33.1", + "@cosmjs/json-rpc": "^0.33.1", + "@cosmjs/math": "^0.33.1", + "@cosmjs/socket": "^0.33.1", + "@cosmjs/stream": "^0.33.1", + "@cosmjs/utils": "^0.33.1", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/stargate/node_modules/@cosmjs/utils": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.33.1.tgz", + "integrity": "sha512-UnLHDY6KMmC+UXf3Ufyh+onE19xzEXjT4VZ504Acmk4PXxqyvG4cCPprlKUFnGUX7f0z8Or9MAOHXBx41uHBcg==", + "license": "Apache-2.0" + }, + "node_modules/@cosmjs/stargate/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/launchpad/node_modules/@cosmjs/amino": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.27.1.tgz", - "integrity": "sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA==", - "dependencies": { - "@cosmjs/crypto": "0.27.1", - "@cosmjs/encoding": "0.27.1", - "@cosmjs/math": "0.27.1", - "@cosmjs/utils": "0.27.1" + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/launchpad/node_modules/@cosmjs/crypto": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.27.1.tgz", - "integrity": "sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==", - "dependencies": { - "@cosmjs/encoding": "0.27.1", - "@cosmjs/math": "0.27.1", - "@cosmjs/utils": "0.27.1", - "bip39": "^3.0.2", - "bn.js": "^5.2.0", - "elliptic": "^6.5.3", - "js-sha3": "^0.8.0", - "libsodium-wrappers": "^0.7.6", - "ripemd160": "^2.0.2", - "sha.js": "^2.4.11" + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/launchpad/node_modules/@cosmjs/encoding": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.27.1.tgz", - "integrity": "sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/launchpad/node_modules/@cosmjs/math": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.27.1.tgz", - "integrity": "sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ==", - "dependencies": { - "bn.js": "^5.2.0" + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/launchpad/node_modules/@cosmjs/utils": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.27.1.tgz", - "integrity": "sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==" - }, - "node_modules/@cosmjs/launchpad/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/math": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.4.tgz", - "integrity": "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==", - "dependencies": { - "bn.js": "^5.2.0" + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/proto-signing": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz", - "integrity": "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==", - "dependencies": { - "@cosmjs/amino": "^0.32.4", - "@cosmjs/crypto": "^0.32.4", - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/utils": "^0.32.4", - "cosmjs-types": "^0.9.0" + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/socket": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.4.tgz", - "integrity": "sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==", - "dependencies": { - "@cosmjs/stream": "^0.32.4", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/stargate": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.4.tgz", - "integrity": "sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.4", - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/proto-signing": "^0.32.4", - "@cosmjs/stream": "^0.32.4", - "@cosmjs/tendermint-rpc": "^0.32.4", - "@cosmjs/utils": "^0.32.4", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/stream": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.4.tgz", - "integrity": "sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==", - "dependencies": { - "xstream": "^11.14.0" + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.4.tgz", - "integrity": "sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==", - "dependencies": { - "@cosmjs/crypto": "^0.32.4", - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/json-rpc": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/socket": "^0.32.4", - "@cosmjs/stream": "^0.32.4", - "@cosmjs/utils": "^0.32.4", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@cosmjs/utils": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.4.tgz", - "integrity": "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -460,72 +1102,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz", - "integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==", - "peer": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "peer": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader/node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -597,9 +1173,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -612,95 +1188,58 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", - "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.8.0.tgz", + "integrity": "sha512-e06W7SwrontJDHwCawNO5SGxG+nU9AAx+jpHHZqGl/WrDBdWOpvirC+s58VpJTB5QemI4jTRcjWT4Pt3Q1NPQQ==", "dependencies": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "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://github.com/sponsors/colinhacks" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "peerDependencies": { - "zod": "^3.25 || ^4" + "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "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" }, @@ -743,59 +1282,297 @@ "node": ">= 8" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true }, "node_modules/@tsconfig/node10": { "version": "1.0.11", @@ -821,10 +1598,26 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true + }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "node_modules/@types/js-yaml": { @@ -839,15 +1632,11 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/node": { "version": "22.13.16", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.16.tgz", "integrity": "sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==", + "dev": true, "dependencies": { "undici-types": "~6.20.0" } @@ -864,6 +1653,16 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.29.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", @@ -1048,6 +1847,141 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@vitest/coverage-v8": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.13.tgz", + "integrity": "sha512-w77N6bmtJ3CFnL/YHiYotwW/JI3oDlR3K38WEIqegRfdMSScaYxwYKB/0jSNpOTZzUjQkG8HHEz4sdWQMWpQ5g==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.0.13", + "ast-v8-to-istanbul": "^0.3.8", + "debug": "^4.4.3", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.1", + "std-env": "^3.10.0", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.0.13", + "vitest": "4.0.13" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.13.tgz", + "integrity": "sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==", + "dev": true, + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.13", + "@vitest/utils": "4.0.13", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.13.tgz", + "integrity": "sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==", + "dev": true, + "dependencies": { + "@vitest/spy": "4.0.13", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.13.tgz", + "integrity": "sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==", + "dev": true, + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.13.tgz", + "integrity": "sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==", + "dev": true, + "dependencies": { + "@vitest/utils": "4.0.13", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.13.tgz", + "integrity": "sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "4.0.13", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.13.tgz", + "integrity": "sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==", + "dev": true, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.13.tgz", + "integrity": "sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "4.0.13", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -1109,55 +2043,11 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1192,54 +2082,48 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/asn1js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.4.0.tgz", - "integrity": "sha512-PvZC0FMyMut8aOnR2jAEGSkmRtHIUYPe9amUEnGjr9TdnUmsfoOkjrvUkOEU9mzpYBR1HyO9bF+8U1cLTMMHhQ==", - "dependencies": { - "pvutils": "^1.1.3" - }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", + "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/ast-v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -1285,56 +2169,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", - "dependencies": { - "@noble/hashes": "^1.2.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.3", + "debug": "^4.4.0", "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", + "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, "engines": { "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" @@ -1357,29 +2219,6 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1394,14 +2233,6 @@ "node": ">= 0.8" } }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -1455,6 +2286,15 @@ "node": ">=6" } }, + "node_modules/chai": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", + "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1507,29 +2347,11 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1540,7 +2362,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1559,21 +2382,15 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "engines": { - "node": ">=18" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dependencies": { + "safe-buffer": "5.2.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": ">= 0.6" } }, "node_modules/content-type": { @@ -1652,28 +2469,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1728,50 +2523,15 @@ "node": ">= 0.8" } }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" } }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1818,12 +2578,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "peer": true - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1832,14 +2586,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1856,6 +2602,12 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -1881,13 +2633,45 @@ "node": ">= 0.4" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "peer": true, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escape-html": { @@ -2103,6 +2887,15 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2139,27 +2932,27 @@ "node": ">=18.0.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=12.0.0" } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", + "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", - "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", @@ -2190,12 +2983,9 @@ } }, "node_modules/express-rate-limit": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", - "dependencies": { - "ip-address": "10.0.1" - }, + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "engines": { "node": ">= 16" }, @@ -2203,13 +2993,14 @@ "url": "https://github.com/sponsors/express-rate-limit" }, "peerDependencies": { - "express": ">= 4.11" + "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.3", @@ -2251,21 +3042,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -2300,9 +3076,9 @@ } }, "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -2312,11 +3088,7 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.8" } }, "node_modules/find-up": { @@ -2355,9 +3127,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -2373,24 +3145,10 @@ } } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2442,11 +3200,6 @@ "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2475,15 +3228,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2519,11 +3263,6 @@ "node": ">= 0.4" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2668,18 +3407,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/hash-wasm": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.12.0.tgz", + "integrity": "sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ==", + "license": "MIT" }, "node_modules/hash.js": { "version": "1.1.7", @@ -2711,31 +3443,25 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hono": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz", - "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==", - "engines": { - "node": ">=16.9.0" - } + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/https": { @@ -2744,39 +3470,16 @@ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2827,19 +3530,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "engines": { - "node": ">= 12" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2860,17 +3550,6 @@ "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -2895,15 +3574,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2930,20 +3600,6 @@ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -2962,23 +3618,76 @@ "ws": "*" } }, - "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", - "funding": { - "url": "https://github.com/sponsors/panva" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -2998,18 +3707,14 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==" - }, "node_modules/json-stable-stringify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz", - "integrity": "sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "isarray": "^2.0.5", "jsonify": "^0.0.1", "object-keys": "^1.1.1" @@ -3043,16 +3748,6 @@ "url": "https://github.com/kjur/jsrsasign#donations" } }, - "node_modules/keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3075,24 +3770,11 @@ "node": ">= 0.8.0" } }, - "node_modules/libsodium": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.15.tgz", - "integrity": "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==" - }, "node_modules/libsodium-sumo": { "version": "0.7.15", "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz", "integrity": "sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==" }, - "node_modules/libsodium-wrappers": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz", - "integrity": "sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==", - "dependencies": { - "libsodium": "^0.7.15" - } - }, "node_modules/libsodium-wrappers-sumo": { "version": "0.7.15", "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz", @@ -3107,7 +3789,59 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" }, "engines": { "node": ">=10" @@ -3116,29 +3850,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "peer": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/long": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", - "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", - "peer": true - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -3203,29 +3914,14 @@ } }, "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, "node_modules/minimalistic-assert": { @@ -3257,6 +3953,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3273,20 +3970,28 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, "node_modules/natural-compare": { "version": "1.4.0", @@ -3302,41 +4007,6 @@ "node": ">= 0.6" } }, - "node_modules/node-abi": { - "version": "3.74.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", - "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" - }, - "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==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3501,14 +4171,25 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "engines": { + "node": ">=16" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -3522,73 +4203,39 @@ } }, "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-4.1.0.tgz", + "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", "engines": { "node": ">=16.20.0" } }, - "node_modules/pkijs": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.2.5.tgz", - "integrity": "sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==", - "dependencies": { - "@noble/hashes": "^1.4.0", - "asn1js": "^3.0.5", - "bytestreamjs": "^2.0.0", - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/pkijs/node_modules/asn1js": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", - "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >=14" } }, "node_modules/prelude-ls": { @@ -3623,36 +4270,6 @@ "node": ">= 0.6.0" } }, - "node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -3670,15 +4287,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3688,26 +4296,10 @@ "node": ">=6" } }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dependencies": { "side-channel": "^1.1.0" }, @@ -3747,52 +4339,17 @@ } }, "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, "node_modules/readdirp": { @@ -3812,23 +4369,6 @@ "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -3881,13 +4421,45 @@ "rimraf": "bin.js" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" } }, "node_modules/router": { @@ -3928,14 +4500,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3964,6 +4528,7 @@ "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -3972,34 +4537,30 @@ } }, "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dependencies": { - "debug": "^4.4.3", + "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.2" + "statuses": "^2.0.1" }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -4008,10 +4569,6 @@ }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/set-function-length": { @@ -4035,25 +4592,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4113,95 +4651,40 @@ "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-jsonrpc-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/simple-jsonrpc-js/-/simple-jsonrpc-js-1.2.0.tgz", - "integrity": "sha512-owkAmh7fjSYBUZVestTPCZMKYQvNiDejqZ/iGfVaKs1nrC1ZBDA3qGraf94+JNFJmu536Tb8oPe8PSPuq7GO6Q==" - }, - "node_modules/sort-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sort-json/-/sort-json-2.0.1.tgz", - "integrity": "sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { - "detect-indent": "^5.0.0", - "detect-newline": "^2.1.0", - "minimist": "^1.2.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, - "bin": { - "sort-json": "app/cmd.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4211,6 +4694,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -4221,47 +4713,25 @@ "source-map": "^0.6.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true }, "node_modules/strip-bom": { "version": "3.0.0", @@ -4316,43 +4786,70 @@ "node": ">=0.10" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=6" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" } }, "node_modules/to-regex-range": { @@ -4375,11 +4872,6 @@ "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -4499,22 +4991,6 @@ "node": ">=0.10.0" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4540,19 +5016,6 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", @@ -4591,7 +5054,8 @@ "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true }, "node_modules/unpipe": { "version": "1.0.0", @@ -4618,11 +5082,6 @@ "inherits": "2.0.3" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/util/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -4642,18 +5101,200 @@ "node": ">= 0.8" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "node_modules/vite": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.4.tgz", + "integrity": "sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.13.tgz", + "integrity": "sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==", + "dev": true, "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "@vitest/expect": "4.0.13", + "@vitest/mocker": "4.0.13", + "@vitest/pretty-format": "4.0.13", + "@vitest/runner": "4.0.13", + "@vitest/snapshot": "4.0.13", + "@vitest/spy": "4.0.13", + "@vitest/utils": "4.0.13", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/debug": "^4.1.12", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.13", + "@vitest/browser-preview": "4.0.13", + "@vitest/browser-webdriverio": "4.0.13", + "@vitest/ui": "4.0.13", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/which": { @@ -4670,24 +5311,20 @@ "node": ">= 8" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "siginfo": "^2.0.0", + "stackback": "0.0.2" }, - "engines": { - "node": ">= 0.4" + "bin": { + "why-is-node-running": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, "node_modules/word-wrap": { @@ -4699,38 +5336,22 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -4759,42 +5380,6 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -4823,6 +5408,14 @@ "funding": { "url": "https://github.com/sponsors/colinhacks" } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/package.json b/package.json index 0fcfc2b..27e3ce5 100644 --- a/package.json +++ b/package.json @@ -10,35 +10,44 @@ "dev:watch": "tsc --watch", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", - "format": "prettier --write \"**/*.{ts,js,json,md}\"" + "format": "prettier --write \"**/*.{ts,js,json,md}\"", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage" }, "author": "Overclock Labs, Inc.", "license": "Apache-2.0", + "engines": { + "node": ">=22.0.0" + }, "dependencies": { - "@akashnetwork/akash-api": "^1.4.0", - "@akashnetwork/akashjs": "^0.11.1", - "@cosmjs/proto-signing": "^0.32.4", - "@cosmjs/stargate": "^0.32.4", + "@akashnetwork/chain-sdk": "^1.0.0-alpha.18", + "@cosmjs/proto-signing": "^0.33.1", + "@cosmjs/stargate": "^0.33.1", "@modelcontextprotocol/sdk": "^1.8.0", "fs": "0.0.1-security", "https": "^1.0.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", "path": "^0.12.7", + "ws": "^8.18.3", "zod": "^3.22.4" }, "devDependencies": { "@eslint/js": "^9.23.0", "@types/js-yaml": "^4.0.9", "@types/node": "^22.13.14", + "@types/ws": "^8.18.1", "@typescript-eslint/eslint-plugin": "^8.29.0", "@typescript-eslint/parser": "^8.29.0", + "@vitest/coverage-v8": "^4.0.13", "eslint": "^9.23.0", "eslint-config-prettier": "^10.1.1", "prettier": "^3.5.3", "ts-node": "^10.9.2", "ts-node-dev": "^2.0.0", "typescript": "^5.8.2", - "typescript-eslint": "^8.29.0" + "typescript-eslint": "^8.29.0", + "vitest": "^4.0.13" } } diff --git a/src/AkashMCP.ts b/src/AkashMCP.ts index 057fb7c..9c42ea9 100644 --- a/src/AkashMCP.ts +++ b/src/AkashMCP.ts @@ -1,6 +1,6 @@ import type { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; -import type { SigningStargateClient } from '@cosmjs/stargate'; -import { loadWalletAndClient, loadCertificate } from './utils/index.js'; +import type { CertificatePem } from '@akashnetwork/chain-sdk'; +import { loadWalletAndClient, loadCertificate, loadCertificateFromDisk } from './utils/index.js'; import { SERVER_CONFIG } from './config.js'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { @@ -17,14 +17,19 @@ import { GetBalancesTool, CloseDeploymentTool, GetDeploymentTool, + RevokeCertificateTool, + RevokeAllCertificatesTool, + RegenerateCertificateTool, + GetLogsTool, + ExecCommandTool, } from './tools/index.js'; -import type { ToolContext } from './types/index.js'; -import type { CertificatePem } from '@akashnetwork/akashjs/build/certificates/certificate-manager/CertificateManager.js'; +import type { ToolContext, ChainNodeSDK, StargateTxClient } from './types/index.js'; class AkashMCP extends McpServer { private wallet: DirectSecp256k1HdWallet | null = null; - private client: SigningStargateClient | null = null; + private client: StargateTxClient | null = null; private certificate: CertificatePem | null = null; + private chainSDK: ChainNodeSDK | null = null; constructor() { super({ @@ -33,18 +38,41 @@ class AkashMCP extends McpServer { }); } - private getToolContext(): ToolContext { + private async getToolContext(): Promise { if (!this.isInitialized()) { throw new Error('MCP server not initialized'); } + + // Always read certificate fresh from disk to ensure we have the latest + const accounts = await this.wallet!.getAccounts(); + const freshCert = loadCertificateFromDisk(accounts[0].address); + if (freshCert) { + this.certificate = freshCert; + } else if (!this.certificate) { + throw new Error( + 'No certificate available. The on-disk certificate is missing and no in-memory ' + + 'certificate exists. Run regenerate-certificate to create a new one.' + ); + } + return { client: this.client!, wallet: this.wallet!, certificate: this.certificate!, + chainSDK: this.chainSDK!, + reloadCertificate: this.reloadCertificate.bind(this), }; } - public getClient(): SigningStargateClient { + public async reloadCertificate(): Promise { + if (!this.wallet || !this.client || !this.chainSDK) { + throw new Error('Cannot reload certificate: server not initialized'); + } + this.certificate = await loadCertificate(this.wallet, this.chainSDK); + return this.certificate; + } + + public getClient(): StargateTxClient { if (!this.client) { throw new Error('Client not initialized'); } @@ -53,10 +81,11 @@ class AkashMCP extends McpServer { public async initialize() { try { - const { wallet, client } = await loadWalletAndClient(); + const { wallet, client, chainSDK } = await loadWalletAndClient(); this.wallet = wallet; this.client = client; - this.certificate = await loadCertificate(wallet, client); + this.chainSDK = chainSDK; + this.certificate = await loadCertificate(wallet, chainSDK); } catch (error) { console.error('Failed to initialize MCP server:', error); throw error; @@ -68,95 +97,131 @@ class AkashMCP extends McpServer { GetAccountAddrTool.name, GetAccountAddrTool.description, GetAccountAddrTool.parameters.shape, - async (args, extra) => GetAccountAddrTool.handler(args, this.getToolContext()) + async (args) => GetAccountAddrTool.handler(args, await this.getToolContext()) ); this.tool( GetBidsTool.name, GetBidsTool.description, GetBidsTool.parameters.shape, - async (args, extra) => GetBidsTool.handler(args, this.getToolContext()) + async (args) => GetBidsTool.handler(args, await this.getToolContext()) ); this.tool( CreateDeploymentTool.name, CreateDeploymentTool.description, CreateDeploymentTool.parameters.shape, - async (args, extra) => CreateDeploymentTool.handler(args, this.getToolContext()) + async (args) => CreateDeploymentTool.handler(args, await this.getToolContext()) ); this.tool( GetSDLsTool.name, GetSDLsTool.description, GetSDLsTool.parameters.shape, - async (args, extra) => GetSDLsTool.handler(args, this.getToolContext()) + async (args) => GetSDLsTool.handler(args, await this.getToolContext()) ); this.tool( GetSDLTool.name, GetSDLTool.description, GetSDLTool.parameters.shape, - async (args, extra) => GetSDLTool.handler(args, this.getToolContext()) + async (args) => GetSDLTool.handler(args, await this.getToolContext()) ); this.tool( SendManifestTool.name, SendManifestTool.description, SendManifestTool.parameters.shape, - async (args, extra) => SendManifestTool.handler(args, this.getToolContext()) + async (args) => SendManifestTool.handler(args, await this.getToolContext()) ); this.tool( CreateLeaseTool.name, CreateLeaseTool.description, CreateLeaseTool.parameters.shape, - async (args, extra) => CreateLeaseTool.handler(args, this.getToolContext()) + async (args) => CreateLeaseTool.handler(args, await this.getToolContext()) ); this.tool( GetServicesTool.name, GetServicesTool.description, GetServicesTool.parameters.shape, - async (args, extra) => GetServicesTool.handler(args, this.getToolContext()) + async (args) => GetServicesTool.handler(args, await this.getToolContext()) ); this.tool( UpdateDeploymentTool.name, UpdateDeploymentTool.description, UpdateDeploymentTool.parameters.shape, - async (args, extra) => UpdateDeploymentTool.handler(args, this.getToolContext()) + async (args) => UpdateDeploymentTool.handler(args, await this.getToolContext()) ); this.tool( AddFundsTool.name, AddFundsTool.description, AddFundsTool.parameters.shape, - async (args, extra) => AddFundsTool.handler(args, this.getToolContext()) + async (args) => AddFundsTool.handler(args, await this.getToolContext()) ); this.tool( GetBalancesTool.name, GetBalancesTool.description, GetBalancesTool.parameters.shape, - async (args, extra) => GetBalancesTool.handler(args, this.getToolContext()) + async (args) => GetBalancesTool.handler(args, await this.getToolContext()) ); this.tool( CloseDeploymentTool.name, CloseDeploymentTool.description, CloseDeploymentTool.parameters.shape, - async (args, extra) => CloseDeploymentTool.handler(args, this.getToolContext()) + async (args) => CloseDeploymentTool.handler(args, await this.getToolContext()) ); this.tool( GetDeploymentTool.name, GetDeploymentTool.description, GetDeploymentTool.parameters.shape, - async (args, extra) => GetDeploymentTool.handler(args, this.getToolContext()) + async (args) => GetDeploymentTool.handler(args, await this.getToolContext()) + ); + + this.tool( + RevokeCertificateTool.name, + RevokeCertificateTool.description, + RevokeCertificateTool.parameters.shape, + async (args) => RevokeCertificateTool.handler(args, await this.getToolContext()) + ); + + this.tool( + RevokeAllCertificatesTool.name, + RevokeAllCertificatesTool.description, + RevokeAllCertificatesTool.parameters.shape, + async (args) => RevokeAllCertificatesTool.handler(args, await this.getToolContext()) + ); + + this.tool( + RegenerateCertificateTool.name, + RegenerateCertificateTool.description, + RegenerateCertificateTool.parameters.shape, + async (args) => RegenerateCertificateTool.handler(args, await this.getToolContext()) ); + + this.tool( + GetLogsTool.name, + GetLogsTool.description, + GetLogsTool.parameters.shape, + async (args) => GetLogsTool.handler(args, await this.getToolContext()) + ); + + this.tool( + ExecCommandTool.name, + ExecCommandTool.description, + ExecCommandTool.parameters.shape, + async (args) => ExecCommandTool.handler(args, await this.getToolContext()) + ); + } public isInitialized(): boolean { - return this.wallet !== null && this.client !== null && this.certificate !== null; + return this.wallet !== null && this.client !== null && this.certificate !== null && this.chainSDK !== null; } } diff --git a/src/config.ts b/src/config.ts index 164f2cc..cef92fd 100644 --- a/src/config.ts +++ b/src/config.ts @@ -4,7 +4,27 @@ export const SERVER_CONFIG = { port: process.env.PORT || 3000, environment: process.env.NODE_ENV || 'development', rpcEndpoint: process.env.RPC_ENDPOINT || 'https://rpc.akashnet.net:443', + grpcEndpoint: process.env.GRPC_ENDPOINT || 'https://akash-grpc.publicnode.com:443', mnemonic: process.env.AKASH_MNEMONIC || '', } as const; export type ServerConfig = typeof SERVER_CONFIG; + +/** Validate mnemonic before wallet creation. Call at startup, not at import. */ +export function validateMnemonic(mnemonic: string): string { + if (!mnemonic || mnemonic.trim().length === 0) { + throw new Error( + 'AKASH_MNEMONIC environment variable is required. ' + + 'Set it to your 12 or 24 word BIP-39 mnemonic.' + ); + } + + const words = mnemonic.trim().split(/\s+/); + if (words.length !== 12 && words.length !== 24) { + throw new Error( + `AKASH_MNEMONIC must be 12 or 24 words, got ${words.length}.` + ); + } + + return mnemonic.trim(); +} diff --git a/src/tools/add-funds.ts b/src/tools/add-funds.ts index 11198d4..8730506 100644 --- a/src/tools/add-funds.ts +++ b/src/tools/add-funds.ts @@ -1,11 +1,6 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; import { createOutput } from '../utils/create-output.js'; -import { getTypeUrl } from '@akashnetwork/akashjs/build/stargate/index.js'; -import { MsgDepositDeployment } from '@akashnetwork/akash-api/akash/deployment/v1beta3'; -import { QueryClientImpl, QueryDeploymentRequest } from '@akashnetwork/akash-api/akash/deployment/v1beta3'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; -import { SERVER_CONFIG } from '../config.js'; const parameters = z.object({ address: z.string().min(1, 'Akash account address is required'), @@ -19,34 +14,42 @@ export const AddFundsTool: ToolDefinition = { parameters, handler: async (params, context) => { const { address, dseq, amount } = params; + const { chainSDK } = context; + try { // 1. Validate deployment exists - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); - const deploymentClient = new QueryClientImpl(rpc); - const queryReq = QueryDeploymentRequest.fromPartial({ - id: { owner: address, dseq }, + const deploymentRes = await chainSDK.akash.deployment.v1beta4.getDeployment({ + id: { + owner: address, + dseq: BigInt(dseq), + }, }); - const deploymentRes = await deploymentClient.Deployment(queryReq); + if (!deploymentRes.deployment) { return createOutput({ error: `Deployment with owner ${address} and dseq ${dseq} not found.` }); } - // 2. Prepare MsgDepositDeployment - const depositMsg = MsgDepositDeployment.fromPartial({ - id: { owner: address, dseq }, - amount: { denom: 'uakt', amount: amount.toString() }, - depositor: address, + // 2. Deposit funds using escrow accountDeposit + // The escrow account xid is typically the deployment ID in a specific format + // Format: owner/dseq + const result = await chainSDK.akash.escrow.v1.accountDeposit({ + signer: address, + id: { + scope: 1, // deployment scope + xid: `${address}/${dseq}`, + }, + deposit: { + amount: { denom: 'uakt', amount: amount.toString() }, + sources: [1], // Source.balance = 1 + }, }); - const msg = { - typeUrl: getTypeUrl(MsgDepositDeployment), - value: depositMsg, - }; - // 3. Sign and broadcast - const tx = await context.client.signAndBroadcast(address, [msg], 'auto'); - return createOutput(tx.rawLog); - } catch (error: any) { - return createOutput({ error: error.message || 'Failed to add funds to deployment.' }); + return createOutput({ + success: true, + result: result, + }); + } catch (error: unknown) { + return createOutput({ error: error instanceof Error ? error.message : String(error) || 'Failed to add funds to deployment.' }); } }, -}; \ No newline at end of file +}; diff --git a/src/tools/close-deployment.ts b/src/tools/close-deployment.ts index 250ef03..c277f56 100644 --- a/src/tools/close-deployment.ts +++ b/src/tools/close-deployment.ts @@ -1,8 +1,6 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; -import { MsgCloseDeployment } from '@akashnetwork/akash-api/akash/deployment/v1beta3'; import { createOutput } from '../utils/create-output.js'; -import { getTypeUrl } from '@akashnetwork/akashjs/build/stargate/index.js'; const parameters = z.object({ dseq: z.number().min(1), @@ -16,7 +14,7 @@ export const CloseDeploymentTool: ToolDefinition = { parameters, handler: async (params: z.infer, context: ToolContext) => { const { dseq } = params; - const { wallet, client } = context; + const { wallet, chainSDK } = context; try { const accounts = await wallet.getAccounts(); @@ -25,24 +23,23 @@ export const CloseDeploymentTool: ToolDefinition = { return createOutput({ error: 'No accounts found in wallet' }); } - const msg = { - typeUrl: getTypeUrl(MsgCloseDeployment), - value: MsgCloseDeployment.fromPartial({ - id: { - owner: accounts[0].address, - dseq: dseq, - }, - }), - }; - - const tx = await client.signAndBroadcast(accounts[0].address, [msg], 'auto'); + // Close deployment using chain SDK (v1beta4 API) + const result = await chainSDK.akash.deployment.v1beta4.closeDeployment({ + id: { + owner: accounts[0].address, + dseq: BigInt(dseq), + }, + }); - return createOutput(tx.rawLog); - } catch (error: any) { + return createOutput({ + success: true, + result: result, + }); + } catch (error: unknown) { console.error('Error closing deployment:', error); return createOutput({ - error: error.message || 'Unknown error closing deployment', + error: error instanceof Error ? error.message : String(error) || 'Unknown error closing deployment', }); } }, -}; \ No newline at end of file +}; diff --git a/src/tools/create-deployment.ts b/src/tools/create-deployment.ts index 1aecadb..eaada7b 100644 --- a/src/tools/create-deployment.ts +++ b/src/tools/create-deployment.ts @@ -1,9 +1,7 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; -import { MsgCreateDeployment } from '@akashnetwork/akash-api/akash/deployment/v1beta3'; -import { SDL } from '@akashnetwork/akashjs/build/sdl/SDL/SDL.js'; +import { SDL } from '@akashnetwork/chain-sdk'; import { createOutput } from '../utils/create-output.js'; -import { getTypeUrl } from '@akashnetwork/akashjs/build/stargate/index.js'; const parameters = z.object({ rawSDL: z.string().min(1), @@ -20,46 +18,54 @@ export const CreateDeploymentTool: ToolDefinition = { parameters, handler: async (params: z.infer, context: ToolContext) => { const { rawSDL } = params; - const { wallet, client } = context; + const { wallet, chainSDK } = context; try { - // Parse SDL directly from the string + // Parse SDL directly from the string using chain-sdk const sdl = SDL.fromString(rawSDL, 'beta3'); - const blockheight = await client.getHeight(); - const groups = sdl.groups(); const accounts = await wallet.getAccounts(); - if (!accounts || accounts.length === 0) { return createOutput({ error: 'No accounts found in wallet' }); } - const deployment = { + // Get block height for deployment sequence number + const statusResponse = await chainSDK.cosmos.base.tendermint.v1beta1.getLatestBlock({}); + const blockHeight = Number(statusResponse.block?.header?.height || 0); + + // Get groups from SDL + const groups = sdl.groups(); + + // Get manifest hash + const hash = await sdl.manifestVersion(); + + // Create deployment using chain SDK (v1beta4 API) + const result = await chainSDK.akash.deployment.v1beta4.createDeployment({ id: { owner: accounts[0].address, - dseq: blockheight, + dseq: BigInt(blockHeight), }, groups: groups, + hash: hash, deposit: { - denom: params.currency, - amount: params.deposit.toString(), + amount: { + denom: params.currency, + amount: params.deposit.toString(), + }, + sources: [1], // Source.balance = 1 }, - version: await sdl.manifestVersion(), - depositor: accounts[0].address, - }; - - const msg = { - typeUrl: getTypeUrl(MsgCreateDeployment), - value: MsgCreateDeployment.fromPartial(deployment), - }; - - const tx = await client.signAndBroadcast(accounts[0].address, [msg], 'auto'); + }); - return createOutput(tx.rawLog); - } catch (error: any) { + return createOutput({ + success: true, + dseq: blockHeight, + owner: accounts[0].address, + result: result, + }); + } catch (error: unknown) { console.error('Error creating deployment:', error); return createOutput({ - error: error.message || 'Unknown error creating deployment', + error: error instanceof Error ? error.message : String(error) || 'Unknown error creating deployment', }); } }, diff --git a/src/tools/create-lease.ts b/src/tools/create-lease.ts index 98ec964..4ad9dab 100644 --- a/src/tools/create-lease.ts +++ b/src/tools/create-lease.ts @@ -1,12 +1,5 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; -import { - BidID, - Lease, - LeaseID, - MsgCreateLease, -} from '@akashnetwork/akash-api/akash/market/v1beta4'; -import { getTypeUrl } from '@akashnetwork/akashjs/build/stargate/index.js'; import { createOutput } from '../utils/create-output.js'; const parameters = z.object({ @@ -23,23 +16,30 @@ export const CreateLeaseTool: ToolDefinition = { 'Create a lease on Akash Network using the provided owner, dseq, gseq, oseq and provider from a bid.', parameters, handler: async (params: z.infer, context: ToolContext) => { - const { client, wallet } = context; - const accounts = await wallet.getAccounts(); - const bid = BidID.fromPartial({ - owner: params.owner, - dseq: params.dseq, - gseq: params.gseq, - oseq: params.oseq, - provider: params.provider, - }); + const { chainSDK } = context; - const lease = MsgCreateLease.fromPartial({ bidId: bid }); - const msg = { - typeUrl: getTypeUrl(MsgCreateLease), - value: lease, - }; + try { + // Create lease using chain SDK (v1beta5 API) + const result = await chainSDK.akash.market.v1beta5.createLease({ + bidId: { + owner: params.owner, + dseq: BigInt(params.dseq), + gseq: params.gseq, + oseq: params.oseq, + provider: params.provider, + bseq: 0, // Default bid sequence + }, + }); - const tx = await client.signAndBroadcast(accounts[0].address, [msg], 'auto'); - return createOutput(tx.rawLog); + return createOutput({ + success: true, + result: result, + }); + } catch (error: unknown) { + console.error('Error creating lease:', error); + return createOutput({ + error: error instanceof Error ? error.message : String(error) || 'Unknown error creating lease', + }); + } }, }; diff --git a/src/tools/exec-command.ts b/src/tools/exec-command.ts new file mode 100644 index 0000000..38929e3 --- /dev/null +++ b/src/tools/exec-command.ts @@ -0,0 +1,223 @@ +import { z } from 'zod'; +import type { CertificatePem } from '@akashnetwork/chain-sdk'; +import type { ToolDefinition, ToolContext } from '../types/index.js'; +import https from 'https'; +import WebSocket from 'ws'; +import { createOutput } from '../utils/create-output.js'; +import type { ClientRequestArgs } from 'http'; + +const parameters = z.object({ + owner: z.string().min(1), + dseq: z.number().min(1), + gseq: z.number().min(1), + oseq: z.number().min(1), + provider: z.string().min(1), + service: z.string().optional().describe('Service name to execute command in (required if deployment has multiple services)'), + command: z.string().min(1).describe('Shell command to execute (e.g., "ls -la", "cat /etc/pingap/certs/origin.crt")'), + stdin: z.boolean().optional().default(false).describe('Enable stdin for interactive commands'), + tty: z.boolean().optional().default(true).describe('Allocate a pseudo-TTY'), +}); + +interface LeaseID { + owner: string; + dseq: number; + gseq: number; + oseq: number; + provider: string; +} + +interface ShellMessage { + type: 'stdout' | 'stderr' | 'result' | 'error'; + data?: string; + exitCode?: number; +} + +export const ExecCommandTool: ToolDefinition = { + name: 'exec-command', + description: + 'Execute a shell command in a running deployment container. Similar to "kubectl exec" or "docker exec". Useful for debugging, checking files, restarting services, or making quick config changes without redeploying.', + parameters, + handler: async (params: z.infer, context: ToolContext) => { + const { certificate, chainSDK } = context; + + try { + // Query provider using chain SDK (v1beta4 API) + const providerRes = await chainSDK.akash.provider.v1beta4.getProvider({ + owner: params.provider, + }); + + if (providerRes.provider === undefined) { + throw new Error(`Could not find provider ${params.provider}`); + } + + const providerInfo = providerRes.provider; + + // Execute command via WebSocket + const output = await executeCommand( + { + owner: params.owner, + dseq: params.dseq, + gseq: params.gseq, + oseq: params.oseq, + provider: params.provider, + }, + providerInfo.hostUri, + certificate, + params.command, + params.service, + params.stdin ?? false, + params.tty ?? true + ); + + return createOutput(output); + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + return createOutput(`Error executing command: ${errorMessage}`); + } + }, +}; + +async function executeCommand( + leaseId: LeaseID, + providerUri: string, + certificate: CertificatePem, + command: string, + service: string | undefined, + stdin: boolean, + tty: boolean +): Promise { + const uri = new URL(providerUri); + + // Build the WebSocket URL with query params + // Path: /lease/{dseq}/{gseq}/{oseq}/shell + // The command is passed as query params: cmd=sh&cmd=-c&cmd= + let shellPath = `/lease/${leaseId.dseq}/${leaseId.gseq}/${leaseId.oseq}/shell`; + + // Build query string + const queryParams = new URLSearchParams(); + + // Add stdin and tty flags + queryParams.set('stdin', stdin ? '1' : '0'); + queryParams.set('tty', tty ? '1' : '0'); + + // Add command as shell -c "command" + queryParams.append('cmd', 'sh'); + queryParams.append('cmd', '-c'); + queryParams.append('cmd', command); + + // Add service filter if specified + if (service) { + queryParams.set('service', service); + } + + shellPath += '?' + queryParams.toString(); + + const wsUrl = `wss://${uri.hostname}:${uri.port || 8443}${shellPath}`; + + return new Promise((resolve, reject) => { + const outputLines: string[] = []; + let resolved = false; + let exitCode: number | undefined; + + // Create HTTPS agent with mTLS credentials + const agent = new https.Agent({ + cert: certificate.cert, + key: certificate.privateKey, + rejectUnauthorized: false, + // Use 'localhost' as SNI to trigger mTLS mode on the provider + servername: 'localhost', + }); + + // Create WebSocket with mTLS via agent + const ws = new WebSocket(wsUrl, { + agent, + headers: { + 'Host': 'localhost', + }, + } as ClientRequestArgs); + + const timeout = setTimeout(() => { + if (!resolved) { + resolved = true; + ws.close(); + if (outputLines.length > 0) { + resolve(outputLines.join('')); + } else { + resolve('Command timed out (30s)'); + } + } + }, 30000); // 30 second timeout for commands + + ws.on('open', () => { + // Connection established, command will execute + }); + + ws.on('message', (data: Buffer) => { + try { + // Provider may send JSON messages or raw output + const text = data.toString(); + + // Try to parse as JSON (some providers send structured output) + try { + const message = JSON.parse(text) as ShellMessage; + if (message.type === 'stdout' || message.type === 'stderr') { + if (message.data) { + outputLines.push(message.data); + } + } else if (message.type === 'result') { + exitCode = message.exitCode; + } else if (message.type === 'error') { + outputLines.push(`Error: ${message.data || 'Unknown error'}`); + } + } catch { + // Not JSON - just raw output from the shell + // The first byte might be a stream identifier (1=stdout, 2=stderr) + if (data.length > 0) { + const streamId = data[0]; + if (streamId === 1 || streamId === 2) { + // Strip the stream identifier byte + outputLines.push(data.subarray(1).toString()); + } else { + outputLines.push(text); + } + } + } + } catch { + outputLines.push(data.toString()); + } + }); + + ws.on('close', (code: number, reason: Buffer) => { + clearTimeout(timeout); + if (!resolved) { + resolved = true; + let result = outputLines.join(''); + + // Add exit code info if available + if (exitCode !== undefined) { + result += `\n[Exit code: ${exitCode}]`; + } + + if (result.trim().length > 0) { + resolve(result); + } else if (code === 4000) { + resolve('Error: Internal server error from provider'); + } else if (code === 4001) { + resolve('Error: Lease not found'); + } else if (code === 4002) { + resolve('Error: Service not found. Specify the service name with the "service" parameter.'); + } else { + resolve(`Command completed (connection closed with code ${code})`); + } + } + }); + + ws.on('error', (error: Error) => { + clearTimeout(timeout); + if (!resolved) { + resolved = true; + reject(new Error(`WebSocket error: ${error.message}`)); + } + }); + }); +} diff --git a/src/tools/get-balances.ts b/src/tools/get-balances.ts index 8ee1d50..b665096 100644 --- a/src/tools/get-balances.ts +++ b/src/tools/get-balances.ts @@ -12,10 +12,13 @@ export const GetBalancesTool: ToolDefinition = { parameters, handler: async (params: z.infer, context: ToolContext) => { try { - const balances = await context.client.getAllBalances(params.address); - return createOutput(balances); - } catch (error: any) { - return createOutput({ error: error.message || 'Failed to fetch balances' }); + // Query balances using chain SDK + const balances = await context.chainSDK.cosmos.bank.v1beta1.getAllBalances({ + address: params.address, + }); + return createOutput(balances.balances); + } catch (error: unknown) { + return createOutput({ error: error instanceof Error ? error.message : String(error) || 'Failed to fetch balances' }); } }, }; diff --git a/src/tools/get-bids.ts b/src/tools/get-bids.ts index ff45622..a337ae5 100644 --- a/src/tools/get-bids.ts +++ b/src/tools/get-bids.ts @@ -1,10 +1,6 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; -import { QueryClientImpl as QueryMarketClient } from '@akashnetwork/akash-api/akash/market/v1beta4'; -import { QueryBidsRequest } from '@akashnetwork/akash-api/akash/market/v1beta4'; import { createOutput } from '../utils/index.js'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; -import { SERVER_CONFIG } from '../config.js'; const parameters = z.object({ dseq: z.number().int().positive(), @@ -18,37 +14,61 @@ export const GetBidsTool: ToolDefinition = { parameters, handler: async (params: z.infer, context: ToolContext) => { const { dseq, owner } = params; - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); - const marketClient = new QueryMarketClient(rpc); - - const request = QueryBidsRequest.fromPartial({ - filters: { - owner: owner, - dseq: dseq, - }, - }); - - let bids: { - bidId: string; - state: string; - price: string; - createdAt: string; - }[] = []; - - const bidsResponse = await marketClient.Bids(request); - bids = bidsResponse.bids.map((bid) => { - return { - bidId: JSON.stringify(bid.bid?.bidId), - state: JSON.stringify(bid.bid?.state), - price: JSON.stringify(bid.bid?.price), - createdAt: JSON.stringify(bid.bid?.createdAt), - }; - }); - - if (bids.length > 0) { - return createOutput(bids); - } else { - return createOutput('No bids found for deployment ' + dseq + '.'); + const { chainSDK } = context; + + try { + // Query bids using chain SDK (v1beta5 API) + const bidsResponse = await chainSDK.akash.market.v1beta5.getBids({ + filters: { + owner: owner, + dseq: BigInt(dseq), + }, + }); + + // Enrich bids with provider information + const bidsWithProviderInfo = await Promise.all( + bidsResponse.bids.map(async (bidResponse) => { + const providerId = bidResponse.bid?.id?.provider; + let providerInfo = null; + + if (providerId) { + try { + const providerRes = await chainSDK.akash.provider.v1beta4.getProvider({ + owner: providerId, + }); + + providerInfo = { + hostUri: providerRes.provider?.hostUri, + attributes: providerRes.provider?.attributes, + info: providerRes.provider?.info, + }; + } catch (error) { + console.error(`Error fetching provider ${providerId}:`, error); + providerInfo = { error: 'Could not fetch provider details' }; + } + } + + return { + bidId: bidResponse.bid?.id, + state: bidResponse.bid?.state, + price: bidResponse.bid?.price, + createdAt: bidResponse.bid?.createdAt, + provider: providerInfo, + }; + }) + ); + + if (bidsWithProviderInfo.length > 0) { + return createOutput(bidsWithProviderInfo); + } else { + return createOutput('No bids found for deployment ' + dseq + '.'); + } + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + console.error('Error getting bids:', error); + return createOutput({ + error: errorMessage || 'Unknown error getting bids', + }); } }, }; diff --git a/src/tools/get-deployment.ts b/src/tools/get-deployment.ts index e7accf6..3ea00ff 100644 --- a/src/tools/get-deployment.ts +++ b/src/tools/get-deployment.ts @@ -1,23 +1,44 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; import { createOutput } from '../utils/create-output.js'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; -import { SERVER_CONFIG } from '../config.js'; -import { QueryClientImpl, QueryDeploymentRequest } from '@akashnetwork/akash-api/akash/deployment/v1beta3'; const parameters = z.object({ dseq: z.number().min(1), }); +/** Minimal shape of a lease response from the chain SDK. */ +interface LeaseResponse { + lease?: { + id?: { provider?: string }; + price?: unknown; + [key: string]: unknown; + }; + [key: string]: unknown; +} + +/** Minimal shape of a deployment group from the chain SDK. */ +interface DeploymentGroup { + state?: { count?: number | string }; + spec?: { + resources?: { + cpu?: { units?: { val?: number | string } }; + memory?: { quantity?: { val?: number | string } }; + gpu?: { units?: { val?: number | string } }; + storage?: Array<{ quantity?: { val?: number | string } }>; + }; + }; + [key: string]: unknown; +} + export const GetDeploymentTool: ToolDefinition = { name: 'get-deployment', description: - 'Get deployment details from Akash Network including status, groups, and escrow account. ' + + 'Get deployment details from Akash Network including status, groups, escrow account, leases, and provider info. ' + 'The dseq is the deployment sequence number.', parameters, handler: async (params: z.infer, context: ToolContext) => { const { dseq } = params; - const { wallet } = context; + const { wallet, chainSDK } = context; try { const accounts = await wallet.getAccounts(); @@ -25,27 +46,139 @@ export const GetDeploymentTool: ToolDefinition = { return createOutput({ error: 'No accounts found in wallet' }); } - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); - const deploymentClient = new QueryClientImpl(rpc); - const queryReq = QueryDeploymentRequest.fromPartial({ - id: { owner: accounts[0].address, dseq }, + const owner = accounts[0].address; + + // Query deployment using chain SDK (v1beta4 API) + const deploymentRes = await chainSDK.akash.deployment.v1beta4.getDeployment({ + id: { + owner, + dseq: BigInt(dseq), + }, }); - const deploymentRes = await deploymentClient.Deployment(queryReq); - + if (!deploymentRes.deployment) { - return createOutput({ error: `Deployment ${dseq} not found for owner ${accounts[0].address}` }); + return createOutput({ error: `Deployment ${dseq} not found for owner ${owner}` }); + } + + // Calculate resource totals from groups + const groups = (deploymentRes.groups || []) as unknown as DeploymentGroup[]; + const resources = calculateResourceTotals(groups); + + // Query leases for this deployment + let leases: LeaseResponse[] = []; + let providers: Array> = []; + + try { + const leasesRes = await chainSDK.akash.market.v1beta5.getLeases({ + filters: { + owner, + dseq: BigInt(dseq), + }, + }); + + leases = (leasesRes.leases || []) as unknown as LeaseResponse[]; + + // Get provider details for each lease + const providerPromises = leases.map(async (lease) => { + try { + const providerRes = await chainSDK.akash.provider.v1beta4.getProvider({ + owner: lease.lease?.id?.provider, + }); + return { + address: lease.lease?.id?.provider, + hostUri: providerRes.provider?.hostUri, + attributes: providerRes.provider?.attributes, + info: providerRes.provider?.info, + }; + } catch (error) { + return { + address: lease.lease?.id?.provider, + error: 'Could not fetch provider details', + }; + } + }); + + providers = await Promise.all(providerPromises); + } catch (error) { + // Leases query may fail if deployment is not leased yet + console.error('Error querying leases:', error); } return createOutput({ - deployment: deploymentRes.deployment, + deployment: { + ...deploymentRes.deployment, + // Include height information for timeline tracking + createdHeight: deploymentRes.deployment.createdAt, + }, groups: deploymentRes.groups, escrowAccount: deploymentRes.escrowAccount, + resources, + leases: leases.map((lease, index: number) => ({ + ...lease.lease, + price: lease.lease?.price, + provider: providers[index], + })), }); - } catch (error: any) { + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); console.error('Error getting deployment:', error); return createOutput({ - error: error.message || 'Unknown error getting deployment', + error: errorMessage || 'Unknown error getting deployment', }); } }, -}; \ No newline at end of file +}; + +// Helper function to calculate resource totals across all groups +function calculateResourceTotals(groups: DeploymentGroup[]): { + cpu: { units: string; total: number }; + memory: { units: string; total: number }; + storage: { units: string; total: number }; + gpu: { units: string; total: number }; +} { + let totalCpu = 0; + let totalMemory = 0; + let totalStorage = 0; + let totalGpu = 0; + + for (const group of groups) { + const count = Number(group.state?.count || 0); + + if (group.spec?.resources) { + const cpu = Number(group.spec.resources.cpu?.units?.val || 0); + const memory = Number(group.spec.resources.memory?.quantity?.val || 0); + const gpu = Number(group.spec.resources.gpu?.units?.val || 0); + + totalCpu += cpu * count; + totalMemory += memory * count; + totalGpu += gpu * count; + + // Sum storage from all volumes + if (group.spec.resources.storage) { + for (const storage of group.spec.resources.storage) { + const storageVal = Number(storage?.quantity?.val || 0); + totalStorage += storageVal * count; + } + } + } + } + + return { + cpu: { + units: 'millicores', + total: totalCpu, + }, + memory: { + units: 'bytes', + total: totalMemory, + }, + storage: { + units: 'bytes', + total: totalStorage, + }, + gpu: { + units: 'units', + total: totalGpu, + }, + }; +} diff --git a/src/tools/get-logs.ts b/src/tools/get-logs.ts new file mode 100644 index 0000000..b40c023 --- /dev/null +++ b/src/tools/get-logs.ts @@ -0,0 +1,169 @@ +import { z } from 'zod'; +import type { CertificatePem } from '@akashnetwork/chain-sdk'; +import type { ToolDefinition, ToolContext } from '../types/index.js'; +import https from 'https'; +import WebSocket from 'ws'; +import { createOutput } from '../utils/create-output.js'; +import type { ClientRequestArgs } from 'http'; + +const parameters = z.object({ + owner: z.string().min(1), + dseq: z.number().min(1), + gseq: z.number().min(1), + oseq: z.number().min(1), + provider: z.string().min(1), + service: z.string().optional().describe('Optional service name to filter logs (e.g., "infisical", "postgres"). If not provided, returns logs from all services.'), + tail: z.number().optional().default(100).describe('Number of lines to return from the end of the logs'), +}); + +interface LeaseID { + owner: string; + dseq: number; + gseq: number; + oseq: number; + provider: string; +} + +interface ServiceLogMessage { + Name: string; + Message: string; +} + +export const GetLogsTool: ToolDefinition = { + name: 'get-logs', + description: + 'Get container logs for a deployment. Uses WebSocket connection to provider. Useful for debugging deployment issues.', + parameters, + handler: async (params: z.infer, context: ToolContext) => { + const { certificate, chainSDK } = context; + + try { + // Query provider using chain SDK (v1beta4 API) + const providerRes = await chainSDK.akash.provider.v1beta4.getProvider({ + owner: params.provider, + }); + + if (providerRes.provider === undefined) { + throw new Error(`Could not find provider ${params.provider}`); + } + + const providerInfo = providerRes.provider; + + // Query lease logs via WebSocket + const logs = await queryLeaseLogs( + { + owner: params.owner, + dseq: params.dseq, + gseq: params.gseq, + oseq: params.oseq, + provider: params.provider, + }, + providerInfo.hostUri, + certificate, + params.service, + params.tail || 100 + ); + + return createOutput(logs); + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + return createOutput(`Error getting logs: ${errorMessage}`); + } + }, +}; + +async function queryLeaseLogs( + leaseId: LeaseID, + providerUri: string, + certificate: CertificatePem, + service: string | undefined, + tail: number +): Promise { + const uri = new URL(providerUri); + + // Build the WebSocket URL with query params + // Path: /lease/{dseq}/{gseq}/{oseq}/logs + let logsPath = `/lease/${leaseId.dseq}/${leaseId.gseq}/${leaseId.oseq}/logs?follow=false&tail=${tail}`; + if (service) { + logsPath += `&services=${encodeURIComponent(service)}`; + } + + const wsUrl = `wss://${uri.hostname}:${uri.port || 8443}${logsPath}`; + + return new Promise((resolve, reject) => { + const logLines: string[] = []; + let resolved = false; + + // Create HTTPS agent with mTLS credentials + const agent = new https.Agent({ + cert: certificate.cert, + key: certificate.privateKey, + rejectUnauthorized: false, + // Use 'localhost' as SNI to trigger mTLS mode on the provider + servername: 'localhost', + }); + + // Create WebSocket with mTLS via agent + const ws = new WebSocket(wsUrl, { + agent, + headers: { + 'Host': 'localhost', + }, + } as ClientRequestArgs); + + const timeout = setTimeout(() => { + if (!resolved) { + resolved = true; + ws.close(); + if (logLines.length > 0) { + resolve(logLines.join('\n')); + } else { + resolve('No logs received (timeout)'); + } + } + }, 10000); // 10 second timeout + + ws.on('open', () => { + // Connection established, waiting for logs + }); + + ws.on('message', (data: Buffer) => { + try { + const message = JSON.parse(data.toString()) as ServiceLogMessage; + if (message.Name && message.Message) { + logLines.push(`[${message.Name}] ${message.Message}`); + } else { + // Raw message + logLines.push(data.toString()); + } + } catch { + // Not JSON, add as raw line + logLines.push(data.toString()); + } + }); + + ws.on('close', (code: number, reason: Buffer) => { + clearTimeout(timeout); + if (!resolved) { + resolved = true; + if (logLines.length > 0) { + resolve(logLines.join('\n')); + } else if (code === 4000) { + resolve('Error: Internal server error from provider'); + } else if (code === 4001) { + resolve('Error: Lease not found'); + } else { + resolve(`No logs available (connection closed with code ${code})`); + } + } + }); + + ws.on('error', (error: Error) => { + clearTimeout(timeout); + if (!resolved) { + resolved = true; + reject(new Error(`WebSocket error: ${error.message}`)); + } + }); + }); +} diff --git a/src/tools/get-sdl.ts b/src/tools/get-sdl.ts index 2d42094..5411d5e 100644 --- a/src/tools/get-sdl.ts +++ b/src/tools/get-sdl.ts @@ -1,6 +1,5 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; -import { ResourceDefinition } from '../types/index.js'; import { createOutput } from '../utils/create-output.js'; import { getSDLTemplate } from '../utils/get-sdl-template.js'; diff --git a/src/tools/get-services.ts b/src/tools/get-services.ts index 82649c2..64d50b2 100644 --- a/src/tools/get-services.ts +++ b/src/tools/get-services.ts @@ -1,14 +1,8 @@ import { z } from 'zod'; +import type { CertificatePem } from '@akashnetwork/chain-sdk'; import type { ToolDefinition, ToolContext } from '../types/index.js'; import https from 'https'; import { createOutput } from '../utils/create-output.js'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; -import { SERVER_CONFIG } from '../config.js'; -import { - QueryClientImpl as QueryProviderClient, - QueryProviderRequest, -} from '@akashnetwork/akash-api/akash/provider/v1beta3'; -import { Lease } from '@akashnetwork/akash-api/akash/market/v1beta4'; const parameters = z.object({ owner: z.string().min(1), @@ -37,7 +31,7 @@ export const GetServicesTool: ToolDefinition = { 'Get the services and their URIs for a lease on Akash Network using the provided owner, dseq, gseq, oseq and provider.', parameters, handler: async (params: z.infer, context: ToolContext) => { - const { certificate } = context; + const { certificate, chainSDK } = context; // Create lease object with our custom type const lease: CustomLease = { @@ -51,20 +45,16 @@ export const GetServicesTool: ToolDefinition = { }; try { - // Get provider URI - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); - const client = new QueryProviderClient(rpc); - const request = QueryProviderRequest.fromPartial({ + // Query provider using chain SDK (v1beta4 API) + const providerRes = await chainSDK.akash.provider.v1beta4.getProvider({ owner: params.provider, }); - const tx = await client.Provider(request); - - if (tx.provider === undefined) { + if (providerRes.provider === undefined) { throw new Error(`Could not find provider ${params.provider}`); } - const providerInfo = tx.provider; + const providerInfo = providerRes.provider; // Query lease status const leaseStatus = await queryLeaseStatus(lease, providerInfo.hostUri, certificate); @@ -77,7 +67,7 @@ export const GetServicesTool: ToolDefinition = { }, }; -async function queryLeaseStatus(lease: CustomLease, providerUri: string, certificate: any) { +async function queryLeaseStatus(lease: CustomLease, providerUri: string, certificate: CertificatePem) { const id = lease.id; if (id === undefined) { @@ -90,6 +80,8 @@ async function queryLeaseStatus(lease: CustomLease, providerUri: string, certifi cert: certificate.cert, key: certificate.privateKey, rejectUnauthorized: false, + // Use 'localhost' as SNI to trigger mTLS mode on the provider + servername: 'localhost', }); const uri = new URL(providerUri); diff --git a/src/tools/index.ts b/src/tools/index.ts index 82406ce..d8384ff 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -11,3 +11,8 @@ export { AddFundsTool } from './add-funds.js'; export { GetBalancesTool } from './get-balances.js'; export { CloseDeploymentTool } from './close-deployment.js'; export { GetDeploymentTool } from './get-deployment.js'; +export { RevokeCertificateTool } from './revoke-certificate.js'; +export { RevokeAllCertificatesTool } from './revoke-all-certificates.js'; +export { RegenerateCertificateTool } from './regenerate-certificate.js'; +export { GetLogsTool } from './get-logs.js'; +export { ExecCommandTool } from './exec-command.js'; diff --git a/src/tools/regenerate-certificate.ts b/src/tools/regenerate-certificate.ts new file mode 100644 index 0000000..4238a67 --- /dev/null +++ b/src/tools/regenerate-certificate.ts @@ -0,0 +1,126 @@ +import { z } from 'zod'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { CertificateManager } from '@akashnetwork/chain-sdk'; +import type { ToolDefinition, ToolContext } from '../types/index.js'; +import { createOutput, pemToUint8Array } from '../utils/index.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const parameters = z.object({}); + +export const RegenerateCertificateTool: ToolDefinition = { + name: 'regenerate-certificate', + description: + 'Regenerate the Akash certificate. Use this when getting 401 errors on manifest send. ' + + 'This will revoke all existing certificates, delete the local certificate, create a new one, ' + + 'and broadcast it to the chain. The new certificate will be used for all subsequent operations.', + parameters, + handler: async (_params: z.infer, context: ToolContext) => { + const { wallet, chainSDK, reloadCertificate } = context; + + try { + const accounts = await wallet.getAccounts(); + + if (!accounts || accounts.length === 0) { + return createOutput({ error: 'No accounts found in wallet' }); + } + + const address = accounts[0].address; + const certificatesDir = path.resolve(__dirname, '../utils/certificates'); + const certificatePath = path.resolve(certificatesDir, `${address}.json`); + + // Step 1: Revoke ALL existing valid certificates on-chain first + // This is critical - we must clear old certs before creating a new one + let revokedCount = 0; + try { + const certsResponse = await chainSDK.akash.cert.v1.getCertificates({ + filter: { + owner: address, + serial: '', + state: 'valid', + }, + pagination: undefined, + }); + + const certificates = certsResponse.certificates || []; + for (const cert of certificates) { + const serial = cert.serial; + if (!serial) continue; + + try { + await chainSDK.akash.cert.v1.revokeCertificate({ + id: { + owner: address, + serial: serial, + }, + }); + revokedCount++; + } catch (revokeError: unknown) { + // Continue even if revoke fails for one cert + const msg = revokeError instanceof Error ? revokeError.message : String(revokeError); + console.warn(`Failed to revoke cert ${serial}: ${msg}`); + } + } + } catch (queryError: unknown) { + const msg = queryError instanceof Error ? queryError.message : String(queryError); + console.warn(`Failed to query existing certs: ${msg}`); + // Continue anyway - we'll try to create a new cert + } + + // Step 2: Delete local certificate file if it exists + if (fs.existsSync(certificatePath)) { + fs.unlinkSync(certificatePath); + } + + // Step 3: Generate new certificate + const certManager = new CertificateManager(); + const newCertificate = await certManager.generatePEM(address); + // Use certificate exactly as generated - don't normalize line endings + + // Step 4: Broadcast to chain - this MUST succeed for the cert to work + try { + await chainSDK.akash.cert.v1.createCertificate({ + owner: address, + cert: pemToUint8Array(newCertificate.cert), + pubkey: pemToUint8Array(newCertificate.publicKey), + }); + } catch (error: unknown) { + // Don't silently ignore "already exists" - this means our cert wasn't created! + const errorMessage = error instanceof Error ? error.message : String(error); + return createOutput({ + error: `Failed to broadcast certificate: ${errorMessage}. ` + + `Try running revoke-all-certificates first, then regenerate again.`, + }); + } + + // Step 5: Save new certificate locally (only after successful broadcast) + if (!fs.existsSync(certificatesDir)) { + fs.mkdirSync(certificatesDir, { recursive: true }); + } + fs.writeFileSync(certificatePath, JSON.stringify(newCertificate)); + + // Step 6: Reload certificate in memory if callback is available + if (reloadCertificate) { + await reloadCertificate(); + } + + return createOutput({ + success: true, + message: `Certificate regenerated successfully. Revoked ${revokedCount} old certificate(s). ` + + `You can now retry sending the manifest.`, + address: address, + certPath: certificatePath, + revokedCount: revokedCount, + }); + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + console.error('Error regenerating certificate:', error); + return createOutput({ + error: errorMessage || 'Unknown error regenerating certificate', + }); + } + }, +}; diff --git a/src/tools/revoke-all-certificates.ts b/src/tools/revoke-all-certificates.ts new file mode 100644 index 0000000..2c55b9d --- /dev/null +++ b/src/tools/revoke-all-certificates.ts @@ -0,0 +1,81 @@ +import { z } from 'zod'; +import type { ToolDefinition, ToolContext } from '../types/index.js'; +import { createOutput } from '../utils/create-output.js'; + +const parameters = z.object({}); + +export const RevokeAllCertificatesTool: ToolDefinition = { + name: 'revoke-all-certificates', + description: + 'Revoke ALL certificates on Akash Network for this account. ' + + 'Use this to clean up old certificates when getting 401 errors.', + parameters, + handler: async (_params: z.infer, context: ToolContext) => { + const { wallet, chainSDK } = context; + + try { + const accounts = await wallet.getAccounts(); + + if (!accounts || accounts.length === 0) { + return createOutput({ error: 'No accounts found in wallet' }); + } + + const owner = accounts[0].address; + + // Query all certificates for this owner + const certsResponse = await chainSDK.akash.cert.v1.getCertificates({ + filter: { + owner: owner, + serial: '', + state: 'valid', + }, + pagination: undefined, + }); + + const certificates = certsResponse.certificates || []; + + if (certificates.length === 0) { + return createOutput({ + success: true, + message: 'No certificates found to revoke', + revoked: 0, + }); + } + + const revokedSerials: string[] = []; + const errors: string[] = []; + + // Revoke each certificate + for (const cert of certificates) { + const serial = cert.serial; + if (!serial) continue; + + try { + await chainSDK.akash.cert.v1.revokeCertificate({ + id: { + owner: owner, + serial: serial, + }, + }); + revokedSerials.push(serial); + } catch (error: unknown) { + errors.push(`Serial ${serial}: ${error instanceof Error ? error.message : String(error)}`); + } + } + + return createOutput({ + success: true, + message: `Revoked ${revokedSerials.length} of ${certificates.length} certificates`, + revoked: revokedSerials.length, + total: certificates.length, + revokedSerials: revokedSerials, + errors: errors.length > 0 ? errors : undefined, + }); + } catch (error: unknown) { + console.error('Error revoking certificates:', error); + return createOutput({ + error: (error instanceof Error ? error.message : String(error)) || 'Unknown error revoking certificates', + }); + } + }, +}; diff --git a/src/tools/revoke-certificate.ts b/src/tools/revoke-certificate.ts new file mode 100644 index 0000000..7b06075 --- /dev/null +++ b/src/tools/revoke-certificate.ts @@ -0,0 +1,46 @@ +import { z } from 'zod'; +import type { ToolDefinition, ToolContext } from '../types/index.js'; +import { createOutput } from '../utils/create-output.js'; + +const parameters = z.object({ + serial: z.string().min(1).describe('The certificate serial number to revoke'), +}); + +export const RevokeCertificateTool: ToolDefinition = { + name: 'revoke-certificate', + description: + 'Revoke a certificate on Akash Network. ' + + 'The serial is the certificate serial number to revoke.', + parameters, + handler: async (params: z.infer, context: ToolContext) => { + const { serial } = params; + const { wallet, chainSDK } = context; + + try { + const accounts = await wallet.getAccounts(); + + if (!accounts || accounts.length === 0) { + return createOutput({ error: 'No accounts found in wallet' }); + } + + // Revoke certificate using chain SDK + const result = await chainSDK.akash.cert.v1.revokeCertificate({ + id: { + owner: accounts[0].address, + serial: serial, + }, + }); + + return createOutput({ + success: true, + serial: serial, + result: result, + }); + } catch (error: unknown) { + console.error('Error revoking certificate:', error); + return createOutput({ + error: error instanceof Error ? error.message : String(error) || 'Unknown error revoking certificate', + }); + } + }, +}; diff --git a/src/tools/send-manifest.ts b/src/tools/send-manifest.ts index 22b2e48..3194a3b 100644 --- a/src/tools/send-manifest.ts +++ b/src/tools/send-manifest.ts @@ -1,15 +1,9 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext, CustomLease, CustomLeaseID } from '../types/index.js'; -import { SDL } from '@akashnetwork/akashjs/build/sdl/SDL/SDL.js'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; +import { SDL, type CertificatePem } from '@akashnetwork/chain-sdk'; import { createOutput } from '../utils/create-output.js'; +import type { ChainNodeSDK } from '../types/index.js'; import https from 'https'; -import { SERVER_CONFIG } from '../config.js'; -import { - QueryClientImpl as QueryProviderClient, - QueryProviderRequest, -} from '@akashnetwork/akash-api/akash/provider/v1beta3'; -import type { CertificatePem } from '@akashnetwork/akashjs/build/certificates/certificate-manager/CertificateManager.js'; const parameters = z.object({ sdl: z.string().min(1), @@ -26,9 +20,9 @@ export const SendManifestTool: ToolDefinition = { 'Send a manifest to a provider using the provided SDL, owner, dseq, gseq, oseq and provider.', parameters, handler: async (params: z.infer, context: ToolContext) => { - const { wallet, certificate } = context; + const { certificate, chainSDK } = context; - // Parse SDL + // Parse SDL using chain-sdk const sdl = SDL.fromString(params.sdl, 'beta3'); // Create lease object with our custom type @@ -41,7 +35,7 @@ export const SendManifestTool: ToolDefinition = { }; try { - await sendManifest(sdl, { id: lease }, certificate); + await sendManifest(sdl, { id: lease }, certificate, chainSDK); return createOutput('Manifest sent successfully'); } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : String(error); @@ -50,34 +44,41 @@ export const SendManifestTool: ToolDefinition = { }, }; -export async function sendManifest(sdl: SDL, lease: CustomLease, certificate: CertificatePem) { +export async function sendManifest(sdl: SDL, lease: CustomLease, certificate: CertificatePem, chainSDK?: ChainNodeSDK) { if (!lease.id) { throw new Error('Lease ID is undefined'); } - const { dseq, provider } = lease.id; - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); + const { dseq, gseq, oseq, provider, owner } = lease.id; - const client = new QueryProviderClient(rpc); - const request = QueryProviderRequest.fromPartial({ + if (!chainSDK) { + throw new Error('ChainSDK is required to send manifest'); + } + + // Query provider using chain SDK (v1beta4 API) + const providerRes = await chainSDK.akash.provider.v1beta4.getProvider({ owner: provider, }); - const tx = await client.Provider(request); - - if (tx.provider === undefined) { + if (providerRes.provider === undefined) { throw new Error(`Could not find provider ${provider}`); } - const providerInfo = tx.provider; + const providerInfo = providerRes.provider; const manifest = sdl.manifestSortedJSON(); const path = `/deployment/${dseq}/manifest`; const uri = new URL(providerInfo.hostUri); + + // Create HTTPS agent with mTLS credentials + // IMPORTANT: Use a custom servername that doesn't match the provider's hostname + // This triggers mTLS mode on the provider (vs Let's Encrypt mode when SNI matches) const agent = new https.Agent({ cert: certificate.cert, key: certificate.privateKey, rejectUnauthorized: false, + // Use 'localhost' as SNI to trigger mTLS mode on the provider + servername: 'localhost', }); return await new Promise((resolve, reject) => { @@ -90,23 +91,24 @@ export async function sendManifest(sdl: SDL, lease: CustomLease, certificate: Ce headers: { 'Content-Type': 'application/json', Accept: 'application/json', - 'Content-Length': manifest.length, + 'Content-Length': Buffer.byteLength(manifest), }, agent: agent, }, (res) => { res.on('error', reject); + let responseBody = ''; res.on('data', (chunk) => { - // Helpful for debugging - //console.warn("Response:", chunk.toString()); + responseBody += chunk.toString(); }); - if (res.statusCode !== 200) { - return reject(`Could not send manifest: ${res.statusCode}`); - } - - resolve(); + res.on('end', () => { + if (res.statusCode !== 200) { + return reject(new Error(`Could not send manifest: ${res.statusCode} - ${responseBody}`)); + } + resolve(); + }); } ); diff --git a/src/tools/update-deployment.ts b/src/tools/update-deployment.ts index f048b6f..08c29d1 100644 --- a/src/tools/update-deployment.ts +++ b/src/tools/update-deployment.ts @@ -1,11 +1,10 @@ import { z } from 'zod'; import type { ToolDefinition, ToolContext } from '../types/index.js'; -import { MsgUpdateDeployment } from '@akashnetwork/akash-api/akash/deployment/v1beta3'; -import { SDL } from '@akashnetwork/akashjs/build/sdl/SDL/SDL.js'; +import { SDL } from '@akashnetwork/chain-sdk'; import { createOutput } from '../utils/create-output.js'; -import { getTypeUrl } from '@akashnetwork/akashjs/build/stargate/index.js'; import { sendManifest } from './send-manifest.js'; import { queryLeases } from '../utils/query-leases.js'; + const parameters = z.object({ rawSDL: z.string().min(1), provider: z.string().min(1), @@ -21,10 +20,10 @@ export const UpdateDeploymentTool: ToolDefinition = { parameters, handler: async (params: z.infer, context: ToolContext) => { const { rawSDL, provider } = params; - const { wallet, client, certificate } = context; + const { wallet, chainSDK, certificate } = context; try { - // Parse SDL directly from the string + // Parse SDL directly from the string using chain-sdk const sdl = SDL.fromString(rawSDL, 'beta3'); const accounts = await wallet.getAccounts(); @@ -32,7 +31,7 @@ export const UpdateDeploymentTool: ToolDefinition = { return createOutput({ error: 'No accounts found in wallet' }); } - const leases = await queryLeases(accounts[0].address, params.dseq, provider); + const leases = await queryLeases(chainSDK, accounts[0].address, params.dseq, provider); if (leases.leases.length === 0) { return createOutput({ error: 'No leases found for deployment' }); @@ -40,37 +39,36 @@ export const UpdateDeploymentTool: ToolDefinition = { const lease = leases.leases[0]; - const msg = { - typeUrl: getTypeUrl(MsgUpdateDeployment), - value: MsgUpdateDeployment.fromPartial({ - id: { - owner: accounts[0].address, - dseq: params.dseq, - }, - version: await sdl.manifestVersion(), - }), - }; - - const tx = await client.signAndBroadcast(accounts[0].address, [msg], 'auto'); + // Update deployment using chain SDK (v1beta4 API) + const result = await chainSDK.akash.deployment.v1beta4.updateDeployment({ + id: { + owner: accounts[0].address, + dseq: BigInt(params.dseq), + }, + hash: await sdl.manifestVersion(), + }); const leaseId = { id: { - owner: lease.lease?.leaseId?.owner ?? '', - dseq: lease.lease?.leaseId?.dseq.toNumber() ?? 0, - gseq: lease.lease?.leaseId?.gseq ?? 0, - oseq: lease.lease?.leaseId?.oseq ?? 0, - provider: lease.lease?.leaseId?.provider ?? '', + owner: lease.lease?.id?.owner ?? '', + dseq: Number(lease.lease?.id?.dseq ?? 0), + gseq: lease.lease?.id?.gseq ?? 0, + oseq: lease.lease?.id?.oseq ?? 0, + provider: lease.lease?.id?.provider ?? '', }, }; // Send manifest to provider - await sendManifest(sdl, leaseId, certificate); + await sendManifest(sdl, leaseId, certificate, chainSDK); - return createOutput(tx.rawLog); - } catch (error: any) { + return createOutput({ + success: true, + result: result, + }); + } catch (error: unknown) { console.error('Error updating deployment:', error); return createOutput({ - error: error.message || 'Unknown error updating deployment', + error: error instanceof Error ? error.message : String(error) || 'Unknown error updating deployment', }); } }, diff --git a/src/types/index.ts b/src/types/index.ts index ed52f59..7e6ce84 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,14 +1,19 @@ import type { z } from 'zod'; -import type { SigningStargateClient } from '@cosmjs/stargate'; import type { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; import type { ReadResourceCallback } from '@modelcontextprotocol/sdk/server/mcp.js'; -import type { CertificatePem } from '@akashnetwork/akashjs/build/certificates/certificate-manager/CertificateManager.js'; +import type { CertificatePem } from '@akashnetwork/chain-sdk'; + +// Chain SDK types +export type ChainNodeSDK = ReturnType; +export type StargateTxClient = ReturnType; // Tool related types export interface ToolContext { - client: SigningStargateClient; + client: StargateTxClient; wallet: DirectSecp256k1HdWallet; certificate: CertificatePem; + chainSDK: ChainNodeSDK; + reloadCertificate?: () => Promise; } export interface ToolDefinition

{ diff --git a/src/utils/index.ts b/src/utils/index.ts index 87adaa2..300ef49 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,5 @@ export { loadWalletAndClient } from './load-wallet.js'; -export { loadCertificate } from './load-certificate.js'; +export { loadCertificate, loadCertificateFromDisk, pemToUint8Array } from './load-certificate.js'; export { createOutput } from './create-output.js'; export { getSDLTemplate } from './get-sdl-template.js'; export { getSDLTemplates } from './get-sdl-templates.js'; diff --git a/src/utils/load-certificate.ts b/src/utils/load-certificate.ts index e646528..772e8d3 100644 --- a/src/utils/load-certificate.ts +++ b/src/utils/load-certificate.ts @@ -1,21 +1,54 @@ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; -import * as cert from '@akashnetwork/akashjs/build/certificates/index.js'; -import { certificateManager } from '@akashnetwork/akashjs/build/certificates/certificate-manager/index.js'; +import { CertificateManager, type CertificatePem } from '@akashnetwork/chain-sdk'; import type { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; -import type { SigningStargateClient } from '@cosmjs/stargate'; -import type { CertificatePem } from '@akashnetwork/akashjs/build/certificates/certificate-manager/CertificateManager.js'; +import type { ChainNodeSDK } from '../types/index.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); +/** Convert PEM string to Uint8Array for chain SDK certificate operations. */ +export function pemToUint8Array(pem: string): Uint8Array { + return new TextEncoder().encode(pem); +} + +// Get the certificates directory path +export function getCertificatesDir(): string { + return path.resolve(__dirname, './certificates'); +} + +// Get the certificate path for a specific address +export function getCertificatePath(address: string): string { + return path.resolve(getCertificatesDir(), `${address}.json`); +} + +// Normalize PEM line endings to Unix-style (\n) +function normalizePem(pem: string): string { + return pem.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); +} + +// Load certificate directly from disk (no caching) +export function loadCertificateFromDisk(address: string): CertificatePem | null { + const certificatePath = getCertificatePath(address); + if (fs.existsSync(certificatePath)) { + const cert = JSON.parse(fs.readFileSync(certificatePath, 'utf8')) as CertificatePem; + // Normalize line endings for all PEM fields + return { + cert: normalizePem(cert.cert), + publicKey: normalizePem(cert.publicKey), + privateKey: normalizePem(cert.privateKey), + }; + } + return null; +} + export async function loadCertificate( wallet: DirectSecp256k1HdWallet, - client: SigningStargateClient + chainSDK?: ChainNodeSDK ): Promise { const accounts = await wallet.getAccounts(); - const certificatesDir = path.resolve(__dirname, './certificates'); + const certificatesDir = getCertificatesDir(); // Ensure certificates directory exists if (!fs.existsSync(certificatesDir)) { @@ -26,18 +59,45 @@ export async function loadCertificate( // check to see if we can load the certificate if (fs.existsSync(certificatePath)) { - return JSON.parse(fs.readFileSync(certificatePath, 'utf8')); + // Normalize line endings for mTLS compatibility + const cert = JSON.parse(fs.readFileSync(certificatePath, 'utf8')) as CertificatePem; + return { + cert: normalizePem(cert.cert), + publicKey: normalizePem(cert.publicKey), + privateKey: normalizePem(cert.privateKey), + }; } // if not, create a new one - const certificate = certificateManager.generatePEM(accounts[0].address); - const result = await cert.broadcastCertificate(certificate, accounts[0].address, client); + const certManager = new CertificateManager(); + const certificate = await certManager.generatePEM(accounts[0].address); - if (result.code === 0) { - // save the certificate - fs.writeFileSync(certificatePath, JSON.stringify(certificate)); - return certificate; + // Broadcast certificate using chain SDK if available + if (chainSDK) { + try { + await chainSDK.akash.cert.v1.createCertificate({ + owner: accounts[0].address, + cert: pemToUint8Array(certificate.cert), + pubkey: pemToUint8Array(certificate.publicKey), + }); + // save the certificate + fs.writeFileSync(certificatePath, JSON.stringify(certificate)); + return certificate; + } catch (error: unknown) { + // Check if certificate already exists on chain + const errorMessage = error instanceof Error ? error.message : String(error); + if (errorMessage.includes('certificate already exists')) { + fs.writeFileSync(certificatePath, JSON.stringify(certificate)); + return certificate; + } + throw new Error(`Could not create certificate: ${errorMessage}`); + } } - throw new Error(`Could not create certificate: ${result.rawLog} `); + // chainSDK is required to broadcast the certificate to the chain. + // Without it, providers won't recognize the certificate. + throw new Error( + 'Cannot create certificate: chainSDK is required to broadcast the certificate on-chain. ' + + 'Providers will reject certificates that are only saved locally.' + ); } diff --git a/src/utils/load-wallet.ts b/src/utils/load-wallet.ts index cf2bb91..78a1cac 100644 --- a/src/utils/load-wallet.ts +++ b/src/utils/load-wallet.ts @@ -1,21 +1,42 @@ -import { GasPrice, SigningStargateClient } from '@cosmjs/stargate'; -import { getAkashTypeRegistry } from '@akashnetwork/akashjs/build/stargate/index.js'; -import { DirectSecp256k1HdWallet, Registry } from '@cosmjs/proto-signing'; -import { SERVER_CONFIG } from '../config.js'; +import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; +import { createStargateClient, createChainNodeSDK } from '@akashnetwork/chain-sdk'; +import { SERVER_CONFIG, validateMnemonic } from '../config.js'; +import type { ChainNodeSDK, StargateTxClient } from '../types/index.js'; -export async function loadWalletAndClient() { - const wallet = await DirectSecp256k1HdWallet.fromMnemonic(SERVER_CONFIG.mnemonic, { +interface WalletAndClient { + wallet: DirectSecp256k1HdWallet; + client: StargateTxClient; + chainSDK: ChainNodeSDK; +} + +export async function loadWalletAndClient(): Promise { + const mnemonic = validateMnemonic(SERVER_CONFIG.mnemonic); + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { prefix: 'akash', }); - const registry = getAkashTypeRegistry(); - const client = await SigningStargateClient.connectWithSigner(SERVER_CONFIG.rpcEndpoint, wallet, { - registry: new Registry(registry), - gasPrice: GasPrice.fromString('0.025uakt'), + // Create the stargate client using chain-sdk (includes proper type registry) + const stargateClient = createStargateClient({ + baseUrl: SERVER_CONFIG.rpcEndpoint, + signer: wallet, + defaultGasPrice: '0.025uakt', + gasMultiplier: 2.0, // Increased from default 1.3 to handle deployment updates + }); + + // Create the chain SDK for queries and transactions + // Use configured gRPC endpoint (public Akash gRPC endpoints use TLS on port 443) + const chainSDK = createChainNodeSDK({ + query: { + baseUrl: SERVER_CONFIG.grpcEndpoint, + }, + tx: { + signer: stargateClient, + }, }); return { wallet, - client, + client: stargateClient, + chainSDK, }; } diff --git a/src/utils/query-lease.ts b/src/utils/query-lease.ts deleted file mode 100644 index 94b0a4f..0000000 --- a/src/utils/query-lease.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - QueryLeaseRequest, - QueryClientImpl as QueryMarketClient, -} from '@akashnetwork/akash-api/akash/market/v1beta4'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; -import { SERVER_CONFIG } from '../config.js'; - -export async function queryLease( - owner: string, - dseq: number, - gseq: number, - oseq: number, - provider: string -) { - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); - const marketClient = new QueryMarketClient(rpc); - - const request = QueryLeaseRequest.fromPartial({ - id: { - owner, - dseq, - gseq, - oseq, - provider, - }, - }); - - const lease = await marketClient.Lease(request); - - return lease; -} diff --git a/src/utils/query-leases.ts b/src/utils/query-leases.ts index bcbac3d..c440650 100644 --- a/src/utils/query-leases.ts +++ b/src/utils/query-leases.ts @@ -1,24 +1,16 @@ -import { - QueryLeaseRequest, - QueryLeasesRequest, - QueryClientImpl as QueryMarketClient, -} from '@akashnetwork/akash-api/akash/market/v1beta4'; -import { getRpc } from '@akashnetwork/akashjs/build/rpc/index.js'; -import { SERVER_CONFIG } from '../config.js'; +import type { ChainNodeSDK } from '../types/index.js'; -export async function queryLeases(owner: string, dseq: number, provider: string) { - const rpc = await getRpc(SERVER_CONFIG.rpcEndpoint); - const marketClient = new QueryMarketClient(rpc); - - const request = QueryLeasesRequest.fromPartial({ +// Using explicit any to avoid complex type inference issues with chain-sdk +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export async function queryLeases(chainSDK: ChainNodeSDK, owner: string, dseq: number, provider: string): Promise { + // Query leases using chain SDK (v1beta5 API) + const leases = await chainSDK.akash.market.v1beta5.getLeases({ filters: { owner, - dseq, + dseq: BigInt(dseq), provider, }, }); - const leases = await marketClient.Leases(request); - return leases; } diff --git a/tests/tools/close-deployment.test.ts b/tests/tools/close-deployment.test.ts new file mode 100644 index 0000000..65e9bdb --- /dev/null +++ b/tests/tools/close-deployment.test.ts @@ -0,0 +1,123 @@ +import { describe, it, expect, vi } from 'vitest'; +import { CloseDeploymentTool } from '../../src/tools/close-deployment.js'; +import type { ToolContext } from '../../src/types/index.js'; + +describe('CloseDeploymentTool', () => { + describe('metadata', () => { + it('should have correct name', () => { + expect(CloseDeploymentTool.name).toBe('close-deployment'); + }); + + it('should have a description mentioning dseq', () => { + expect(CloseDeploymentTool.description).toContain('dseq'); + }); + }); + + describe('parameter validation', () => { + it('should accept valid dseq', () => { + const result = CloseDeploymentTool.parameters.safeParse({ + dseq: 12345, + }); + expect(result.success).toBe(true); + }); + + it('should reject missing dseq', () => { + const result = CloseDeploymentTool.parameters.safeParse({}); + expect(result.success).toBe(false); + }); + + it('should reject dseq less than 1', () => { + const result = CloseDeploymentTool.parameters.safeParse({ + dseq: 0, + }); + expect(result.success).toBe(false); + }); + + it('should reject negative dseq', () => { + const result = CloseDeploymentTool.parameters.safeParse({ + dseq: -1, + }); + expect(result.success).toBe(false); + }); + }); + + describe('handler', () => { + it('should close deployment successfully', async () => { + const mockResult = { hash: 'abc123', code: 0 }; + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([{ address: 'akash1owner' }]), + }, + chainSDK: { + akash: { + deployment: { + v1beta4: { + closeDeployment: vi.fn().mockResolvedValue(mockResult), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await CloseDeploymentTool.handler( + { dseq: 12345 }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.success).toBe(true); + expect(parsed.result).toEqual(mockResult); + + // Verify correct parameters + expect(mockContext.chainSDK.akash.deployment.v1beta4.closeDeployment).toHaveBeenCalledWith({ + id: { + owner: 'akash1owner', + dseq: BigInt(12345), + }, + }); + }); + + it('should return error when no accounts in wallet', async () => { + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([]), + }, + chainSDK: {}, + } as unknown as ToolContext; + + const result = await CloseDeploymentTool.handler( + { dseq: 12345 }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.error).toContain('No accounts found'); + }); + + it('should handle chain SDK errors gracefully', async () => { + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([{ address: 'akash1owner' }]), + }, + chainSDK: { + akash: { + deployment: { + v1beta4: { + closeDeployment: vi.fn().mockRejectedValue(new Error('Deployment not found')), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await CloseDeploymentTool.handler( + { dseq: 12345 }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('error'); + expect(parsed.error).toContain('Deployment not found'); + }); + }); +}); diff --git a/tests/tools/create-deployment.test.ts b/tests/tools/create-deployment.test.ts new file mode 100644 index 0000000..1b8d0eb --- /dev/null +++ b/tests/tools/create-deployment.test.ts @@ -0,0 +1,118 @@ +import { describe, it, expect, vi } from 'vitest'; +import { CreateDeploymentTool } from '../../src/tools/create-deployment.js'; +import type { ToolContext } from '../../src/types/index.js'; + +describe('CreateDeploymentTool', () => { + describe('metadata', () => { + it('should have correct name', () => { + expect(CreateDeploymentTool.name).toBe('create-deployment'); + }); + + it('should have a description mentioning SDL and deposit', () => { + expect(CreateDeploymentTool.description).toContain('SDL'); + expect(CreateDeploymentTool.description).toContain('deposit'); + }); + }); + + describe('parameter validation', () => { + const validParams = { + rawSDL: 'version: "2.0"\nservices:\n web:\n image: nginx', + deposit: 500000, + currency: 'uakt', + }; + + it('should accept valid parameters', () => { + const result = CreateDeploymentTool.parameters.safeParse(validParams); + expect(result.success).toBe(true); + }); + + it('should reject missing rawSDL', () => { + const result = CreateDeploymentTool.parameters.safeParse({ + deposit: 500000, + currency: 'uakt', + }); + expect(result.success).toBe(false); + }); + + it('should reject empty rawSDL', () => { + const result = CreateDeploymentTool.parameters.safeParse({ + rawSDL: '', + deposit: 500000, + currency: 'uakt', + }); + expect(result.success).toBe(false); + }); + + it('should reject missing deposit', () => { + const result = CreateDeploymentTool.parameters.safeParse({ + rawSDL: 'version: "2.0"', + currency: 'uakt', + }); + expect(result.success).toBe(false); + }); + + it('should reject deposit less than 1', () => { + const result = CreateDeploymentTool.parameters.safeParse({ + rawSDL: 'version: "2.0"', + deposit: 0, + currency: 'uakt', + }); + expect(result.success).toBe(false); + }); + + it('should reject missing currency', () => { + const result = CreateDeploymentTool.parameters.safeParse({ + rawSDL: 'version: "2.0"', + deposit: 500000, + }); + expect(result.success).toBe(false); + }); + + it('should reject empty currency', () => { + const result = CreateDeploymentTool.parameters.safeParse({ + rawSDL: 'version: "2.0"', + deposit: 500000, + currency: '', + }); + expect(result.success).toBe(false); + }); + }); + + describe('handler', () => { + it('should handle SDL parsing errors gracefully', async () => { + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([{ address: 'akash1abc' }]), + }, + chainSDK: {}, + } as unknown as ToolContext; + + // Invalid SDL will throw during parsing + const result = await CreateDeploymentTool.handler( + { rawSDL: 'invalid yaml: {{{{', deposit: 500000, currency: 'uakt' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('error'); + }); + + it('should handle incomplete SDL gracefully', async () => { + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([{ address: 'akash1abc' }]), + }, + chainSDK: {}, + } as unknown as ToolContext; + + // Incomplete SDL (missing services) will throw during parsing + const result = await CreateDeploymentTool.handler( + { rawSDL: 'version: "2.0"', deposit: 500000, currency: 'uakt' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('error'); + }); + }); +}); diff --git a/tests/tools/create-lease.test.ts b/tests/tools/create-lease.test.ts new file mode 100644 index 0000000..e9e5cb4 --- /dev/null +++ b/tests/tools/create-lease.test.ts @@ -0,0 +1,157 @@ +import { describe, it, expect, vi } from 'vitest'; +import { CreateLeaseTool } from '../../src/tools/create-lease.js'; +import type { ToolContext } from '../../src/types/index.js'; + +describe('CreateLeaseTool', () => { + describe('metadata', () => { + it('should have correct name', () => { + expect(CreateLeaseTool.name).toBe('create-lease'); + }); + + it('should have a description mentioning bid', () => { + expect(CreateLeaseTool.description).toContain('bid'); + }); + }); + + describe('parameter validation', () => { + const validParams = { + owner: 'akash1abc123', + dseq: 12345, + gseq: 1, + oseq: 1, + provider: 'akash1provider', + }; + + it('should accept valid parameters', () => { + const result = CreateLeaseTool.parameters.safeParse(validParams); + expect(result.success).toBe(true); + }); + + it('should reject missing owner', () => { + const { owner, ...params } = validParams; + const result = CreateLeaseTool.parameters.safeParse(params); + expect(result.success).toBe(false); + }); + + it('should reject missing dseq', () => { + const { dseq, ...params } = validParams; + const result = CreateLeaseTool.parameters.safeParse(params); + expect(result.success).toBe(false); + }); + + it('should reject missing gseq', () => { + const { gseq, ...params } = validParams; + const result = CreateLeaseTool.parameters.safeParse(params); + expect(result.success).toBe(false); + }); + + it('should reject missing oseq', () => { + const { oseq, ...params } = validParams; + const result = CreateLeaseTool.parameters.safeParse(params); + expect(result.success).toBe(false); + }); + + it('should reject missing provider', () => { + const { provider, ...params } = validParams; + const result = CreateLeaseTool.parameters.safeParse(params); + expect(result.success).toBe(false); + }); + + it('should reject dseq less than 1', () => { + const result = CreateLeaseTool.parameters.safeParse({ + ...validParams, + dseq: 0, + }); + expect(result.success).toBe(false); + }); + + it('should reject empty owner', () => { + const result = CreateLeaseTool.parameters.safeParse({ + ...validParams, + owner: '', + }); + expect(result.success).toBe(false); + }); + + it('should reject empty provider', () => { + const result = CreateLeaseTool.parameters.safeParse({ + ...validParams, + provider: '', + }); + expect(result.success).toBe(false); + }); + }); + + describe('handler', () => { + it('should create lease successfully', async () => { + const mockResult = { hash: 'abc123', code: 0 }; + const mockContext = { + chainSDK: { + akash: { + market: { + v1beta5: { + createLease: vi.fn().mockResolvedValue(mockResult), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await CreateLeaseTool.handler( + { + owner: 'akash1abc', + dseq: 12345, + gseq: 1, + oseq: 1, + provider: 'akash1provider', + }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.success).toBe(true); + expect(parsed.result).toEqual(mockResult); + + // Verify the correct parameters were passed + expect(mockContext.chainSDK.akash.market.v1beta5.createLease).toHaveBeenCalledWith({ + bidId: { + owner: 'akash1abc', + dseq: BigInt(12345), + gseq: 1, + oseq: 1, + provider: 'akash1provider', + bseq: 0, + }, + }); + }); + + it('should handle errors gracefully', async () => { + const mockContext = { + chainSDK: { + akash: { + market: { + v1beta5: { + createLease: vi.fn().mockRejectedValue(new Error('Lease creation failed')), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await CreateLeaseTool.handler( + { + owner: 'akash1abc', + dseq: 12345, + gseq: 1, + oseq: 1, + provider: 'akash1provider', + }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('error'); + expect(parsed.error).toContain('Lease creation failed'); + }); + }); +}); diff --git a/tests/tools/get-account-addr.test.ts b/tests/tools/get-account-addr.test.ts new file mode 100644 index 0000000..e567631 --- /dev/null +++ b/tests/tools/get-account-addr.test.ts @@ -0,0 +1,49 @@ +import { describe, it, expect, vi } from 'vitest'; +import { GetAccountAddrTool } from '../../src/tools/get-account-addr.js'; +import type { ToolContext } from '../../src/types/index.js'; + +describe('GetAccountAddrTool', () => { + describe('metadata', () => { + it('should have correct name', () => { + expect(GetAccountAddrTool.name).toBe('get-akash-account-addr'); + }); + + it('should have a description', () => { + expect(GetAccountAddrTool.description).toBeDefined(); + expect(GetAccountAddrTool.description.length).toBeGreaterThan(0); + }); + + it('should have empty parameters schema', () => { + const result = GetAccountAddrTool.parameters.safeParse({}); + expect(result.success).toBe(true); + }); + }); + + describe('handler', () => { + it('should return the account address from wallet', async () => { + const mockAddress = 'akash1degudmhf24auhfnqtn99mkja3xt7clt9um77tn'; + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([{ address: mockAddress }]), + }, + } as unknown as ToolContext; + + const result = await GetAccountAddrTool.handler({}, mockContext); + + expect(result.content[0].text).toBe(JSON.stringify(mockAddress)); + expect(mockContext.wallet.getAccounts).toHaveBeenCalledOnce(); + }); + + it('should return "Account not found" when address is empty', async () => { + const mockContext = { + wallet: { + getAccounts: vi.fn().mockResolvedValue([{ address: '' }]), + }, + } as unknown as ToolContext; + + const result = await GetAccountAddrTool.handler({}, mockContext); + + expect(result.content[0].text).toBe(JSON.stringify('Account not found')); + }); + }); +}); diff --git a/tests/tools/get-balances.test.ts b/tests/tools/get-balances.test.ts new file mode 100644 index 0000000..527f7ba --- /dev/null +++ b/tests/tools/get-balances.test.ts @@ -0,0 +1,113 @@ +import { describe, it, expect, vi } from 'vitest'; +import { GetBalancesTool } from '../../src/tools/get-balances.js'; +import type { ToolContext } from '../../src/types/index.js'; + +describe('GetBalancesTool', () => { + describe('metadata', () => { + it('should have correct name', () => { + expect(GetBalancesTool.name).toBe('get-akash-balances'); + }); + + it('should have a description mentioning AKT', () => { + expect(GetBalancesTool.description).toContain('AKT'); + }); + }); + + describe('parameter validation', () => { + it('should accept valid address', () => { + const result = GetBalancesTool.parameters.safeParse({ + address: 'akash1degudmhf24auhfnqtn99mkja3xt7clt9um77tn', + }); + expect(result.success).toBe(true); + }); + + it('should reject missing address', () => { + const result = GetBalancesTool.parameters.safeParse({}); + expect(result.success).toBe(false); + }); + + it('should reject empty address', () => { + const result = GetBalancesTool.parameters.safeParse({ + address: '', + }); + expect(result.success).toBe(false); + }); + }); + + describe('handler', () => { + it('should return balances from chain SDK', async () => { + const mockBalances = [ + { denom: 'uakt', amount: '1000000' }, + { denom: 'ibc/abc123', amount: '500000' }, + ]; + + const mockContext = { + chainSDK: { + cosmos: { + bank: { + v1beta1: { + getAllBalances: vi.fn().mockResolvedValue({ balances: mockBalances }), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await GetBalancesTool.handler( + { address: 'akash1abc' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toEqual(mockBalances); + expect(mockContext.chainSDK.cosmos.bank.v1beta1.getAllBalances).toHaveBeenCalledWith({ + address: 'akash1abc', + }); + }); + + it('should handle errors gracefully', async () => { + const mockContext = { + chainSDK: { + cosmos: { + bank: { + v1beta1: { + getAllBalances: vi.fn().mockRejectedValue(new Error('RPC error')), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await GetBalancesTool.handler( + { address: 'akash1abc' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('error'); + expect(parsed.error).toContain('RPC error'); + }); + + it('should return empty array when no balances', async () => { + const mockContext = { + chainSDK: { + cosmos: { + bank: { + v1beta1: { + getAllBalances: vi.fn().mockResolvedValue({ balances: [] }), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await GetBalancesTool.handler( + { address: 'akash1abc' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toEqual([]); + }); + }); +}); diff --git a/tests/tools/get-bids.test.ts b/tests/tools/get-bids.test.ts new file mode 100644 index 0000000..145e2f3 --- /dev/null +++ b/tests/tools/get-bids.test.ts @@ -0,0 +1,157 @@ +import { describe, it, expect, vi } from 'vitest'; +import { GetBidsTool } from '../../src/tools/get-bids.js'; +import type { ToolContext } from '../../src/types/index.js'; + +describe('GetBidsTool', () => { + describe('metadata', () => { + it('should have correct name', () => { + expect(GetBidsTool.name).toBe('get-bids'); + }); + + it('should have a description', () => { + expect(GetBidsTool.description).toBeDefined(); + expect(GetBidsTool.description).toContain('bids'); + }); + }); + + describe('parameter validation', () => { + it('should accept valid parameters', () => { + const result = GetBidsTool.parameters.safeParse({ + dseq: 12345, + owner: 'akash1abc123', + }); + expect(result.success).toBe(true); + }); + + it('should reject missing dseq', () => { + const result = GetBidsTool.parameters.safeParse({ + owner: 'akash1abc123', + }); + expect(result.success).toBe(false); + }); + + it('should reject missing owner', () => { + const result = GetBidsTool.parameters.safeParse({ + dseq: 12345, + }); + expect(result.success).toBe(false); + }); + + it('should reject non-positive dseq', () => { + const result = GetBidsTool.parameters.safeParse({ + dseq: 0, + owner: 'akash1abc123', + }); + expect(result.success).toBe(false); + }); + + it('should reject negative dseq', () => { + const result = GetBidsTool.parameters.safeParse({ + dseq: -1, + owner: 'akash1abc123', + }); + expect(result.success).toBe(false); + }); + + it('should reject empty owner string', () => { + const result = GetBidsTool.parameters.safeParse({ + dseq: 12345, + owner: '', + }); + expect(result.success).toBe(false); + }); + + it('should reject non-integer dseq', () => { + const result = GetBidsTool.parameters.safeParse({ + dseq: 123.45, + owner: 'akash1abc123', + }); + expect(result.success).toBe(false); + }); + }); + + describe('handler', () => { + it('should return bids when found', async () => { + // Use regular numbers instead of BigInt to avoid JSON serialization issues + const mockBids = [ + { + bid: { + id: { owner: 'akash1abc', dseq: 12345, gseq: 1, oseq: 1, provider: 'akash1provider', bseq: 0 }, + state: 1, // BidState.open + price: { denom: 'uakt', amount: '1000' }, + createdAt: 1234567890, + }, + }, + ]; + + const mockContext = { + chainSDK: { + akash: { + market: { + v1beta5: { + getBids: vi.fn().mockResolvedValue({ bids: mockBids }), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await GetBidsTool.handler( + { dseq: 12345, owner: 'akash1abc' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(Array.isArray(parsed)).toBe(true); + expect(parsed).toHaveLength(1); + expect(parsed[0]).toHaveProperty('bidId'); + expect(parsed[0]).toHaveProperty('state'); + expect(parsed[0]).toHaveProperty('price'); + }); + + it('should return message when no bids found', async () => { + const mockContext = { + chainSDK: { + akash: { + market: { + v1beta5: { + getBids: vi.fn().mockResolvedValue({ bids: [] }), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await GetBidsTool.handler( + { dseq: 12345, owner: 'akash1abc' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toContain('No bids found'); + }); + + it('should handle errors gracefully', async () => { + const mockContext = { + chainSDK: { + akash: { + market: { + v1beta5: { + getBids: vi.fn().mockRejectedValue(new Error('Network error')), + }, + }, + }, + }, + } as unknown as ToolContext; + + const result = await GetBidsTool.handler( + { dseq: 12345, owner: 'akash1abc' }, + mockContext + ); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('error'); + expect(parsed.error).toContain('Network error'); + }); + }); +}); diff --git a/tests/utils/create-output.test.ts b/tests/utils/create-output.test.ts new file mode 100644 index 0000000..2b274e6 --- /dev/null +++ b/tests/utils/create-output.test.ts @@ -0,0 +1,60 @@ +import { describe, it, expect } from 'vitest'; +import { createOutput } from '../../src/utils/create-output.js'; + +describe('createOutput', () => { + it('should return a valid MCP tool response with string content', () => { + const result = createOutput('test string'); + + expect(result).toHaveProperty('content'); + expect(result.content).toHaveLength(1); + expect(result.content[0]).toEqual({ + type: 'text', + text: '"test string"', + }); + }); + + it('should serialize objects to JSON', () => { + const obj = { foo: 'bar', num: 42 }; + const result = createOutput(obj); + + expect(result.content[0].text).toBe(JSON.stringify(obj)); + expect(JSON.parse(result.content[0].text)).toEqual(obj); + }); + + it('should serialize arrays to JSON', () => { + const arr = [1, 2, 3, { nested: true }]; + const result = createOutput(arr); + + expect(result.content[0].text).toBe(JSON.stringify(arr)); + expect(JSON.parse(result.content[0].text)).toEqual(arr); + }); + + it('should handle null values', () => { + const result = createOutput(null); + expect(result.content[0].text).toBe('null'); + }); + + it('should handle numbers', () => { + const result = createOutput(12345); + expect(result.content[0].text).toBe('12345'); + }); + + it('should handle boolean values', () => { + expect(createOutput(true).content[0].text).toBe('true'); + expect(createOutput(false).content[0].text).toBe('false'); + }); + + it('should handle complex nested structures', () => { + const complex = { + deployment: { + dseq: 12345, + owner: 'akash1abc...', + groups: [{ name: 'web', count: 1 }], + }, + status: 'active', + }; + const result = createOutput(complex); + + expect(JSON.parse(result.content[0].text)).toEqual(complex); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 2aaa7cf..ec55199 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,5 +13,5 @@ "resolveJsonModule": true }, "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..6bfdb82 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,15 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + include: ['tests/**/*.test.ts'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + include: ['src/**/*.ts'], + exclude: ['src/**/*.test.ts', 'src/index.ts'], + }, + }, +});