]> git.codecow.com Git - libnemo.git/commitdiff
Start scaffolding DMK implementation which requires workspaces to manage diverging...
authorChris Duncan <chris@zoso.dev>
Wed, 24 Sep 2025 06:07:09 +0000 (23:07 -0700)
committerChris Duncan <chris@zoso.dev>
Wed, 24 Sep 2025 06:07:09 +0000 (23:07 -0700)
package-lock.json
package.json
src/lib/ledger/ble/index.ts [new file with mode: 0644]
src/lib/ledger/ble/package.json [new file with mode: 0644]
src/lib/ledger/ble/package.json.license [new file with mode: 0644]
src/lib/ledger/hid/index.ts [new file with mode: 0644]
src/lib/ledger/hid/package.json [new file with mode: 0644]
src/lib/ledger/hid/package.json.license [new file with mode: 0644]
src/lib/ledger/index.ts [moved from src/lib/ledger.ts with 97% similarity]

index 0211878f5a13ede144324e2e8e41bf1cda034dfd..8d404a134f8ac85a39652bb8de57d56a9db217b5 100644 (file)
@@ -8,11 +8,14 @@
                        "name": "libnemo",
                        "version": "0.10.0",
                        "license": "(GPL-3.0-or-later AND MIT AND ISC)",
+                       "workspaces": [
+                               "src/lib/ledger/*"
+                       ],
                        "dependencies": {
-                               "@ledgerhq/hw-transport-web-ble": "^6.29.10",
-                               "@ledgerhq/hw-transport-webhid": "^6.30.6",
-                               "@ledgerhq/hw-transport-webusb": "^6.29.10",
-                               "nano-pow": "^5.1.7"
+                               "@ledgerhq/device-management-kit": "0.9.0",
+                               "@ledgerhq/dmk-ble": "file:src/lib/ledger/ble",
+                               "@ledgerhq/dmk-hid": "file:src/lib/ledger/hid",
+                               "nano-pow": "5.1.7"
                        },
                        "devDependencies": {
                                "@types/node": "^24.5.0",
                                "node": ">=18"
                        }
                },
-               "node_modules/@ledgerhq/devices": {
-                       "version": "8.5.1",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.5.1.tgz",
-                       "integrity": "sha512-oW75YQQiP2muHveXTuwSAze6CBxJ7jOYILhFiJbsVzmgLPVqtdw4s0bJJlOBft4Aup67yNAjboFCIU7kTYQBFg==",
-                       "license": "Apache-2.0",
+               "node_modules/@inversifyjs/common": {
+                       "version": "1.5.0",
+                       "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.0.tgz",
+                       "integrity": "sha512-Qj5BELk11AfI2rgZEAaLPmOftmQRLLmoCXgAjmaF0IngQN5vHomVT5ML7DZ3+CA5fgGcEVMcGbUDAun+Rz+oNg==",
+                       "license": "MIT"
+               },
+               "node_modules/@inversifyjs/container": {
+                       "version": "1.9.1",
+                       "resolved": "https://registry.npmjs.org/@inversifyjs/container/-/container-1.9.1.tgz",
+                       "integrity": "sha512-8EhjFoAx1LoD7TpCuP9ptitwc+7kVXEpZB0IeoEsCQb9sWaNYYaBi+7Lommu3/1nYxdMbX2t7AJhQnryT1EEsg==",
+                       "license": "MIT",
                        "dependencies": {
-                               "@ledgerhq/errors": "^6.25.0",
-                               "@ledgerhq/logs": "^6.13.0",
-                               "rxjs": "^7.8.1",
-                               "semver": "^7.3.5"
+                               "@inversifyjs/common": "1.5.0",
+                               "@inversifyjs/core": "5.2.0",
+                               "@inversifyjs/reflect-metadata-utils": "1.1.0"
+                       },
+                       "peerDependencies": {
+                               "reflect-metadata": "~0.2.2"
                        }
                },
-               "node_modules/@ledgerhq/errors": {
-                       "version": "6.25.0",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.25.0.tgz",
-                       "integrity": "sha512-9cU0dgUyq3Adb1bHAjJnbwl+r+4WBjuPq0k+/DbBNpuYHwcz2xKtRIjLimUJyACjHti3iWwRt1sFcbQDDdI08w==",
-                       "license": "Apache-2.0"
-               },
-               "node_modules/@ledgerhq/hw-transport": {
-                       "version": "6.31.10",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.31.10.tgz",
-                       "integrity": "sha512-ruNtkTPMO3rFCaSM+oPTOXXerzxWFZF43pAHVAHhsjiQGhLWzLSkMc7qBEpWIpZPubKRAbWSXR2zXBIJPNy8oQ==",
-                       "license": "Apache-2.0",
+               "node_modules/@inversifyjs/core": {
+                       "version": "5.2.0",
+                       "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-5.2.0.tgz",
+                       "integrity": "sha512-MMaHGGRjQWT9uAof63sbZyEhRl4XptEAE17DJwrgUcN9LsdIEvecKP3r53pE9VF88PFR41knUKKzagUBvWLHmw==",
+                       "license": "MIT",
                        "dependencies": {
-                               "@ledgerhq/devices": "8.5.1",
-                               "@ledgerhq/errors": "^6.25.0",
-                               "@ledgerhq/logs": "^6.13.0",
-                               "events": "^3.3.0"
+                               "@inversifyjs/common": "1.5.0",
+                               "@inversifyjs/prototype-utils": "0.1.0",
+                               "@inversifyjs/reflect-metadata-utils": "1.1.0"
                        }
                },
-               "node_modules/@ledgerhq/hw-transport-web-ble": {
-                       "version": "6.29.10",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-web-ble/-/hw-transport-web-ble-6.29.10.tgz",
-                       "integrity": "sha512-c4MrXSS4UfPsq0Qk7C1bLGXp7OnQtifDswaEQpvjoOQ57fArObh5rpYzUuBxNPHhwh/3zNcqIWNkR0oe4ugP5Q==",
-                       "license": "Apache-2.0",
+               "node_modules/@inversifyjs/prototype-utils": {
+                       "version": "0.1.0",
+                       "resolved": "https://registry.npmjs.org/@inversifyjs/prototype-utils/-/prototype-utils-0.1.0.tgz",
+                       "integrity": "sha512-lNz1yyajMRDXBHLvJsYYX81FcmeD15e5Qz1zAZ/3zeYTl+u7ZF/GxNRKJzNOloeMPMtuR8BnvzHA1SZxjR+J9w==",
+                       "license": "MIT",
                        "dependencies": {
-                               "@ledgerhq/devices": "8.5.1",
-                               "@ledgerhq/errors": "^6.25.0",
-                               "@ledgerhq/hw-transport": "^6.31.10",
-                               "@ledgerhq/logs": "^6.13.0",
-                               "rxjs": "^7.8.1"
+                               "@inversifyjs/common": "1.5.0"
+                       }
+               },
+               "node_modules/@inversifyjs/reflect-metadata-utils": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-1.1.0.tgz",
+                       "integrity": "sha512-jmuAuC3eL1GnFAYfJGJOMKRDL9q1mgzOyrban6zxfM8Yg1FUHsj25h27bW2G7p8X1Amvhg3MLkaOuogszkrofA==",
+                       "license": "MIT",
+                       "peerDependencies": {
+                               "reflect-metadata": "0.2.2"
                        }
                },
-               "node_modules/@ledgerhq/hw-transport-webhid": {
-                       "version": "6.30.6",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.30.6.tgz",
-                       "integrity": "sha512-AOzjFv5n1OTMfvEInAZRfLO11G5zfG8pB5zhmjK5d/mVQfFNcKsLZNAC2h4OZZMBtUy8UTT3n03z93e6k6n4pQ==",
+               "node_modules/@ledgerhq/device-management-kit": {
+                       "version": "0.9.0",
+                       "resolved": "https://registry.npmjs.org/@ledgerhq/device-management-kit/-/device-management-kit-0.9.0.tgz",
+                       "integrity": "sha512-zWcQ0TOerZU4tvBdHd7RWpmYB+nVN3aTZ/hHz5IVnESEmQa2m4YsmOb2vm55k3tvyc5yRW/sOqX83Bnr+y+G+w==",
                        "license": "Apache-2.0",
                        "dependencies": {
-                               "@ledgerhq/devices": "8.5.1",
-                               "@ledgerhq/errors": "^6.25.0",
-                               "@ledgerhq/hw-transport": "^6.31.10",
-                               "@ledgerhq/logs": "^6.13.0"
+                               "@sentry/minimal": "6.19.7",
+                               "axios": "1.8.2",
+                               "inversify": "7.5.1",
+                               "isomorphic-ws": "^5.0.0",
+                               "purify-ts": "2.1.0",
+                               "reflect-metadata": "0.2.2",
+                               "semver": "7.7.2",
+                               "url": "^0.11.4",
+                               "uuid": "11.0.3",
+                               "ws": "^8.18.0",
+                               "xstate": "5.19.2"
+                       },
+                       "peerDependencies": {
+                               "rxjs": "7.8.2"
                        }
                },
-               "node_modules/@ledgerhq/hw-transport-webusb": {
-                       "version": "6.29.10",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.29.10.tgz",
-                       "integrity": "sha512-3op7ipyZrM/Gg2qUBUM6tGKgYVh7k3hvXPE7z4i5ElAFHBdM5XMI4OD2cfl38XE0fij1dk/NCpKntOekIL7lmA==",
+               "node_modules/@ledgerhq/device-transport-kit-web-ble": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-web-ble/-/device-transport-kit-web-ble-1.2.0.tgz",
+                       "integrity": "sha512-tZfMK/xuxQB606sshDjg+b7QVI4GzTqP3yKk/w5SF+mb9ED8jq9nhRohJNJa34NiRQVauGoJsqO9mk5rZ2K/WQ==",
                        "license": "Apache-2.0",
                        "dependencies": {
-                               "@ledgerhq/devices": "8.5.1",
-                               "@ledgerhq/errors": "^6.25.0",
-                               "@ledgerhq/hw-transport": "^6.31.10",
-                               "@ledgerhq/logs": "^6.13.0"
+                               "@sentry/minimal": "6.19.7",
+                               "purify-ts": "2.1.0",
+                               "uuid": "11.0.3"
+                       },
+                       "peerDependencies": {
+                               "@ledgerhq/device-management-kit": "0.9.0",
+                               "rxjs": "7.8.2"
                        }
                },
-               "node_modules/@ledgerhq/logs": {
-                       "version": "6.13.0",
-                       "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.13.0.tgz",
-                       "integrity": "sha512-4+qRW2Pc8V+btL0QEmdB2X+uyx0kOWMWE1/LWsq5sZy3Q5tpi4eItJS6mB0XL3wGW59RQ+8bchNQQ1OW/va8Og==",
-                       "license": "Apache-2.0"
+               "node_modules/@ledgerhq/dmk-ble": {
+                       "resolved": "src/lib/ledger/ble",
+                       "link": true
+               },
+               "node_modules/@ledgerhq/dmk-hid": {
+                       "resolved": "src/lib/ledger/hid",
+                       "link": true
                },
                "node_modules/@puppeteer/browsers": {
                        "version": "2.10.10",
                                "node": ">=18"
                        }
                },
+               "node_modules/@sentry/hub": {
+                       "version": "6.19.7",
+                       "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz",
+                       "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==",
+                       "license": "BSD-3-Clause",
+                       "dependencies": {
+                               "@sentry/types": "6.19.7",
+                               "@sentry/utils": "6.19.7",
+                               "tslib": "^1.9.3"
+                       },
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/@sentry/minimal": {
+                       "version": "6.19.7",
+                       "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz",
+                       "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==",
+                       "license": "BSD-3-Clause",
+                       "dependencies": {
+                               "@sentry/hub": "6.19.7",
+                               "@sentry/types": "6.19.7",
+                               "tslib": "^1.9.3"
+                       },
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/@sentry/types": {
+                       "version": "6.19.7",
+                       "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz",
+                       "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==",
+                       "license": "BSD-3-Clause",
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/@sentry/utils": {
+                       "version": "6.19.7",
+                       "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz",
+                       "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==",
+                       "license": "BSD-3-Clause",
+                       "dependencies": {
+                               "@sentry/types": "6.19.7",
+                               "tslib": "^1.9.3"
+                       },
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
                "node_modules/@tootallnate/quickjs-emscripten": {
                        "version": "0.23.0",
                        "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
                        "license": "MIT",
                        "optional": true
                },
+               "node_modules/@types/json-schema": {
+                       "version": "7.0.15",
+                       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+                       "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+                       "license": "MIT"
+               },
                "node_modules/@types/node": {
-                       "version": "24.5.1",
-                       "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.1.tgz",
-                       "integrity": "sha512-/SQdmUP2xa+1rdx7VwB9yPq8PaKej8TD5cQ+XfKDPWWC+VDJU4rvVVagXqKUzhKjtFoNA8rXDJAkCxQPAe00+Q==",
+                       "version": "24.5.2",
+                       "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz",
+                       "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==",
                        "devOptional": true,
                        "license": "MIT",
                        "dependencies": {
                                "node": ">=4"
                        }
                },
+               "node_modules/ast-types/node_modules/tslib": {
+                       "version": "2.8.1",
+                       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+                       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+                       "license": "0BSD",
+                       "optional": true
+               },
+               "node_modules/asynckit": {
+                       "version": "0.4.0",
+                       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+                       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+                       "license": "MIT"
+               },
+               "node_modules/axios": {
+                       "version": "1.12.2",
+                       "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz",
+                       "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "follow-redirects": "^1.15.6",
+                               "form-data": "^4.0.4",
+                               "proxy-from-env": "^1.1.0"
+                       }
+               },
                "node_modules/b4a": {
-                       "version": "1.7.1",
-                       "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.1.tgz",
-                       "integrity": "sha512-ZovbrBV0g6JxK5cGUF1Suby1vLfKjv4RWi8IxoaO/Mon8BDD9I21RxjHFtgQ+kskJqLAVyQZly3uMBui+vhc8Q==",
+                       "version": "1.7.2",
+                       "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.2.tgz",
+                       "integrity": "sha512-DyUOdz+E8R6+sruDpQNOaV0y/dBbV6X/8ZkxrDcR0Ifc3BgKlpgG0VAtfOozA0eMtJO5GGe9FsZhueLs00pTww==",
                        "license": "Apache-2.0",
                        "optional": true,
                        "peerDependencies": {
                                "node": "*"
                        }
                },
+               "node_modules/call-bind-apply-helpers": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+                       "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "es-errors": "^1.3.0",
+                               "function-bind": "^1.1.2"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/call-bound": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+                       "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "call-bind-apply-helpers": "^1.0.2",
+                               "get-intrinsic": "^1.3.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
                "node_modules/callsites": {
                        "version": "3.1.0",
                        "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
                        "license": "MIT",
                        "optional": true
                },
+               "node_modules/combined-stream": {
+                       "version": "1.0.8",
+                       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+                       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "delayed-stream": "~1.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.8"
+                       }
+               },
                "node_modules/cosmiconfig": {
                        "version": "9.0.0",
                        "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
                                "node": ">= 14"
                        }
                },
+               "node_modules/delayed-stream": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+                       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">=0.4.0"
+                       }
+               },
                "node_modules/devtools-protocol": {
                        "version": "0.0.1495869",
                        "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz",
                        "license": "BSD-3-Clause",
                        "optional": true
                },
+               "node_modules/dunder-proto": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+                       "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "call-bind-apply-helpers": "^1.0.1",
+                               "es-errors": "^1.3.0",
+                               "gopd": "^1.2.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
                "node_modules/emoji-regex": {
                        "version": "8.0.0",
                        "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
                                "is-arrayish": "^0.2.1"
                        }
                },
+               "node_modules/es-define-property": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+                       "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/es-errors": {
+                       "version": "1.3.0",
+                       "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+                       "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/es-object-atoms": {
+                       "version": "1.1.1",
+                       "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+                       "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "es-errors": "^1.3.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/es-set-tostringtag": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+                       "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "es-errors": "^1.3.0",
+                               "get-intrinsic": "^1.2.6",
+                               "has-tostringtag": "^1.0.2",
+                               "hasown": "^2.0.2"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
                "node_modules/esbuild": {
                        "version": "0.25.10",
                        "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz",
                                "node": ">=0.10.0"
                        }
                },
-               "node_modules/events": {
-                       "version": "3.3.0",
-                       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-                       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-                       "license": "MIT",
-                       "engines": {
-                               "node": ">=0.8.x"
+               "node_modules/events-universal": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+                       "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+                       "license": "Apache-2.0",
+                       "optional": true,
+                       "dependencies": {
+                               "bare-events": "^2.7.0"
                        }
                },
                "node_modules/extract-zip": {
                                "pend": "~1.2.0"
                        }
                },
+               "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==",
+                       "funding": [
+                               {
+                                       "type": "individual",
+                                       "url": "https://github.com/sponsors/RubenVerborgh"
+                               }
+                       ],
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">=4.0"
+                       },
+                       "peerDependenciesMeta": {
+                               "debug": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/form-data": {
+                       "version": "4.0.4",
+                       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+                       "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "asynckit": "^0.4.0",
+                               "combined-stream": "^1.0.8",
+                               "es-set-tostringtag": "^2.1.0",
+                               "hasown": "^2.0.2",
+                               "mime-types": "^2.1.12"
+                       },
+                       "engines": {
+                               "node": ">= 6"
+                       }
+               },
+               "node_modules/function-bind": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+                       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+                       "license": "MIT",
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
                "node_modules/get-caller-file": {
                        "version": "2.0.5",
                        "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
                                "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",
+                       "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "call-bind-apply-helpers": "^1.0.2",
+                               "es-define-property": "^1.0.1",
+                               "es-errors": "^1.3.0",
+                               "es-object-atoms": "^1.1.1",
+                               "function-bind": "^1.1.2",
+                               "get-proto": "^1.0.1",
+                               "gopd": "^1.2.0",
+                               "has-symbols": "^1.1.0",
+                               "hasown": "^2.0.2",
+                               "math-intrinsics": "^1.1.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/get-proto": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+                       "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "dunder-proto": "^1.0.1",
+                               "es-object-atoms": "^1.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
                "node_modules/get-stream": {
                        "version": "5.2.0",
                        "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
                                "node": ">= 14"
                        }
                },
+               "node_modules/gopd": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+                       "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/has-symbols": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+                       "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/has-tostringtag": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+                       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "has-symbols": "^1.0.3"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/hasown": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+                       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "function-bind": "^1.1.2"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
                "node_modules/http-proxy-agent": {
                        "version": "7.0.2",
                        "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
                                "url": "https://github.com/sponsors/sindresorhus"
                        }
                },
+               "node_modules/inversify": {
+                       "version": "7.5.1",
+                       "resolved": "https://registry.npmjs.org/inversify/-/inversify-7.5.1.tgz",
+                       "integrity": "sha512-oWWFDU2BXiuqZynGcLDDD4tqiWAeaEUCALlCj0vk/QwHGgZY/tzDFPuTmWMY3jwRmDIHxVDkcj9SL3MFTlCEDw==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "@inversifyjs/common": "1.5.0",
+                               "@inversifyjs/container": "1.9.1",
+                               "@inversifyjs/core": "5.2.0"
+                       },
+                       "peerDependencies": {
+                               "reflect-metadata": "~0.2.2"
+                       }
+               },
                "node_modules/ip-address": {
                        "version": "10.0.1",
                        "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
                                "node": ">=8"
                        }
                },
+               "node_modules/isomorphic-ws": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
+                       "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
+                       "license": "MIT",
+                       "peerDependencies": {
+                               "ws": "*"
+                       }
+               },
                "node_modules/js-tokens": {
                        "version": "4.0.0",
                        "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
                                "node": ">=12"
                        }
                },
+               "node_modules/math-intrinsics": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+                       "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/mime-db": {
+                       "version": "1.52.0",
+                       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+                       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.6"
+                       }
+               },
+               "node_modules/mime-types": {
+                       "version": "2.1.35",
+                       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+                       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "mime-db": "1.52.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.6"
+                       }
+               },
                "node_modules/mitt": {
                        "version": "3.0.1",
                        "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
                                "node": ">= 0.4.0"
                        }
                },
+               "node_modules/object-inspect": {
+                       "version": "1.13.4",
+                       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+                       "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+                       "license": "MIT",
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
                "node_modules/once": {
                        "version": "1.4.0",
                        "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
                        "version": "1.1.0",
                        "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
                        "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-                       "license": "MIT",
-                       "optional": true
+                       "license": "MIT"
                },
                "node_modules/pump": {
                        "version": "3.0.3",
                                "once": "^1.3.1"
                        }
                },
+               "node_modules/punycode": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+                       "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+                       "license": "MIT"
+               },
                "node_modules/puppeteer": {
-                       "version": "24.22.0",
-                       "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.0.tgz",
-                       "integrity": "sha512-QabGIvu7F0hAMiKGHZCIRHMb6UoH0QAJA2OaqxEU2tL5noXPrxUcotg2l3ttOA4p1PFnVIGkr6PXRAWlM2evVQ==",
+                       "version": "24.22.2",
+                       "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.22.2.tgz",
+                       "integrity": "sha512-tsjIR24nAp/LfEhnBLw11yc0LxzwmB67obPrgqpDZxhub4i5nHxn9pKezcm46d583gdhotSETSA3q3Hbj+ZdNQ==",
                        "hasInstallScript": true,
                        "license": "Apache-2.0",
                        "optional": true,
                                "chromium-bidi": "8.0.0",
                                "cosmiconfig": "^9.0.0",
                                "devtools-protocol": "0.0.1495869",
-                               "puppeteer-core": "24.22.0",
+                               "puppeteer-core": "24.22.2",
                                "typed-query-selector": "^2.12.0"
                        },
                        "bin": {
                        }
                },
                "node_modules/puppeteer-core": {
-                       "version": "24.22.0",
-                       "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.0.tgz",
-                       "integrity": "sha512-oUeWlIg0pMz8YM5pu0uqakM+cCyYyXkHBxx9di9OUELu9X9+AYrNGGRLK9tNME3WfN3JGGqQIH3b4/E9LGek/w==",
+                       "version": "24.22.2",
+                       "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.2.tgz",
+                       "integrity": "sha512-J1WBOWE2AU57ntwH8EJe10xlpfdimMjmYDDVHna2iiBn85FemU7H6s46Thn+wb7VKqN+YeyYhSjDNE0+R8phoQ==",
                        "license": "Apache-2.0",
                        "optional": true,
                        "dependencies": {
                                "node": ">=18"
                        }
                },
+               "node_modules/purify-ts": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/purify-ts/-/purify-ts-2.1.0.tgz",
+                       "integrity": "sha512-+KNUHV9FxB9BbjadFdvxa+LNJIaqZmSF7CQH5Rv6+f0rBzsxm9FEqrvkALQbWYJobAja2ZCbBDUY7O4fH2znMA==",
+                       "license": "ISC",
+                       "dependencies": {
+                               "@types/json-schema": "7.0.15"
+                       }
+               },
+               "node_modules/qs": {
+                       "version": "6.14.0",
+                       "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+                       "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+                       "license": "BSD-3-Clause",
+                       "dependencies": {
+                               "side-channel": "^1.1.0"
+                       },
+                       "engines": {
+                               "node": ">=0.6"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/reflect-metadata": {
+                       "version": "0.2.2",
+                       "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
+                       "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
+                       "license": "Apache-2.0"
+               },
                "node_modules/require-directory": {
                        "version": "2.1.1",
                        "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
                        "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
                        "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
                        "license": "Apache-2.0",
+                       "peer": true,
                        "dependencies": {
                                "tslib": "^2.1.0"
                        }
                },
+               "node_modules/rxjs/node_modules/tslib": {
+                       "version": "2.8.1",
+                       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+                       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+                       "license": "0BSD",
+                       "peer": true
+               },
                "node_modules/semver": {
                        "version": "7.7.2",
                        "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
                                "node": ">=10"
                        }
                },
+               "node_modules/side-channel": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+                       "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "es-errors": "^1.3.0",
+                               "object-inspect": "^1.13.3",
+                               "side-channel-list": "^1.0.0",
+                               "side-channel-map": "^1.0.1",
+                               "side-channel-weakmap": "^1.0.2"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/side-channel-list": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+                       "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "es-errors": "^1.3.0",
+                               "object-inspect": "^1.13.3"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/side-channel-map": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+                       "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "call-bound": "^1.0.2",
+                               "es-errors": "^1.3.0",
+                               "get-intrinsic": "^1.2.5",
+                               "object-inspect": "^1.13.3"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/side-channel-weakmap": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+                       "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "call-bound": "^1.0.2",
+                               "es-errors": "^1.3.0",
+                               "get-intrinsic": "^1.2.5",
+                               "object-inspect": "^1.13.3",
+                               "side-channel-map": "^1.0.1"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
                "node_modules/smart-buffer": {
                        "version": "4.2.0",
                        "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
                        }
                },
                "node_modules/streamx": {
-                       "version": "2.22.1",
-                       "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz",
-                       "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==",
+                       "version": "2.23.0",
+                       "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
+                       "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
                        "license": "MIT",
                        "optional": true,
                        "dependencies": {
+                               "events-universal": "^1.0.0",
                                "fast-fifo": "^1.3.2",
                                "text-decoder": "^1.1.0"
-                       },
-                       "optionalDependencies": {
-                               "bare-events": "^2.2.0"
                        }
                },
                "node_modules/string-width": {
                        }
                },
                "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==",
+                       "version": "1.14.1",
+                       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+                       "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
                        "license": "0BSD"
                },
                "node_modules/typed-query-selector": {
                        "devOptional": true,
                        "license": "MIT"
                },
+               "node_modules/url": {
+                       "version": "0.11.4",
+                       "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+                       "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+                       "license": "MIT",
+                       "dependencies": {
+                               "punycode": "^1.4.1",
+                               "qs": "^6.12.3"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/uuid": {
+                       "version": "11.0.3",
+                       "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz",
+                       "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==",
+                       "funding": [
+                               "https://github.com/sponsors/broofa",
+                               "https://github.com/sponsors/ctavan"
+                       ],
+                       "license": "MIT",
+                       "bin": {
+                               "uuid": "dist/esm/bin/uuid"
+                       }
+               },
                "node_modules/webdriver-bidi-protocol": {
                        "version": "0.2.11",
                        "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz",
                        "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
                        "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
                        "license": "MIT",
-                       "optional": true,
                        "engines": {
                                "node": ">=10.0.0"
                        },
                                }
                        }
                },
+               "node_modules/xstate": {
+                       "version": "5.19.2",
+                       "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.19.2.tgz",
+                       "integrity": "sha512-B8fL2aP0ogn5aviAXFzI5oZseAMqN00fg/TeDa3ZtatyDcViYLIfuQl4y8qmHCiKZgGEzmnTyNtNQL9oeJE2gw==",
+                       "license": "MIT",
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/xstate"
+                       }
+               },
                "node_modules/y18n": {
                        "version": "5.0.8",
                        "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
                        "funding": {
                                "url": "https://github.com/sponsors/colinhacks"
                        }
+               },
+               "src/lib/ledger/ble": {
+                       "name": "@ledgerhq/dmk-ble",
+                       "version": "1.0.0",
+                       "dependencies": {
+                               "@ledgerhq/device-management-kit": "0.9.0",
+                               "@ledgerhq/device-transport-kit-web-ble": "1.2.0"
+                       }
+               },
+               "src/lib/ledger/hid": {
+                       "name": "@ledgerhq/dmk-hid",
+                       "version": "1.0.0",
+                       "dependencies": {
+                               "@ledgerhq/device-management-kit": "0.8.0",
+                               "@ledgerhq/device-transport-kit-web-hid": "1.2.0"
+                       }
+               },
+               "src/lib/ledger/hid/node_modules/@ledgerhq/device-management-kit": {
+                       "version": "0.8.0",
+                       "resolved": "https://registry.npmjs.org/@ledgerhq/device-management-kit/-/device-management-kit-0.8.0.tgz",
+                       "integrity": "sha512-KymU8UHfP9rz4JGSTpfhQvSpdckxZIaJY9bDm5BXE8C5pTWPu2jMj0m64j9pCuNi1gN6Z+IL6hZZIskKN5cszQ==",
+                       "license": "Apache-2.0",
+                       "dependencies": {
+                               "@sentry/minimal": "6.19.7",
+                               "axios": "1.8.2",
+                               "inversify": "7.5.1",
+                               "isomorphic-ws": "^5.0.0",
+                               "purify-ts": "2.1.0",
+                               "reflect-metadata": "0.2.2",
+                               "semver": "7.7.0",
+                               "url": "^0.11.4",
+                               "uuid": "11.0.3",
+                               "ws": "^8.18.0",
+                               "xstate": "5.19.2"
+                       },
+                       "peerDependencies": {
+                               "rxjs": "^7.8.2"
+                       }
+               },
+               "src/lib/ledger/hid/node_modules/@ledgerhq/device-transport-kit-web-hid": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/@ledgerhq/device-transport-kit-web-hid/-/device-transport-kit-web-hid-1.2.0.tgz",
+                       "integrity": "sha512-51kLHqrn1dP+0ZQLRyUBHIPSBNvx74hiIAMHrBkiCAedpmND/W522nslpX42bVf3tU3+I0Y51qn3WFvd8ZtIow==",
+                       "license": "Apache-2.0",
+                       "dependencies": {
+                               "@sentry/minimal": "6.19.7",
+                               "purify-ts": "2.1.0",
+                               "uuid": "11.0.3"
+                       },
+                       "peerDependencies": {
+                               "@ledgerhq/device-management-kit": "0.8.0",
+                               "rxjs": "^7.8.2"
+                       }
+               },
+               "src/lib/ledger/hid/node_modules/semver": {
+                       "version": "7.7.0",
+                       "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz",
+                       "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==",
+                       "license": "ISC",
+                       "bin": {
+                               "semver": "bin/semver.js"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
                }
        }
 }
index 871b98695aae9b47d0094802ede0ed42c4adb0ec..1e9de5dfe51f691138448371935c6d99544b3727 100644 (file)
        "imports": {
                "#types": "./src/types.d.ts"
        },
+       "workspaces": [
+               "src/lib/ledger/*"
+       ],
        "dependencies": {
-               "@ledgerhq/hw-transport-web-ble": "^6.29.10",
-               "@ledgerhq/hw-transport-webhid": "^6.30.6",
-               "@ledgerhq/hw-transport-webusb": "^6.29.10",
-               "nano-pow": "^5.1.7"
+               "@ledgerhq/device-management-kit": "0.9.0",
+               "@ledgerhq/dmk-ble": "file:src/lib/ledger/ble",
+               "@ledgerhq/dmk-hid": "file:src/lib/ledger/hid",
+               "nano-pow": "5.1.7"
        },
        "devDependencies": {
                "@types/node": "^24.5.0",
                "fake-indexeddb": "^6.2.2",
                "typescript": "^5.9.2"
        },
+       "overrides": {
+               "@ledgerhq/device-management-kit": {
+                       "axios": "1.12.2"
+               }
+       },
        "type": "module",
        "exports": {
                ".": {
diff --git a/src/lib/ledger/ble/index.ts b/src/lib/ledger/ble/index.ts
new file mode 100644 (file)
index 0000000..bdc9bda
--- /dev/null
@@ -0,0 +1,7 @@
+import { DeviceManagementKitBuilder, ConsoleLogger } from '@ledgerhq/device-management-kit'
+import { webBleTransportFactory } from '@ledgerhq/device-transport-kit-web-ble'
+
+export const DmkBle = new DeviceManagementKitBuilder()
+       .addTransport(webBleTransportFactory)
+       .addLogger(new ConsoleLogger())
+       .build()
diff --git a/src/lib/ledger/ble/package.json b/src/lib/ledger/ble/package.json
new file mode 100644 (file)
index 0000000..98884ca
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "name": "@ledgerhq/dmk-ble",
+       "version": "1.0.0",
+       "dependencies": {
+               "@ledgerhq/device-management-kit": "0.9.0",
+               "@ledgerhq/device-transport-kit-web-ble": "1.2.0"
+       },
+       "overrides": {
+               "@ledgerhq/device-management-kit": {
+                       "axios": "1.12.2"
+               }
+       }
+}
diff --git a/src/lib/ledger/ble/package.json.license b/src/lib/ledger/ble/package.json.license
new file mode 100644 (file)
index 0000000..7f56691
--- /dev/null
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/src/lib/ledger/hid/index.ts b/src/lib/ledger/hid/index.ts
new file mode 100644 (file)
index 0000000..d48f52e
--- /dev/null
@@ -0,0 +1,7 @@
+import { DeviceManagementKitBuilder, ConsoleLogger } from '@ledgerhq/device-management-kit'
+import { webHidTransportFactory } from '@ledgerhq/device-transport-kit-web-hid'
+
+export const DmkHid = new DeviceManagementKitBuilder()
+       .addTransport(webHidTransportFactory)
+       .addLogger(new ConsoleLogger())
+       .build()
diff --git a/src/lib/ledger/hid/package.json b/src/lib/ledger/hid/package.json
new file mode 100644 (file)
index 0000000..3db1722
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "name": "@ledgerhq/dmk-hid",
+       "version": "1.0.0",
+       "dependencies": {
+               "@ledgerhq/device-management-kit": "0.8.0",
+               "@ledgerhq/device-transport-kit-web-hid": "1.2.0"
+       },
+       "overrides": {
+               "@ledgerhq/device-management-kit": {
+                       "axios": "1.12.2"
+               }
+       }
+}
diff --git a/src/lib/ledger/hid/package.json.license b/src/lib/ledger/hid/package.json.license
new file mode 100644 (file)
index 0000000..7f56691
--- /dev/null
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+SPDX-License-Identifier: GPL-3.0-or-later
similarity index 97%
rename from src/lib/ledger.ts
rename to src/lib/ledger/index.ts
index a5bcd9722501ef3e87b1fd9586ff71a1e09b0e79..d60fbb439fb1824385662020b9e0b9e2e7ddcda1 100644 (file)
@@ -1,15 +1,15 @@
 //! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
 //! SPDX-License-Identifier: GPL-3.0-or-later
 
-import { default as TransportBLE } from '@ledgerhq/hw-transport-web-ble'
-import { default as TransportHID } from '@ledgerhq/hw-transport-webhid'
-import { default as TransportUSB } from '@ledgerhq/hw-transport-webusb'
-import { Account } from './account'
-import { Block } from './block'
-import { BIP44_COIN_NANO, BIP44_PURPOSE, HARDENED_OFFSET } from './constants'
-import { bytes, dec, hex } from './convert'
-import { Rpc } from './rpc'
-import { Wallet } from './wallet'
+import { DeviceManagementKit, DeviceManagementKitBuilder } from '@ledgerhq/device-management-kit'
+import { DmkBle } from '@ledgerhq/dmk-ble'
+import { DmkHid } from '@ledgerhq/dmk-hid'
+import { Account } from '../account'
+import { Block } from '../block'
+import { BIP44_COIN_NANO, BIP44_PURPOSE, HARDENED_OFFSET } from '../constants'
+import { bytes, dec, hex } from '../convert'
+import { Rpc } from '../rpc'
+import { Wallet } from '../wallet'
 
 type LedgerStatus = 'UNSUPPORTED' | 'DISCONNECTED' | 'BUSY' | 'LOCKED' | 'CONNECTED'
 
@@ -47,7 +47,7 @@ export class Ledger {
        static #openTimeout: 3000 = 3000
        static #queue: { task: Function, resolve: Function, reject: Function }[] = []
        static #status: LedgerStatus = 'DISCONNECTED'
-       static #transport: typeof TransportHID | typeof TransportBLE | typeof TransportUSB
+       static #transport: DeviceManagementKit
        static #ADPU_CODES: { [key: string]: number } = Object.freeze({
                class: 0xa1,
                bip32DerivationLevel: 0x03,
@@ -90,15 +90,11 @@ export class Ledger {
                }
                console.log('Checking browser Ledger support...')
                if (typeof globalThis.navigator?.hid?.getDevices === 'function') {
-                       this.#transport ??= TransportHID
+                       this.#transport ??= DmkHid
                        return false
                }
                if (typeof globalThis.navigator?.bluetooth?.getDevices === 'function') {
-                       this.#transport ??= TransportBLE
-                       return false
-               }
-               if (typeof globalThis.navigator?.usb?.getDevices === 'function') {
-                       this.#transport ??= TransportUSB
+                       this.#transport ??= DmkBle
                        return false
                }
                this.#status = 'UNSUPPORTED'