diff --git a/electron/core/plugins/data-plugin/index.ts b/electron/core/plugins/data-plugin/index.ts index 87f58673e..8e90654ae 100644 --- a/electron/core/plugins/data-plugin/index.ts +++ b/electron/core/plugins/data-plugin/index.ts @@ -1,6 +1,6 @@ -import { core, store, RegisterExtensionPoint, StoreService, DataService } from "@janhq/plugin-core"; +import { core, store, RegisterExtensionPoint, StoreService, DataService, PluginService } from "@janhq/plugin-core"; -// Provide an async method to manipulate the price provided by the extension point +const PluginName = "data-plugin"; const MODULE_PATH = "data-plugin/dist/cjs/module.js"; /** @@ -12,7 +12,6 @@ const MODULE_PATH = "data-plugin/dist/cjs/module.js"; * */ function createCollection({ name, schema }: { name: string; schema?: { [key: string]: any } }): Promise { - console.log("renderer: creating collection:", name, schema); return core.invokePluginFunc(MODULE_PATH, "createCollection", name, schema); } @@ -137,8 +136,7 @@ function onStart() { // Register all the above functions and objects with the relevant extension points export function init({ register }: { register: RegisterExtensionPoint }) { - onStart(); - + register(PluginService.OnStart, PluginName, onStart); register(StoreService.CreateCollection, createCollection.name, createCollection); register(StoreService.DeleteCollection, deleteCollection.name, deleteCollection); register(StoreService.InsertOne, insertOne.name, insertOne); diff --git a/electron/core/plugins/data-plugin/package-lock.json b/electron/core/plugins/data-plugin/package-lock.json index 5594af93c..5de27e83e 100644 --- a/electron/core/plugins/data-plugin/package-lock.json +++ b/electron/core/plugins/data-plugin/package-lock.json @@ -1,20 +1,20 @@ { "name": "data-plugin", - "version": "1.0.0", + "version": "1.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "data-plugin", - "version": "1.0.0", + "version": "1.0.4", "bundleDependencies": [ - "rxdb", - "rxjs" + "pouchdb-node", + "pouchdb-find" ], "hasInstallScript": true, "license": "MIT", "dependencies": { - "@janhq/plugin-core": "file:../../../../plugin-core", + "@janhq/plugin-core": "^0.1.5", "pouchdb-find": "^8.0.1", "pouchdb-node": "^8.0.1" }, @@ -31,10 +31,11 @@ }, "../../../../plugin-core": { "name": "@janhq/plugin-core", - "version": "0.1.0", + "version": "0.1.6", "license": "MIT", "devDependencies": { - "@types/node": "^12.0.2" + "@types/node": "^12.0.2", + "typescript": "^5.2.2" } }, "node_modules/@cspotcode/source-map-support": { @@ -177,9 +178,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", "dev": true, "dependencies": { "undici-types": "~5.25.1" @@ -397,6 +398,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "inBundle": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -408,6 +410,7 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "inBundle": true, "dependencies": { "buffer": "^5.5.0", "immediate": "^3.2.3", @@ -674,7 +677,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "inBundle": true }, "node_modules/binary-extensions": { "version": "1.13.1", @@ -769,6 +773,7 @@ "url": "https://feross.org/support" } ], + "inBundle": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -777,7 +782,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "inBundle": true }, "node_modules/cache-base": { "version": "1.0.1", @@ -809,9 +815,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", + "version": "1.0.30001549", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz", + "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==", "dev": true, "funding": [ { @@ -966,6 +972,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "inBundle": true, "engines": { "node": ">= 0.10" } @@ -1083,7 +1090,8 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "inBundle": true }, "node_modules/cpx": { "version": "1.5.0", @@ -1158,6 +1166,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "inBundle": true, "dependencies": { "abstract-leveldown": "~6.2.1", "inherits": "^2.0.3" @@ -1218,7 +1227,8 @@ "node_modules/double-ended-queue": { "version": "2.1.0-0", "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==" + "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==", + "inBundle": true }, "node_modules/duplexer": { "version": "0.1.2", @@ -1227,15 +1237,16 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.551", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz", - "integrity": "sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw==", + "version": "1.4.554", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz", + "integrity": "sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ==", "dev": true }, "node_modules/encoding-down": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "inBundle": true, "dependencies": { "abstract-leveldown": "^6.2.1", "inherits": "^2.0.3", @@ -1250,6 +1261,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/end-stream/-/end-stream-0.1.0.tgz", "integrity": "sha512-Brl10T8kYnc75IepKizW6Y9liyW8ikz1B7n/xoHrJxoVSSjoqPn30sb7XVFfQERK4QfUMYRGs9dhWwtt2eu6uA==", + "inBundle": true, "dependencies": { "write-stream": "~0.4.3" } @@ -1283,6 +1295,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "inBundle": true, "dependencies": { "prr": "~1.0.1" }, @@ -1352,6 +1365,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "inBundle": true, "engines": { "node": ">=6" } @@ -1451,6 +1465,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==", + "inBundle": true, "dependencies": { "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" }, @@ -1792,7 +1807,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "inBundle": true }, "node_modules/ignore-walk": { "version": "3.0.4", @@ -1806,7 +1822,8 @@ "node_modules/immediate": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "inBundle": true }, "node_modules/import-local": { "version": "3.1.0", @@ -1840,7 +1857,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "inBundle": true }, "node_modules/ini": { "version": "1.3.8", @@ -2078,7 +2096,8 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "inBundle": true }, "node_modules/isexe": { "version": "2.0.0", @@ -2155,6 +2174,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/level/-/level-6.0.1.tgz", "integrity": "sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==", + "inBundle": true, "dependencies": { "level-js": "^5.0.0", "level-packager": "^5.1.0", @@ -2172,6 +2192,7 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "inBundle": true, "dependencies": { "buffer": "^5.6.0" }, @@ -2183,6 +2204,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "inBundle": true, "engines": { "node": ">=6" } @@ -2191,6 +2213,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "inBundle": true, "dependencies": { "errno": "~0.1.1" }, @@ -2202,6 +2225,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "inBundle": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.4.0", @@ -2215,6 +2239,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "inBundle": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2228,6 +2253,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/level-js/-/level-js-5.0.2.tgz", "integrity": "sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==", + "inBundle": true, "dependencies": { "abstract-leveldown": "~6.2.3", "buffer": "^5.5.0", @@ -2239,6 +2265,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "inBundle": true, "dependencies": { "encoding-down": "^6.3.0", "levelup": "^4.3.2" @@ -2251,6 +2278,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "inBundle": true, "dependencies": { "xtend": "^4.0.2" }, @@ -2262,6 +2290,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/level-write-stream/-/level-write-stream-1.0.0.tgz", "integrity": "sha512-bBNKOEOMl8msO+uIM9YX/gUO6ckokZ/4pCwTm/lwvs46x6Xs8Zy0sn3Vh37eDqse4mhy4fOMIb/JsSM2nyQFtw==", + "inBundle": true, "dependencies": { "end-stream": "~0.1.0" } @@ -2271,6 +2300,7 @@ "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-5.6.0.tgz", "integrity": "sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==", "hasInstallScript": true, + "inBundle": true, "dependencies": { "abstract-leveldown": "~6.2.1", "napi-macros": "~2.0.0", @@ -2284,6 +2314,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "inBundle": true, "dependencies": { "deferred-leveldown": "~5.3.0", "level-errors": "~2.0.0", @@ -2337,7 +2368,8 @@ "node_modules/ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "inBundle": true }, "node_modules/make-error": { "version": "1.3.6", @@ -2565,7 +2597,8 @@ "node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "inBundle": true }, "node_modules/needle": { "version": "2.9.1", @@ -2594,6 +2627,7 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "inBundle": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2613,6 +2647,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.1.1.tgz", "integrity": "sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==", + "inBundle": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -3041,6 +3076,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-8.0.1.tgz", "integrity": "sha512-BxJRHdfiC8gID8h4DPS0Xy6wsa2VBHRHMv9hsm0BhGTWTqS4k8ivItVSeU2dMoXiTBYp+7SerYmovUQNGSX1GA==", + "inBundle": true, "dependencies": { "pouchdb-binary-utils": "8.0.1", "pouchdb-collate": "8.0.1", @@ -3056,6 +3092,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-binary-utils/-/pouchdb-binary-utils-8.0.1.tgz", "integrity": "sha512-WsuR/S0aoUlcA0Alt99czkXsfuXWcrYXAcvGiTW02zawVXOafCnb/qHjA09TUaV0oy5HeHmYaNnDckoOUqspeA==", + "inBundle": true, "dependencies": { "buffer-from": "1.1.2" } @@ -3063,22 +3100,26 @@ "node_modules/pouchdb-collate": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-collate/-/pouchdb-collate-8.0.1.tgz", - "integrity": "sha512-DTuNz1UJjBTGZMUlWS1klSE1rPsmHy8IIDie3MFH1ZTz/C+SwGgGwkiAyUDv/n00D18EMLgXq5mu+r7L6K1BwQ==" + "integrity": "sha512-DTuNz1UJjBTGZMUlWS1klSE1rPsmHy8IIDie3MFH1ZTz/C+SwGgGwkiAyUDv/n00D18EMLgXq5mu+r7L6K1BwQ==", + "inBundle": true }, "node_modules/pouchdb-collections": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-8.0.1.tgz", - "integrity": "sha512-TlkQ2GGHJApJgL0b7bJMQcwX6eMfVenLeoK9mqHfC2fJssui+HWJJ5LYKHOWan11SeB90BQVFbO6rHN6CJQeDg==" + "integrity": "sha512-TlkQ2GGHJApJgL0b7bJMQcwX6eMfVenLeoK9mqHfC2fJssui+HWJJ5LYKHOWan11SeB90BQVFbO6rHN6CJQeDg==", + "inBundle": true }, "node_modules/pouchdb-errors": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-errors/-/pouchdb-errors-8.0.1.tgz", - "integrity": "sha512-H+ZsQxcG/JV3Tn29gnM6c9+lRPCN91ZYOkoIICsLjVRYgOTzN1AvNUD/G5JCB+81aI/u3fxZec0LEaZh6g6NHA==" + "integrity": "sha512-H+ZsQxcG/JV3Tn29gnM6c9+lRPCN91ZYOkoIICsLjVRYgOTzN1AvNUD/G5JCB+81aI/u3fxZec0LEaZh6g6NHA==", + "inBundle": true }, "node_modules/pouchdb-fetch": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-fetch/-/pouchdb-fetch-8.0.1.tgz", "integrity": "sha512-Px5HLT8MxqTujc8bpPRKoouznDTJa9XBGqCbhl95q6rhjWRfwZEvXjV92z0B5BALAM6D6avMyG0DjuNfUWnMuA==", + "inBundle": true, "dependencies": { "abort-controller": "3.0.0", "fetch-cookie": "0.11.0", @@ -3089,6 +3130,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-find/-/pouchdb-find-8.0.1.tgz", "integrity": "sha512-i5criYXMOXlbeRrCrXonqaOY+xiMiOyTLybqvtX/NkUsiD4BxJxkq5AxdSlHdJ9703nWJ0k6S+5C8VrpEj8tsQ==", + "inBundle": true, "dependencies": { "pouchdb-abstract-mapreduce": "8.0.1", "pouchdb-collate": "8.0.1", @@ -3103,6 +3145,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-8.0.1.tgz", "integrity": "sha512-asZcFLy1DA3oe5CeXIRCpfVrBHaHRvSb3Tc/LPD1dZDDtpEkeCuXGtJm+praN0jl41jTBEm0uMdD/YI0J5ZFXw==", + "inBundle": true, "dependencies": { "pouchdb-collections": "8.0.1", "pouchdb-utils": "8.0.1" @@ -3112,6 +3155,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-md5/-/pouchdb-md5-8.0.1.tgz", "integrity": "sha512-shVcs/K/iilrcAhDEERpLIrGm/cnDVsXiocOzs7kycJEuBqYnLD9nj58VwWDcum26wfa8T9cznvEGE1jlYVNPQ==", + "inBundle": true, "dependencies": { "pouchdb-binary-utils": "8.0.1", "spark-md5": "3.0.2" @@ -3121,6 +3165,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-node/-/pouchdb-node-8.0.1.tgz", "integrity": "sha512-xYvVmBB/nEZltBYkslE0RKciL7l359BFbG27gyGJlpPHeMUhtVlYHoEiI2gb2x2pEn7hG9B7Odo8keuq4/ot1w==", + "inBundle": true, "dependencies": { "abort-controller": "3.0.0", "buffer-from": "1.1.2", @@ -3143,12 +3188,14 @@ "node_modules/pouchdb-node/node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "inBundle": true }, "node_modules/pouchdb-node/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "inBundle": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -3159,12 +3206,14 @@ "node_modules/pouchdb-node/node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "inBundle": true }, "node_modules/pouchdb-selector-core": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-selector-core/-/pouchdb-selector-core-8.0.1.tgz", "integrity": "sha512-dHWsnR+mLGyfVld1vSHJI1xKTwS1xk1G2dggjfXfUrLehI+wysjTUOwiSNytyPzG6DpT+o86wyUpwzPwsDCLBw==", + "inBundle": true, "dependencies": { "pouchdb-collate": "8.0.1", "pouchdb-utils": "8.0.1" @@ -3174,6 +3223,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/pouchdb-utils/-/pouchdb-utils-8.0.1.tgz", "integrity": "sha512-pWgxdk9EHVWJmjQoEvTe+ZlPXyjcuQ/vgLITN+RjGwcYhoQYUE1M0PksQd2dUP3V8lGS4+wrg9lEM/qSJPYcpw==", + "inBundle": true, "dependencies": { "clone-buffer": "1.0.0", "immediate": "3.3.0", @@ -3195,22 +3245,26 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "inBundle": true }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "inBundle": true }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "inBundle": true }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "inBundle": true, "engines": { "node": ">=6" } @@ -3218,7 +3272,8 @@ "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "inBundle": true }, "node_modules/randomatic": { "version": "3.1.1", @@ -3280,6 +3335,7 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "inBundle": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3293,7 +3349,8 @@ "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "inBundle": true }, "node_modules/readdirp": { "version": "2.2.1", @@ -3694,7 +3751,8 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "inBundle": true }, "node_modules/resolve": { "version": "1.22.8", @@ -4145,7 +4203,8 @@ "node_modules/spark-md5": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", - "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", + "inBundle": true }, "node_modules/split-string": { "version": "3.1.0", @@ -4235,6 +4294,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "inBundle": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -4242,7 +4302,8 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "inBundle": true }, "node_modules/string-width": { "version": "1.0.2", @@ -4405,6 +4466,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "inBundle": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "2 || 3" @@ -4466,6 +4528,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "inBundle": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -4479,7 +4542,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "inBundle": true }, "node_modules/ts-loader": { "version": "9.5.0", @@ -4655,6 +4719,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "inBundle": true, "engines": { "node": ">= 4.0.0" } @@ -4766,6 +4831,7 @@ "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "inBundle": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -4783,12 +4849,14 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "inBundle": true }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "inBundle": true, "bin": { "uuid": "dist/bin/uuid" } @@ -4802,7 +4870,8 @@ "node_modules/vuvuzela": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/vuvuzela/-/vuvuzela-1.0.3.tgz", - "integrity": "sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==" + "integrity": "sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==", + "inBundle": true }, "node_modules/watchpack": { "version": "2.4.0", @@ -4820,12 +4889,13 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "inBundle": true }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -4949,6 +5019,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "inBundle": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -4994,6 +5065,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/write-stream/-/write-stream-0.4.3.tgz", "integrity": "sha512-IJrvkhbAnj89W/GAVdVgbnPiVw5Ntg/B4tc/MUCIEwj/g6JIww1DWJyB/yBMT3yw2/TkT6IUZ0+IYef3flEw8A==", + "inBundle": true, "dependencies": { "readable-stream": "~0.0.2" } @@ -5001,12 +5073,14 @@ "node_modules/write-stream/node_modules/readable-stream": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-0.0.4.tgz", - "integrity": "sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw==" + "integrity": "sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw==", + "inBundle": true }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "inBundle": true, "engines": { "node": ">=0.4" } diff --git a/electron/core/plugins/data-plugin/package.json b/electron/core/plugins/data-plugin/package.json index fec21d616..43cecfd4b 100644 --- a/electron/core/plugins/data-plugin/package.json +++ b/electron/core/plugins/data-plugin/package.json @@ -39,7 +39,7 @@ "node_modules" ], "dependencies": { - "@janhq/plugin-core": "file:../../../../plugin-core", + "@janhq/plugin-core": "^0.1.7", "pouchdb-find": "^8.0.1", "pouchdb-node": "^8.0.1" } diff --git a/electron/core/plugins/inference-plugin/index.ts b/electron/core/plugins/inference-plugin/index.ts index 9f758f12f..7b95f37b1 100644 --- a/electron/core/plugins/inference-plugin/index.ts +++ b/electron/core/plugins/inference-plugin/index.ts @@ -1,23 +1,97 @@ -const MODULE_PATH = "inference-plugin/dist/module.js"; +import { EventName, InferenceService, NewMessageRequest, PluginService, core, events, store } from "@janhq/plugin-core"; -const initModel = async (product) => - new Promise(async (resolve) => { - if (window.electronAPI) { - window.electronAPI - .invokePluginFunc(MODULE_PATH, "initModel", product) - .then((res) => resolve(res)); - } - }); +const PluginName = "inference-plugin"; +const MODULE_PATH = `${PluginName}/dist/module.js`; +const inferenceUrl = "http://localhost:3928/llama/chat_completion"; -const inferenceUrl = () => "http://localhost:3928/llama/chat_completion"; +const initModel = async (product) => core.invokePluginFunc(MODULE_PATH, "initModel", product); const stopModel = () => { - window.electronAPI.invokePluginFunc(MODULE_PATH, "killSubprocess"); + core.invokePluginFunc(MODULE_PATH, "killSubprocess"); }; +async function handleMessageRequest(data: NewMessageRequest) { + // TODO: Common collections should be able to access via core functions instead of store + const messageHistory = + (await store.findMany("messages", { conversationId: data.conversationId }, [{ createdAt: "asc" }])) ?? []; + const recentMessages = messageHistory + .filter((e) => e.message !== "" && (e.user === "user" || e.user === "assistant")) + .slice(-10) + .map((message) => { + return { + content: message.message.trim(), + role: message.user === "user" ? "user" : "assistant", + }; + }); + + const message = { + ...data, + message: "", + user: "assistant", + createdAt: new Date().toISOString(), + _id: undefined, + }; + // TODO: Common collections should be able to access via core functions instead of store + const id = await store.insertOne("messages", message); + + message._id = id; + events.emit(EventName.OnNewMessageResponse, message); + + const response = await fetch(inferenceUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + Accept: "text/event-stream", + "Access-Control-Allow-Origi": "*", + }, + body: JSON.stringify({ + messages: recentMessages, + stream: true, + model: "gpt-3.5-turbo", + max_tokens: 500, + }), + }); + const stream = response.body; + + const decoder = new TextDecoder("utf-8"); + const reader = stream?.getReader(); + let answer = ""; + + while (true && reader) { + const { done, value } = await reader.read(); + if (done) { + console.log("SSE stream closed"); + break; + } + const text = decoder.decode(value); + const lines = text.trim().split("\n"); + for (const line of lines) { + if (line.startsWith("data: ") && !line.includes("data: [DONE]")) { + const data = JSON.parse(line.replace("data: ", "")); + answer += data.choices[0]?.delta?.content ?? ""; + if (answer.startsWith("assistant: ")) { + answer = answer.replace("assistant: ", ""); + } + message.message = answer; + events.emit(EventName.OnMessageResponseUpdate, message); + } + } + } + message.message = answer.trim(); + // TODO: Common collections should be able to access via core functions instead of store + await store.updateOne("messages", message._id, message); +} + +const registerListener = () => { + events.on(EventName.OnNewMessageRequest, handleMessageRequest); +}; + +const onStart = async () => { + registerListener(); +}; // Register all the above functions and objects with the relevant extension points export function init({ register }) { - register("initModel", "initModel", initModel); - register("inferenceUrl", "inferenceUrl", inferenceUrl); - register("stopModel", "stopModel", stopModel); + register(PluginService.OnStart, PluginName, onStart); + register(InferenceService.InitModel, initModel.name, initModel); + register(InferenceService.StopModel, stopModel.name, stopModel); } diff --git a/electron/core/plugins/inference-plugin/package-lock.json b/electron/core/plugins/inference-plugin/package-lock.json index 9bb9c09e7..5a593472e 100644 --- a/electron/core/plugins/inference-plugin/package-lock.json +++ b/electron/core/plugins/inference-plugin/package-lock.json @@ -14,6 +14,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { + "@janhq/plugin-core": "^0.1.5", "kill-port-process": "^3.2.0", "tcp-port-used": "^1.0.2", "ts-loader": "^9.5.0" @@ -28,6 +29,15 @@ "node": ">=18.0.0" } }, + "../../../../plugin-core": { + "name": "@janhq/plugin-core", + "version": "0.1.6", + "license": "MIT", + "devDependencies": { + "@types/node": "^12.0.2", + "typescript": "^5.2.2" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -37,6 +47,10 @@ "node": ">=10.0.0" } }, + "node_modules/@janhq/plugin-core": { + "resolved": "../../../../plugin-core", + "link": true + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", diff --git a/electron/core/plugins/inference-plugin/package.json b/electron/core/plugins/inference-plugin/package.json index 3983432f6..6cbfa041e 100644 --- a/electron/core/plugins/inference-plugin/package.json +++ b/electron/core/plugins/inference-plugin/package.json @@ -25,6 +25,7 @@ "webpack-cli": "^5.1.4" }, "dependencies": { + "@janhq/plugin-core": "^0.1.7", "kill-port-process": "^3.2.0", "tcp-port-used": "^1.0.2", "ts-loader": "^9.5.0" diff --git a/electron/core/plugins/inference-plugin/tsconfig.json b/electron/core/plugins/inference-plugin/tsconfig.json index 72d6f3732..339950719 100644 --- a/electron/core/plugins/inference-plugin/tsconfig.json +++ b/electron/core/plugins/inference-plugin/tsconfig.json @@ -1,22 +1,13 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - /* Modules */ - "module": "ES6" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "." /* Specify the base directory to resolve non-relative module names. */, - // "paths": {} /* Specify a set of entries that re-map imports to additional lookup locations. */, - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "target": "es2016", + "module": "ES6", + "moduleResolution": "node", - "outDir": "./dist" /* Specify an output folder for all emitted files. */, - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - /* Type Checking */ - "strict": false /* Enable all strict type-checking options. */, - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": false, + "skipLibCheck": true } } diff --git a/electron/core/plugins/inference-plugin/types/index.d.ts b/electron/core/plugins/inference-plugin/types/index.d.ts deleted file mode 100644 index a7ac3c8ac..000000000 --- a/electron/core/plugins/inference-plugin/types/index.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export {}; - -declare global { - interface Window { - electronAPI?: any | undefined; - } -} diff --git a/electron/core/plugins/model-management-plugin/index.ts b/electron/core/plugins/model-management-plugin/index.ts index 62df1b980..f031d9bfc 100644 --- a/electron/core/plugins/model-management-plugin/index.ts +++ b/electron/core/plugins/model-management-plugin/index.ts @@ -1,4 +1,6 @@ -import { ModelManagementService, RegisterExtensionPoint, core, store } from "@janhq/plugin-core"; +import { ModelManagementService, PluginService, RegisterExtensionPoint, core, store } from "@janhq/plugin-core"; + +const PluginName = "model-management-plugin"; const MODULE_PATH = "model-management-plugin/dist/module.js"; const getDownloadedModels = () => core.invokePluginFunc(MODULE_PATH, "getDownloadedModels"); @@ -81,7 +83,7 @@ function onStart() { // Register all the above functions and objects with the relevant extension points export function init({ register }: { register: RegisterExtensionPoint }) { - onStart(); + register(PluginService.OnStart, PluginName, onStart); register(ModelManagementService.GetDownloadedModels, getDownloadedModels.name, getDownloadedModels); register(ModelManagementService.GetAvailableModels, getAvailableModels.name, getAvailableModels); diff --git a/electron/core/plugins/model-management-plugin/package-lock.json b/electron/core/plugins/model-management-plugin/package-lock.json index b8587f369..b36a690a4 100644 --- a/electron/core/plugins/model-management-plugin/package-lock.json +++ b/electron/core/plugins/model-management-plugin/package-lock.json @@ -14,7 +14,7 @@ "license": "MIT", "dependencies": { "@huggingface/hub": "^0.8.5", - "@janhq/plugin-core": "file:../../../../plugin-core", + "@janhq/plugin-core": "^0.1.5", "ts-loader": "^9.5.0" }, "devDependencies": { @@ -26,10 +26,11 @@ }, "../../../../plugin-core": { "name": "@janhq/plugin-core", - "version": "0.1.0", + "version": "0.1.6", "license": "MIT", "devDependencies": { - "@types/node": "^12.0.2" + "@types/node": "^12.0.2", + "typescript": "^5.2.2" } }, "node_modules/@discoveryjs/json-ext": { diff --git a/electron/core/plugins/model-management-plugin/package.json b/electron/core/plugins/model-management-plugin/package.json index 137c54c8d..0473f8c37 100644 --- a/electron/core/plugins/model-management-plugin/package.json +++ b/electron/core/plugins/model-management-plugin/package.json @@ -27,7 +27,7 @@ ], "dependencies": { "@huggingface/hub": "^0.8.5", - "@janhq/plugin-core": "file:../../../../plugin-core", + "@janhq/plugin-core": "^0.1.7", "ts-loader": "^9.5.0" }, "bundledDependencies": [ diff --git a/electron/core/plugins/openai-plugin/index.ts b/electron/core/plugins/openai-plugin/index.ts new file mode 100644 index 000000000..91e640399 --- /dev/null +++ b/electron/core/plugins/openai-plugin/index.ts @@ -0,0 +1,115 @@ +import { + PluginService, + EventName, + NewMessageRequest, + events, + store, + preferences, + RegisterExtensionPoint, +} from "@janhq/plugin-core"; +import { Configuration, OpenAIApi } from "azure-openai"; + +const PluginName = "openai-plugin"; + +const setRequestHeader = XMLHttpRequest.prototype.setRequestHeader; +XMLHttpRequest.prototype.setRequestHeader = function newSetRequestHeader(key: string, val: string) { + if (key.toLocaleLowerCase() === "user-agent") { + return; + } + setRequestHeader.apply(this, [key, val]); +}; + +var openai: OpenAIApi | undefined = undefined; + +const setup = async () => { + const apiKey: string = (await preferences.get(PluginName, "apiKey")) ?? ""; + const endpoint: string = (await preferences.get(PluginName, "endpoint")) ?? ""; + const deploymentName: string = (await preferences.get(PluginName, "deploymentName")) ?? ""; + try { + openai = new OpenAIApi( + new Configuration({ + azure: { + apiKey, //Your API key goes here + endpoint, //Your endpoint goes here. It is like: "https://endpointname.openai.azure.com/" + deploymentName, //Your deployment name goes here. It is like "chatgpt" + }, + }) + ); + } catch (err) { + openai = undefined; + console.log(err); + } +}; + +async function onStart() { + setup(); + registerListener(); +} + +async function handleMessageRequest(data: NewMessageRequest) { + if (!openai) { + const message = { + ...data, + message: "Your API key is not set. Please set it in the plugin preferences.", + user: "GPT-3", + avatar: "https://static-assets.jan.ai/openai-icon.jpg", + createdAt: new Date().toISOString(), + _id: undefined, + }; + const id = await store.insertOne("messages", message); + message._id = id; + events.emit(EventName.OnNewMessageResponse, message); + return; + } + + const message = { + ...data, + message: "", + user: "GPT-3", + avatar: "https://static-assets.jan.ai/openai-icon.jpg", + createdAt: new Date().toISOString(), + _id: undefined, + }; + const id = await store.insertOne("messages", message); + + message._id = id; + events.emit(EventName.OnNewMessageResponse, message); + const response = await openai.createChatCompletion({ + messages: [{ role: "user", content: data.message }], + model: "gpt-3.5-turbo", + }); + message.message = response.data.choices[0].message.content; + events.emit(EventName.OnMessageResponseUpdate, message); + await store.updateOne("messages", message._id, message); +} + +const registerListener = () => { + events.on(EventName.OnNewMessageRequest, handleMessageRequest); +}; + +const onPreferencesUpdate = () => { + setup(); +}; +// Register all the above functions and objects with the relevant extension points +export function init({ register }: { register: RegisterExtensionPoint }) { + register(PluginService.OnStart, PluginName, onStart); + register(PluginService.OnPreferencesUpdate, PluginName, onPreferencesUpdate); + + preferences.registerPreferences(register, PluginName, "apiKey", "API Key", "Azure Project API Key", ""); + preferences.registerPreferences( + register, + PluginName, + "endpoint", + "API Endpoint", + "Azure Deployment Endpoint API", + "" + ); + preferences.registerPreferences( + register, + PluginName, + "deploymentName", + "Deployment Name", + "The deployment name you chose when you deployed the model", + "" + ); +} diff --git a/electron/core/plugins/openai-plugin/package-lock.json b/electron/core/plugins/openai-plugin/package-lock.json new file mode 100644 index 000000000..a5639657b --- /dev/null +++ b/electron/core/plugins/openai-plugin/package-lock.json @@ -0,0 +1,3708 @@ +{ + "name": "azure-openai-plugin", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "azure-openai-plugin", + "version": "1.0.0", + "bundleDependencies": [ + "tcp-port-used", + "kill-port-process" + ], + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@janhq/plugin-core": "^0.1.5", + "azure-openai": "^0.9.4", + "kill-port-process": "^3.2.0", + "tcp-port-used": "^1.0.2", + "ts-loader": "^9.5.0" + }, + "devDependencies": { + "cpx": "^1.5.0", + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "../../../../plugin-core": { + "name": "@janhq/plugin-core", + "version": "0.1.6", + "license": "MIT", + "devDependencies": { + "@types/node": "^12.0.2", + "typescript": "^5.2.2" + } + }, + "../../../../plugin-core/node_modules/@types/node": { + "version": "12.20.55", + "dev": true, + "license": "MIT" + }, + "../../../../plugin-core/node_modules/typescript": { + "version": "5.2.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@janhq/plugin-core": { + "resolved": "../../../../plugin-core", + "link": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.4", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.5", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.8.6", + "license": "MIT", + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.10.0", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "1.3.2", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/axios": { + "version": "0.26.1", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/azure-openai": { + "version": "0.9.4", + "license": "MIT", + "dependencies": { + "axios": "^0.26.0", + "form-data": "^4.0.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "1.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001549", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "1.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "optionalDependencies": { + "fsevents": "^1.0.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cpx": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.9.2", + "chokidar": "^1.6.0", + "duplexer": "^0.1.1", + "glob": "^7.0.5", + "glob2base": "^0.0.12", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "resolve": "^1.1.7", + "safe-buffer": "^5.0.1", + "shell-quote": "^1.6.1", + "subarg": "^1.0.0" + }, + "bin": { + "cpx": "bin/index.js" + } + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/define-property": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.554", + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "0.9.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-posix-bracket": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-index": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-them-args": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/get-value": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^2.0.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/glob2base": { + "version": "0.0.12", + "dev": true, + "dependencies": { + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/has": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-primitive": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is2": { + "version": "2.0.9", + "inBundle": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/kill-port-process": { + "version": "3.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "get-them-args": "1.3.2", + "pid-from-port": "1.1.3" + }, + "bin": { + "kill-port": "dist/bin/kill-port-process.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.18.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pid-from-port": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "execa": "^0.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/array-unique": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-equal-shallow": "^0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ret": { + "version": "0.1.15", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "inBundle": true, + "license": "ISC" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/split-string": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/terser": { + "version": "5.21.0", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/braces": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/ts-loader/node_modules/micromatch": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ts-loader/node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "license": "MIT" + }, + "node_modules/union-value": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/use": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "2.1.2", + "inBundle": true, + "license": "ISC" + } + } +} diff --git a/electron/core/plugins/openai-plugin/package.json b/electron/core/plugins/openai-plugin/package.json new file mode 100644 index 000000000..6517de6fd --- /dev/null +++ b/electron/core/plugins/openai-plugin/package.json @@ -0,0 +1,46 @@ +{ + "name": "azure-openai-plugin", + "version": "1.0.0", + "description": "Inference plugin for Azure OpenAI", + "icon": "https://static-assets.jan.ai/openai-icon.jpg", + "main": "dist/index.js", + "author": "Jan", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "build": "tsc -b . && webpack --config webpack.config.js", + "postinstall": "rimraf ./*.tgz && npm run build && rimraf dist/nitro/* && cpx \"nitro/**\" \"dist/nitro\"", + "build:publish": "npm pack && cpx *.tgz ../../pre-install" + }, + "exports": { + ".": "./dist/index.js", + "./main": "./dist/module.js" + }, + "devDependencies": { + "cpx": "^1.5.0", + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "dependencies": { + "@janhq/plugin-core": "^0.1.7", + "azure-openai": "^0.9.4", + "kill-port-process": "^3.2.0", + "tcp-port-used": "^1.0.2", + "ts-loader": "^9.5.0" + }, + "bundledDependencies": [ + "tcp-port-used", + "kill-port-process" + ], + "engines": { + "node": ">=18.0.0" + }, + "files": [ + "dist/*", + "package.json", + "README.md" + ] +} diff --git a/electron/core/plugins/openai-plugin/tsconfig.json b/electron/core/plugins/openai-plugin/tsconfig.json new file mode 100644 index 000000000..339950719 --- /dev/null +++ b/electron/core/plugins/openai-plugin/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "ES6", + "moduleResolution": "node", + + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": false, + "skipLibCheck": true + } +} diff --git a/electron/core/plugins/openai-plugin/webpack.config.js b/electron/core/plugins/openai-plugin/webpack.config.js new file mode 100644 index 000000000..18696aa34 --- /dev/null +++ b/electron/core/plugins/openai-plugin/webpack.config.js @@ -0,0 +1,25 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.ts", // Adjust the entry point to match your project's main file + mode: "production", + module: { + rules: [ + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/, + }, + ], + }, + output: { + filename: "index.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".ts", ".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/package.json b/package.json index 1ebf42577..fade080c8 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "build:core": "cd plugin-core && yarn install && yarn run build", "build:web": "yarn workspace jan-web build && cpx \"web/out/**\" \"electron/renderer/\"", "build:electron": "yarn workspace jan build", - "build:plugins": "rimraf ./electron/core/pre-install/*.tgz && concurrently \"cd ./electron/core/plugins/data-plugin && npm ci\" \"cd ./electron/core/plugins/inference-plugin && npm ci\" \"cd ./electron/core/plugins/model-management-plugin && npm ci\" \"cd ./electron/core/plugins/monitoring-plugin && npm ci\" && concurrently \"cd ./electron/core/plugins/data-plugin && npm run build:publish\" \"cd ./electron/core/plugins/inference-plugin && npm run build:publish\" \"cd ./electron/core/plugins/model-management-plugin && npm run build:publish\" \"cd ./electron/core/plugins/monitoring-plugin && npm run build:publish\"", - "build:plugins-darwin": "rimraf ./electron/core/pre-install/*.tgz && concurrently \"cd ./electron/core/plugins/data-plugin && npm ci\" \"cd ./electron/core/plugins/inference-plugin && npm ci\" \"cd ./electron/core/plugins/model-management-plugin && npm ci\" \"cd ./electron/core/plugins/monitoring-plugin && npm ci\" && chmod +x ./electron/auto-sign.sh && ./electron/auto-sign.sh && concurrently \"cd ./electron/core/plugins/data-plugin && npm run build:publish\" \"cd ./electron/core/plugins/inference-plugin && npm run build:publish\" \"cd ./electron/core/plugins/model-management-plugin && npm run build:publish\" \"cd ./electron/core/plugins/monitoring-plugin && npm run build:publish\"", + "build:plugins": "rimraf ./electron/core/pre-install/*.tgz && concurrently --kill-others-on-fail \"cd ./electron/core/plugins/data-plugin && npm install && npm run postinstall\" \"cd ./electron/core/plugins/inference-plugin && npm install && npm run postinstall\" \"cd ./electron/core/plugins/model-management-plugin && npm install && npm run postinstall\" \"cd ./electron/core/plugins/monitoring-plugin && npm install && npm run postinstall\" && concurrently --kill-others-on-fail \"cd ./electron/core/plugins/data-plugin && npm run build:publish\" \"cd ./electron/core/plugins/inference-plugin && npm run build:publish\" \"cd ./electron/core/plugins/model-management-plugin && npm run build:publish\" \"cd ./electron/core/plugins/monitoring-plugin && npm run build:publish\"", + "build:plugins-darwin": "rimraf ./electron/core/pre-install/*.tgz && concurrently \"cd ./electron/core/plugins/data-plugin && npm install && npm run postinstall\" \"cd ./electron/core/plugins/inference-plugin && npm install && npm run postinstall\" \"cd ./electron/core/plugins/model-management-plugin && npm install && npm run postinstall\" \"cd ./electron/core/plugins/monitoring-plugin && npm install && npm run postinstall\" && chmod +x ./electron/auto-sign.sh && ./electron/auto-sign.sh && concurrently \"cd ./electron/core/plugins/data-plugin && npm run build:publish\" \"cd ./electron/core/plugins/inference-plugin && npm run build:publish\" \"cd ./electron/core/plugins/model-management-plugin && npm run build:publish\" \"cd ./electron/core/plugins/monitoring-plugin && npm run build:publish\"", "build": "yarn build:web && yarn build:electron", "build:darwin": "yarn build:web && yarn workspace jan build:darwin", "build:win32": "yarn build:web && yarn workspace jan build:win32", diff --git a/plugin-core/README.md b/plugin-core/README.md index 806406e79..ee4814ffc 100644 --- a/plugin-core/README.md +++ b/plugin-core/README.md @@ -143,15 +143,20 @@ To register plugin preferences, you can use the preferences object from the @jan ```js import { PluginService, preferences } from "@janhq/plugin-core"; -const PluginName = "your-first-plugin"; +const pluginName = "your-first-plugin"; +const preferenceKey = ""; +const preferenceName = "Your First Preference"; +const preferenceDescription = "This is for example only"; +const defaultValue = ""; export function init({ register }: { register: RegisterExtensionPoint }) { // Register preference update handlers. E.g. update plugin instance with new configuration - register(PluginService.OnPreferencesUpdate, PluginName, onPreferencesUpdate); + register(PluginService.OnPreferencesUpdate, pluginName, onPreferencesUpdate); - // Register plugin preferences. E.g. Plugin need apiKey and endpoint to connect to your service - preferences.registerPreferences(register, PluginName, "apiKey", ""); - preferences.registerPreferences(register, PluginName, "endpoint", ""); + // Register plugin preferences. E.g. Plugin need apiKey to connect to your service + preferences.registerPreferences < + string > + (register, pluginName, preferenceKey, preferenceName, preferenceDescription, defaultValue); } ``` @@ -162,15 +167,13 @@ To retrieve the values of the registered preferences, we're using the get method ```js import { preferences } from "@janhq/plugin-core"; -const PluginName = "your-first-plugin"; +const pluginName = "your-first-plugin"; +const preferenceKey = "apiKey"; const setup = async () => { // Retrieve apiKey - const apiKey: string = (await preferences.get(PluginName, "apiKey")) ?? ""; - - // Retrieve endpoint - const endpoint: string = (await preferences.get(PluginName, "endpoint")) ?? ""; -} + const apiKey: string = (await preferences.get(pluginName, preferenceKey)) ?? ""; +}; ``` ### Access Core API diff --git a/plugin-core/index.ts b/plugin-core/index.ts index b2f379d2d..6eb2960e4 100644 --- a/plugin-core/index.ts +++ b/plugin-core/index.ts @@ -8,7 +8,8 @@ export type CoreService = | InferenceService | ModelManagementService | SystemMonitoringService - | PreferenceService; + | PreferenceService + | PluginService; /** * Represents the available methods for the StoreService. diff --git a/plugin-core/preferences.ts b/plugin-core/preferences.ts index 0ff1969ce..8d3f6beb5 100644 --- a/plugin-core/preferences.ts +++ b/plugin-core/preferences.ts @@ -4,13 +4,13 @@ import { store } from "./store"; * Returns the value of the specified preference for the specified plugin. * * @param pluginName The name of the plugin. - * @param preferenceName The name of the preference. + * @param preferenceKey The key of the preference. * @returns A promise that resolves to the value of the preference. */ -function get(pluginName: string, preferenceName: string): Promise { +function get(pluginName: string, preferenceKey: string): Promise { return store .createCollection("preferences", {}) - .then(() => store.findOne("preferences", `${pluginName}.${preferenceName}`)) + .then(() => store.findOne("preferences", `${pluginName}.${preferenceKey}`)) .then((doc) => doc?.value ?? ""); } @@ -18,20 +18,20 @@ function get(pluginName: string, preferenceName: string): Promise { * Sets the value of the specified preference for the specified plugin. * * @param pluginName The name of the plugin. - * @param preferenceName The name of the preference. + * @param preferenceKey The key of the preference. * @param value The value of the preference. * @returns A promise that resolves when the preference has been set. */ -function set(pluginName: string, preferenceName: string, value: any): Promise { +function set(pluginName: string, preferenceKey: string, value: any): Promise { return store .createCollection("preferences", {}) .then(() => store - .findOne("preferences", `${pluginName}.${preferenceName}`) + .findOne("preferences", `${pluginName}.${preferenceKey}`) .then((doc) => doc - ? store.updateOne("preferences", `${pluginName}.${preferenceName}`, { value }) - : store.insertOne("preferences", { _id: `${pluginName}.${preferenceName}`, value }) + ? store.updateOne("preferences", `${pluginName}.${preferenceKey}`, { value }) + : store.insertOne("preferences", { _id: `${pluginName}.${preferenceKey}`, value }) ) ); } @@ -51,7 +51,9 @@ function clear(pluginName: string): Promise { * * @param register The function to use for registering the preference. * @param pluginName The name of the plugin. + * @param preferenceKey The key of the preference. * @param preferenceName The name of the preference. + * @param preferenceDescription The description of the preference. * @param defaultValue The default value of the preference. */ function registerPreferences( diff --git a/web/app/_components/Preferences.tsx b/web/app/_components/Preferences.tsx index 214601da5..c011f50f1 100644 --- a/web/app/_components/Preferences.tsx +++ b/web/app/_components/Preferences.tsx @@ -6,21 +6,22 @@ import { extensionPoints, activationPoints, } from "@/../../electron/core/plugin-manager/execution/index"; -import { - ChartPieIcon, - CommandLineIcon, - PlayIcon, -} from "@heroicons/react/24/outline"; +import { ChartPieIcon, CommandLineIcon, PlayIcon } from "@heroicons/react/24/outline"; import { MagnifyingGlassIcon } from "@heroicons/react/20/solid"; import classNames from "classnames"; +import { PluginService, preferences } from "@janhq/plugin-core"; +import { execute } from "../../../electron/core/plugin-manager/execution/extension-manager"; -/* eslint-disable @next/next/no-sync-scripts */ export const Preferences = () => { const [search, setSearch] = useState(""); const [activePlugins, setActivePlugins] = useState([]); + const [preferenceItems, setPreferenceItems] = useState([]); + const [preferenceValues, setPreferenceValues] = useState([]); const [isTestAvailable, setIsTestAvailable] = useState(false); const [fileName, setFileName] = useState(""); + const experimentRef = useRef(null); + const preferenceRef = useRef(null); const handleFileChange = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; @@ -31,7 +32,6 @@ export const Preferences = () => { } }; - const preferenceRef = useRef(null); useEffect(() => { async function setupPE() { // Enable activation point management @@ -54,19 +54,22 @@ export const Preferences = () => { setTimeout(async () => { await activationPoints.trigger("init"); if (extensionPoints.get("experimentComponent")) { - const components = await Promise.all( - extensionPoints.execute("experimentComponent") - ); + const components = await Promise.all(extensionPoints.execute("experimentComponent")); if (components.length > 0) { setIsTestAvailable(true); } components.forEach((e) => { - if (preferenceRef.current) { + if (experimentRef.current) { // @ts-ignore - preferenceRef.current.appendChild(e); + experimentRef.current.appendChild(e); } }); } + + if (extensionPoints.get("PluginPreferences")) { + const data = await Promise.all(extensionPoints.execute("PluginPreferences")); + setPreferenceItems(Array.isArray(data) ? data : []); + } }, 500); }; setupPE().then(() => activePlugins()); @@ -86,17 +89,9 @@ export const Preferences = () => { // Uninstall a plugin on clicking uninstall const uninstall = async (name: string) => { - //@ts-ignore - // Send the filename of the to be uninstalled plugin // to the main process for removal - //@ts-ignore const res = await plugins.uninstall([name]); - console.log( - res - ? "Plugin successfully uninstalled" - : "Plugin could not be uninstalled" - ); if (res) window.electronAPI.relaunch(); }; @@ -110,6 +105,26 @@ export const Preferences = () => { // plugins.update(active.map((plg) => plg.name)); }; + let timeout: any | undefined = undefined; + function notifyPreferenceUpdate() { + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => execute(PluginService.OnPreferencesUpdate), 100); + } + + useEffect(() => { + if (preferenceItems) { + Promise.all( + preferenceItems.map((e) => + preferences.get(e.pluginName, e.preferenceKey).then((k) => ({ key: e.preferenceKey, value: k })) + ) + ).then((data) => { + setPreferenceValues(data); + }); + } + }, [preferenceItems]); + return (
@@ -152,12 +167,9 @@ export const Preferences = () => { {!fileName ? (

- Click to upload{" "} - or drag and drop -

-

- TGZ (MAX 50MB) + Click to upload or drag and drop

+

TGZ (MAX 50MB)

) : ( <>{fileName} @@ -177,9 +189,7 @@ export const Preferences = () => { type="submit" className={classNames( "rounded-md px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600", - fileName - ? "bg-blue-500 hover:bg-blue-300" - : "bg-gray-500" + fileName ? "bg-blue-500 hover:bg-blue-300" : "bg-gray-500" )} > Install Plugin @@ -205,11 +215,7 @@ export const Preferences = () => {
{activePlugins - .filter( - (e) => - search.trim() === "" || - e.name.toLowerCase().includes(search.toLowerCase()) - ) + .filter((e) => search.trim() === "" || e.name.toLowerCase().includes(search.toLowerCase())) .map((e) => (
{ >
- +

{e.name.replaceAll("-", " ")}

-

- Version: {e.version} -

+

Version: {e.version}

@@ -266,8 +266,34 @@ export const Preferences = () => { Test Plugins
)} -
- {/* Content */} +
+ +
+ + Preferences +
+
+ {preferenceItems?.map((e) => ( +
+
+ Setting:{" "} + {e.preferenceName} +
+ {e.preferenceDescription} +
+ v.key === e.preferenceKey)[0]?.value} + onChange={(event) => { + preferences + .set(e.pluginName, e.preferenceKey, event.target.value) + .then(() => notifyPreferenceUpdate()); + }} + > +
+
+ ))} +
diff --git a/web/app/_helpers/EventHandler.tsx b/web/app/_helpers/EventHandler.tsx new file mode 100644 index 000000000..219a38390 --- /dev/null +++ b/web/app/_helpers/EventHandler.tsx @@ -0,0 +1,34 @@ +import { addNewMessageAtom, updateMessageAtom } from "@/_helpers/atoms/ChatMessage.atom"; +import { toChatMessage } from "@/_models/ChatMessage"; +import { events, EventName, NewMessageResponse } from "@janhq/plugin-core"; +import { useSetAtom } from "jotai"; +import { ReactNode, useEffect } from "react"; + +export default function EventHandler({ children }: { children: ReactNode }) { + const addNewMessage = useSetAtom(addNewMessageAtom); + const updateMessage = useSetAtom(updateMessageAtom); + + function handleNewMessageResponse(message: NewMessageResponse) { + const newResponse = toChatMessage(message); + addNewMessage(newResponse); + } + async function handleMessageResponseUpdate(messageResponse: NewMessageResponse) { + if (messageResponse.conversationId && messageResponse._id && messageResponse.message) + updateMessage(messageResponse._id, messageResponse.conversationId, messageResponse.message); + } + + useEffect(() => { + if (window.corePlugin.events) { + events.on(EventName.OnNewMessageResponse, handleNewMessageResponse); + events.on(EventName.OnMessageResponseUpdate, handleMessageResponseUpdate); + } + }, []); + + useEffect(() => { + return () => { + events.off(EventName.OnNewMessageResponse, handleNewMessageResponse); + events.off(EventName.OnMessageResponseUpdate, handleMessageResponseUpdate); + }; + }, []); + return <> {children}; +} diff --git a/web/app/_helpers/EventListenerWrapper.tsx b/web/app/_helpers/EventListenerWrapper.tsx index 6ad8e2b28..e5777391e 100644 --- a/web/app/_helpers/EventListenerWrapper.tsx +++ b/web/app/_helpers/EventListenerWrapper.tsx @@ -6,12 +6,10 @@ import { appDownloadProgress } from "./JotaiWrapper"; import { DownloadState } from "@/_models/DownloadState"; import { executeSerial } from "../../../electron/core/plugin-manager/execution/extension-manager"; import { ModelManagementService } from "@janhq/plugin-core"; -import { - setDownloadStateAtom, - setDownloadStateSuccessAtom, -} from "./atoms/DownloadState.atom"; +import { setDownloadStateAtom, setDownloadStateSuccessAtom } from "./atoms/DownloadState.atom"; import { getDownloadedModels } from "@/_hooks/useGetDownloadedModels"; import { downloadedModelAtom } from "./atoms/DownloadedModel.atom"; +import EventHandler from "./EventHandler"; type Props = { children: ReactNode; @@ -25,57 +23,46 @@ export default function EventListenerWrapper({ children }: Props) { useEffect(() => { if (window && window.electronAPI) { - window.electronAPI.onFileDownloadUpdate( - (_event: string, state: DownloadState | undefined) => { - if (!state) return; - setDownloadState(state); - } - ); + window.electronAPI.onFileDownloadUpdate((_event: string, state: DownloadState | undefined) => { + if (!state) return; + setDownloadState(state); + }); - window.electronAPI.onFileDownloadError( - (_event: string, callback: any) => { - console.log("Download error", callback); - } - ); + window.electronAPI.onFileDownloadError((_event: string, callback: any) => { + console.log("Download error", callback); + }); - window.electronAPI.onFileDownloadSuccess( - (_event: string, callback: any) => { - if (callback && callback.fileName) { - setDownloadStateSuccess(callback.fileName); + window.electronAPI.onFileDownloadSuccess((_event: string, callback: any) => { + if (callback && callback.fileName) { + setDownloadStateSuccess(callback.fileName); - executeSerial( - ModelManagementService.UpdateFinishedDownloadAt, - callback.fileName - ).then(() => { - getDownloadedModels().then((models) => { - setDownloadedModels(models); - }); + executeSerial(ModelManagementService.UpdateFinishedDownloadAt, callback.fileName).then(() => { + getDownloadedModels().then((models) => { + setDownloadedModels(models); }); - } + }); } - ); + }); - window.electronAPI.onAppUpdateDownloadUpdate( - (_event: string, progress: any) => { - setProgress(progress.percent); - console.log("app update progress:", progress.percent); - } - ); + window.electronAPI.onAppUpdateDownloadUpdate((_event: string, progress: any) => { + setProgress(progress.percent); + console.log("app update progress:", progress.percent); + }); - window.electronAPI.onAppUpdateDownloadError( - (_event: string, callback: any) => { - console.log("Download error", callback); - setProgress(-1); - } - ); + window.electronAPI.onAppUpdateDownloadError((_event: string, callback: any) => { + console.log("Download error", callback); + setProgress(-1); + }); - window.electronAPI.onAppUpdateDownloadSuccess( - (_event: string, callback: any) => { - setProgress(-1); - } - ); + window.electronAPI.onAppUpdateDownloadSuccess((_event: string, callback: any) => { + setProgress(-1); + }); } }, []); - return
{children}
; + return ( +
+ {children} +
+ ); } diff --git a/web/app/_hooks/useChatMessages.ts b/web/app/_hooks/useChatMessages.ts index 77b1027e2..197f25e7e 100644 --- a/web/app/_hooks/useChatMessages.ts +++ b/web/app/_hooks/useChatMessages.ts @@ -31,28 +31,18 @@ const useChatMessages = (offset = 0) => { if (!hasMore) return; const getMessages = async () => { - executeSerial( - DataService.GetConversationMessages, - currentConvo._id - ).then((data: any) => { + executeSerial(DataService.GetConversationMessages, currentConvo._id).then((data: any) => { if (!data) { return; } - parseMessages(data ?? []).then((newMessages) => { - addOldChatMessages(newMessages); - updateConvoHasMore(currentConvo._id ?? "", false); - setLoading(false); - }); + const newMessages = parseMessages(data ?? []); + addOldChatMessages(newMessages); + updateConvoHasMore(currentConvo._id ?? "", false); + setLoading(false); }); }; getMessages(); - }, [ - offset, - currentConvo?._id, - convoStates, - addOldChatMessages, - updateConvoHasMore, - ]); + }, [offset, currentConvo?._id, convoStates, addOldChatMessages, updateConvoHasMore]); return { loading: loading, @@ -61,10 +51,10 @@ const useChatMessages = (offset = 0) => { }; }; -async function parseMessages(messages: RawMessage[]): Promise { +function parseMessages(messages: RawMessage[]): ChatMessage[] { const newMessages: ChatMessage[] = []; for (const m of messages) { - const chatMessage = await toChatMessage(m); + const chatMessage = toChatMessage(m); newMessages.push(chatMessage); } return newMessages; diff --git a/web/app/_hooks/useSendChatMessage.ts b/web/app/_hooks/useSendChatMessage.ts index e6cfed5d1..310783b5a 100644 --- a/web/app/_hooks/useSendChatMessage.ts +++ b/web/app/_hooks/useSendChatMessage.ts @@ -1,51 +1,19 @@ import { currentPromptAtom } from "@/_helpers/JotaiWrapper"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; -import { selectAtom } from "jotai/utils"; -import { DataService, InferenceService } from "@janhq/plugin-core"; -import { - ChatMessage, - MessageSenderType, - RawMessage, - toChatMessage, -} from "@/_models/ChatMessage"; +import { DataService, EventName, events } from "@janhq/plugin-core"; +import { RawMessage, toChatMessage } from "@/_models/ChatMessage"; import { executeSerial } from "@/_services/pluginService"; -import { useCallback } from "react"; -import { - addNewMessageAtom, - updateMessageAtom, - chatMessages, - currentChatMessagesAtom, -} from "@/_helpers/atoms/ChatMessage.atom"; -import { - currentConversationAtom, - getActiveConvoIdAtom, - updateConversationAtom, - updateConversationWaitingForResponseAtom, -} from "@/_helpers/atoms/Conversation.atom"; -import { Conversation } from "@/_models/Conversation"; +import { addNewMessageAtom } from "@/_helpers/atoms/ChatMessage.atom"; +import { currentConversationAtom } from "@/_helpers/atoms/Conversation.atom"; export default function useSendChatMessage() { const currentConvo = useAtomValue(currentConversationAtom); - const updateConversation = useSetAtom(updateConversationAtom); const addNewMessage = useSetAtom(addNewMessageAtom); - const updateMessage = useSetAtom(updateMessageAtom); - const activeConversationId = useAtomValue(getActiveConvoIdAtom) ?? ""; - const updateConvWaiting = useSetAtom( - updateConversationWaitingForResponseAtom - ); - const chatMessagesHistory = useAtomValue( - selectAtom( - chatMessages, - useCallback((v) => v[activeConversationId], [activeConversationId]) - ) - ); const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom); const sendChatMessage = async () => { setCurrentPrompt(""); - const conversationId = activeConversationId; - updateConvWaiting(conversationId, true); const prompt = currentPrompt.trim(); const newMessage: RawMessage = { conversationId: currentConvo?._id, @@ -56,188 +24,9 @@ export default function useSendChatMessage() { const id = await executeSerial(DataService.CreateMessage, newMessage); newMessage._id = id; - const newChatMessage = await toChatMessage(newMessage); - addNewMessage(newChatMessage); - const messageHistory = chatMessagesHistory ?? []; - const recentMessages = [ - ...messageHistory.sort((a, b) => parseInt(a.id) - parseInt(b.id)), - newChatMessage, - ] - .slice(-10) - .map((message) => { - return { - content: message.text, - role: - message.messageSenderType === MessageSenderType.User - ? "user" - : "assistant", - }; - }); - const url = await executeSerial(InferenceService.InferenceUrl); - const response = await fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json", - Accept: "text/event-stream", - "Access-Control-Allow-Origi": "*", - }, - body: JSON.stringify({ - messages: recentMessages, - stream: true, - model: "gpt-3.5-turbo", - max_tokens: 500, - }), - }); - const stream = response.body; - - const decoder = new TextDecoder("utf-8"); - const reader = stream?.getReader(); - let answer = ""; - - // Cache received response - const newResponse: RawMessage = { - conversationId: currentConvo?._id, - message: answer, - user: "assistant", - createdAt: new Date().toISOString(), - }; - const respId = await executeSerial(DataService.CreateMessage, newResponse); - newResponse._id = respId; - const responseChatMessage = toChatMessage(newResponse); - addNewMessage(responseChatMessage); - - while (true && reader) { - const { done, value } = await reader.read(); - if (done) { - console.log("SSE stream closed"); - break; - } - const text = decoder.decode(value); - const lines = text.trim().split("\n"); - for (const line of lines) { - if (line.startsWith("data: ") && !line.includes("data: [DONE]")) { - updateConvWaiting(conversationId, false); - const data = JSON.parse(line.replace("data: ", "")); - answer += data.choices[0]?.delta?.content ?? ""; - if (answer.startsWith("assistant: ")) { - answer = answer.replace("assistant: ", ""); - } - updateMessage( - responseChatMessage.id, - responseChatMessage.conversationId, - answer - ); - } - } - } - updateMessage( - responseChatMessage.id, - responseChatMessage.conversationId, - answer.trimEnd() - ); - await executeSerial(DataService.UpdateMessage, { - ...newResponse, - message: answer.trimEnd(), - updatedAt: new Date() - .toISOString() - .replace("T", " ") - .replace(/\.\d+Z$/, ""), - }); - - const updatedConvo: Conversation = { - ...currentConvo, - lastMessage: answer.trim(), - updatedAt: new Date().toISOString(), - }; - - await executeSerial(DataService.UpdateConversation, updatedConvo); - updateConversation(updatedConvo); - updateConvWaiting(conversationId, false); - - newResponse.message = answer.trim(); - const messages: RawMessage[] = [newMessage, newResponse]; - - inferConvoSummary(updatedConvo, messages); - }; - - const inferConvoSummary = async ( - convo: Conversation, - lastMessages: RawMessage[] - ) => { - if (convo.summary) return; - const newMessage: RawMessage = { - conversationId: currentConvo?._id, - message: "summary this conversation in 5 words", - user: "user", - createdAt: new Date().toISOString(), - }; - const messageHistory = lastMessages.map((m) => toChatMessage(m)); const newChatMessage = toChatMessage(newMessage); - - const recentMessages = [...messageHistory, newChatMessage] - .slice(-10) - .map((message) => ({ - content: message.text, - role: message.messageSenderType, - })); - - console.debug(`Sending ${JSON.stringify(recentMessages)}`); - const url = await executeSerial(InferenceService.InferenceUrl); - const response = await fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json", - Accept: "text/event-stream", - "Access-Control-Allow-Origi": "*", - }, - body: JSON.stringify({ - messages: recentMessages, - stream: true, - model: "gpt-3.5-turbo", - max_tokens: 500, - }), - }); - const stream = response.body; - - const decoder = new TextDecoder("utf-8"); - const reader = stream?.getReader(); - let answer = ""; - - // Cache received response - const newResponse: RawMessage = { - conversationId: currentConvo?._id, - message: answer, - user: "assistant", - createdAt: new Date().toISOString(), - }; - - while (reader) { - const { done, value } = await reader.read(); - if (done) { - console.log("SSE stream closed"); - break; - } - const text = decoder.decode(value); - const lines = text.trim().split("\n"); - for (const line of lines) { - if (line.startsWith("data: ") && !line.includes("data: [DONE]")) { - const data = JSON.parse(line.replace("data: ", "")); - answer += data.choices[0]?.delta?.content ?? ""; - if (answer.startsWith("assistant: ")) { - answer = answer.replace("assistant: ", ""); - } - } - } - } - - const updatedConvo: Conversation = { - ...convo, - summary: answer.trim(), - }; - - console.debug(`Update convo: ${JSON.stringify(updatedConvo)}`); - await executeSerial(DataService.UpdateConversation, updatedConvo); - updateConversation(updatedConvo); + addNewMessage(newChatMessage); + events.emit(EventName.OnNewMessageRequest, newMessage); }; return { diff --git a/web/app/_models/ChatMessage.ts b/web/app/_models/ChatMessage.ts index b87a92e08..3e1f890fd 100644 --- a/web/app/_models/ChatMessage.ts +++ b/web/app/_models/ChatMessage.ts @@ -1,3 +1,4 @@ +import { NewMessageResponse } from "@janhq/plugin-core"; export enum MessageType { Text = "Text", Image = "Image", @@ -33,12 +34,13 @@ export interface RawMessage { _id?: string; conversationId?: string; user?: string; + avatar?: string; message?: string; createdAt?: string; updatedAt?: string; } -export const toChatMessage = (m: RawMessage): ChatMessage => { +export const toChatMessage = (m: RawMessage | NewMessageResponse): ChatMessage => { const createdAt = new Date(m.createdAt ?? "").getTime(); const imageUrls: string[] = []; const imageUrl = undefined; @@ -47,8 +49,7 @@ export const toChatMessage = (m: RawMessage): ChatMessage => { } const messageType = MessageType.Text; - const messageSenderType = - m.user === "user" ? MessageSenderType.User : MessageSenderType.Ai; + const messageSenderType = m.user === "user" ? MessageSenderType.User : MessageSenderType.Ai; const content = m.message ?? ""; @@ -58,9 +59,8 @@ export const toChatMessage = (m: RawMessage): ChatMessage => { messageType: messageType, messageSenderType: messageSenderType, senderUid: m.user?.toString() || "0", - senderName: m.user === "user" ? "You" : "Assistant", - senderAvatarUrl: - m.user === "user" ? "icons/avatar.svg" : "icons/app_icon.svg", + senderName: m.user === "user" ? "You" : m.user && m.user !== "ai" && m.user !== "assistant" ? m.user : "Assistant", + senderAvatarUrl: m.avatar ? m.avatar : m.user === "user" ? "icons/avatar.svg" : "icons/app_icon.svg", text: content, imageUrls: imageUrls, createdAt: createdAt, diff --git a/web/app/_services/coreService.ts b/web/app/_services/coreService.ts index 6f7d0fd93..c8bd328c4 100644 --- a/web/app/_services/coreService.ts +++ b/web/app/_services/coreService.ts @@ -1,8 +1,21 @@ import { store } from "./storeService"; +import { EventEmitter } from "./eventsService"; + export const setupCoreServices = () => { + if (typeof window === "undefined") { + console.log("undefine", window); + return; + } else { + console.log("Setting up core services"); + } if (!window.corePlugin) { window.corePlugin = { store, + events: new EventEmitter(), }; } + if (!window.coreAPI) { + // fallback electron API + window.coreAPI = window.electronAPI; + } }; diff --git a/web/app/_services/eventsService.ts b/web/app/_services/eventsService.ts new file mode 100644 index 000000000..cbdce426b --- /dev/null +++ b/web/app/_services/eventsService.ts @@ -0,0 +1,40 @@ +export class EventEmitter { + private handlers: Map; + + constructor() { + this.handlers = new Map(); + } + + public on(eventName: string, handler: Function): void { + if (!this.handlers.has(eventName)) { + this.handlers.set(eventName, []); + } + + this.handlers.get(eventName)?.push(handler); + } + + public off(eventName: string, handler: Function): void { + if (!this.handlers.has(eventName)) { + return; + } + + const handlers = this.handlers.get(eventName); + const index = handlers?.indexOf(handler); + + if (index !== undefined && index !== -1) { + handlers?.splice(index, 1); + } + } + + public emit(eventName: string, args: any): void { + if (!this.handlers.has(eventName)) { + return; + } + + const handlers = this.handlers.get(eventName); + + handlers?.forEach((handler) => { + handler(args); + }); + } +} diff --git a/web/app/page.tsx b/web/app/page.tsx index fa3ea5e86..9c9b104af 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -1,76 +1,81 @@ "use client"; - +import { PluginService } from "@janhq/plugin-core"; import { ThemeWrapper } from "./_helpers/ThemeWrapper"; import JotaiWrapper from "./_helpers/JotaiWrapper"; import { ModalWrapper } from "./_helpers/ModalWrapper"; import { useEffect, useState } from "react"; import Image from "next/image"; -import { - setup, - plugins, - activationPoints, -} from "../../electron/core/plugin-manager/execution/index"; -import { - isCorePluginInstalled, - setupBasePlugins, -} from "./_services/pluginService"; +import { setup, plugins, activationPoints, extensionPoints } from "../../electron/core/plugin-manager/execution/index"; +import { isCorePluginInstalled, setupBasePlugins } from "./_services/pluginService"; import EventListenerWrapper from "./_helpers/EventListenerWrapper"; import { setupCoreServices } from "./_services/coreService"; import MainContainer from "./_components/MainContainer"; +import { executeSerial } from "../../electron/core/plugin-manager/execution/extension-manager"; const Page: React.FC = () => { + const [setupCore, setSetupCore] = useState(false); const [activated, setActivated] = useState(false); + async function setupPE() { + // Enable activation point management + setup({ + importer: (plugin: string) => + import(/* webpackIgnore: true */ plugin).catch((err) => { + console.log(err); + }), + }); + + // Register all active plugins with their activation points + await plugins.registerActive(); + setTimeout(async () => { + // Trigger activation points + await activationPoints.trigger("init"); + if (!isCorePluginInstalled()) { + setupBasePlugins(); + return; + } + if (extensionPoints.get(PluginService.OnStart)) { + await executeSerial(PluginService.OnStart); + } + setActivated(true); + }, 500); + } + // Services Setup useEffect(() => { - // Setup Core Service setupCoreServices(); - - async function setupPE() { - // Enable activation point management - setup({ - importer: (plugin: string) => - import(/* webpackIgnore: true */ plugin).catch((err) => { - console.log(err); - }), - }); - - // Register all active plugins with their activation points - await plugins.registerActive(); - setTimeout(async () => { - // Trigger activation points - await activationPoints.trigger("init"); - if (!isCorePluginInstalled()) { - setupBasePlugins(); - return; - } - setActivated(true); - }, 500); - } - // Electron - if (window && window.electronAPI) { - setupPE(); - } else { - // Host - setActivated(true); - } + setSetupCore(true); }, []); + useEffect(() => { + if (setupCore) { + // Electron + if (window && window.electronAPI) { + setupPE(); + } else { + // Host + setActivated(true); + } + } + }, [setupCore]); + return ( - - - - {activated ? ( - - ) : ( -
- -
- )} -
-
-
+ {setupCore && ( + + + + {activated ? ( + + ) : ( +
+ +
+ )} +
+
+
+ )}
); }; diff --git a/web/types/index.d.ts b/web/types/index.d.ts index d5b1b6da8..2bc4065c6 100644 --- a/web/types/index.d.ts +++ b/web/types/index.d.ts @@ -4,5 +4,6 @@ declare global { interface Window { electronAPI?: any | undefined; corePlugin?: any | undefined; + coreAPI?: any | undefined; } }