diff --git a/.pnp.cjs b/.pnp.cjs index 54028c654..1aa9d5de7 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -5370,6 +5370,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@colors/colors", [\ + ["npm:1.6.0", {\ + "packageLocation": "./.yarn/cache/@colors-colors-npm-1.6.0-47f686c4e2-66d00284a3.zip/node_modules/@colors/colors/",\ + "packageDependencies": [\ + ["@colors/colors", "npm:1.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@commitlint/cli", [\ ["npm:17.3.0", {\ "packageLocation": "./.yarn/cache/@commitlint-cli-npm-17.3.0-4523c41580-4d93498f86.zip/node_modules/@commitlint/cli/",\ @@ -6322,6 +6331,18 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@dabh/diagnostics", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/@dabh-diagnostics-npm-2.0.3-0f2cd64f24-14e449a7f4.zip/node_modules/@dabh/diagnostics/",\ + "packageDependencies": [\ + ["@dabh/diagnostics", "npm:2.0.3"],\ + ["colorspace", "npm:1.1.4"],\ + ["enabled", "npm:2.0.0"],\ + ["kuler", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@develar/schema-utils", [\ ["npm:2.6.5", {\ "packageLocation": "./.yarn/cache/@develar-schema-utils-npm-2.6.5-6c3f4e1579-a219d60afc.zip/node_modules/@develar/schema-utils/",\ @@ -12618,6 +12639,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@types/triple-beam", [\ + ["npm:1.3.5", {\ + "packageLocation": "./.yarn/cache/@types-triple-beam-npm-1.3.5-0f1b823630-519b6a1b30.zip/node_modules/@types/triple-beam/",\ + "packageDependencies": [\ + ["@types/triple-beam", "npm:1.3.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@types/trusted-types", [\ ["npm:2.0.2", {\ "packageLocation": "./.yarn/cache/@types-trusted-types-npm-2.0.2-035cb17c5e-3371eef5f1.zip/node_modules/@types/trusted-types/",\ @@ -14627,6 +14657,39 @@ const RAW_RUNTIME_STATE = ["uri-js", "npm:4.4.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.17.1", {\ + "packageLocation": "./.yarn/cache/ajv-npm-8.17.1-12ade7edc6-ee3c62162c.zip/node_modules/ajv/",\ + "packageDependencies": [\ + ["ajv", "npm:8.17.1"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["fast-uri", "npm:3.0.1"],\ + ["json-schema-traverse", "npm:1.0.0"],\ + ["require-from-string", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ajv-formats", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/ajv-formats-npm-3.0.1-2662cf5b12-5679b9f9ce.zip/node_modules/ajv-formats/",\ + "packageDependencies": [\ + ["ajv-formats", "npm:3.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:bf6054e1eb321f075ce9ed9b9d8a1a5356d1c4e18132692812c90f41c1ec5c638d1476804913878315dbdae16a6f04095262fe73054f9ce2e2721f3ab7dcad7b#npm:3.0.1", {\ + "packageLocation": "./.yarn/__virtual__/ajv-formats-virtual-1793f492cb/0/cache/ajv-formats-npm-3.0.1-2662cf5b12-5679b9f9ce.zip/node_modules/ajv-formats/",\ + "packageDependencies": [\ + ["ajv-formats", "virtual:bf6054e1eb321f075ce9ed9b9d8a1a5356d1c4e18132692812c90f41c1ec5c638d1476804913878315dbdae16a6f04095262fe73054f9ce2e2721f3ab7dcad7b#npm:3.0.1"],\ + ["@types/ajv", null],\ + ["ajv", "npm:8.17.1"]\ + ],\ + "packagePeers": [\ + "@types/ajv",\ + "ajv"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ajv-keywords", [\ @@ -15198,6 +15261,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["atomically", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/atomically-npm-2.0.3-a28bb34e18-c71cd27688.zip/node_modules/atomically/",\ + "packageDependencies": [\ + ["atomically", "npm:2.0.3"],\ + ["stubborn-fs", "npm:1.2.5"],\ + ["when-exit", "npm:2.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["auto-launch", [\ ["npm:5.0.5", {\ "packageLocation": "./.yarn/cache/auto-launch-npm-5.0.5-ec3c743cc0-1c00dac67d.zip/node_modules/auto-launch/",\ @@ -16824,6 +16898,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["check-disk-space", [\ + ["npm:3.4.0", {\ + "packageLocation": "./.yarn/cache/check-disk-space-npm-3.4.0-78a4169ea3-73130c32e2.zip/node_modules/check-disk-space/",\ + "packageDependencies": [\ + ["check-disk-space", "npm:3.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["checkpoint-store", [\ ["npm:1.1.0", {\ "packageLocation": "./.yarn/cache/checkpoint-store-npm-1.1.0-eb4af62735-94e921ccb2.zip/node_modules/checkpoint-store/",\ @@ -17140,6 +17223,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["color", [\ + ["npm:3.2.1", {\ + "packageLocation": "./.yarn/cache/color-npm-3.2.1-568cf1014f-bf70438e01.zip/node_modules/color/",\ + "packageDependencies": [\ + ["color", "npm:3.2.1"],\ + ["color-convert", "npm:1.9.3"],\ + ["color-string", "npm:1.9.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["color-convert", [\ ["npm:1.9.3", {\ "packageLocation": "./.yarn/cache/color-convert-npm-1.9.3-1fe690075e-ffa3190250.zip/node_modules/color-convert/",\ @@ -17174,6 +17268,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["color-string", [\ + ["npm:1.9.1", {\ + "packageLocation": "./.yarn/cache/color-string-npm-1.9.1-dc020e56be-72aa0b81ee.zip/node_modules/color-string/",\ + "packageDependencies": [\ + ["color-string", "npm:1.9.1"],\ + ["color-name", "npm:1.1.4"],\ + ["simple-swizzle", "npm:0.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["color-support", [\ ["npm:1.1.3", {\ "packageLocation": "./.yarn/cache/color-support-npm-1.1.3-3be5c53455-4bcfe30eea.zip/node_modules/color-support/",\ @@ -17192,6 +17297,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["colorspace", [\ + ["npm:1.1.4", {\ + "packageLocation": "./.yarn/cache/colorspace-npm-1.1.4-f01655548a-bb3934ef3c.zip/node_modules/colorspace/",\ + "packageDependencies": [\ + ["colorspace", "npm:1.1.4"],\ + ["color", "npm:3.2.1"],\ + ["text-hex", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["combined-stream", [\ ["npm:1.0.8", {\ "packageLocation": "./.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-2e969e637d.zip/node_modules/combined-stream/",\ @@ -17397,6 +17513,24 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["conf", [\ + ["npm:13.0.1", {\ + "packageLocation": "./.yarn/cache/conf-npm-13.0.1-bf6054e1eb-6367c6c802.zip/node_modules/conf/",\ + "packageDependencies": [\ + ["conf", "npm:13.0.1"],\ + ["ajv", "npm:8.17.1"],\ + ["ajv-formats", "virtual:bf6054e1eb321f075ce9ed9b9d8a1a5356d1c4e18132692812c90f41c1ec5c638d1476804913878315dbdae16a6f04095262fe73054f9ce2e2721f3ab7dcad7b#npm:3.0.1"],\ + ["atomically", "npm:2.0.3"],\ + ["debounce-fn", "npm:6.0.0"],\ + ["dot-prop", "npm:9.0.0"],\ + ["env-paths", "npm:3.0.0"],\ + ["json-schema-typed", "npm:8.0.1"],\ + ["semver", "npm:7.6.3"],\ + ["uint8array-extras", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["config-file-ts", [\ ["npm:0.2.4", {\ "packageLocation": "./.yarn/cache/config-file-ts-npm-0.2.4-97788fbb47-9094f31c6c.zip/node_modules/config-file-ts/",\ @@ -18280,6 +18414,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["debounce-fn", [\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/debounce-fn-npm-6.0.0-11a6f151d7-9941efbf9e.zip/node_modules/debounce-fn/",\ + "packageDependencies": [\ + ["debounce-fn", "npm:6.0.0"],\ + ["mimic-function", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["debug", [\ ["npm:2.6.9", {\ "packageLocation": "./.yarn/cache/debug-npm-2.6.9-7d4cb597dc-e07005f2b4.zip/node_modules/debug/",\ @@ -18924,6 +19068,14 @@ const RAW_RUNTIME_STATE = ["is-obj", "npm:2.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:9.0.0", {\ + "packageLocation": "./.yarn/cache/dot-prop-npm-9.0.0-e5f329106a-2c23524018.zip/node_modules/dot-prop/",\ + "packageDependencies": [\ + ["dot-prop", "npm:9.0.0"],\ + ["type-fest", "npm:4.23.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["dotenv", [\ @@ -19218,6 +19370,17 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["electron-store", [\ + ["npm:10.0.0", {\ + "packageLocation": "./.yarn/cache/electron-store-npm-10.0.0-ef389fde2b-8fbc0916fd.zip/node_modules/electron-store/",\ + "packageDependencies": [\ + ["electron-store", "npm:10.0.0"],\ + ["conf", "npm:13.0.1"],\ + ["type-fest", "npm:4.23.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["electron-to-chromium", [\ ["npm:1.4.284", {\ "packageLocation": "./.yarn/cache/electron-to-chromium-npm-1.4.284-2fb881a7ac-ffbf6e9939.zip/node_modules/electron-to-chromium/",\ @@ -19313,6 +19476,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["enabled", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/enabled-npm-2.0.0-bf5d96c9d8-9d256d89f4.zip/node_modules/enabled/",\ + "packageDependencies": [\ + ["enabled", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["encodeurl", [\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/encodeurl-npm-1.0.2-f8c8454c41-e50e3d508c.zip/node_modules/encodeurl/",\ @@ -19382,6 +19554,13 @@ const RAW_RUNTIME_STATE = ["env-paths", "npm:2.2.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/env-paths-npm-3.0.0-3860895468-b2b0a0d0d9.zip/node_modules/env-paths/",\ + "packageDependencies": [\ + ["env-paths", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["envalid", [\ @@ -21308,6 +21487,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["fast-uri", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/fast-uri-npm-3.0.1-20477a5d16-e8ee471227.zip/node_modules/fast-uri/",\ + "packageDependencies": [\ + ["fast-uri", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["fastq", [\ ["npm:1.13.0", {\ "packageLocation": "./.yarn/cache/fastq-npm-1.13.0-a45963881c-0902cb9b81.zip/node_modules/fastq/",\ @@ -21338,6 +21526,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["fecha", [\ + ["npm:4.2.3", {\ + "packageLocation": "./.yarn/cache/fecha-npm-4.2.3-75248da3fd-534ce630c8.zip/node_modules/fecha/",\ + "packageDependencies": [\ + ["fecha", "npm:4.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["fetch-blob", [\ ["npm:3.2.0", {\ "packageLocation": "./.yarn/cache/fetch-blob-npm-3.2.0-28e01becfc-5264ecceb5.zip/node_modules/fetch-blob/",\ @@ -21505,6 +21702,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["fn.name", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/fn.name-npm-1.1.0-b472333184-000198af19.zip/node_modules/fn.name/",\ + "packageDependencies": [\ + ["fn.name", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["focus-lock", [\ ["npm:0.11.4", {\ "packageLocation": "./.yarn/cache/focus-lock-npm-0.11.4-b5405c7cb9-4c316c0b57.zip/node_modules/focus-lock/",\ @@ -23058,6 +23264,13 @@ const RAW_RUNTIME_STATE = ["is-arrayish", "npm:0.2.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:0.3.2", {\ + "packageLocation": "./.yarn/cache/is-arrayish-npm-0.3.2-f856180f79-81a78d518e.zip/node_modules/is-arrayish/",\ + "packageDependencies": [\ + ["is-arrayish", "npm:0.3.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["is-bigint", [\ @@ -24621,6 +24834,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["json-schema-typed", [\ + ["npm:8.0.1", {\ + "packageLocation": "./.yarn/cache/json-schema-typed-npm-8.0.1-d42539dd4a-7f73246d4b.zip/node_modules/json-schema-typed/",\ + "packageDependencies": [\ + ["json-schema-typed", "npm:8.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["json-stable-stringify", [\ ["npm:1.0.2", {\ "packageLocation": "./.yarn/cache/json-stable-stringify-npm-1.0.2-214b247c1e-96c8d69752.zip/node_modules/json-stable-stringify/",\ @@ -24844,6 +25066,7 @@ const RAW_RUNTIME_STATE = ["bs58check", "npm:3.0.1"],\ ["bufferutil", "npm:4.0.7"],\ ["builder-util", "npm:25.0.0-alpha.6"],\ + ["check-disk-space", "npm:3.4.0"],\ ["comlink", "npm:4.3.1"],\ ["comlink-electron-endpoint", "patch:comlink-electron-endpoint@npm%3A1.0.3#./.yarn/patches/comlink-electron-endpoint-npm-1.0.3-e9e40b4d5c.patch::version=1.0.3&hash=22349e&locator=keepkey-monorepo%40workspace%3A."],\ ["common-utils", "workspace:packages/common-utils"],\ @@ -24856,6 +25079,7 @@ const RAW_RUNTIME_STATE = ["electron-is-dev", "npm:2.0.0"],\ ["electron-log", "npm:4.4.8"],\ ["electron-notarize-dmg", "npm:1.0.0"],\ + ["electron-store", "npm:10.0.0"],\ ["electron-unhandled", "npm:4.0.1"],\ ["electron-updater", "npm:6.2.1"],\ ["esbuild", "npm:0.15.16"],\ @@ -24880,6 +25104,7 @@ const RAW_RUNTIME_STATE = ["nedb-promises", "npm:6.2.1"],\ ["node-fetch", "npm:3.3.0"],\ ["node-hid", "patch:node-hid@npm%3A2.1.2#./.yarn/patches/node-hid-npm-2.1.2-82add4c8de.patch::version=2.1.2&hash=1e3ac2&locator=keepkey-monorepo%40workspace%3A."],\ + ["ollama", "npm:0.5.6"],\ ["prettier", "npm:2.8.0"],\ ["promise.any", "npm:2.0.5"],\ ["protobufjs", "npm:7.2.6"],\ @@ -24887,6 +25112,7 @@ const RAW_RUNTIME_STATE = ["secp256k1", "npm:4.0.3"],\ ["semver", "npm:7.3.8"],\ ["source-map-support", "npm:0.5.21"],\ + ["sudo-prompt", "npm:9.2.1"],\ ["swagger-ui-dist", "npm:4.15.5"],\ ["swagger-ui-express", "virtual:15149eb01efe6dae21a27159fdeb7f62cca0f4e19d09d3abd4eb0cc76d89fd1a64d234276982b5e754aae438c4679864c2b8ee064ff74d60a47dfedc442fd25f#npm:4.6.0"],\ ["tiny-secp256k1", "patch:tiny-secp256k1@npm%3A1.1.6#./.yarn/patches/tiny-secp256k1-npm-1.1.6-00db893e04.patch::version=1.1.6&hash=6b0a67&locator=keepkey-monorepo%40workspace%3A."],\ @@ -24897,7 +25123,8 @@ const RAW_RUNTIME_STATE = ["utf-8-validate", "npm:5.0.10"],\ ["uuid", "npm:9.0.0"],\ ["wait-promise", "npm:0.4.1"],\ - ["web3", "npm:4.0.1"]\ + ["web3", "npm:4.0.1"],\ + ["winston", "npm:3.13.1"]\ ],\ "linkType": "SOFT"\ }]\ @@ -25263,6 +25490,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["kuler", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/kuler-npm-2.0.0-19e74c9695-9e10b5a165.zip/node_modules/kuler/",\ + "packageDependencies": [\ + ["kuler", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["language-subtag-registry", [\ ["npm:0.3.22", {\ "packageLocation": "./.yarn/cache/language-subtag-registry-npm-0.3.22-e9f79fe04e-5591f4abd7.zip/node_modules/language-subtag-registry/",\ @@ -25672,6 +25908,21 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["logform", [\ + ["npm:2.6.1", {\ + "packageLocation": "./.yarn/cache/logform-npm-2.6.1-3d7ec22905-e67f414787.zip/node_modules/logform/",\ + "packageDependencies": [\ + ["logform", "npm:2.6.1"],\ + ["@colors/colors", "npm:1.6.0"],\ + ["@types/triple-beam", "npm:1.3.5"],\ + ["fecha", "npm:4.2.3"],\ + ["ms", "npm:2.1.3"],\ + ["safe-stable-stringify", "npm:2.4.3"],\ + ["triple-beam", "npm:1.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["loglevel", [\ ["npm:1.8.1", {\ "packageLocation": "./.yarn/cache/loglevel-npm-1.8.1-1768109374-36a786082a.zip/node_modules/loglevel/",\ @@ -26484,6 +26735,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["mimic-function", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/mimic-function-npm-5.0.1-5078456e31-eb5893c99e.zip/node_modules/mimic-function/",\ + "packageDependencies": [\ + ["mimic-function", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["mimic-response", [\ ["npm:1.0.1", {\ "packageLocation": "./.yarn/cache/mimic-response-npm-1.0.1-f6f85dde84-034c78753b.zip/node_modules/mimic-response/",\ @@ -27541,6 +27801,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["ollama", [\ + ["npm:0.5.6", {\ + "packageLocation": "./.yarn/cache/ollama-npm-0.5.6-fff9382dc7-3fe8d81a8a.zip/node_modules/ollama/",\ + "packageDependencies": [\ + ["ollama", "npm:0.5.6"],\ + ["whatwg-fetch", "npm:3.6.20"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["omggif", [\ ["npm:1.0.10", {\ "packageLocation": "./.yarn/cache/omggif-npm-1.0.10-6ffa5bf343-a7b063d702.zip/node_modules/omggif/",\ @@ -27579,6 +27849,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["one-time", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/one-time-npm-1.0.0-aeaad5e524-64d0160480.zip/node_modules/one-time/",\ + "packageDependencies": [\ + ["one-time", "npm:1.0.0"],\ + ["fn.name", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["onetime", [\ ["npm:5.1.2", {\ "packageLocation": "./.yarn/cache/onetime-npm-5.1.2-3ed148fa42-e9fd0695a0.zip/node_modules/onetime/",\ @@ -30830,6 +31110,16 @@ const RAW_RUNTIME_STATE = ["util-deprecate", "npm:1.0.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.6.2", {\ + "packageLocation": "./.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-d9e3e53193.zip/node_modules/readable-stream/",\ + "packageDependencies": [\ + ["readable-stream", "npm:3.6.2"],\ + ["inherits", "npm:2.0.4"],\ + ["string_decoder", "npm:1.3.0"],\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["readdirp", [\ @@ -31565,6 +31855,13 @@ const RAW_RUNTIME_STATE = ["safe-stable-stringify", "npm:2.4.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:2.4.3", {\ + "packageLocation": "./.yarn/cache/safe-stable-stringify-npm-2.4.3-d895741b40-a6c192bbef.zip/node_modules/safe-stable-stringify/",\ + "packageDependencies": [\ + ["safe-stable-stringify", "npm:2.4.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["safer-buffer", [\ @@ -31740,6 +32037,13 @@ const RAW_RUNTIME_STATE = ["lru-cache", "npm:6.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:7.6.3", {\ + "packageLocation": "./.yarn/cache/semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:7.6.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["semver-compare", [\ @@ -31994,6 +32298,16 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["simple-swizzle", [\ + ["npm:0.2.2", {\ + "packageLocation": "./.yarn/cache/simple-swizzle-npm-0.2.2-8dee37fad1-c6dffff17a.zip/node_modules/simple-swizzle/",\ + "packageDependencies": [\ + ["simple-swizzle", "npm:0.2.2"],\ + ["is-arrayish", "npm:0.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["simple-update-notifier", [\ ["npm:1.1.0", {\ "packageLocation": "./.yarn/cache/simple-update-notifier-npm-1.1.0-92878518a3-0f9be259b3.zip/node_modules/simple-update-notifier/",\ @@ -32290,6 +32604,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["stack-trace", [\ + ["npm:0.0.10", {\ + "packageLocation": "./.yarn/cache/stack-trace-npm-0.0.10-9460b173e1-7bd633f0e9.zip/node_modules/stack-trace/",\ + "packageDependencies": [\ + ["stack-trace", "npm:0.0.10"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["stack-utils", [\ ["npm:2.0.6", {\ "packageLocation": "./.yarn/cache/stack-utils-npm-2.0.6-2be1099696-cdc988acbc.zip/node_modules/stack-utils/",\ @@ -32613,6 +32936,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["stubborn-fs", [\ + ["npm:1.2.5", {\ + "packageLocation": "./.yarn/cache/stubborn-fs-npm-1.2.5-b4c27578fb-bd811a7a33.zip/node_modules/stubborn-fs/",\ + "packageDependencies": [\ + ["stubborn-fs", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["style-to-js", [\ ["npm:1.1.1", {\ "packageLocation": "./.yarn/cache/style-to-js-npm-1.1.1-565bfb2b78-cf3dddd4bb.zip/node_modules/style-to-js/",\ @@ -32653,6 +32985,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["sudo-prompt", [\ + ["npm:9.2.1", {\ + "packageLocation": "./.yarn/cache/sudo-prompt-npm-9.2.1-673cc9fe7b-0557d0eece.zip/node_modules/sudo-prompt/",\ + "packageDependencies": [\ + ["sudo-prompt", "npm:9.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["sumchecker", [\ ["npm:3.0.1", {\ "packageLocation": "./.yarn/cache/sumchecker-npm-3.0.1-b6973781e3-5c69776ce2.zip/node_modules/sumchecker/",\ @@ -33007,6 +33348,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["text-hex", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/text-hex-npm-1.0.0-22389e4d56-1138f68adc.zip/node_modules/text-hex/",\ + "packageDependencies": [\ + ["text-hex", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["text-table", [\ ["npm:0.2.0", {\ "packageLocation": "./.yarn/cache/text-table-npm-0.2.0-d92a778b59-4383b5baae.zip/node_modules/text-table/",\ @@ -33337,6 +33687,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["triple-beam", [\ + ["npm:1.4.1", {\ + "packageLocation": "./.yarn/cache/triple-beam-npm-1.4.1-d21ba5346a-2e881a3e8e.zip/node_modules/triple-beam/",\ + "packageDependencies": [\ + ["triple-beam", "npm:1.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["trough", [\ ["npm:2.1.0", {\ "packageLocation": "./.yarn/cache/trough-npm-2.1.0-20e92f46fc-6ca8a545d0.zip/node_modules/trough/",\ @@ -33858,6 +34217,13 @@ const RAW_RUNTIME_STATE = ["type-fest", "npm:3.3.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.23.0", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-4.23.0-cea2c34bb1-c411dea832.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:4.23.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["type-is", [\ @@ -33976,6 +34342,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["uint8array-extras", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/uint8array-extras-npm-1.4.0-a1af4ea1db-4d2955d67c.zip/node_modules/uint8array-extras/",\ + "packageDependencies": [\ + ["uint8array-extras", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["uint8arrays", [\ ["npm:3.1.1", {\ "packageLocation": "./.yarn/cache/uint8arrays-npm-3.1.1-42293ad777-536e70273c.zip/node_modules/uint8arrays/",\ @@ -35469,6 +35844,13 @@ const RAW_RUNTIME_STATE = ["whatwg-fetch", "npm:3.6.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.6.20", {\ + "packageLocation": "./.yarn/cache/whatwg-fetch-npm-3.6.20-a6f79b98c4-2b4ed92acd.zip/node_modules/whatwg-fetch/",\ + "packageDependencies": [\ + ["whatwg-fetch", "npm:3.6.20"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["whatwg-mimetype", [\ @@ -35500,6 +35882,15 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["when-exit", [\ + ["npm:2.1.3", {\ + "packageLocation": "./.yarn/cache/when-exit-npm-2.1.3-d67f8a83d2-d4242a1514.zip/node_modules/when-exit/",\ + "packageDependencies": [\ + ["when-exit", "npm:2.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["which", [\ ["npm:2.0.2", {\ "packageLocation": "./.yarn/cache/which-npm-2.0.2-320ddf72f7-4782f8a1d6.zip/node_modules/which/",\ @@ -35600,6 +35991,38 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["winston", [\ + ["npm:3.13.1", {\ + "packageLocation": "./.yarn/cache/winston-npm-3.13.1-d3d3332f9f-bc78202708.zip/node_modules/winston/",\ + "packageDependencies": [\ + ["winston", "npm:3.13.1"],\ + ["@colors/colors", "npm:1.6.0"],\ + ["@dabh/diagnostics", "npm:2.0.3"],\ + ["async", "npm:3.2.4"],\ + ["is-stream", "npm:2.0.1"],\ + ["logform", "npm:2.6.1"],\ + ["one-time", "npm:1.0.0"],\ + ["readable-stream", "npm:3.6.0"],\ + ["safe-stable-stringify", "npm:2.4.3"],\ + ["stack-trace", "npm:0.0.10"],\ + ["triple-beam", "npm:1.4.1"],\ + ["winston-transport", "npm:4.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["winston-transport", [\ + ["npm:4.7.1", {\ + "packageLocation": "./.yarn/cache/winston-transport-npm-4.7.1-670dc6d411-bc48c921ec.zip/node_modules/winston-transport/",\ + "packageDependencies": [\ + ["winston-transport", "npm:4.7.1"],\ + ["logform", "npm:2.6.1"],\ + ["readable-stream", "npm:3.6.2"],\ + ["triple-beam", "npm:1.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["word-wrap", [\ ["npm:1.2.3", {\ "packageLocation": "./.yarn/cache/word-wrap-npm-1.2.3-7fb15ab002-08a677e157.zip/node_modules/word-wrap/",\ diff --git a/executables/version.txt b/executables/version.txt new file mode 100644 index 000000000..7a14b6540 --- /dev/null +++ b/executables/version.txt @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fde5bc1103fad2ad0131aded18e7ea7a557ea635d7a452818e178d82a71cda44 +size 90 diff --git a/packages/keepkey-desktop-app/.env b/packages/keepkey-desktop-app/.env index 250c27f5a..9ffc11a45 100644 --- a/packages/keepkey-desktop-app/.env +++ b/packages/keepkey-desktop-app/.env @@ -42,7 +42,7 @@ REACT_APP_UNCHAINED_THORCHAIN_WS_URL=wss://api.thorchain.shapeshift.com REACT_APP_THORCHAIN_NODE_URL=https://daemon.thorchain.shapeshift.com REACT_APP_ETHEREUM_NODE_URL=https://daemon.ethereum.shapeshift.com REACT_APP_ETHEREUM_INFURA_URL=https://mainnet.infura.io/v3/527a7b1368e9464fbdc9d0f0efac1c0e -REACT_APP_ETHEREUM_INFURA_URL2=https://goerli.infura.io/v3/fb05c87983c4431baafd4600fd33de7e +REACT_APP_ETHEREUM_INFURA_URL2=https://mainnet.infura.io/v3/527a7b1368e9464fbdc9d0f0efac1c0e REACT_APP_ETHEREUM_INFURA_URL3=https://avalanche-mainnet.infura.io/v3/fb05c87983c4431baafd4600fd33de7e REACT_APP_MIDGARD_URL=https://indexer.thorchain.shapeshift.com/v2 REACT_APP_WALLET_CONNECT_PROJECT_ID=14d36ca1bc76a70273d44d384e8475ae diff --git a/packages/keepkey-desktop-app/src/assets/translations/en/main.json b/packages/keepkey-desktop-app/src/assets/translations/en/main.json index 018d78fb3..50781c770 100644 --- a/packages/keepkey-desktop-app/src/assets/translations/en/main.json +++ b/packages/keepkey-desktop-app/src/assets/translations/en/main.json @@ -359,6 +359,7 @@ "IDR": "Indonesian Rupiah" }, "tabs": { + "ollama": "Ollama", "general": "General", "app": "App", "keepkey": "KeepKey" diff --git a/packages/keepkey-desktop-app/src/components/Modals/Settings/OllamaSettings.tsx b/packages/keepkey-desktop-app/src/components/Modals/Settings/OllamaSettings.tsx new file mode 100644 index 000000000..8d8ae1654 --- /dev/null +++ b/packages/keepkey-desktop-app/src/components/Modals/Settings/OllamaSettings.tsx @@ -0,0 +1,96 @@ +import { Divider, HStack, Stack } from '@chakra-ui/layout'; +import { Avatar, Button, Icon, IconButton, Switch, Text } from '@chakra-ui/react'; +import { useModal } from 'hooks/useModal/useModal'; +import { useEffect, useState } from 'react'; +import { FaTrash } from 'react-icons/fa'; +import { HiRefresh } from 'react-icons/hi'; +import { IoFileTray } from 'react-icons/io5'; +import { TbRefreshAlert } from 'react-icons/tb'; +import { MdPlayArrow, MdStop, MdViewList } from 'react-icons/md'; + +import { SettingsListItem } from './SettingsListItem'; + +interface OllamaSettingsProps { + shouldAutoUpdate: boolean; + shouldMinimizeToTray: boolean; + allowPreRelease: boolean; + autoScanQr: boolean; +} + +export const OllamaSettings: FC = () => { + const { settings, onboardingSteps } = useModal(); + const [appSettings, setAppSettings] = useState({ + shouldAutoUpdate: true, + shouldMinimizeToTray: true, + allowPreRelease: false, + autoScanQr: false, + }); + + const [prevAppSettings, setPrevAppSettings] = useState(appSettings); + + const handleViewModels = () => { + console.log('Viewing models...'); + // Mock action: Display a message or simulate viewing models + }; + + const handleStartOllama = () => { + console.log('Starting Ollama...'); + // Mock action: Display a message or simulate starting Ollama + }; + + const handleStopOllama = () => { + console.log('Stopping Ollama...'); + // Mock action: Display a message or simulate stopping Ollama + }; + + useEffect(() => { + (async () => { + if ( + prevAppSettings && + appSettings.shouldAutoUpdate === prevAppSettings.shouldAutoUpdate && + appSettings.shouldMinimizeToTray === prevAppSettings.shouldMinimizeToTray && + appSettings.allowPreRelease === prevAppSettings.allowPreRelease && + appSettings.autoScanQr === prevAppSettings.autoScanQr + ) + return; + setPrevAppSettings(appSettings); + // Save settings + console.log('APP SETTINGS SAVED', appSettings); + })().catch(e => console.error(e)); + }, [appSettings, prevAppSettings]); + + return ( + + + } + > + + + + } + > + + + + } + > + + + + ); +}; diff --git a/packages/keepkey-desktop-app/src/components/Modals/Settings/SettingsList.tsx b/packages/keepkey-desktop-app/src/components/Modals/Settings/SettingsList.tsx index e7053c7c8..9def7c53c 100644 --- a/packages/keepkey-desktop-app/src/components/Modals/Settings/SettingsList.tsx +++ b/packages/keepkey-desktop-app/src/components/Modals/Settings/SettingsList.tsx @@ -20,6 +20,7 @@ import type { RouteComponentProps } from 'react-router-dom' import { AppSettings } from './AppSettings' import { GeneralSettings } from './GeneralSettings' +import { OllamaSettings } from './OllamaSettings' export type SettingsListProps = { appHistory: RouteComponentProps['history'] @@ -65,6 +66,9 @@ export const SettingsList = ({ appHistory, ...routeProps }: SettingsListProps) = + + + @@ -83,6 +87,11 @@ export const SettingsList = ({ appHistory, ...routeProps }: SettingsListProps) = /> + + + + + diff --git a/packages/keepkey-desktop/package.json b/packages/keepkey-desktop/package.json index 129fc492e..0c4641edb 100644 --- a/packages/keepkey-desktop/package.json +++ b/packages/keepkey-desktop/package.json @@ -1,6 +1,6 @@ { "name": "keepkey-desktop", - "version": "3.0.26", + "version": "3.1.0", "author": { "name": "KeepKey", "email": "support@keepkey.com" @@ -30,7 +30,8 @@ "generateUpdatesFilesForAllChannels": true, "publish": "github", "files": [ - "build/**/*" + "build/**/*", + "executables/*" ], "protocols": [ { @@ -103,6 +104,7 @@ "bs58check": "^3.0.1", "bufferutil": "^4.0.7", "builder-util": "^25.0.0-alpha.6", + "check-disk-space": "^3.4.0", "comlink": "^4.3.1", "comlink-electron-endpoint": "^1.0.3", "common-utils": "workspace:*", @@ -111,6 +113,7 @@ "dotenv": "^16.0.3", "electron-is-dev": "^2.0.0", "electron-log": "^4.4.8", + "electron-store": "^10.0.0", "electron-unhandled": "^4.0.1", "electron-updater": "^6.1.8", "esbuild": "^0.15.14", @@ -130,11 +133,13 @@ "nedb-promises": "^6.2.1", "node-fetch": "^3.3.0", "node-hid": "^2.1.2", + "ollama": "^0.5.6", "promise.any": "^2.0.5", "protobufjs": "^7.2.6", "secp256k1": "^4.0.3", "semver": "^7.3.8", "source-map-support": "^0.5.21", + "sudo-prompt": "^9.2.1", "swagger-ui-dist": "^4.15.5", "swagger-ui-express": "^4.6.0", "tiny-secp256k1": "^1.1.6", @@ -142,7 +147,8 @@ "utf-8-validate": "^5.0.10", "uuid": "^9.0.0", "wait-promise": "^0.4.1", - "web3": "^4.0.1" + "web3": "^4.0.1", + "winston": "^3.13.1" }, "devDependencies": { "@keepkey/common-esbuild-bits": "workspace:*", diff --git a/packages/keepkey-desktop/scripts/build.ts b/packages/keepkey-desktop/scripts/build.ts index ed07bf8c0..1b9206243 100644 --- a/packages/keepkey-desktop/scripts/build.ts +++ b/packages/keepkey-desktop/scripts/build.ts @@ -21,6 +21,8 @@ const appSource = path.join( const assetsSource = path.join(workspacePath, 'assets') const swaggerUiDistSource = pnpapi.resolveToUnqualified('swagger-ui-dist', workspacePath)! const firmwareSource = path.join(rootPath, 'firmware') +const executablesSource = path.join(rootPath, 'executables'); +const executablesPath = path.join(buildPath, 'executables'); const apiPath = path.join(buildPath, 'api') const appPath = path.join(buildPath, 'app') @@ -70,6 +72,18 @@ const copySwaggerUiDist = async () => { recursive: true, }) } +//copyExecutables +const copyExecutables = async () => { + if (fs.existsSync(executablesSource)) { + await fs.promises.cp(executablesSource, executablesPath, { + dereference: true, + recursive: true, + }); + console.log('Executables copied successfully.'); + } else { + console.warn('Executables source directory does not exist.'); + } +}; const copyFirmware = async () => { const releases = JSON.parse( @@ -224,6 +238,7 @@ export const build = async () => { copyAssetsDir(), copySwaggerUiDist(), copyFirmware(), + copyExecutables(), esbuild.then(async x => { if (isDev) { await fs.promises.writeFile( diff --git a/packages/keepkey-desktop/src/ai/ai-models.ts b/packages/keepkey-desktop/src/ai/ai-models.ts new file mode 100644 index 000000000..4ba722f6f --- /dev/null +++ b/packages/keepkey-desktop/src/ai/ai-models.ts @@ -0,0 +1,14 @@ +export const models = { + mistral: { + tags: ['text', '7b', '7b-instruct', '7b-text'], + }, + llama2: { + tags: ['chat', '7b', 'text'], + }, + orcaMini: { + tags: ['latest', '3b'], + }, + nousHermes: { + tags: ['latest', '7b'], + }, +}; diff --git a/packages/keepkey-desktop/src/ai/events.ts b/packages/keepkey-desktop/src/ai/events.ts new file mode 100644 index 000000000..9b67aac98 --- /dev/null +++ b/packages/keepkey-desktop/src/ai/events.ts @@ -0,0 +1,21 @@ +export enum IpcChannel { + AppInit = 'app:init', + GetModelsPath = 'app:getfolder', + SetFolderPath = 'app:setfolder', + Close = 'app:close', + Minimize = 'app:minimize', +} + +export enum OllamaChannel { + OllamaInit = 'ollama:init', + OllamaStatusUpdate = 'ollama:status', + OllamaGetAllModels = 'ollama:getallmodels', + OllamaQuestion = 'ollama:question', + OllamaAnswer = 'ollama:answer', + OllamaGetModel = 'ollama:getmodel', +} + +export enum IpcMainChannel { + Error = 'main:error', + CommandOuput = 'command:output', +} diff --git a/packages/keepkey-desktop/src/ai/index.ts b/packages/keepkey-desktop/src/ai/index.ts new file mode 100644 index 000000000..7430e65ee --- /dev/null +++ b/packages/keepkey-desktop/src/ai/index.ts @@ -0,0 +1,81 @@ +import { dialog } from 'electron'; + +import { IpcChannel } from './events'; +import { + loadOllama, + stopOllama, + getAllLocalModels, + askOllama, + getOrPullModel, +} from './ollama'; +import { OllamaQuestion } from './types'; +import { saveModelPathToStorage, getModelPathFromStorage } from './storage'; + +export const initOllama = async () => { + try { + const ollamaLoaded = await loadOllama(); + + return ollamaLoaded; + } catch (err) { + handleError(err); + + return false; + } +}; + +export const stopOllamaServe = async () => { + await stopOllama(); +}; + +export const getAllModels = async () => { + try { + const models = await getAllLocalModels(); + + return models; + // event.reply(OllamaChannel.OllamaGetAllModels, models); + } catch (err) { + handleError(err); + } +}; + +export const getModel = async ( model: string) => { + try { + const response = await getOrPullModel(model); + + return response; + } catch (err) { + handleError(err); + } +}; + +export const askOlama = async ( { model, query }: OllamaQuestion) => { + try { + const response = await askOllama(model, query); + + return response; + } catch (err) { + handleError(err); + } +}; + +export const getModelsFolderPath = async () => { + return getModelPathFromStorage(); +}; + +export const setModelFolderPath = async () => { + const result = await dialog.showOpenDialog({ + properties: ['openDirectory', 'createDirectory'], + }); + + if (result.filePaths) { + saveModelPathToStorage(result.filePaths[0]); + } + + return true; +}; + +const handleError = (err: Error) => { + console.error(err); + + // log with winston here +}; diff --git a/packages/keepkey-desktop/src/ai/logger.ts b/packages/keepkey-desktop/src/ai/logger.ts new file mode 100644 index 000000000..c53ab2cc0 --- /dev/null +++ b/packages/keepkey-desktop/src/ai/logger.ts @@ -0,0 +1,29 @@ +import winston from 'winston'; +import path from 'path'; +import { isDev } from '../main'; +import { app } from 'electron'; + +const logFilePath = isDev ? '.' : app.getPath('userData'); + +export const logger = winston.createLogger({ + format: winston.format.simple(), + transports: [ + new winston.transports.Console(), + new winston.transports.File({ + filename: path.join(logFilePath, 'error.log'), + maxFiles: 1, + level: 'error', + }), + new winston.transports.File({ + filename: path.join(logFilePath, 'app.log'), + maxFiles: 1, + level: 'info', + }), + ], + exceptionHandlers: [ + new winston.transports.File({ + filename: path.join(logFilePath, 'exceptions.log'), + }), + ], + exitOnError: false, +}); diff --git a/packages/keepkey-desktop/src/ai/ollama.ts b/packages/keepkey-desktop/src/ai/ollama.ts new file mode 100644 index 000000000..de6674b89 --- /dev/null +++ b/packages/keepkey-desktop/src/ai/ollama.ts @@ -0,0 +1,216 @@ +import { app, ipcMain } from 'electron'; +import { Ollama } from 'ollama'; +import { execFile, ChildProcess } from 'child_process'; +import fs from 'fs'; +import { sendOllamaStatusToRenderer } from '../main'; +import { PROMPT } from './prompts'; + +// events +import { IpcMainChannel } from './events'; +import { + createDirectoryElevated, + executeCommandElevated, + getExecutablePathByPlatform, + killProcess, + runDelayed, +} from './system'; + +// storage +import { getModelPathFromStorage } from './storage'; +import { logger } from './logger'; +const TAG = ' | ollama | ' +// constants +const DEFAULT_OLLAMA_URL = 'http://127.0.0.1:11434/'; + +// commands +export const SERVE_OLLAMA_CMD = 'ollama serve'; +export const WSL_SERVE_OLLAMA_CMD = 'wsl ollama serve'; + +// ollama instance +let ollama: Ollama; +let ollamaProcess: ChildProcess | null; + +export const loadOllama = async () => { + let runningInstance = await isOllamaInstanceRunning(); + + if (runningInstance) { + // connect to local instance + ollama = new Ollama({ + host: DEFAULT_OLLAMA_URL, + }); + + await sendOllamaStatusToRenderer( + `local instance of ollama is running and connected at ${DEFAULT_OLLAMA_URL}`, + ); + + return true; + } + + const customAppData = getModelPathFromStorage(); + runningInstance = await packedExecutableOllamaSpawn(customAppData); + + if (runningInstance) { + // connect to local instance + ollama = new Ollama({ + host: DEFAULT_OLLAMA_URL, + }); + + await sendOllamaStatusToRenderer( + `local instance of ollama is running and connected at ${DEFAULT_OLLAMA_URL}`, + ); + + return true; + } + + ipcMain.emit(IpcMainChannel.Error, `Couldn't start Ollama locally.`); + + return false; +}; + +export const isOllamaInstanceRunning = async (url?: string): Promise => { + try { + const usedUrl = url ?? DEFAULT_OLLAMA_URL; + + await sendOllamaStatusToRenderer(`checking if ollama instance is running at ${usedUrl}`); + + const ping = await fetch(usedUrl); + + return ping.status === 200; + } catch (err) { + return false; + } +}; + +export const packedExecutableOllamaSpawn = async (customDataPath?: string) => { + let tag = TAG + " | packedExecutableOllamaSpawn | " + try { + console.log(tag,'customDataPath:', customDataPath) + await sendOllamaStatusToRenderer(`trying to spawn locally installed ollama`); + spawnLocalExecutable(customDataPath); + } catch (err) { + console.error(err); + } + + return await runDelayed(isOllamaInstanceRunning, 10000); +}; + +export const devRunLocalWSLOllama = (customDataPath?: string) => { + executeCommandElevated( + WSL_SERVE_OLLAMA_CMD, + customDataPath ? { OLLAMA_MODELS: customDataPath } : undefined, + ); +}; + +export const spawnLocalExecutable = async (customDataPath?: string) => { + let tag = TAG + " | spawnLocalExecutable | " + try { + console.log(tag,'customDataPath:', customDataPath) + const { executablePath, appDataPath } = await getOllamaExecutableAndAppDataPath(customDataPath); + console.log(tag,'appDataPath:', appDataPath) + if (!fs.existsSync(appDataPath)) { + console.log(tag,'No app data path found, creating one') + createDirectoryElevated(appDataPath); + } + + const env = { + ...process.env, + OLLAMA_MODELS: appDataPath, + }; + console.log(tag,'env:', env) + ollamaProcess = execFile(executablePath, ['serve'], { env }, (err, stdout, stderr) => { + if (err) { + console.error(tag,'err:', err) + throw new Error(`exec error: ${err.message}`); + } + + if (stderr) { + console.error(tag,'stderr:', stderr) + throw new Error(`stderr: ${stderr}`); + } + }); + } catch (err) { + logger.error(err); + } +}; + +export const getOllamaExecutableAndAppDataPath = async ( + customDataPath?: string, +): Promise<{ + executablePath: string; + appDataPath: string; +}> => { + const appDataPath = customDataPath || app.getPath('userData'); + const executablePath = await getExecutablePathByPlatform(); // This line is corrected + + return { + executablePath, + appDataPath, + }; +}; + +export const askOllama = async (model: string, message: string) => { + return await ollama.chat({ + model, + messages: [ + { + role: 'system', + content: PROMPT, + }, + { + role: 'user', + content: `Answer the following query in a valid formatted JSON object without comments with both the response and action fields deduced from the user's question. Adhere strictly to JSON syntax without comments. Query: ${message}. Response: { "response":`, + }, + ], + }); +}; + +export const getOrPullModel = async (model: string) => { + await installModelWithStatus(model); + + // init the model on pull to load into memory + await ollama.chat({ model }); + + return findModel(model); +}; + +export const installModelWithStatus = async (model: string) => { + const stream = await ollama.pull({ + model, + stream: true, + }); + + for await (const part of stream) { + if (part.digest) { + let percent = 0; + + if (part.completed && part.total) { + percent = Math.round((part.completed / part.total) * 100); + + await sendOllamaStatusToRenderer(`${part.status} ${percent}%`); + } + } else { + await sendOllamaStatusToRenderer(`${part.status}`); + } + } +}; + +export const findModel = async (model: string) => { + const allModels = await ollama.list(); + + return allModels.models.find((m) => m.name.toLowerCase().includes(model)); +}; + +export const getAllLocalModels = async () => { + return await ollama.list(); +}; + +export const stopOllama = async () => { + if (!ollamaProcess) { + return; + } + + killProcess(ollamaProcess); + + ollamaProcess.removeAllListeners(); + ollamaProcess = null; +}; diff --git a/packages/keepkey-desktop/src/ai/prompts.ts b/packages/keepkey-desktop/src/ai/prompts.ts new file mode 100644 index 000000000..55af2eb1b --- /dev/null +++ b/packages/keepkey-desktop/src/ai/prompts.ts @@ -0,0 +1,6 @@ +export const PROMPT = `###System: +You are a SmartAgent. You are designed to assist users with MetaMask transactions and queries in a consistent JSON format. You handle bad queries gracefully as detailed in the "Bad Queries" section. Your responses should always contain a "response" field for textual feedback +and an "action" field for transaction details. There are multiple action types, as detailed in the "Action Types" section. +`; + +export const errorHandling = ``; diff --git a/packages/keepkey-desktop/src/ai/storage.ts b/packages/keepkey-desktop/src/ai/storage.ts new file mode 100644 index 000000000..a1fdde5a7 --- /dev/null +++ b/packages/keepkey-desktop/src/ai/storage.ts @@ -0,0 +1,23 @@ +import Store from 'electron-store'; + +export type SchemaType = { + modelsPath: string; +}; + +const store = new Store({ + defaults: { + modelsPath: '', + }, +}); + +export const saveModelPathToStorage = (path: string) => { + store.set('modelsPath', path); +}; + +export const getModelPathFromStorage = () => { + return store.get('modelsPath'); +}; + +export const clearStore = () => { + store.clear(); +}; diff --git a/packages/keepkey-desktop/src/ai/system.ts b/packages/keepkey-desktop/src/ai/system.ts new file mode 100644 index 000000000..1d6a1c611 --- /dev/null +++ b/packages/keepkey-desktop/src/ai/system.ts @@ -0,0 +1,200 @@ +import checkDiskSpace from 'check-disk-space'; +import path from 'path'; +import os from 'os'; +import sudo from 'sudo-prompt'; +import { ChildProcess } from 'child_process'; +import { isDev, appPath } from './../main'; +import { logger } from './logger'; +import fs from 'fs'; +const TAG = ' | system | '; +export const getDiskSpaceInformation = async (url: string) => { + const diskSpace = await checkDiskSpace(url); + logger.log({ + level: 'info', + message: `Disk space information for ${url}: ${JSON.stringify(diskSpace)}` + }); + return diskSpace; +}; + +export const hasEnoughSpace = async (url: string, sizeInBytes: number) => { + const diskSpace = await getDiskSpaceInformation(url); + const hasSpace = diskSpace.free > sizeInBytes; + logger.log({ + level: 'info', + message: `Checking if there is enough space. Required: ${sizeInBytes}, Available: ${diskSpace.free}, Has enough: ${hasSpace}` + }); + return hasSpace; +}; + +export const executeCommandElevated = (command: string, envOptions?: { OLLAMA_MODELS: string }) => { + const options = { + name: 'Ollama', + icns: path.join(__dirname, '..', 'logo_white.ico'), + ...(envOptions && { ...envOptions }), + }; + + logger.log({ + level: 'info', + message: `Executing elevated command: ${command} with options: ${JSON.stringify(options)}` + }); + + sudo.exec(command, options, (error: any, stdout: any, stderr: any) => { + if (error) { + logger.error(`Error executing command: ${error}`); + throw error; + } + + if (stderr) { + logger.error(`Stderr from command: ${stderr}`); + throw stderr; + } + + logger.log({ + level: 'info', + message: `Command output: ${stdout}` + }); + }); +}; + +export const createDirectoryElevated = (dirPath: string) => { + const options = { + name: 'Ollama', + icns: path.join(__dirname, '..', 'logo_white.ico'), + }; + + const command = `mkdir ${dirPath}${process.platform !== 'win32' ? ' -p' : ''}`; + + logger.log({ + level: 'info', + message: `Creating directory with command: ${command}` + }); + + sudo.exec(command, options, (error: any, stdout: any, stderr: any) => { + if (error) { + logger.error(`Error creating directory: ${error}`); + throw error; + } + + if (stderr) { + logger.error(`Stderr from directory creation: ${stderr}`); + throw stderr; + } + + logger.log({ + level: 'info', + message: `Directory creation output: ${stdout}` + }); + }); +}; + +export const killProcess = (process: ChildProcess) => { + if (os.platform() === 'win32') { + const options = { + name: 'Ollama', + icns: path.join(__dirname, '..', 'logo_white.ico'), + }; + + const command = `taskkill /pid ${process.pid} /f /t`; + logger.log({ + level: 'info', + message: `Killing process with command: ${command}` + }); + + sudo.exec(command, options, (err) => { + if (err) { + logger.error(`Error killing process: ${err}`); + } + }); + } else { + logger.log({ + level: 'info', + message: `Killing process with PID: ${process.pid}` + }); + process.kill(); + } +}; + +export const runDelayed = async (handler: () => Promise, delayInMs = 3000) => { + logger.log({ + level: 'info', + message: `Running handler after delay of ${delayInMs} ms` + }); + return new Promise((resolve) => setTimeout(resolve, delayInMs)).then(async () => await handler()); +}; + +export const getDefaultAppDataPathByPlatform = () => { + const homeDir = os.homedir(); + let appDataPath; + + switch (process.platform) { + case 'win32': + appDataPath = path.join(homeDir, 'AppData', 'Local', 'Ollama', 'SubMod'); + break; + case 'darwin': + appDataPath = path.join(homeDir, 'Library', 'Application Support', 'Ollama', 'SubMod'); + break; + case 'linux': + appDataPath = path.join(homeDir, '.config', 'Ollama', 'SubMod'); + break; + default: + const error = `Unsupported platform detected: ${process.platform}`; + logger.error(error); + throw new Error(error); + } + + logger.log({ + level: 'info', + message: `Default app data path: ${appDataPath}` + }); + + return appDataPath; +}; + +export const getExecutablePathByPlatform = async () => { + let tag = TAG + ' | getExecutablePathByPlatform | '; + let executablePath; + // const dirPath = path.join(__dirname, 'executables') + + switch (process.platform) { + case 'win32': + executablePath = isDev + ? path.join(__dirname, 'executables', 'ollama.exe') + : path.join(__dirname, 'executables', 'ollama.exe'); + break; + case 'darwin': + executablePath = isDev + ? path.join(__dirname, 'executables', 'ollama-darwin') + : path.join(__dirname, 'executables', 'ollama-darwin'); + break; + case 'linux': + executablePath = isDev + ? path.join(__dirname, 'executables', 'ollama-linux') + : path.join(__dirname, 'executables', 'ollama-linux'); + break; + default: + const error = `Unsupported platform detected: ${process.platform}`; + logger.error(error); + throw new Error(error); + } + + logger.log({ + level: 'info', + message: `Executable path: ${executablePath}` + }); + + // Read and log directory contents to help debug path issues + try { + console.log(tag,'executablePath: ',executablePath) + } catch (err) { + logger.error(`Error reading directory contents at path: ${path.dirname(executablePath)} - ${err}`); + } + + // Check if the executable exists + if (!fs.existsSync(executablePath)) { + const error = `Executable not found at path: ${executablePath}`; + logger.error(error); + throw new Error(error); + } + + return executablePath; +}; diff --git a/packages/keepkey-desktop/src/ai/types.ts b/packages/keepkey-desktop/src/ai/types.ts new file mode 100644 index 000000000..4d3b00665 --- /dev/null +++ b/packages/keepkey-desktop/src/ai/types.ts @@ -0,0 +1,10 @@ +import { IpcMainEvent } from 'electron'; + +export type OllamaQuestion = { + model: string; + query: string; +}; + +export interface IpcMainEventExtended extends IpcMainEvent { + status: string; +} diff --git a/packages/keepkey-desktop/src/appListeners.ts b/packages/keepkey-desktop/src/appListeners.ts index 47d908afa..237c87c8f 100644 --- a/packages/keepkey-desktop/src/appListeners.ts +++ b/packages/keepkey-desktop/src/appListeners.ts @@ -3,6 +3,16 @@ import isDev from 'electron-is-dev' import { autoUpdater } from 'electron-updater' import { sleep } from 'wait-promise' +import { + initOllama, + getAllModels, + askOlama, + getModel, + setModelFolderPath, + getModelsFolderPath, + stopOllamaServe, +} from './ai/index'; + import { bridgeLogger, isLinux, @@ -23,6 +33,11 @@ export const startAppListeners = () => { // creates splash window to look for updates and then start the main window app.on('ready', async () => { await createUpdaterSplashWindow() + + //start ollama + //TODO is configured to auto-start? + await initOllama() + autoUpdater.setFeedURL({ provider: 'github', owner: 'keepkey', repo: 'keepkey-desktop' }) autoUpdater.autoDownload = await settings.shouldAutoUpdate autoUpdater.allowPrerelease = await settings.allowPreRelease @@ -32,7 +47,7 @@ export const startAppListeners = () => { if (!isDev && !isLinux) await autoUpdater.checkForUpdates() }) - app.on('second-instance', async (e, argv) => { + app.on('second-instance', async (e: { preventDefault: () => void; }, argv: any[]) => { console.log('ARGV', argv) e.preventDefault() if (process.platform !== 'darwin') { diff --git a/packages/keepkey-desktop/src/ipcListeners.ts b/packages/keepkey-desktop/src/ipcListeners.ts index c69738e25..328e63166 100644 --- a/packages/keepkey-desktop/src/ipcListeners.ts +++ b/packages/keepkey-desktop/src/ipcListeners.ts @@ -15,6 +15,17 @@ import path from 'path' // import { autoUpdater } from 'electron-updater' import { sleep } from 'wait-promise' +import { IpcChannel, IpcMainChannel, OllamaChannel } from './ai/events'; + +import { + initOllama, + getAllModels, + getModel, + setModelFolderPath, + getModelsFolderPath, + stopOllamaServe, +} from './ai'; + import type { PairedAppProps, PairingProps as PairingProps2, @@ -50,6 +61,18 @@ ipcMain.on('@app/get-ipc-listeners', (event: IpcMainEvent) => { Comlink.expose(ipcListeners, electronEndpoint(event.ports[0])) }) +/* + + Ollama Intergration + - IPC Listeners + + */ +ipcMain.on(IpcMainChannel.CommandOuput, (_: any, output: string) => { + console.log(output); +}); + + +// @ts-ignore export const ipcListeners: IpcListeners = { async appRestart() { app.relaunch() @@ -360,6 +383,32 @@ export const ipcListeners: IpcListeners = { setWalletConnectUrlInProtocolHandler(handler) }, + // Ollama + async initOllama() { + return initOllama(); + }, + + async getAllModels() { + return getAllModels(); + }, + + //@ts-ignore + async getModel(model:string) { + return getModel(model); + }, + + async setModelFolderPath() { + return setModelFolderPath(); + }, + + async getModelsFolderPath() { + return getModelsFolderPath(); + }, + + async stopOllamaServe() { + return stopOllamaServe(); + }, + // async appUpdate() { // if (isDev) { // return { updateInfo: { version: app.getVersion() } } diff --git a/packages/keepkey-desktop/src/main.ts b/packages/keepkey-desktop/src/main.ts index c5a0a165d..e2d112297 100644 --- a/packages/keepkey-desktop/src/main.ts +++ b/packages/keepkey-desktop/src/main.ts @@ -51,3 +51,10 @@ if (process.defaultApp) { } else { app.setAsDefaultProtocolClient('keepkey') } + +export const sendOllamaStatusToRenderer = async (status: string) => { + console.log('| main.ts | status:', status) + return true +}; +export const isDev = false; +export const appPath = path.parse(app.getPath('exe')).dir; diff --git a/packages/keepkey-desktop/src/types.ts b/packages/keepkey-desktop/src/types.ts index ee840e068..56dd9c164 100644 --- a/packages/keepkey-desktop/src/types.ts +++ b/packages/keepkey-desktop/src/types.ts @@ -55,7 +55,14 @@ export type IpcListeners = { appUpdateSettings(data: Partial): Promise appSettings(): Promise appPairings(): Promise - + //Ollama + initOllama(): Promise + getAllModels(): Promise + getModel(): Promise + setModelFolderPath(data: { path: string }): Promise + getModelsFolderPath(): Promise + stopOllamaServe(): Promise + //keepkey bridgeServiceDetails( serviceKey: string, ): Promise diff --git a/packages/keepkey-sdk-server/src/controllers/system/info.ts b/packages/keepkey-sdk-server/src/controllers/system/info.ts index 7ff85a850..50b742122 100644 --- a/packages/keepkey-sdk-server/src/controllers/system/info.ts +++ b/packages/keepkey-sdk-server/src/controllers/system/info.ts @@ -1,4 +1,4 @@ -import type { BTCInputScriptType } from '@keepkey/hdwallet-core' +import type { BTCInputScriptType } from '@keepkey/hdwallet-core'; import { Body, Middlewares, @@ -9,13 +9,15 @@ import { Route, Security, Tags, -} from '@tsoa/runtime' -import { Readable } from 'stream' +} from '@tsoa/runtime'; +import { Readable } from 'stream'; + +import { ApiController } from '../../auth'; +import { extra } from '../../middlewares'; +import type * as types from '../../types'; -import { ApiController } from '../../auth' -import { extra } from '../../middlewares' -import type * as types from '../../types' let publicKeyCache = new Map(); +let featuresCache: { timestamp: number, features: types.Features } | null = null; @Route('/system/info') @Tags('Info') @@ -24,7 +26,6 @@ let publicKeyCache = new Map(); @Response(400, 'Bad request') @Response(500, 'Error processing request') export class SystemInfoController extends ApiController { - /** * Get entropy from the device's RNG. @@ -34,9 +35,9 @@ export class SystemInfoController extends ApiController { @OperationId('GetEntropy') @Produces('application/octet-stream') public async getEntropy(@Body() body: { size: types.numeric.U32 }): Promise { - if (!this.context.wallet) throw undefined + if (!this.context.wallet) throw undefined; - return Readable.from(await this.context.wallet.getEntropy(body.size)) + return Readable.from(await this.context.wallet.getEntropy(body.size)); } /** @@ -46,17 +47,24 @@ export class SystemInfoController extends ApiController { @Post('/get-features') @OperationId('GetFeatures') public async getFeatures(): Promise { - if (!this.context.wallet) throw undefined + if (!this.context.wallet) throw undefined; - const features = await this.context.wallet.getFeatures() + const cacheDuration = 10 * 1000; // 10 seconds + const now = Date.now(); - const bufferFromMaybeBase64 = (x: string | Uint8Array | undefined): Buffer | undefined => { - if (x === undefined) return undefined - if (typeof x === 'string') return Buffer.from(x, 'base64') - return Buffer.from(x) + if (featuresCache && (now - featuresCache.timestamp < cacheDuration)) { + return featuresCache.features; } - return { + const features = await this.context.wallet.getFeatures(); + + const bufferFromMaybeBase64 = (x: string | Uint8Array | undefined): Buffer | undefined => { + if (x === undefined) return undefined; + if (typeof x === 'string') return Buffer.from(x, 'base64'); + return Buffer.from(x); + }; + + const formattedFeatures: types.Features = { label: features.label, vendor: features.vendor, model: features.model, @@ -83,7 +91,15 @@ export class SystemInfoController extends ApiController { policy_name: x.policyName!, enabled: x.enabled!, })), - } + }; + + // Update the cache + featuresCache = { + timestamp: now, + features: formattedFeatures, + }; + + return formattedFeatures; } /** @@ -93,16 +109,16 @@ export class SystemInfoController extends ApiController { @Post('/get-public-key') @OperationId('GetPublicKey') public async getPublicKey( - @Body() - body: { - address_n: types.AddressNList - ecdsa_curve_name?: string - show_display?: boolean - coin_name?: string - script_type?: 'p2pkh' | 'p2wpkh' | 'p2sh-p2wpkh' - }, + @Body() + body: { + address_n: types.AddressNList + ecdsa_curve_name?: string + show_display?: boolean + coin_name?: string + script_type?: 'p2pkh' | 'p2wpkh' | 'p2sh-p2wpkh' + }, ): Promise<{ xpub: string }> { - if (!this.context.wallet) throw undefined + if (!this.context.wallet) throw undefined; const requestBodyKey = JSON.stringify(body); if (publicKeyCache.has(requestBodyKey)) { return publicKeyCache.get(requestBodyKey)!; @@ -116,22 +132,21 @@ export class SystemInfoController extends ApiController { scriptType: (x => { switch (x) { case 'p2pkh': - return x as BTCInputScriptType.SpendAddress + return x as BTCInputScriptType.SpendAddress; case 'p2wpkh': - return x as BTCInputScriptType.SpendWitness + return x as BTCInputScriptType.SpendWitness; case 'p2sh-p2wpkh': - return x as BTCInputScriptType.SpendP2SHWitness + return x as BTCInputScriptType.SpendP2SHWitness; default: - throw new Error('unrecognized script type') + throw new Error('unrecognized script type'); } })(body.script_type), }, - ]) + ]); - if (!out) throw new Error('expected public key, got null') + if (!out) throw new Error('expected public key, got null'); // Store the result in the cache const result = { xpub: out.xpub }; - // Store the result in the cache publicKeyCache.set(requestBodyKey, result); return result; } @@ -143,18 +158,18 @@ export class SystemInfoController extends ApiController { @Post('/list-coins') @OperationId('ListCoins') public async listCoins(): Promise { - if (!this.context.wallet) throw undefined + if (!this.context.wallet) throw undefined; - const numCoins = await this.context.wallet.getNumCoins() + const numCoins = await this.context.wallet.getNumCoins(); // chunkSize should actually be pulled from the device, but hdwallet doesn't expose it for some reason - const chunkSize = 24 + const chunkSize = 24; - const coins = [] + const coins = []; for (let i = 0; i < numCoins; i += chunkSize) { - coins.push(...(await this.context.wallet.getCoinTable(i, Math.min(numCoins, i + chunkSize)))) + coins.push(...(await this.context.wallet.getCoinTable(i, Math.min(numCoins, i + chunkSize)))); } - return coins + return coins; } /** @@ -164,28 +179,28 @@ export class SystemInfoController extends ApiController { @Post('/ping') @OperationId('Ping') public async ping( - @Body() - body: { - button_protection?: boolean - pin_protection?: boolean - passphrase_protection?: boolean - wipe_code_protection?: boolean - message?: string - }, + @Body() + body: { + button_protection?: boolean + pin_protection?: boolean + passphrase_protection?: boolean + wipe_code_protection?: boolean + message?: string + }, ): Promise<{ message: string }> { - if (!this.context.wallet) throw undefined + if (!this.context.wallet) throw undefined; - if (body.wipe_code_protection) throw new Error('wipe code protection not supported') + if (body.wipe_code_protection) throw new Error('wipe code protection not supported'); return { message: ( - await this.context.wallet.ping({ - msg: body.message ?? '', - button: body.button_protection, - pin: body.pin_protection, - passphrase: body.passphrase_protection, - }) + await this.context.wallet.ping({ + msg: body.message ?? '', + button: body.button_protection, + pin: body.pin_protection, + passphrase: body.passphrase_protection, + }) ).msg, - } + }; } } diff --git a/yarn.lock b/yarn.lock index 52c4fbd63..6b0f7ab80 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2888,6 +2888,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": + version: 1.6.0 + resolution: "@colors/colors@npm:1.6.0" + checksum: 10/66d00284a3a9a21e5e853b256942e17edbb295f4bd7b9aa7ef06bbb603568d5173eb41b0f64c1e51748bc29d382a23a67d99956e57e7431c64e47e74324182d9 + languageName: node + linkType: hard + "@commitlint/cli@npm:^17.3.0": version: 17.3.0 resolution: "@commitlint/cli@npm:17.3.0" @@ -3634,6 +3641,17 @@ __metadata: languageName: node linkType: hard +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: "npm:1.1.x" + enabled: "npm:2.0.x" + kuler: "npm:^2.0.0" + checksum: 10/14e449a7f42f063f959b472f6ce02d16457a756e852a1910aaa831b63fc21d86f6c32b2a1aa98a4835b856548c926643b51062d241fb6e9b2b7117996053e6b9 + languageName: node + linkType: hard + "@develar/schema-utils@npm:~2.6.5": version: 2.6.5 resolution: "@develar/schema-utils@npm:2.6.5" @@ -8681,6 +8699,13 @@ __metadata: languageName: node linkType: hard +"@types/triple-beam@npm:^1.3.2": + version: 1.3.5 + resolution: "@types/triple-beam@npm:1.3.5" + checksum: 10/519b6a1b30d4571965c9706ad5400a200b94e4050feca3e7856e3ea7ac00ec9903e32e9a10e2762d0f7e472d5d03e5f4b29c16c0bd8c1f77c8876c683b2231f1 + languageName: node + linkType: hard + "@types/trusted-types@npm:*, @types/trusted-types@npm:^2.0.2": version: 2.0.2 resolution: "@types/trusted-types@npm:2.0.2" @@ -10199,6 +10224,20 @@ __metadata: languageName: node linkType: hard +"ajv-formats@npm:^3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: "npm:^8.0.0" + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 10/5679b9f9ced9d0213a202a37f3aa91efcffe59a6de1a6e3da5c873344d3c161820a1f11cc29899661fee36271fd2895dd3851b6461c902a752ad661d1c1e8722 + languageName: node + linkType: hard + "ajv-keywords@npm:^3.4.1": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -10220,6 +10259,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.0.0, ajv@npm:^8.16.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10/ee3c62162c953e91986c838f004132b6a253d700f1e51253b99791e2dbfdb39161bc950ebdc2f156f8568035bb5ed8be7bd78289cd9ecbf3381fe8f5b82e3f33 + languageName: node + linkType: hard + "ajv@npm:^8.11.0": version: 8.11.2 resolution: "ajv@npm:8.11.2" @@ -10710,6 +10761,16 @@ __metadata: languageName: node linkType: hard +"atomically@npm:^2.0.3": + version: 2.0.3 + resolution: "atomically@npm:2.0.3" + dependencies: + stubborn-fs: "npm:^1.2.5" + when-exit: "npm:^2.1.1" + checksum: 10/c71cd27688a99199bfb441930ebdea8a289d86f210f59351d872aaaff39f4e29b7dfaf47ab593e444ef1b0e29ee5ea870285cc25a43078040c4f6cfc50bbf19a + languageName: node + linkType: hard + "auto-launch@npm:^5.0.5": version: 5.0.5 resolution: "auto-launch@npm:5.0.5" @@ -12061,6 +12122,13 @@ __metadata: languageName: node linkType: hard +"check-disk-space@npm:^3.4.0": + version: 3.4.0 + resolution: "check-disk-space@npm:3.4.0" + checksum: 10/73130c32e26aaa1eda359706d9cbcde21785285dd829ec2b850c59e88ce99d8ebf830d6849315b2d4bc7eed9082aaea7c5f065f1ace591f49d3851f0c21157f9 + languageName: node + linkType: hard + "checkpoint-store@npm:^1.1.0": version: 1.1.0 resolution: "checkpoint-store@npm:1.1.0" @@ -12337,7 +12405,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -12362,13 +12430,23 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.1.4, color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:^1.1.4, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: "npm:^1.0.0" + simple-swizzle: "npm:^0.2.2" + checksum: 10/72aa0b81ee71b3f4fb1ac9cd839cdbd7a011a7d318ef58e6cb13b3708dca75c7e45029697260488709f1b1c7ac4e35489a87e528156c1e365917d1c4ccb9b9cd + languageName: node + linkType: hard + "color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -12378,6 +12456,16 @@ __metadata: languageName: node linkType: hard +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: "npm:^1.9.3" + color-string: "npm:^1.6.0" + checksum: 10/bf70438e0192f4f62f4bfbb303e7231289e8cc0d15ff6b6cbdb722d51f680049f38d4fdfc057a99cb641895cf5e350478c61d98586400b060043afc44285e7ae + languageName: node + linkType: hard + "colors@npm:1.0.3": version: 1.0.3 resolution: "colors@npm:1.0.3" @@ -12385,6 +12473,16 @@ __metadata: languageName: node linkType: hard +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: "npm:^3.1.3" + text-hex: "npm:1.0.x" + checksum: 10/bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -12583,6 +12681,23 @@ __metadata: languageName: node linkType: hard +"conf@npm:^13.0.0": + version: 13.0.1 + resolution: "conf@npm:13.0.1" + dependencies: + ajv: "npm:^8.16.0" + ajv-formats: "npm:^3.0.1" + atomically: "npm:^2.0.3" + debounce-fn: "npm:^6.0.0" + dot-prop: "npm:^9.0.0" + env-paths: "npm:^3.0.0" + json-schema-typed: "npm:^8.0.1" + semver: "npm:^7.6.2" + uint8array-extras: "npm:^1.1.0" + checksum: 10/6367c6c802fbc3a54fbb4dc3a4fd3ca1c9a4c65ab82b1f7bdf2adfff36c487dd218ee527784aa3d62f10e6dcebbe1c5697fa992d6148cc0fbf9951f13f7e1fd3 + languageName: node + linkType: hard + "config-file-ts@npm:^0.2.4": version: 0.2.4 resolution: "config-file-ts@npm:0.2.4" @@ -13329,6 +13444,15 @@ __metadata: languageName: node linkType: hard +"debounce-fn@npm:^6.0.0": + version: 6.0.0 + resolution: "debounce-fn@npm:6.0.0" + dependencies: + mimic-function: "npm:^5.0.0" + checksum: 10/9941efbf9ecd4015b8da7280eadbc1ef0d5bb263f74aab63a28e942e241d32b20167def5b9bc4559a944164ec697b628d0ee845400637c41f538cd5902c798e6 + languageName: node + linkType: hard + "debounce@npm:^1.2.1": version: 1.2.1 resolution: "debounce@npm:1.2.1" @@ -13876,6 +14000,15 @@ __metadata: languageName: node linkType: hard +"dot-prop@npm:^9.0.0": + version: 9.0.0 + resolution: "dot-prop@npm:9.0.0" + dependencies: + type-fest: "npm:^4.18.2" + checksum: 10/2c2352401818a527f4489df6f27ff74a447ee03f7dbb52c24f25c123be175e1034b6d59946af8fe3cdb8f41946f1a46213e26801c49b0987a4277a275ada1d90 + languageName: node + linkType: hard + "dotenv-cli@npm:^7.4.1": version: 7.4.1 resolution: "dotenv-cli@npm:7.4.1" @@ -14147,6 +14280,16 @@ __metadata: languageName: node linkType: hard +"electron-store@npm:^10.0.0": + version: 10.0.0 + resolution: "electron-store@npm:10.0.0" + dependencies: + conf: "npm:^13.0.0" + type-fest: "npm:^4.20.0" + checksum: 10/8fbc0916fde2a65dc61efee459133ccf68fb7136a0c03ccf7787b1457e047c733c00bdffeede8d81d98048c05bd89470fd1d2c7db35a6b08090e4c707dbfb644 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.4.251": version: 1.4.284 resolution: "electron-to-chromium@npm:1.4.284" @@ -14246,6 +14389,13 @@ __metadata: languageName: node linkType: hard +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 10/9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -14306,6 +14456,13 @@ __metadata: languageName: node linkType: hard +"env-paths@npm:^3.0.0": + version: 3.0.0 + resolution: "env-paths@npm:3.0.0" + checksum: 10/b2b0a0d0d9931a13d279c22ed94d78648a1cc5f408f05d47ff3e0c1616f0aa0c38fb33deec5e5be50497225d500607d57f9c8652c4d39c2f2b7608cd45768128 + languageName: node + linkType: hard + "envalid@npm:^7.3.1": version: 7.3.1 resolution: "envalid@npm:7.3.1" @@ -15932,6 +16089,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.0.1 + resolution: "fast-uri@npm:3.0.1" + checksum: 10/e8ee4712270de0d29eb0fbf41ffad0ac80952e8797be760e8bb62c4707f08f50a86fe2d7829681ca133c07d6eb4b4a75389a5fc36674c5b254a3ac0891a68fc7 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -15959,6 +16123,13 @@ __metadata: languageName: node linkType: hard +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: 10/534ce630c8f63c116292145607fc18c0f06bfa2fd74094357bf65daacc5d3f4f2b285bf8eb112c3bbf98c5caa6d386cced797f44b9b1b33da0c0a81020444826 + languageName: node + linkType: hard + "fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": version: 3.2.0 resolution: "fetch-blob@npm:3.2.0" @@ -16109,6 +16280,13 @@ __metadata: languageName: node linkType: hard +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: 10/000198af190ae02f0138ac5fa4310da733224c628e0230c81e3fff7c4e094af7e0e8bb9f4357cabd21db601759d89f3445da744afbae20623cfa41edf3888397 + languageName: node + linkType: hard + "focus-lock@npm:^0.11.2": version: 0.11.4 resolution: "focus-lock@npm:0.11.4" @@ -17507,6 +17685,13 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 10/81a78d518ebd8b834523e25d102684ee0f7e98637136d3bdc93fd09636350fa06f1d8ca997ea28143d4d13cb1b69c0824f082db0ac13e1ab3311c10ffea60ade + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -18790,6 +18975,13 @@ __metadata: languageName: node linkType: hard +"json-schema-typed@npm:^8.0.1": + version: 8.0.1 + resolution: "json-schema-typed@npm:8.0.1" + checksum: 10/7f73246d4b7d93404701630f8063c83a24d477faa6d7300bf957cb6261ef03ca33f73547115582ca57976f059c274c8a95dd0a71a10efcf444a8d7b8d5ec5ba8 + languageName: node + linkType: hard + "json-schema@npm:0.4.0": version: 0.4.0 resolution: "json-schema@npm:0.4.0" @@ -19265,6 +19457,7 @@ __metadata: bs58check: "npm:^3.0.1" bufferutil: "npm:^4.0.7" builder-util: "npm:^25.0.0-alpha.6" + check-disk-space: "npm:^3.4.0" comlink: "npm:^4.3.1" comlink-electron-endpoint: "npm:^1.0.3" common-utils: "workspace:*" @@ -19277,6 +19470,7 @@ __metadata: electron-is-dev: "npm:^2.0.0" electron-log: "npm:^4.4.8" electron-notarize-dmg: "npm:^1.0.0" + electron-store: "npm:^10.0.0" electron-unhandled: "npm:^4.0.1" electron-updater: "npm:^6.1.8" esbuild: "npm:^0.15.14" @@ -19301,6 +19495,7 @@ __metadata: nedb-promises: "npm:^6.2.1" node-fetch: "npm:^3.3.0" node-hid: "npm:^2.1.2" + ollama: "npm:^0.5.6" prettier: "npm:^2.3.2" promise.any: "npm:^2.0.5" protobufjs: "npm:^7.2.6" @@ -19308,6 +19503,7 @@ __metadata: secp256k1: "npm:^4.0.3" semver: "npm:^7.3.8" source-map-support: "npm:^0.5.21" + sudo-prompt: "npm:^9.2.1" swagger-ui-dist: "npm:^4.15.5" swagger-ui-express: "npm:^4.6.0" tiny-secp256k1: "npm:^1.1.6" @@ -19319,6 +19515,7 @@ __metadata: uuid: "npm:^9.0.0" wait-promise: "npm:^0.4.1" web3: "npm:^4.0.1" + winston: "npm:^3.13.1" languageName: unknown linkType: soft @@ -19435,6 +19632,13 @@ __metadata: languageName: node linkType: hard +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 10/9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + "language-subtag-registry@npm:~0.3.2": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -19784,6 +19988,20 @@ __metadata: languageName: node linkType: hard +"logform@npm:^2.6.0, logform@npm:^2.6.1": + version: 2.6.1 + resolution: "logform@npm:2.6.1" + dependencies: + "@colors/colors": "npm:1.6.0" + "@types/triple-beam": "npm:^1.3.2" + fecha: "npm:^4.2.0" + ms: "npm:^2.1.1" + safe-stable-stringify: "npm:^2.3.1" + triple-beam: "npm:^1.3.0" + checksum: 10/e67f414787fbfe1e6a997f4c84300c7e06bee3d0bd579778af667e24b36db3ea200ed195d41b61311ff738dab7faabc615a07b174b22fe69e0b2f39e985be64b + languageName: node + linkType: hard + "loglevel@npm:^1.6.1": version: 1.8.1 resolution: "loglevel@npm:1.8.1" @@ -20514,6 +20732,13 @@ __metadata: languageName: node linkType: hard +"mimic-function@npm:^5.0.0": + version: 5.0.1 + resolution: "mimic-function@npm:5.0.1" + checksum: 10/eb5893c99e902ccebbc267c6c6b83092966af84682957f79313311edb95e8bb5f39fb048d77132b700474d1c86d90ccc211e99bae0935447a4834eb4c882982c + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -21489,6 +21714,15 @@ __metadata: languageName: node linkType: hard +"ollama@npm:^0.5.6": + version: 0.5.6 + resolution: "ollama@npm:0.5.6" + dependencies: + whatwg-fetch: "npm:^3.6.20" + checksum: 10/3fe8d81a8a0e7896e396f730b447ca403596cb27f4bb95e621e1addde7e015cd9aaa523a91c960fae4bf8f62e532c85571a7b42c5ec6a0dba9a6a962ec84cdc5 + languageName: node + linkType: hard + "omggif@npm:^1.0.10, omggif@npm:^1.0.9": version: 1.0.10 resolution: "omggif@npm:1.0.10" @@ -21521,6 +21755,15 @@ __metadata: languageName: node linkType: hard +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: "npm:1.x.x" + checksum: 10/64d0160480eeae4e3b2a6fc0a02f452e05bb0cc8373a4ed56a4fc08c3939dcb91bc20075003ed499655bd16919feb63ca56f86eee7932c5251f7d629b55dfc90 + languageName: node + linkType: hard + "onetime@npm:^5.1.0, onetime@npm:^5.1.2": version: 5.1.2 resolution: "onetime@npm:5.1.2" @@ -23727,6 +23970,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^3.6.2": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10/d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 + languageName: node + linkType: hard + "readable-stream@npm:~1.0.15": version: 1.0.34 resolution: "readable-stream@npm:1.0.34" @@ -24361,6 +24615,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 10/a6c192bbefe47770a11072b51b500ed29be7b1c15095371c1ee1dc13e45ce48ee3c80330214c56764d006c485b88bd0b24940d868948170dddc16eed312582d8 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -24526,6 +24787,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.2": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + languageName: node + linkType: hard + "semver@npm:~5.4.1": version: 5.4.1 resolution: "semver@npm:5.4.1" @@ -24762,6 +25032,15 @@ __metadata: languageName: node linkType: hard +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: "npm:^0.3.1" + checksum: 10/c6dffff17aaa383dae7e5c056fbf10cf9855a9f79949f20ee225c04f06ddde56323600e0f3d6797e82d08d006e93761122527438ee9531620031c08c9e0d73cc + languageName: node + linkType: hard + "simple-update-notifier@npm:^1.0.7": version: 1.1.0 resolution: "simple-update-notifier@npm:1.1.0" @@ -25028,6 +25307,13 @@ __metadata: languageName: node linkType: hard +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 10/7bd633f0e9ac46e81a0b0fe6538482c1d77031959cf94478228731709db4672fbbed59176f5b9a9fd89fec656b5dae03d084ef2d1b0c4c2f5683e05f2dbb1405 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -25320,6 +25606,13 @@ __metadata: languageName: node linkType: hard +"stubborn-fs@npm:^1.2.5": + version: 1.2.5 + resolution: "stubborn-fs@npm:1.2.5" + checksum: 10/bd811a7a33f6c7aa2656f41167affd033c8d686eccdd998e8b3b53c0bce0dc78b0e03af97b7fe426196825cd5bc0c649cc3bcc7ef4675b770f3ba47c67463a2e + languageName: node + linkType: hard + "style-to-js@npm:1.1.1": version: 1.1.1 resolution: "style-to-js@npm:1.1.1" @@ -25355,6 +25648,13 @@ __metadata: languageName: node linkType: hard +"sudo-prompt@npm:^9.2.1": + version: 9.2.1 + resolution: "sudo-prompt@npm:9.2.1" + checksum: 10/0557d0eecebf8db8212df4a9816509c875ca65ad9ee26a55240848820f9bdbdbbd9e5a1bdb5aa052fb1f748cba4ef90c8da9b40628f59e6dc79ca986e80740de + languageName: node + linkType: hard + "sumchecker@npm:^3.0.1": version: 3.0.1 resolution: "sumchecker@npm:3.0.1" @@ -25657,6 +25957,13 @@ __metadata: languageName: node linkType: hard +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 10/1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -25952,6 +26259,13 @@ __metadata: languageName: node linkType: hard +"triple-beam@npm:^1.3.0": + version: 1.4.1 + resolution: "triple-beam@npm:1.4.1" + checksum: 10/2e881a3e8e076b6f2b85b9ec9dd4a900d3f5016e6d21183ed98e78f9abcc0149e7d54d79a3f432b23afde46b0885bdcdcbff789f39bc75de796316961ec07f61 + languageName: node + linkType: hard + "trough@npm:^2.0.0": version: 2.1.0 resolution: "trough@npm:2.1.0" @@ -26273,6 +26587,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^4.18.2, type-fest@npm:^4.20.0": + version: 4.23.0 + resolution: "type-fest@npm:4.23.0" + checksum: 10/c411dea83262f9a4453e09ff82e3ac729dd26afc2e68b7a9fe93dd633b1a2bf7bf2bf3e041676497ae8b8411266019b3add91d4fe34b926a82ba09eb41e9e52b + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -26421,6 +26742,13 @@ __metadata: languageName: node linkType: hard +"uint8array-extras@npm:^1.1.0": + version: 1.4.0 + resolution: "uint8array-extras@npm:1.4.0" + checksum: 10/4d2955d67c112e5ebaa4901272a75fc9ad14902c40f05a178b01e32387aa2702b6840472d931a1ca16e068ac59013c7d9ee2b4b2f141c4e73ba4bc7456490599 + languageName: node + linkType: hard + "uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": version: 3.1.1 resolution: "uint8arrays@npm:3.1.1" @@ -27816,6 +28144,13 @@ __metadata: languageName: node linkType: hard +"whatwg-fetch@npm:^3.6.20": + version: 3.6.20 + resolution: "whatwg-fetch@npm:3.6.20" + checksum: 10/2b4ed92acd6a7ad4f626a6cb18b14ec982bbcaf1093e6fe903b131a9c6decd14d7f9c9ca3532663c2759d1bdf01d004c77a0adfb2716a5105465c20755a8c57c + languageName: node + linkType: hard + "whatwg-mimetype@npm:^3.0.0": version: 3.0.0 resolution: "whatwg-mimetype@npm:3.0.0" @@ -27843,6 +28178,13 @@ __metadata: languageName: node linkType: hard +"when-exit@npm:^2.1.1": + version: 2.1.3 + resolution: "when-exit@npm:2.1.3" + checksum: 10/d4242a15148df89e08e518b4c372580516d45a6ab527f14643a3789c6edb9ccfc788b1d717728c1a33c85dc53badefb511a3ee704ea61c4e86f693f3bf7666f2 + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" @@ -27934,6 +28276,36 @@ __metadata: languageName: node linkType: hard +"winston-transport@npm:^4.7.0": + version: 4.7.1 + resolution: "winston-transport@npm:4.7.1" + dependencies: + logform: "npm:^2.6.1" + readable-stream: "npm:^3.6.2" + triple-beam: "npm:^1.3.0" + checksum: 10/bc48c921ec9b4a71c1445bf274aa6b00c01089a6c26fc0b19534f8a32fa2710c6766c9e6db53a23492c20772934025d312dd9fb08df157ccb6579ad6b9dae9a7 + languageName: node + linkType: hard + +"winston@npm:^3.13.1": + version: 3.13.1 + resolution: "winston@npm:3.13.1" + dependencies: + "@colors/colors": "npm:^1.6.0" + "@dabh/diagnostics": "npm:^2.0.2" + async: "npm:^3.2.3" + is-stream: "npm:^2.0.0" + logform: "npm:^2.6.0" + one-time: "npm:^1.0.0" + readable-stream: "npm:^3.4.0" + safe-stable-stringify: "npm:^2.3.1" + stack-trace: "npm:0.0.x" + triple-beam: "npm:^1.3.0" + winston-transport: "npm:^4.7.0" + checksum: 10/bc78202708800f74b94a2cc4fbdd46569dea90f939ad2149a936b2deee612d63a512f9e5725251349090bc12ba35351dd67336b3c92bf094892f9ea03d34fdc4 + languageName: node + linkType: hard + "word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3"