From a602f7fde7303fbec408c9a299ae021b103f9a74 Mon Sep 17 00:00:00 2001 From: Andreas Obersteiner <8959303+iimez@users.noreply.github.com> Date: Mon, 3 Jun 2024 18:12:55 +0200 Subject: [PATCH] typescript bindings maintenance (#2363) * remove outdated comments Signed-off-by: limez * simpler build from source Signed-off-by: limez * update unix build script to create .so runtimes correctly Signed-off-by: limez * configure ci build type, use RelWithDebInfo for dev build script Signed-off-by: limez * add clean script Signed-off-by: limez * fix streamed token decoding / emoji Signed-off-by: limez * remove deprecated nCtx Signed-off-by: limez * update typings Signed-off-by: jacob update typings Signed-off-by: jacob * readme,mspell Signed-off-by: jacob * cuda/backend logic changes + name napi methods like their js counterparts Signed-off-by: limez * convert llmodel example into a test, separate test suite that can run in ci Signed-off-by: limez * update examples / naming Signed-off-by: limez * update deps, remove the need for binding.ci.gyp, make node-gyp-build fallback easier testable Signed-off-by: limez * make sure the assert-backend-sources.js script is published, but not the others Signed-off-by: limez * build correctly on windows (regression on node-gyp-build) Signed-off-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> * codespell Signed-off-by: limez * make sure dlhandle.cpp gets linked correctly Signed-off-by: limez * add include for check_cxx_compiler_flag call during aarch64 builds Signed-off-by: limez * x86 > arm64 cross compilation of runtimes and bindings Signed-off-by: limez * default to cpu instead of kompute on arm64 Signed-off-by: limez * formatting, more minimal example Signed-off-by: limez --------- Signed-off-by: limez Signed-off-by: jacob Signed-off-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Co-authored-by: Jacob Nguyen <76754747+jacoobes@users.noreply.github.com> Co-authored-by: jacob --- .circleci/continue_config.yml | 34 +- gpt4all-backend/CMakeLists.txt | 1 + .../toolchains/linux-arm64-toolchain.cmake | 11 + gpt4all-bindings/typescript/.gitignore | 1 + gpt4all-bindings/typescript/.npmignore | 3 +- gpt4all-bindings/typescript/README.md | 32 +- gpt4all-bindings/typescript/binding.ci.gyp | 62 -- gpt4all-bindings/typescript/binding.gyp | 14 +- gpt4all-bindings/typescript/index.cc | 172 ++-- gpt4all-bindings/typescript/index.h | 38 +- gpt4all-bindings/typescript/package.json | 30 +- gpt4all-bindings/typescript/prompt.cc | 3 +- .../scripts/assert-backend-sources.js | 47 + .../typescript/scripts/build_unix.sh | 56 +- .../typescript/scripts/prebuild.js | 50 +- .../typescript/spec/chat-minimal.mjs | 7 +- .../typescript/spec/concurrency.mjs | 9 +- .../{long-context.mjs => context-large.mjs} | 0 .../{chat-memory.mjs => context-recalc.mjs} | 0 gpt4all-bindings/typescript/spec/llmodel.mjs | 61 -- .../{callbacks.mjs => token-callbacks.mjs} | 10 +- .../typescript/spec/token-streaming-emoji.mjs | 37 + .../{streaming.mjs => token-streaming.mjs} | 4 +- .../typescript/src/chat-session.js | 2 +- gpt4all-bindings/typescript/src/gpt4all.d.ts | 112 ++- gpt4all-bindings/typescript/src/gpt4all.js | 82 +- gpt4all-bindings/typescript/src/models.js | 97 +- .../typescript/test/bindings.test.js | 73 ++ .../test/{gpt4all.test.js => ci.test.js} | 8 +- gpt4all-bindings/typescript/yarn.lock | 929 +++++++++--------- 30 files changed, 1112 insertions(+), 873 deletions(-) create mode 100644 gpt4all-backend/toolchains/linux-arm64-toolchain.cmake delete mode 100644 gpt4all-bindings/typescript/binding.ci.gyp create mode 100644 gpt4all-bindings/typescript/scripts/assert-backend-sources.js rename gpt4all-bindings/typescript/spec/{long-context.mjs => context-large.mjs} (100%) rename gpt4all-bindings/typescript/spec/{chat-memory.mjs => context-recalc.mjs} (100%) delete mode 100644 gpt4all-bindings/typescript/spec/llmodel.mjs rename gpt4all-bindings/typescript/spec/{callbacks.mjs => token-callbacks.mjs} (66%) create mode 100644 gpt4all-bindings/typescript/spec/token-streaming-emoji.mjs rename gpt4all-bindings/typescript/spec/{streaming.mjs => token-streaming.mjs} (94%) create mode 100644 gpt4all-bindings/typescript/test/bindings.test.js rename gpt4all-bindings/typescript/test/{gpt4all.test.js => ci.test.js} (97%) diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index 9e8ce63e..a84c86f3 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -570,7 +570,7 @@ jobs: wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update - sudo apt-get install -y cmake build-essential vulkan-sdk cuda-compiler-12-4 libcublas-dev-12-4 libnvidia-compute-550-server libmysqlclient21 libodbc2 libpq5 + sudo apt-get install -y cmake build-essential g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu vulkan-sdk cuda-compiler-12-4 libcublas-dev-12-4 libnvidia-compute-550-server libmysqlclient21 libodbc2 libpq5 - run: name: Build Libraries command: | @@ -578,14 +578,19 @@ jobs: cd gpt4all-backend mkdir -p runtimes/build cd runtimes/build - cmake ../.. - cmake --build . --parallel --config Release + cmake ../.. -DCMAKE_BUILD_TYPE=Release + cmake --build . --parallel mkdir ../linux-x64 cp -L *.so ../linux-x64 # otherwise persist_to_workspace seems to mess symlinks + cmake ../.. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="./toolchains/linux-arm64-toolchain.cmake" + cmake --build . --parallel + mkdir ../linux-arm64 + cp -L *.so ../linux-arm64 - persist_to_workspace: root: gpt4all-backend paths: - runtimes/linux-x64/*.so + - runtimes/linux-arm64/*.so build-bindings-backend-macos: macos: @@ -896,6 +901,11 @@ jobs: - checkout - attach_workspace: at: /tmp/gpt4all-backend + - run: + name: Install dependencies + command: | + sudo apt-get update + sudo apt-get install -y g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu - node/install: install-yarn: true node-version: "18.16" @@ -908,18 +918,24 @@ jobs: - run: command: | cd gpt4all-bindings/typescript - yarn prebuildify -t 18.16.0 --napi + yarn build:prebuilds - run: command: | mkdir -p gpt4all-backend/prebuilds/linux-x64 mkdir -p gpt4all-backend/runtimes/linux-x64 cp /tmp/gpt4all-backend/runtimes/linux-x64/*-*.so gpt4all-backend/runtimes/linux-x64 cp gpt4all-bindings/typescript/prebuilds/linux-x64/*.node gpt4all-backend/prebuilds/linux-x64 + mkdir -p gpt4all-backend/prebuilds/linux-arm64 + mkdir -p gpt4all-backend/runtimes/linux-arm64 + cp /tmp/gpt4all-backend/runtimes/linux-arm64/*-*.so gpt4all-backend/runtimes/linux-arm64 + cp gpt4all-bindings/typescript/prebuilds/linux-arm64/*.node gpt4all-backend/prebuilds/linux-arm64 - persist_to_workspace: root: gpt4all-backend paths: - prebuilds/linux-x64/*.node - runtimes/linux-x64/*-*.so + - prebuilds/linux-arm64/*.node + - runtimes/linux-arm64/*-*.so build-nodejs-macos: macos: xcode: "14.0.0" @@ -1029,13 +1045,11 @@ jobs: cp /tmp/gpt4all-backend/runtimes/darwin/*-*.* runtimes/darwin/native/ cp /tmp/gpt4all-backend/prebuilds/darwin-x64/*.node prebuilds/darwin-x64/ - - # Fallback build if user is not on above prebuilds - mv -f binding.ci.gyp binding.gyp - mkdir gpt4all-backend + # copy the backend source we depend on to make fallback builds work + mkdir backend cd ../../gpt4all-backend - mv llmodel.h llmodel.cpp llmodel_c.cpp llmodel_c.h sysinfo.h dlhandle.h ../gpt4all-bindings/typescript/gpt4all-backend/ + mv llmodel.h llmodel.cpp llmodel_c.cpp llmodel_c.h sysinfo.h dlhandle.h ../gpt4all-bindings/typescript/backend/ # Test install - node/install-packages: @@ -1045,7 +1059,7 @@ jobs: - run: command: | cd gpt4all-bindings/typescript - yarn run test + yarn run test:ci - run: command: | cd gpt4all-bindings/typescript diff --git a/gpt4all-backend/CMakeLists.txt b/gpt4all-backend/CMakeLists.txt index d8993eb9..8647ed90 100644 --- a/gpt4all-backend/CMakeLists.txt +++ b/gpt4all-backend/CMakeLists.txt @@ -79,6 +79,7 @@ if (LLMODEL_ROCM) endif() set(CMAKE_VERBOSE_MAKEFILE ON) +include(CheckCXXCompilerFlag) # Go through each build variant foreach(BUILD_VARIANT IN LISTS BUILD_VARIANTS) diff --git a/gpt4all-backend/toolchains/linux-arm64-toolchain.cmake b/gpt4all-backend/toolchains/linux-arm64-toolchain.cmake new file mode 100644 index 00000000..69ac845b --- /dev/null +++ b/gpt4all-backend/toolchains/linux-arm64-toolchain.cmake @@ -0,0 +1,11 @@ +# Toolchain to crosscompile runtimes for arm64 on jammy x86_64 +# You may have to `sudo apt-get install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu` + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc-12) +set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++-12) + +# Supported backends +set(LLMODEL_CUDA off) +set(LLMODEL_KOMPUTE off) diff --git a/gpt4all-bindings/typescript/.gitignore b/gpt4all-bindings/typescript/.gitignore index 7fd9d3cb..eb7af4f2 100644 --- a/gpt4all-bindings/typescript/.gitignore +++ b/gpt4all-bindings/typescript/.gitignore @@ -8,4 +8,5 @@ prebuilds/ !.yarn/sdks !.yarn/versions runtimes/ +backend/ compile_flags.txt diff --git a/gpt4all-bindings/typescript/.npmignore b/gpt4all-bindings/typescript/.npmignore index 8921a757..dd25c641 100644 --- a/gpt4all-bindings/typescript/.npmignore +++ b/gpt4all-bindings/typescript/.npmignore @@ -1,4 +1,5 @@ test/ spec/ -scripts/ +scripts/* +!scripts/assert-backend-sources.js build \ No newline at end of file diff --git a/gpt4all-bindings/typescript/README.md b/gpt4all-bindings/typescript/README.md index 384e4afb..44690ec9 100644 --- a/gpt4all-bindings/typescript/README.md +++ b/gpt4all-bindings/typescript/README.md @@ -188,6 +188,8 @@ model.dispose(); * python 3 * On Windows and Linux, building GPT4All requires the complete Vulkan SDK. You may download it from here: https://vulkan.lunarg.com/sdk/home * macOS users do not need Vulkan, as GPT4All will use Metal instead. +* CUDA Toolkit >= 11.4 (you can bypass this with adding a custom flag to build step) + - Windows: There is difficulty compiling with cuda if the Visual Studio IDE is NOT present. ### Build (from source) @@ -196,23 +198,29 @@ git clone https://github.com/nomic-ai/gpt4all.git cd gpt4all-bindings/typescript ``` -* The below shell commands assume the current working directory is `typescript`. - -* To Build and Rebuild: - -```sh -node scripts/prebuild.js -``` -* llama.cpp git submodule for gpt4all can be possibly absent. If this is the case, make sure to run in llama.cpp parent directory +llama.cpp git submodule for gpt4all can be possibly absent or outdated. Make sure to run ```sh git submodule update --init --recursive ``` +The below shell commands assume the current working directory is `typescript`. + +Using yarn + ```sh -yarn build:backend +yarn install +yarn build ``` -This will build platform-dependent dynamic libraries, and will be located in runtimes/(platform)/native + +Using npm + +```sh +npm install +npm run build +``` + +The `build:runtimes` script will create runtime libraries for your platform in `runtimes` and `build:prebuilds` will create the bindings in `prebuilds`. `build` is a shortcut for both. ### Test @@ -259,7 +267,7 @@ yarn test This package has been stabilizing over time development, and breaking changes may happen until the api stabilizes. Here's what's the todo list: -* \[ ] Purely offline. Per the gui, which can be run completely offline, the bindings should be as well. +* \[x] [Purely offline](#Offline-usage). Per the gui, which can be run completely offline, the bindings should be as well. * \[ ] NPM bundle size reduction via optionalDependencies strategy (need help) * Should include prebuilds to avoid painful node-gyp errors * \[x] createChatSession ( the python equivalent to create\_chat\_session ) @@ -276,7 +284,7 @@ This package has been stabilizing over time development, and breaking changes ma This repository serves as the new bindings for nodejs users. - If you were a user of [these bindings](https://github.com/nomic-ai/gpt4all-ts), they are outdated. - Version 4 includes the follow breaking changes - * `createEmbedding` & `EmbeddingModel.embed()` returns an object, `EmbeddingResult`, instead of a float32array. + * `createEmbedding` & `EmbeddingModel.embed()` returns an object, `EmbeddingResult`, instead of a Float32Array. * Removed deprecated types `ModelType` and `ModelFile` * Removed deprecated initiation of model by string path only diff --git a/gpt4all-bindings/typescript/binding.ci.gyp b/gpt4all-bindings/typescript/binding.ci.gyp deleted file mode 100644 index 5d511155..00000000 --- a/gpt4all-bindings/typescript/binding.ci.gyp +++ /dev/null @@ -1,62 +0,0 @@ -{ - "targets": [ - { - "target_name": "gpt4all", # gpt4all-ts will cause compile error - "include_dirs": [ - "(llmodel_required_mem(GetInference(), full_model_path.c_str(), nCtx, nGpuLayers))); + env, static_cast(llmodel_required_mem(GetInference(), model_file.c_str(), n_ctx, n_gpu_layers))); } Napi::Value NodeModelWrapper::GetGpuDevices(const Napi::CallbackInfo &info) { auto env = info.Env(); int num_devices = 0; - auto mem_size = llmodel_required_mem(GetInference(), full_model_path.c_str(), nCtx, nGpuLayers); + auto mem_size = llmodel_required_mem(GetInference(), model_file.c_str(), n_ctx, n_gpu_layers); llmodel_gpu_device *all_devices = llmodel_available_gpu_devices(mem_size, &num_devices); if (all_devices == nullptr) { @@ -63,6 +64,7 @@ Napi::Value NodeModelWrapper::GetGpuDevices(const Napi::CallbackInfo &info) js_gpu_device["heapSize"] = static_cast(gpu_device.heapSize); js_gpu_device["name"] = gpu_device.name; js_gpu_device["vendor"] = gpu_device.vendor; + js_gpu_device["backend"] = gpu_device.backend; js_array[i] = js_gpu_device; } @@ -71,35 +73,13 @@ Napi::Value NodeModelWrapper::GetGpuDevices(const Napi::CallbackInfo &info) Napi::Value NodeModelWrapper::GetType(const Napi::CallbackInfo &info) { - if (type.empty()) + if (model_type.empty()) { return info.Env().Undefined(); } - return Napi::String::New(info.Env(), type); + return Napi::String::New(info.Env(), model_type); } -Napi::Value NodeModelWrapper::InitGpuByString(const Napi::CallbackInfo &info) -{ - auto env = info.Env(); - size_t memory_required = static_cast(info[0].As().Uint32Value()); - - std::string gpu_device_identifier = info[1].As(); - - size_t converted_value; - if (memory_required <= std::numeric_limits::max()) - { - converted_value = static_cast(memory_required); - } - else - { - Napi::Error::New(env, "invalid number for memory size. Exceeded bounds for memory.") - .ThrowAsJavaScriptException(); - return env.Undefined(); - } - - auto result = llmodel_gpu_init_gpu_device_by_string(GetInference(), converted_value, gpu_device_identifier.c_str()); - return Napi::Boolean::New(env, result); -} Napi::Value NodeModelWrapper::HasGpuDevice(const Napi::CallbackInfo &info) { return Napi::Boolean::New(info.Env(), llmodel_has_gpu_device(GetInference())); @@ -110,82 +90,61 @@ NodeModelWrapper::NodeModelWrapper(const Napi::CallbackInfo &info) : Napi::Objec auto env = info.Env(); auto config_object = info[0].As(); - // sets the directory where models (gguf files) are to be searched - llmodel_set_implementation_search_path( - config_object.Has("library_path") ? config_object.Get("library_path").As().Utf8Value().c_str() - : "."); + // sets the directories where runtime libs are to be searched + llmodel_set_implementation_search_path(config_object.Has("librariesPath") + ? config_object.Get("librariesPath").As().Utf8Value().c_str() + : "."); - std::string model_name = config_object.Get("model_name").As(); - fs::path model_path = config_object.Get("model_path").As().Utf8Value(); - std::string full_weight_path = (model_path / fs::path(model_name)).string(); + model_file = config_object.Get("modelFile").As().Utf8Value(); + model_name = model_file.substr(model_file.find_last_of("/\\") + 1); + backend = config_object.Get("backend").As().Utf8Value(); + n_ctx = config_object.Get("nCtx").As().Int32Value(); + n_gpu_layers = config_object.Get("nGpuLayers").As().Int32Value(); - name = model_name.empty() ? model_path.filename().string() : model_name; - full_model_path = full_weight_path; - nCtx = config_object.Get("nCtx").As().Int32Value(); - nGpuLayers = config_object.Get("ngl").As().Int32Value(); - - const char *e; - inference_ = llmodel_model_create2(full_weight_path.c_str(), "auto", &e); + const char *err; + inference_ = llmodel_model_create2(model_file.c_str(), backend.c_str(), &err); if (!inference_) { - Napi::Error::New(env, e).ThrowAsJavaScriptException(); + Napi::Error::New(env, err).ThrowAsJavaScriptException(); return; } if (GetInference() == nullptr) { std::cerr << "Tried searching libraries in \"" << llmodel_get_implementation_search_path() << "\"" << std::endl; - std::cerr << "Tried searching for model weight in \"" << full_weight_path << "\"" << std::endl; + std::cerr << "Tried using model weights in \"" << model_file << "\"" << std::endl; std::cerr << "Do you have runtime libraries installed?" << std::endl; Napi::Error::New(env, "Had an issue creating llmodel object, inference is null").ThrowAsJavaScriptException(); return; } - - std::string device = config_object.Get("device").As(); - if (device != "cpu") - { - size_t mem = llmodel_required_mem(GetInference(), full_weight_path.c_str(), nCtx, nGpuLayers); - - auto success = llmodel_gpu_init_gpu_device_by_string(GetInference(), mem, device.c_str()); - if (!success) - { - // https://github.com/nomic-ai/gpt4all/blob/3acbef14b7c2436fe033cae9036e695d77461a16/gpt4all-bindings/python/gpt4all/pyllmodel.py#L215 - // Haven't implemented this but it is still open to contribution - std::cout << "WARNING: Failed to init GPU\n"; - } - } - - auto success = llmodel_loadModel(GetInference(), full_weight_path.c_str(), nCtx, nGpuLayers); - if (!success) - { - Napi::Error::New(env, "Failed to load model at given path").ThrowAsJavaScriptException(); - return; - } // optional - if (config_object.Has("model_type")) + if (config_object.Has("modelType")) { - type = config_object.Get("model_type").As(); + model_type = config_object.Get("modelType").As(); } }; -// NodeModelWrapper::~NodeModelWrapper() { -// if(GetInference() != nullptr) { -// std::cout << "Debug: deleting model\n"; -// llmodel_model_destroy(inference_); -// std::cout << (inference_ == nullptr); -// } -// } -// void NodeModelWrapper::Finalize(Napi::Env env) { -// if(inference_ != nullptr) { -// std::cout << "Debug: deleting model\n"; -// -// } -// } +Napi::Value NodeModelWrapper::Load(const Napi::CallbackInfo &info) +{ + auto env = info.Env(); + auto success = llmodel_loadModel(GetInference(), model_file.c_str(), n_ctx, n_gpu_layers); + return Napi::Boolean::New(env, success); +} + +Napi::Value NodeModelWrapper::InitGpu(const Napi::CallbackInfo &info) +{ + auto env = info.Env(); + auto device = info[0].As().Utf8Value(); + size_t mem_required = llmodel_required_mem(GetInference(), model_file.c_str(), n_ctx, n_gpu_layers); + auto success = llmodel_gpu_init_gpu_device_by_string(GetInference(), mem_required, device.c_str()); + return Napi::Boolean::New(env, success); +} + Napi::Value NodeModelWrapper::IsModelLoaded(const Napi::CallbackInfo &info) { return Napi::Boolean::New(info.Env(), llmodel_isModelLoaded(GetInference())); } -Napi::Value NodeModelWrapper::StateSize(const Napi::CallbackInfo &info) +Napi::Value NodeModelWrapper::GetStateSize(const Napi::CallbackInfo &info) { // Implement the binding for the stateSize method return Napi::Number::New(info.Env(), static_cast(llmodel_get_state_size(GetInference()))); @@ -220,7 +179,7 @@ Napi::Array ChunkedFloatPtr(float *embedding_ptr, int embedding_size, int text_l return result; } -Napi::Value NodeModelWrapper::GenerateEmbedding(const Napi::CallbackInfo &info) +Napi::Value NodeModelWrapper::Embed(const Napi::CallbackInfo &info) { auto env = info.Env(); @@ -256,7 +215,7 @@ Napi::Value NodeModelWrapper::GenerateEmbedding(const Napi::CallbackInfo &info) str_ptrs.push_back(text_arr[i].c_str()); str_ptrs.push_back(nullptr); const char *_err = nullptr; - float *embeds = llmodel_embed(GetInference(), str_ptrs.data(), &embedding_size, + float *embeds = llmodel_embed(GetInference(), str_ptrs.data(), &embedding_size, prefix.IsUndefined() ? nullptr : prefix.As().Utf8Value().c_str(), dimensionality, &token_count, do_mean, atlas, nullptr, &_err); if (!embeds) @@ -271,9 +230,12 @@ Napi::Value NodeModelWrapper::GenerateEmbedding(const Napi::CallbackInfo &info) llmodel_free_embedding(embeds); auto res = Napi::Object::New(env); res.Set("n_prompt_tokens", token_count); - if(is_single_text) { + if (is_single_text) + { res.Set("embeddings", embedmat.Get(static_cast(0))); - } else { + } + else + { res.Set("embeddings", embedmat); } @@ -308,7 +270,7 @@ Napi::Value NodeModelWrapper::Infer(const Napi::CallbackInfo &info) llmodel_prompt_context promptContext = {.logits = nullptr, .tokens = nullptr, .n_past = 0, - .n_ctx = nCtx, + .n_ctx = n_ctx, .n_predict = 4096, .top_k = 40, .top_p = 0.9f, @@ -323,6 +285,12 @@ Napi::Value NodeModelWrapper::Infer(const Napi::CallbackInfo &info) auto inputObject = info[1].As(); + if (!inputObject.Has("promptTemplate")) + { + Napi::Error::New(info.Env(), "Missing Prompt Template").ThrowAsJavaScriptException(); + return info.Env().Undefined(); + } + if (inputObject.Has("logits") || inputObject.Has("tokens")) { Napi::Error::New(info.Env(), "Invalid input: 'logits' or 'tokens' properties are not allowed") @@ -425,9 +393,9 @@ void NodeModelWrapper::SetThreadCount(const Napi::CallbackInfo &info) Napi::Value NodeModelWrapper::GetName(const Napi::CallbackInfo &info) { - return Napi::String::New(info.Env(), name); + return Napi::String::New(info.Env(), model_name); } -Napi::Value NodeModelWrapper::ThreadCount(const Napi::CallbackInfo &info) +Napi::Value NodeModelWrapper::GetThreadCount(const Napi::CallbackInfo &info) { return Napi::Number::New(info.Env(), llmodel_threadCount(GetInference())); } diff --git a/gpt4all-bindings/typescript/index.h b/gpt4all-bindings/typescript/index.h index db3ef11e..f21d4dac 100644 --- a/gpt4all-bindings/typescript/index.h +++ b/gpt4all-bindings/typescript/index.h @@ -16,30 +16,28 @@ class NodeModelWrapper : public Napi::ObjectWrap public: NodeModelWrapper(const Napi::CallbackInfo &); - // virtual ~NodeModelWrapper(); - Napi::Value GetType(const Napi::CallbackInfo &info); - Napi::Value IsModelLoaded(const Napi::CallbackInfo &info); - Napi::Value StateSize(const Napi::CallbackInfo &info); - // void Finalize(Napi::Env env) override; + Napi::Value Load(const Napi::CallbackInfo &info); + Napi::Value InitGpu(const Napi::CallbackInfo &info); /** * Prompting the model. This entails spawning a new thread and adding the response tokens * into a thread local string variable. */ Napi::Value Infer(const Napi::CallbackInfo &info); - void SetThreadCount(const Napi::CallbackInfo &info); - void Dispose(const Napi::CallbackInfo &info); + Napi::Value Embed(const Napi::CallbackInfo &info); + Napi::Value IsModelLoaded(const Napi::CallbackInfo &info); + Napi::Value GetType(const Napi::CallbackInfo &info); Napi::Value GetName(const Napi::CallbackInfo &info); - Napi::Value ThreadCount(const Napi::CallbackInfo &info); - Napi::Value GenerateEmbedding(const Napi::CallbackInfo &info); - Napi::Value HasGpuDevice(const Napi::CallbackInfo &info); - Napi::Value ListGpus(const Napi::CallbackInfo &info); - Napi::Value InitGpuByString(const Napi::CallbackInfo &info); - Napi::Value GetRequiredMemory(const Napi::CallbackInfo &info); - Napi::Value GetGpuDevices(const Napi::CallbackInfo &info); + Napi::Value GetStateSize(const Napi::CallbackInfo &info); + void SetThreadCount(const Napi::CallbackInfo &info); + Napi::Value GetThreadCount(const Napi::CallbackInfo &info); /* * The path that is used to search for the dynamic libraries */ Napi::Value GetLibraryPath(const Napi::CallbackInfo &info); + Napi::Value HasGpuDevice(const Napi::CallbackInfo &info); + Napi::Value GetGpuDevices(const Napi::CallbackInfo &info); + Napi::Value GetRequiredMemory(const Napi::CallbackInfo &info); + void Dispose(const Napi::CallbackInfo &info); /** * Creates the LLModel class */ @@ -54,10 +52,10 @@ class NodeModelWrapper : public Napi::ObjectWrap std::mutex inference_mutex; - std::string type; - // corresponds to LLModel::name() in typescript - std::string name; - int nCtx{}; - int nGpuLayers{}; - std::string full_model_path; + std::string model_type; + std::string model_name; + std::string model_file; + std::string backend; + int n_ctx{}; + int n_gpu_layers{}; }; diff --git a/gpt4all-bindings/typescript/package.json b/gpt4all-bindings/typescript/package.json index 7f3e368e..94f6cdf6 100644 --- a/gpt4all-bindings/typescript/package.json +++ b/gpt4all-bindings/typescript/package.json @@ -5,32 +5,38 @@ "main": "src/gpt4all.js", "repository": "nomic-ai/gpt4all", "scripts": { - "install": "node-gyp-build", + "install": "node ./scripts/assert-backend-sources.js && node-gyp-build", + "test:ci": "jest test/ci.test.js", "test": "jest", - "build:backend": "node scripts/build.js", - "build": "node-gyp-build", + "clean": "rimraf build runtimes prebuilds backend", + "prebuild": "npm run clean", + "build": "npm run build:runtimes && npm run build:prebuilds", + "build:runtimes": "node scripts/build.js", + "build:prebuilds": "node scripts/assert-backend-sources.js && node scripts/prebuild.js", "docs:build": "node scripts/docs.js && documentation readme ./src/gpt4all.d.ts --parse-extension js d.ts --format md --section \"API Reference\" --readme-file ../python/docs/gpt4all_nodejs.md" }, "files": [ + "binding.gyp", "src/**/*", "runtimes/**/*", - "binding.gyp", "prebuilds/**/*", + "backend/**/*", + "scripts/assert-backend-sources.js", "*.h", - "*.cc", - "gpt4all-backend/**/*" + "*.cc" ], "dependencies": { "md5-file": "^5.0.0", - "node-addon-api": "^6.1.0", - "node-gyp-build": "^4.6.0" + "node-addon-api": "^8.0.0", + "node-gyp-build": "~4.8.0" }, "devDependencies": { - "@types/node": "^20.1.5", + "@types/node": "^20.12.12", "documentation": "^14.0.2", - "jest": "^29.5.0", - "prebuildify": "^5.0.1", - "prettier": "^2.8.8" + "jest": "^29.7.0", + "prebuildify": "^6.0.1", + "prettier": "^3.2.5", + "rimraf": "^5.0.7" }, "optionalDependencies": { "node-gyp": "9.x.x" diff --git a/gpt4all-bindings/typescript/prompt.cc b/gpt4all-bindings/typescript/prompt.cc index d24a7e90..3a317d9d 100644 --- a/gpt4all-bindings/typescript/prompt.cc +++ b/gpt4all-bindings/typescript/prompt.cc @@ -131,7 +131,8 @@ bool PromptWorker::ResponseCallback(int32_t token_id, const std::string token) // Transform native data into JS data, passing it to the provided // `jsCallback` -- the TSFN's JavaScript function. auto token_id = Napi::Number::New(env, value->tokenId); - auto token = Napi::String::New(env, value->token); + auto token = Napi::Uint8Array::New(env, value->token.size()); + memcpy(token.Data(), value->token.data(), value->token.size()); auto jsResult = jsCallback.Call({token_id, token}).ToBoolean(); promise.set_value(jsResult); } diff --git a/gpt4all-bindings/typescript/scripts/assert-backend-sources.js b/gpt4all-bindings/typescript/scripts/assert-backend-sources.js new file mode 100644 index 00000000..e8b7c4e6 --- /dev/null +++ b/gpt4all-bindings/typescript/scripts/assert-backend-sources.js @@ -0,0 +1,47 @@ +const fs = require("fs"); +const path = require("path"); + +// Copies the shared llmodel sources from gpt4all-backend into the backend folder. +// These are dependencies of the bindings and will be required in case node-gyp-build +// cannot find a prebuild. This script is used in the package install hook and will +// be executed BOTH when `yarn install` is run in the root folder AND when the package +// is installed as a dependency in another project. + +const backendDeps = [ + "llmodel.h", + "llmodel.cpp", + "llmodel_c.cpp", + "llmodel_c.h", + "sysinfo.h", + "dlhandle.h", + "dlhandle.cpp", +]; + +const sourcePath = path.resolve(__dirname, "../../../gpt4all-backend"); +const destPath = path.resolve(__dirname, "../backend"); + +// Silently ignore if the backend sources are not available. +// When the package is installed as a dependency, gpt4all-backend will not be present. +if (fs.existsSync(sourcePath)) { + if (!fs.existsSync(destPath)) { + fs.mkdirSync(destPath); + } + for (const file of backendDeps) { + const sourceFile = path.join(sourcePath, file); + const destFile = path.join(destPath, file); + if (fs.existsSync(sourceFile)) { + console.info(`Copying ${sourceFile} to ${destFile}`); + fs.copyFileSync(sourceFile, destFile); // overwrite + } else { + throw new Error(`File ${sourceFile} does not exist`); + } + } +} + +// assert that the backend sources are present +for (const file of backendDeps) { + const destFile = path.join(destPath, file); + if (!fs.existsSync(destFile)) { + throw new Error(`File ${destFile} does not exist`); + } +} diff --git a/gpt4all-bindings/typescript/scripts/build_unix.sh b/gpt4all-bindings/typescript/scripts/build_unix.sh index d60343c9..5c979ed2 100755 --- a/gpt4all-bindings/typescript/scripts/build_unix.sh +++ b/gpt4all-bindings/typescript/scripts/build_unix.sh @@ -1,12 +1,42 @@ #!/bin/sh +# Build script for Unix-like systems (Linux, macOS). +# Script assumes the current working directory is the bindings project root. SYSNAME=$(uname -s) +PLATFORM=$(uname -m) + +# Allows overriding target sysname and platform via args +# If not provided, the current system's sysname and platform will be used + +while [ $# -gt 0 ]; do + case "$1" in + --sysname=*) + SYSNAME="${1#*=}" + shift + ;; + --platform=*) + PLATFORM="${1#*=}" + shift + ;; + *) + echo "Unknown argument: $1" >&2 + exit 1 + ;; + esac +done if [ "$SYSNAME" = "Linux" ]; then - BASE_DIR="runtimes/linux-x64" + if [ "$PLATFORM" = "x86_64" ]; then + BASE_DIR="runtimes/linux-x64" + elif [ "$PLATFORM" = "aarch64" ]; then + BASE_DIR="runtimes/linux-arm64" + else + echo "Unsupported platform: $PLATFORM" >&2 + exit 1 + fi LIB_EXT="so" elif [ "$SYSNAME" = "Darwin" ]; then - BASE_DIR="runtimes/osx" + BASE_DIR="runtimes/darwin" LIB_EXT="dylib" elif [ -n "$SYSNAME" ]; then echo "Unsupported system: $SYSNAME" >&2 @@ -22,8 +52,24 @@ BUILD_DIR="$BASE_DIR/build" rm -rf "$BASE_DIR" mkdir -p "$NATIVE_DIR" "$BUILD_DIR" -cmake -S ../../gpt4all-backend -B "$BUILD_DIR" && -cmake --build "$BUILD_DIR" -j --config Release && { +if [ "$PLATFORM" = "x86_64" ]; then + echo "Building for x86_64" + cmake -S ../../gpt4all-backend -B "$BUILD_DIR" -DCMAKE_BUILD_TYPE=RelWithDebInfo +fi + +if [ "$PLATFORM" = "aarch64" ]; then + if [ "$(uname -m)" != "aarch64" ]; then + echo "Cross-compiling for aarch64" + cmake -S ../../gpt4all-backend \ + -B "$BUILD_DIR" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_TOOLCHAIN_FILE="./toolchains/linux-arm64-toolchain.cmake" + else + cmake -S ../../gpt4all-backend -B "$BUILD_DIR" -DCMAKE_BUILD_TYPE=RelWithDebInfo + fi +fi + +cmake --build "$BUILD_DIR" --parallel && { cp "$BUILD_DIR"/libgptj*.$LIB_EXT "$NATIVE_DIR"/ cp "$BUILD_DIR"/libllama*.$LIB_EXT "$NATIVE_DIR"/ -} +} \ No newline at end of file diff --git a/gpt4all-bindings/typescript/scripts/prebuild.js b/gpt4all-bindings/typescript/scripts/prebuild.js index 0ea196f7..4f785ba5 100644 --- a/gpt4all-bindings/typescript/scripts/prebuild.js +++ b/gpt4all-bindings/typescript/scripts/prebuild.js @@ -1,22 +1,21 @@ const prebuildify = require("prebuildify"); -async function createPrebuilds(combinations) { - for (const { platform, arch } of combinations) { +async function createPrebuilds(configs) { + for (const config of configs) { const opts = { - platform, - arch, napi: true, - targets: ["18.16.0"] + targets: ["18.16.0"], + ...config, }; try { await createPrebuild(opts); console.log( - `Build succeeded for platform ${opts.platform} and architecture ${opts.arch}` + `Build succeeded for platform ${opts.platform} and architecture ${opts.arch}`, ); } catch (err) { console.error( `Error building for platform ${opts.platform} and architecture ${opts.arch}:`, - err + err, ); } } @@ -24,6 +23,17 @@ async function createPrebuilds(combinations) { function createPrebuild(opts) { return new Promise((resolve, reject) => { + // if this prebuild is cross-compiling for arm64 on a non-arm64 machine, + // set the CXX and CC environment variables to the cross-compilers + if ( + opts.arch === "arm64" && + process.arch !== "arm64" && + process.platform === "linux" + ) { + process.env.CXX = "aarch64-linux-gnu-g++-12"; + process.env.CC = "aarch64-linux-gnu-gcc-12"; + } + prebuildify(opts, (err) => { if (err) { reject(err); @@ -35,22 +45,18 @@ function createPrebuild(opts) { } let prebuildConfigs; -if(process.platform === 'win32') { - prebuildConfigs = [ - { platform: "win32", arch: "x64" } - ]; -} else if(process.platform === 'linux') { - //Unsure if darwin works, need mac tester! - prebuildConfigs = [ - { platform: "linux", arch: "x64" }, - //{ platform: "linux", arch: "arm64" }, - //{ platform: "linux", arch: "armv7" }, - ] -} else if(process.platform === 'darwin') { +if (process.platform === "win32") { + prebuildConfigs = [{ platform: "win32", arch: "x64" }]; +} else if (process.platform === "linux") { prebuildConfigs = [ - { platform: "darwin", arch: "x64" }, - { platform: "darwin", arch: "arm64" }, - ] + { platform: "linux", arch: "x64" }, + { platform: "linux", arch: "arm64" }, + ]; +} else if (process.platform === "darwin") { + prebuildConfigs = [ + { platform: "darwin", arch: "x64" }, + { platform: "darwin", arch: "arm64" }, + ]; } createPrebuilds(prebuildConfigs) diff --git a/gpt4all-bindings/typescript/spec/chat-minimal.mjs b/gpt4all-bindings/typescript/spec/chat-minimal.mjs index 6d822f23..672849b2 100644 --- a/gpt4all-bindings/typescript/spec/chat-minimal.mjs +++ b/gpt4all-bindings/typescript/spec/chat-minimal.mjs @@ -2,7 +2,6 @@ import { loadModel, createCompletion } from "../src/gpt4all.js"; const model = await loadModel("orca-mini-3b-gguf2-q4_0.gguf", { verbose: true, - device: "gpu", }); const chat = await model.createChatSession(); @@ -12,8 +11,6 @@ await createCompletion( "Why are bananas rather blue than bread at night sometimes?", { verbose: true, + nPredict: 10, } -); -await createCompletion(chat, "Are you sure?", { - verbose: true, -}); +); \ No newline at end of file diff --git a/gpt4all-bindings/typescript/spec/concurrency.mjs b/gpt4all-bindings/typescript/spec/concurrency.mjs index 55ba9046..aa6b98b0 100644 --- a/gpt4all-bindings/typescript/spec/concurrency.mjs +++ b/gpt4all-bindings/typescript/spec/concurrency.mjs @@ -7,12 +7,12 @@ const modelOptions = { verbose: true, }; -const model1 = await loadModel("orca-mini-3b-gguf2-q4_0.gguf", { +const model1 = await loadModel("Phi-3-mini-4k-instruct.Q4_0.gguf", { ...modelOptions, device: "gpu", // only one model can be on gpu }); -const model2 = await loadModel("orca-mini-3b-gguf2-q4_0.gguf", modelOptions); -const model3 = await loadModel("orca-mini-3b-gguf2-q4_0.gguf", modelOptions); +const model2 = await loadModel("Phi-3-mini-4k-instruct.Q4_0.gguf", modelOptions); +const model3 = await loadModel("Phi-3-mini-4k-instruct.Q4_0.gguf", modelOptions); const promptContext = { verbose: true, @@ -27,3 +27,6 @@ const responses = await Promise.all([ createCompletion(model3, "What is 1 + 3?", promptContext), ]); console.log(responses.map((res) => res.choices[0].message)); +model1.dispose(); +model2.dispose(); +model3.dispose(); \ No newline at end of file diff --git a/gpt4all-bindings/typescript/spec/long-context.mjs b/gpt4all-bindings/typescript/spec/context-large.mjs similarity index 100% rename from gpt4all-bindings/typescript/spec/long-context.mjs rename to gpt4all-bindings/typescript/spec/context-large.mjs diff --git a/gpt4all-bindings/typescript/spec/chat-memory.mjs b/gpt4all-bindings/typescript/spec/context-recalc.mjs similarity index 100% rename from gpt4all-bindings/typescript/spec/chat-memory.mjs rename to gpt4all-bindings/typescript/spec/context-recalc.mjs diff --git a/gpt4all-bindings/typescript/spec/llmodel.mjs b/gpt4all-bindings/typescript/spec/llmodel.mjs deleted file mode 100644 index baa6ed76..00000000 --- a/gpt4all-bindings/typescript/spec/llmodel.mjs +++ /dev/null @@ -1,61 +0,0 @@ -import { - LLModel, - createCompletion, - DEFAULT_DIRECTORY, - DEFAULT_LIBRARIES_DIRECTORY, - loadModel, -} from "../src/gpt4all.js"; - -const model = await loadModel("mistral-7b-openorca.gguf2.Q4_0.gguf", { - verbose: true, - device: "gpu", -}); -const ll = model.llm; - -try { - class Extended extends LLModel {} -} catch (e) { - console.log("Extending from native class gone wrong " + e); -} - -console.log("state size " + ll.stateSize()); - -console.log("thread count " + ll.threadCount()); -ll.setThreadCount(5); - -console.log("thread count " + ll.threadCount()); -ll.setThreadCount(4); -console.log("thread count " + ll.threadCount()); -console.log("name " + ll.name()); -console.log("type: " + ll.type()); -console.log("Default directory for models", DEFAULT_DIRECTORY); -console.log("Default directory for libraries", DEFAULT_LIBRARIES_DIRECTORY); -console.log("Has GPU", ll.hasGpuDevice()); -console.log("gpu devices", ll.listGpu()); -console.log("Required Mem in bytes", ll.memoryNeeded()); - -// to ingest a custom system prompt without using a chat session. -await createCompletion( - model, - "<|im_start|>system\nYou are an advanced mathematician.\n<|im_end|>\n", - { - promptTemplate: "%1", - nPredict: 0, - special: true, - } -); -const completion1 = await createCompletion(model, "What is 1 + 1?", { - verbose: true, -}); -console.log(`🤖 > ${completion1.choices[0].message.content}`); -//Very specific: -// tested on Ubuntu 22.0, Linux Mint, if I set nPast to 100, the app hangs. -const completion2 = await createCompletion(model, "And if we add two?", { - verbose: true, -}); -console.log(`🤖 > ${completion2.choices[0].message.content}`); - -//CALLING DISPOSE WILL INVALID THE NATIVE MODEL. USE THIS TO CLEANUP -model.dispose(); - -console.log("model disposed, exiting..."); diff --git a/gpt4all-bindings/typescript/spec/callbacks.mjs b/gpt4all-bindings/typescript/spec/token-callbacks.mjs similarity index 66% rename from gpt4all-bindings/typescript/spec/callbacks.mjs rename to gpt4all-bindings/typescript/spec/token-callbacks.mjs index 461f32be..ca5a55b4 100644 --- a/gpt4all-bindings/typescript/spec/callbacks.mjs +++ b/gpt4all-bindings/typescript/spec/token-callbacks.mjs @@ -1,7 +1,6 @@ -import { promises as fs } from "node:fs"; import { loadModel, createCompletion } from "../src/gpt4all.js"; -const model = await loadModel("Nous-Hermes-2-Mistral-7B-DPO.Q4_0.gguf", { +const model = await loadModel("Phi-3-mini-4k-instruct.Q4_0.gguf", { verbose: true, device: "gpu", }); @@ -12,14 +11,15 @@ const res = await createCompletion( { onPromptToken: (tokenId) => { console.debug("onPromptToken", { tokenId }); - // throwing an error will cancel + // errors within the callback will cancel ingestion, inference will still run throw new Error("This is an error"); // const foo = thisMethodDoesNotExist(); // returning false will cancel as well // return false; }, - onResponseToken: (tokenId, token) => { - console.debug("onResponseToken", { tokenId, token }); + onResponseTokens: ({ tokenIds, text }) => { + // console.debug("onResponseToken", { tokenIds, text }); + process.stdout.write(text); // same applies here }, } diff --git a/gpt4all-bindings/typescript/spec/token-streaming-emoji.mjs b/gpt4all-bindings/typescript/spec/token-streaming-emoji.mjs new file mode 100644 index 00000000..532faa13 --- /dev/null +++ b/gpt4all-bindings/typescript/spec/token-streaming-emoji.mjs @@ -0,0 +1,37 @@ +import { + loadModel, + createCompletion, + createCompletionStream, + createCompletionGenerator, +} from "../src/gpt4all.js"; + +const model = await loadModel("Phi-3-mini-4k-instruct.Q4_0.gguf", { + device: "cpu", +}); + +const prompt = "Tell a short story but only use emojis. Three sentences max."; + +const result = await createCompletion(model, prompt, { + onResponseToken: (tokens) => { + console.debug(tokens) + }, +}); + +console.debug(result.choices[0].message); + +process.stdout.write("### Stream:"); +const stream = createCompletionStream(model, prompt); +stream.tokens.on("data", (data) => { + process.stdout.write(data); +}); +await stream.result; +process.stdout.write("\n"); + +process.stdout.write("### Generator:"); +const gen = createCompletionGenerator(model, prompt); +for await (const chunk of gen) { + process.stdout.write(chunk); +} + + +model.dispose(); diff --git a/gpt4all-bindings/typescript/spec/streaming.mjs b/gpt4all-bindings/typescript/spec/token-streaming.mjs similarity index 94% rename from gpt4all-bindings/typescript/spec/streaming.mjs rename to gpt4all-bindings/typescript/spec/token-streaming.mjs index 0dfcfd7b..dcb996a2 100644 --- a/gpt4all-bindings/typescript/spec/streaming.mjs +++ b/gpt4all-bindings/typescript/spec/token-streaming.mjs @@ -38,8 +38,8 @@ process.stdout.write("\n"); process.stdout.write("### Callback:"); await createCompletion(model, "Why not just callbacks?", { - onResponseToken: (tokenId, token) => { - process.stdout.write(token); + onResponseTokens: ({ text }) => { + process.stdout.write(text); }, }); process.stdout.write("\n"); diff --git a/gpt4all-bindings/typescript/src/chat-session.js b/gpt4all-bindings/typescript/src/chat-session.js index dcbdb7da..93b58bc1 100644 --- a/gpt4all-bindings/typescript/src/chat-session.js +++ b/gpt4all-bindings/typescript/src/chat-session.js @@ -25,7 +25,7 @@ class ChatSession { const { messages, systemPrompt, ...sessionDefaultPromptContext } = chatSessionOpts; this.model = model; - this.modelName = model.llm.name(); + this.modelName = model.llm.getName(); this.messages = messages ?? []; this.systemPrompt = systemPrompt ?? model.config.systemPrompt; this.initialized = false; diff --git a/gpt4all-bindings/typescript/src/gpt4all.d.ts b/gpt4all-bindings/typescript/src/gpt4all.d.ts index 4d9bfdcc..f862076d 100644 --- a/gpt4all-bindings/typescript/src/gpt4all.d.ts +++ b/gpt4all-bindings/typescript/src/gpt4all.d.ts @@ -5,10 +5,27 @@ interface LLModelOptions { /** * Model architecture. This argument currently does not have any functionality and is just used as descriptive identifier for user. */ - type?: string; - model_name: string; - model_path: string; - library_path?: string; + modelType?: string; + /** + * Absolute path to the model file. + */ + modelFile: string; + /** + * Path to the llmodel implementation shared objects. This can be a single path or a list of paths separated by ';' delimiter. + */ + librariesPath?: string; + /** + * A string representing the implementation to use. One of 'auto', 'cpu', 'metal', 'kompute', or 'cuda'. + */ + backend: string; + /** + * The maximum window size of this model. + */ + nCtx: number; + /** + * Number of GPU layers to use (Vulkan) + */ + nGpuLayers: number; } interface ModelConfig { @@ -263,10 +280,10 @@ interface LLModelInferenceResult { interface LLModelInferenceOptions extends Partial { /** Callback for response tokens, called for each generated token. * @param {number} tokenId The token id. - * @param {string} token The token. + * @param {Uint8Array} bytes The token bytes. * @returns {boolean | undefined} Whether to continue generating tokens. * */ - onResponseToken?: (tokenId: number, token: string) => boolean | void; + onResponseToken?: (tokenId: number, bytes: Uint8Array) => boolean | void; /** Callback for prompt tokens, called for each input token in the prompt. * @param {number} tokenId The token id. * @returns {boolean | undefined} Whether to continue ingesting the prompt. @@ -281,30 +298,42 @@ interface LLModelInferenceOptions extends Partial { declare class LLModel { /** * Initialize a new LLModel. - * @param {string} path Absolute path to the model file. - * @throws {Error} If the model file does not exist. + * @param {LLModelOptions} options LLModel options. + * @throws {Error} If the model can't be loaded or necessary runtimes are not found. */ constructor(options: LLModelOptions); + /** + * Loads the LLModel. + * @return {boolean} true if the model was loaded successfully, false otherwise. + */ + load(): boolean; + + /** + * Initiate a GPU by a string identifier. See LoadModelOptions.device for more information + * @param {string} device 'amd' | 'nvidia' | 'intel' | 'gpu' | gpu name. + * @return {boolean} true if the GPU was initialized successfully, false otherwise. + */ + initGpu(device: string): boolean; /** undefined or user supplied */ - type(): string | undefined; + getType(): string | undefined; /** The name of the model. */ - name(): string; + getName(): string; /** * Get the size of the internal state of the model. * NOTE: This state data is specific to the type of model you have created. * @return the size in bytes of the internal state of the model */ - stateSize(): number; + getStateSize(): number; /** * Get the number of threads used for model inference. * The default is the number of physical cores your computer has. * @returns The number of threads used for model inference. */ - threadCount(): number; + getThreadCount(): number; /** * Set the number of threads used for model inference. @@ -375,14 +404,6 @@ declare class LLModel { */ getLibraryPath(): string; - /** - * Initiate a GPU by a string identifier. - * @param {number} memory_required Should be in the range size_t or will throw - * @param {string} device_name 'amd' | 'nvidia' | 'intel' | 'gpu' | gpu name. - * read LoadModelOptions.device for more information - */ - initGpuByString(memory_required: number, device_name: string): boolean; - /** * From C documentation * @returns True if a GPU device is successfully initialized, false otherwise. @@ -391,11 +412,10 @@ declare class LLModel { /** * GPUs that are usable for this LLModel - * @param {number} nCtx Maximum size of context window - * @throws if hasGpuDevice returns false (i think) - * @returns + * @throws if gpu device list is not available + * @returns an array of GpuDevice objects */ - listGpu(nCtx: number): GpuDevice[]; + getGpuDevices(): GpuDevice[]; /** * delete and cleanup the native model @@ -414,6 +434,7 @@ interface GpuDevice { heapSize: number; name: string; vendor: string; + backend: string; } /** @@ -443,13 +464,15 @@ interface LoadModelOptions { /** * The processing unit on which the model will run. It can be set to * - "cpu": Model will run on the central processing unit. - * - "gpu": Model will run on the best available graphics processing unit, irrespective of its vendor. - * - "amd", "nvidia", "intel": Model will run on the best available GPU from the specified vendor. + * - "kompute": Model will run using the kompute (vulkan) gpu backend + * - "cuda": Model will run using the cuda gpu backend + * - "gpu": Use Metal on ARM64 macOS, otherwise the same as "kompute" + * - "amd", "nvidia": Use the best GPU provided by the Kompute backend from this vendor. * - "gpu name": Model will run on the GPU that matches the name if it's available. * Note: If a GPU device lacks sufficient RAM to accommodate the model, an error will be thrown, and the GPT4All * instance will be rendered invalid. It's advised to ensure the device has enough memory before initiating the * model. - * @default "cpu" + * @default Metal on ARM64 macOS, "cpu" otherwise. */ device?: string; /** @@ -458,10 +481,16 @@ interface LoadModelOptions { */ nCtx?: number; /** - * Number of gpu layers needed + * Number of GPU layers to use (Vulkan) * @default 100 + * @alias ngl */ + nGpuLayers?: number; ngl?: number; + /** + * Number of CPU threads used by GPT4All. Default is None, then the number of threads are determined automatically. + */ + nThreads?: number; } interface InferenceModelOptions extends LoadModelOptions { @@ -507,15 +536,33 @@ interface CompletionProvider { ): Promise; } +interface CompletionTokens { + /** The token ids. */ + tokenIds: number[]; + /** The token text. May be an empty string. */ + text: string; +} + /** * Options for creating a completion. */ -interface CompletionOptions extends LLModelInferenceOptions { +interface CompletionOptions extends Partial { /** * Indicates if verbose logging is enabled. * @default false */ verbose?: boolean; + + /** Called every time new tokens can be decoded to text. + * @param {CompletionTokens} tokens The token ids and decoded text. + * @returns {boolean | undefined} Whether to continue generating tokens. + * */ + onResponseTokens?: (tokens: CompletionTokens) => boolean | void; + /** Callback for prompt tokens, called for each input token in the prompt. + * @param {number} tokenId The token id. + * @returns {boolean | undefined} Whether to continue ingesting the prompt. + * */ + onPromptToken?: (tokenId: number) => boolean | void; } /** @@ -639,13 +686,6 @@ interface LLModelPromptContext { */ promptTemplate?: string; - /** The context window size. Do not use, it has no effect. See loadModel options. - * THIS IS DEPRECATED!!! - * Use loadModel's nCtx option instead. - * @default 2048 - */ - nCtx: number; - /** The top-k logits to sample from. * Top-K sampling selects the next token only from the top K most likely tokens predicted by the model. * It helps reduce the risk of generating low-probability or nonsensical tokens, but it may also limit diff --git a/gpt4all-bindings/typescript/src/gpt4all.js b/gpt4all-bindings/typescript/src/gpt4all.js index aab01d91..5109ce87 100644 --- a/gpt4all-bindings/typescript/src/gpt4all.js +++ b/gpt4all-bindings/typescript/src/gpt4all.js @@ -37,9 +37,8 @@ async function loadModel(modelName, options = {}) { type: "inference", allowDownload: true, verbose: false, - device: "cpu", nCtx: 2048, - ngl: 100, + nGpuLayers: options.ngl ?? 100, ...options, }; @@ -54,27 +53,77 @@ async function loadModel(modelName, options = {}) { typeof loadOptions.librariesPath === "string", "Libraries path should be a string" ); - const existingPaths = loadOptions.librariesPath + const existingLibPaths = loadOptions.librariesPath .split(";") .filter(existsSync) .join(";"); - + const llmOptions = { - model_name: appendBinSuffixIfMissing(modelName), - model_path: loadOptions.modelPath, - library_path: existingPaths, - device: loadOptions.device, + modelFile: modelConfig.path, + librariesPath: existingLibPaths, nCtx: loadOptions.nCtx, - ngl: loadOptions.ngl, + nGpuLayers: loadOptions.nGpuLayers, }; + let initDevice; + if (process.platform === "darwin") { + if (!loadOptions.device) { + llmOptions.backend = "auto"; // 'auto' is effectively 'metal' due to currently non-functional fallback + } else if (loadOptions.device === "cpu") { + llmOptions.backend = "cpu"; + } else { + if (process.arch !== "arm64" || loadOptions.device !== "gpu") { + throw new Error( + `Unknown device for this platform: ${loadOptions.device}` + ); + } + llmOptions.backend = "metal"; + } + } else { + // default to kompute. use cpu for arm64 because we currently dont build kompute runtimes for arm64 + llmOptions.backend = process.arch === "arm64" ? "cpu" : "kompute"; + if (!loadOptions.device || loadOptions.device === "cpu") { + // use the default backend + } else if ( + loadOptions.device === "cuda" || + loadOptions.device === "kompute" + ) { + llmOptions.backend = loadOptions.device; + initDevice = "gpu"; + } else if (loadOptions.device.startsWith("cuda:")) { + llmOptions.backend = "cuda"; + initDevice = loadOptions.device.replace(/^cuda:/, ""); + } else { + initDevice = loadOptions.device.replace(/^kompute:/, ""); + } + } + if (loadOptions.verbose) { console.debug("Creating LLModel:", { + initDevice, llmOptions, modelConfig, }); } const llmodel = new LLModel(llmOptions); + if (initDevice) { + const gpuInitSuccess = llmodel.initGpu(initDevice); + if (!gpuInitSuccess) { + const availableDevices = llmodel.getGpuDevices(); + const deviceNames = availableDevices + .map((device) => device.name) + .join(", "); + console.warn( + `Failed to initialize GPU device "${initDevice}" - Available devices: ${deviceNames}` + ); + } + } + llmodel.load(); + + if (loadOptions.nThreads) { + llmodel.setThreadCount(loadOptions.nThreads); + } + if (loadOptions.type === "embedding") { return new EmbeddingModel(llmodel, modelConfig); } else if (loadOptions.type === "inference") { @@ -84,7 +133,7 @@ async function loadModel(modelName, options = {}) { } } -function createEmbedding(model, text, options={}) { +function createEmbedding(model, text, options = {}) { let { dimensionality = undefined, longTextMode = "mean", @@ -138,10 +187,7 @@ async function createCompletion( ...options, }; - const result = await provider.generate( - input, - completionOptions, - ); + const result = await provider.generate(input, completionOptions); return { model: provider.modelName, @@ -174,10 +220,10 @@ function createCompletionStream( const completionPromise = createCompletion(provider, input, { ...options, - onResponseToken: (tokenId, token) => { - completionStream.push(token); - if (options.onResponseToken) { - return options.onResponseToken(tokenId, token); + onResponseTokens: (tokens) => { + completionStream.push(tokens.text); + if (options.onResponseTokens) { + return options.onResponseTokens(tokens); } }, }).then((result) => { diff --git a/gpt4all-bindings/typescript/src/models.js b/gpt4all-bindings/typescript/src/models.js index 2c516ccb..921bce6a 100644 --- a/gpt4all-bindings/typescript/src/models.js +++ b/gpt4all-bindings/typescript/src/models.js @@ -11,7 +11,7 @@ class InferenceModel { constructor(llmodel, config) { this.llm = llmodel; this.config = config; - this.modelName = this.llm.name(); + this.modelName = this.llm.getName(); } async createChatSession(options) { @@ -89,6 +89,25 @@ class InferenceModel { } let tokensGenerated = 0; + + const decoder = new TokenDecoder((tokenIds, text) => { + let continueGeneration = true; + tokensGenerated += tokenIds.length; + + if (options.onResponseTokens) { + // catch here because if errors bubble through cpp they will loose stacktraces + try { + // don't cancel the generation unless user explicitly returns false + continueGeneration = + options.onResponseTokens({ tokenIds, text }) !== false; + } catch (err) { + console.error("Error in onResponseToken callback", err); + continueGeneration = false; + } + } + return continueGeneration; + + }); const result = await this.llm.infer(prompt, { ...promptContext, @@ -97,7 +116,7 @@ class InferenceModel { let continueIngestion = true; tokensIngested++; if (options.onPromptToken) { - // catch errors because if they go through cpp they will loose stacktraces + // catch here because if errors bubble through cpp they will looe stacktraces try { // don't cancel ingestion unless user explicitly returns false continueIngestion = @@ -109,20 +128,8 @@ class InferenceModel { } return continueIngestion; }, - onResponseToken: (tokenId, token) => { - let continueGeneration = true; - tokensGenerated++; - if (options.onResponseToken) { - try { - // don't cancel the generation unless user explicitly returns false - continueGeneration = - options.onResponseToken(tokenId, token) !== false; - } catch (err) { - console.error("Error in onResponseToken callback", err); - continueGeneration = false; - } - } - return continueGeneration; + onResponseToken: (tokenId, bytes) => { + return decoder.decode(tokenId, bytes); }, }); @@ -141,6 +148,63 @@ class InferenceModel { } } +// see https://github.com/nomic-ai/gpt4all/pull/1281 +class TokenDecoder { + + constructor(callback) { + this.callback = callback; + this.buffer = []; + this.tokenIds = []; + this.buffExpectingContBytes = 0; + this.textDecoder = new TextDecoder(); + } + + decode(tokenId, bytes) { + const decoded = []; + this.tokenIds.push(tokenId); + + for (let i = 0; i < bytes.length; i++) { + const byte = bytes[i]; + const bits = byte.toString(2).padStart(8, '0'); + const highOnes = bits.split('0')[0]; + + if (highOnes.length === 1) { + // Continuation byte + this.buffer.push(byte); + this.buffExpectingContBytes -= 1; + } else { + // Beginning of a byte sequence + if (this.buffer.length > 0) { + decoded.push(this._decodeBuffer()); + this.buffer = []; + } + + this.buffer.push(byte); + this.buffExpectingContBytes = Math.max(0, highOnes.length - 1); + } + + if (this.buffExpectingContBytes <= 0) { + // Received the whole sequence or an out-of-place continuation byte + decoded.push(this._decodeBuffer()); + this.buffer = []; + this.buffExpectingContBytes = 0; + } + } + + if (decoded.length === 0 && this.buffExpectingContBytes > 0) { + // Wait for more continuation bytes + return true; + } + const tokenIds = this.tokenIds; + this.tokenIds = []; + return this.callback(tokenIds, decoded.join('')); + } + + _decodeBuffer() { + return this.textDecoder.decode(new Uint8Array(this.buffer)); + } +} + class EmbeddingModel { llm; config; @@ -160,6 +224,7 @@ class EmbeddingModel { } module.exports = { + TokenDecoder, InferenceModel, EmbeddingModel, }; diff --git a/gpt4all-bindings/typescript/test/bindings.test.js b/gpt4all-bindings/typescript/test/bindings.test.js new file mode 100644 index 00000000..b06c22ca --- /dev/null +++ b/gpt4all-bindings/typescript/test/bindings.test.js @@ -0,0 +1,73 @@ +const { loadModel } = require("../src/gpt4all.js"); + +// these tests require an internet connection / a real model +const testModel = "Phi-3-mini-4k-instruct.Q4_0.gguf"; + +describe("llmodel", () => { + let model; + + test("load on cpu", async () => { + model = await loadModel(testModel, { + device: "cpu", + }); + }); + + test("getter working", async () => { + const stateSize = model.llm.getStateSize(); + expect(stateSize).toBeGreaterThan(0); + const name = model.llm.getName(); + expect(name).toBe(testModel); + const type = model.llm.getType(); + expect(type).toBeUndefined(); + const devices = model.llm.getGpuDevices(); + expect(Array.isArray(devices)).toBe(true); + const gpuEnabled = model.llm.hasGpuDevice(); + expect(gpuEnabled).toBe(false); + const requiredMem = model.llm.getRequiredMemory(); + expect(typeof requiredMem).toBe('number'); + const threadCount = model.llm.getThreadCount(); + expect(threadCount).toBe(4); + }); + + test("setting thread count", () => { + model.llm.setThreadCount(5); + expect(model.llm.getThreadCount()).toBe(5); + }); + + test("cpu inference", async () => { + const res = await model.llm.infer("what is the capital of france?", { + temp: 0, + promptTemplate: model.config.promptTemplate, + nPredict: 10, + onResponseToken: () => { + return true; + }, + }); + expect(res.text).toMatch(/paris/i); + }, 10000); + + test("dispose and load model on gpu", async () => { + model.dispose(); + model = await loadModel(testModel, { + device: "gpu", + }); + const gpuEnabled = model.llm.hasGpuDevice(); + expect(gpuEnabled).toBe(true); + }); + + test("gpu inference", async () => { + const res = await model.llm.infer("what is the capital of france?", { + temp: 0, + promptTemplate: model.config.promptTemplate, + nPredict: 10, + onResponseToken: () => { + return true; + }, + }); + expect(res.text).toMatch(/paris/i); + }, 10000); + + afterAll(() => { + model.dispose(); + }); +}); diff --git a/gpt4all-bindings/typescript/test/gpt4all.test.js b/gpt4all-bindings/typescript/test/ci.test.js similarity index 97% rename from gpt4all-bindings/typescript/test/gpt4all.test.js rename to gpt4all-bindings/typescript/test/ci.test.js index 6d987a3f..0026faea 100644 --- a/gpt4all-bindings/typescript/test/gpt4all.test.js +++ b/gpt4all-bindings/typescript/test/ci.test.js @@ -2,7 +2,6 @@ const path = require("node:path"); const os = require("node:os"); const fsp = require("node:fs/promises"); const { existsSync } = require('node:fs'); -const { LLModel } = require("node-gyp-build")(path.resolve(__dirname, "..")); const { listModels, downloadModel, @@ -13,11 +12,8 @@ const { DEFAULT_LIBRARIES_DIRECTORY, DEFAULT_MODEL_LIST_URL, } = require("../src/config.js"); -const { - loadModel, - createPrompt, - createCompletion, -} = require("../src/gpt4all.js"); + +// these tests do not require an internet connection or an actual model describe("config", () => { test("default paths constants are available and correct", () => { diff --git a/gpt4all-bindings/typescript/yarn.lock b/gpt4all-bindings/typescript/yarn.lock index efdef2eb..03e00402 100644 --- a/gpt4all-bindings/typescript/yarn.lock +++ b/gpt4all-bindings/typescript/yarn.lock @@ -6,204 +6,204 @@ __metadata: cacheKey: 8 "@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/code-frame@npm:7.24.6" dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + "@babel/highlight": ^7.24.6 + picocolors: ^1.0.0 + checksum: 0904514ea7079a9590c1c546cd20b9c1beab9649873f2a0703429860775c1713a8dfb2daacd781a0210bb3930c656c1c436013fb20eaa3644880fb3a2b34541d languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 +"@babel/compat-data@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/compat-data@npm:7.24.6" + checksum: 92233c708f7c349923c1f9a2b3c9354875a951ac3afaca0a2c159de1c808f6799ad4433652b90870015281aa466ec6e9aa8922e755cd7ac1413a3a5782cd685d languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.10": - version: 7.23.6 - resolution: "@babel/core@npm:7.23.6" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.10, @babel/core@npm:^7.23.9": + version: 7.24.6 + resolution: "@babel/core@npm:7.24.6" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-compilation-targets": ^7.23.6 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.23.6 - "@babel/parser": ^7.23.6 - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.6 - "@babel/types": ^7.23.6 + "@babel/code-frame": ^7.24.6 + "@babel/generator": ^7.24.6 + "@babel/helper-compilation-targets": ^7.24.6 + "@babel/helper-module-transforms": ^7.24.6 + "@babel/helpers": ^7.24.6 + "@babel/parser": ^7.24.6 + "@babel/template": ^7.24.6 + "@babel/traverse": ^7.24.6 + "@babel/types": ^7.24.6 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 4bddd1b80394a64b2ee33eeb216e8a2a49ad3d74f0ca9ba678c84a37f4502b2540662d72530d78228a2a349fda837fa852eea5cd3ae28465d1188acc6055868e + checksum: f8af23de19865818c27c2fbe0d87b0834b118386da5ee09b20ae0cf7a5540065054ef2b70f377d025d9feee765db18df39900e4c18e905988b94b54a104c738e languageName: node linkType: hard -"@babel/generator@npm:^7.18.10, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": - version: 7.23.6 - resolution: "@babel/generator@npm:7.23.6" +"@babel/generator@npm:^7.18.10, @babel/generator@npm:^7.24.6, @babel/generator@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/generator@npm:7.24.6" dependencies: - "@babel/types": ^7.23.6 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 + "@babel/types": ^7.24.6 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^2.5.1 - checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c + checksum: a477e03129106908f464b195c4f138052d732cfca47506b127edbed6a496371bae821662a8a4e51e6d144ac236a5d05dc2da0e145e29bb8e19d3e7c480ac00fe languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-compilation-targets@npm:7.24.6" dependencies: - "@babel/compat-data": ^7.23.5 - "@babel/helper-validator-option": ^7.23.5 + "@babel/compat-data": ^7.24.6 + "@babel/helper-validator-option": ^7.24.6 browserslist: ^4.22.2 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590 + checksum: c66bf86387fbeefc617db9510de553880ed33dc91308421ee36a7b489d0e8c8eb615e0f467a9ec886eada7c05b03e421e55b2a724ff302402fdd4e0c0b2b0443 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 +"@babel/helper-environment-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-environment-visitor@npm:7.24.6" + checksum: 9c2b3f1ee7ba46b61b0482efab6d37f5c76f0ea4e9d9775df44a89644729c3a50101040a0233543ec6c3f416d8e548d337f310ff3e164f847945507428ee39e5 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" +"@babel/helper-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-function-name@npm:7.24.6" dependencies: - "@babel/template": ^7.22.15 - "@babel/types": ^7.23.0 - checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 + "@babel/template": ^7.24.6 + "@babel/types": ^7.24.6 + checksum: d7a2198b6bf2cae9767d5b0d6cb5d3cbd9a07640ad4b6798abb7d7242e8f32765a94fd98ab1a039d7607f0ddbeaf9ddc822dd536b856e499f7082899c6f455f0 languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" +"@babel/helper-hoist-variables@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-hoist-variables@npm:7.24.6" dependencies: - "@babel/types": ^7.22.5 - checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + "@babel/types": ^7.24.6 + checksum: 4819b574393a5214aff6ae02a6e5250ace2564f8bcdb28d580ffec57bbb2092425e8f39563d75cfa268940a01fd425bad503c0b92717c12426f15cf6847855d3 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-imports@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-imports@npm:7.24.6" dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + "@babel/types": ^7.24.6 + checksum: 3484420c45529aac34cb14111a03c78edab84e5c4419634affe61176d832af82963395ea319f67c7235fd4106d9052a9f3ce012d2d57d56644572d3f7d495231 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-transforms@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-environment-visitor": ^7.24.6 + "@babel/helper-module-imports": ^7.24.6 + "@babel/helper-simple-access": ^7.24.6 + "@babel/helper-split-export-declaration": ^7.24.6 + "@babel/helper-validator-identifier": ^7.24.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + checksum: 904e2a0701eb1eeb84b0d0df5dacdc40291307025b7e3a9a3c6f3eee912c893524f9dc7f5624225a5783a258dec2eb2489a9638bf5f3de26ebfcbcac1b5cc2fc languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.24.6 + resolution: "@babel/helper-plugin-utils@npm:7.24.6" + checksum: d22bb82c75afed0d8c37784876fd6deb9db06ef21526db909ef7986a6050b50beb60a7823c08a1bb7c57c668af2e086d8086e88b6f9140b0d9ade07472f7c748 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" +"@babel/helper-simple-access@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-simple-access@npm:7.24.6" dependencies: - "@babel/types": ^7.22.5 - checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + "@babel/types": ^7.24.6 + checksum: 929162e887efc1bcadd4e141ed7782b45fccc6873d5023a744fee9c94d16d3a13dbfb66eb259181613a36c2d35f7d2088ee37e76014223d3b9b6c9ef1094e4b6 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" +"@babel/helper-split-export-declaration@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-split-export-declaration@npm:7.24.6" dependencies: - "@babel/types": ^7.22.5 - checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + "@babel/types": ^7.24.6 + checksum: b546fd7e186b4aa69f96e041b6c4c9154115a2579a297b86773719dbed53b938cfc3f6b4996ae410296bb8aa30ea031f9ff31f1255aa25c3af75026c5b7c4059 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 +"@babel/helper-string-parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-string-parser@npm:7.24.6" + checksum: c8c614a663928b67c5c65cfea958ed20c858fa2af8c957d301bd852c0ab98adae0861f081fd8f5add16539d9393bd4b10b8c86a97a9d7304f70a6a67b2c2ff07 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc +"@babel/helper-validator-identifier@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-identifier@npm:7.24.6" + checksum: a265a6fba570332dca63ad7e749b867d29b52da2573dc62bf19b5b8c5387d4f4296af33da9da7c71ffe3d3abecd743418278f56d38b057ad4b53f09b937fe113 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e +"@babel/helper-validator-option@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-option@npm:7.24.6" + checksum: 5defb2da74e1cac9497016f4e41698aeed75ec7a5e9dc07e777cdb67ef73cd2e27bd2bf8a3ab8d37e0b93a6a45524a9728f03e263afdef452436cf74794bde87 languageName: node linkType: hard -"@babel/helpers@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helpers@npm:7.23.6" +"@babel/helpers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helpers@npm:7.24.6" dependencies: - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.6 - "@babel/types": ^7.23.6 - checksum: c5ba62497e1d717161d107c4b3de727565c68b6b9f50f59d6298e613afeca8895799b227c256e06d362e565aec34e26fb5c675b9c3d25055c52b945a21c21e21 + "@babel/template": ^7.24.6 + "@babel/types": ^7.24.6 + checksum: c936058fd5caf7173e157f790fdbe9535237a7b8bc2c3d084bdf16467a034f73bd5d731deb514aa84e356c72de1cc93500a376f9d481f5c1e335f5a563426e58 languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/highlight@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/highlight@npm:7.24.6" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-validator-identifier": ^7.24.6 chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + picocolors: ^1.0.0 + checksum: 2f8f7f060eeccc3ddf03ba12c263995de0e6c0dd31ad224bed58d983b3bb08fe34dfc01440396266456a4cad83226c38ad6814805bc5d0c774a056cac9182eca languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.10.5, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.11, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5, @babel/parser@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/parser@npm:7.23.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.10.5, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.11, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/parser@npm:7.24.6" bin: parser: ./bin/babel-parser.js - checksum: 140801c43731a6c41fd193f5c02bc71fd647a0360ca616b23d2db8be4b9739b9f951a03fc7c2db4f9b9214f4b27c1074db0f18bc3fa653783082d5af7c8860d5 + checksum: ca3773f5b2a4a065b827990ca0c867e670f01d7a7d7278838bd64d583e68ed52356b5a613303c5aa736d20f024728fec80fc5845fed1eb751ab5f1bfbdc1dd3c languageName: node linkType: hard @@ -263,13 +263,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" + version: 7.24.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e + checksum: e288681cab57d059b0b2e132040eb5e21a158c40229c600e77cb0289ba5d32a2102af94e43390d270e0ddd968685e9de8d10dab0291c53b84e2219a7bc4cdb54 languageName: node linkType: hard @@ -351,64 +351,53 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" + version: 7.24.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 + checksum: 2fb15b246f7a2334ae5ebbc4c263dc2a66464e65074cbe82204acb42c097601c5ae5933d4c4716cad0a64b41aa999080eeabddbabadd163232d9e2631749f596 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" +"@babel/template@npm:^7.24.6, @babel/template@npm:^7.3.3": + version: 7.24.6 + resolution: "@babel/template@npm:7.24.6" dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd + "@babel/code-frame": ^7.24.6 + "@babel/parser": ^7.24.6 + "@babel/types": ^7.24.6 + checksum: 8e532ebdd5e1398c030af16881061bad43b9c3b758a193a6289dc5be5988cc543f7aa56a360e15b755258c0b3d387f3cd78b505835b040a2729d0261d0ff1711 languageName: node linkType: hard -"@babel/traverse@npm:^7.10.5, @babel/traverse@npm:^7.18.11, @babel/traverse@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/traverse@npm:7.23.6" +"@babel/traverse@npm:^7.10.5, @babel/traverse@npm:^7.18.11, @babel/traverse@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/traverse@npm:7.24.6" dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.6 - "@babel/types": ^7.23.6 + "@babel/code-frame": ^7.24.6 + "@babel/generator": ^7.24.6 + "@babel/helper-environment-visitor": ^7.24.6 + "@babel/helper-function-name": ^7.24.6 + "@babel/helper-hoist-variables": ^7.24.6 + "@babel/helper-split-export-declaration": ^7.24.6 + "@babel/parser": ^7.24.6 + "@babel/types": ^7.24.6 debug: ^4.3.1 globals: ^11.1.0 - checksum: 48f2eac0e86b6cb60dab13a5ea6a26ba45c450262fccdffc334c01089e75935f7546be195e260e97f6e43cea419862eda095018531a2718fef8189153d479f88 + checksum: 654151b2ab5c9d5031c274cf197f707b8a27a1c70b38fcb8d1bf5ad2d8848f38675ab9c2a86aeb804657c5817124ac5be4cb6f5defa8ef7ac40596e1220697aa languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.3.3": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.10, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.24.6 + resolution: "@babel/types@npm:7.24.6" dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-string-parser": ^7.24.6 + "@babel/helper-validator-identifier": ^7.24.6 to-fast-properties: ^2.0.0 - checksum: 68187dbec0d637f79bc96263ac95ec8b06d424396678e7e225492be866414ce28ebc918a75354d4c28659be6efe30020b4f0f6df81cc418a2d30645b690a8de0 - languageName: node - linkType: hard - -"@babel/types@npm:^7.8.3": - version: 7.23.9 - resolution: "@babel/types@npm:7.23.9" - dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 0a9b008e9bfc89beb8c185e620fa0f8ed6c771f1e1b2e01e1596870969096fec7793898a1d64a035176abf1dd13e2668ee30bf699f2d92c210a8128f4b151e65 + checksum: 58d798dd37e6b14f818730b4536795d68d28ccd5dc2a105fd977104789b20602be11d92cdd47cdbd48d8cce3cc0e14c7773813357ad9d5d6e94d70587eb45bf5 languageName: node linkType: hard @@ -453,7 +442,7 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2": +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 @@ -690,28 +679,28 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: - "@jridgewell/set-array": ^1.0.1 + "@jridgewell/set-array": ^1.2.1 "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 languageName: node linkType: hard "@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard @@ -722,26 +711,26 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 languageName: node linkType: hard "@npmcli/agent@npm:^2.0.0": - version: 2.2.0 - resolution: "@npmcli/agent@npm:2.2.0" + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" dependencies: agent-base: ^7.1.0 http-proxy-agent: ^7.0.0 https-proxy-agent: ^7.0.1 lru-cache: ^10.0.1 - socks-proxy-agent: ^8.0.1 - checksum: 3b25312edbdfaa4089af28e2d423b6f19838b945e47765b0c8174c1395c79d43c3ad6d23cb364b43f59fd3acb02c93e3b493f72ddbe3dfea04c86843a7311fc4 + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 languageName: node linkType: hard @@ -756,11 +745,11 @@ __metadata: linkType: hard "@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" dependencies: semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 languageName: node linkType: hard @@ -789,11 +778,11 @@ __metadata: linkType: hard "@sinonjs/commons@npm:^3.0.0": - version: 3.0.0 - resolution: "@sinonjs/commons@npm:3.0.0" + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" dependencies: type-detect: 4.0.8 - checksum: b4b5b73d4df4560fb8c0c7b38c7ad4aeabedd362f3373859d804c988c725889cde33550e4bcc7cd316a30f5152a2d1d43db71b6d0c38f5feef71fd8d016763f8 + checksum: a7c3e7cc612352f4004873747d9d8b2d4d90b13a6d483f685598c945a70e734e255f1ca5dc49702515533c403b32725defff148177453b3f3915bcb60e9d4601 languageName: node linkType: hard @@ -846,11 +835,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.4 - resolution: "@types/babel__traverse@npm:7.20.4" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": ^7.20.7 - checksum: f044ba80e00d07e46ee917c44f96cfc268fcf6d3871f7dfb8db8d3c6dab1508302f3e6bc508352a4a3ae627d2522e3fc500fa55907e0410a08e2e0902a8f3576 + checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c languageName: node linkType: hard @@ -880,11 +869,11 @@ __metadata: linkType: hard "@types/hast@npm:^2.0.0": - version: 2.3.9 - resolution: "@types/hast@npm:2.3.9" + version: 2.3.10 + resolution: "@types/hast@npm:2.3.10" dependencies: "@types/unist": ^2 - checksum: 32a742021a973b1e23399f09a21325fda89bf55486068ef7c6364f5054b991cc8ab007f1134cc9d6c7030b6ed60633d70f7401dffb3dec8d10c997330d458a3f + checksum: 41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 languageName: node linkType: hard @@ -929,12 +918,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^20.1.5": - version: 20.10.5 - resolution: "@types/node@npm:20.10.5" +"@types/node@npm:*, @types/node@npm:^20.12.12": + version: 20.12.12 + resolution: "@types/node@npm:20.12.12" dependencies: undici-types: ~5.26.4 - checksum: e216b679f545a8356960ce985a0e53c3a58fff0eacd855e180b9e223b8db2b5bd07b744a002b8c1f0c37f9194648ab4578533b5c12df2ec10cc02f61d20948d2 + checksum: 5373983874b9af7c216e7ca5d26b32a8d9829c703a69f1e66f2113598b5be8582c0e009ca97369f1ec9a6282b3f92812208d06eb1e9fc3bd9b939b022303d042 languageName: node linkType: hard @@ -989,73 +978,60 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-core@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/compiler-core@npm:3.3.13" +"@vue/compiler-core@npm:3.4.27": + version: 3.4.27 + resolution: "@vue/compiler-core@npm:3.4.27" dependencies: - "@babel/parser": ^7.23.5 - "@vue/shared": 3.3.13 + "@babel/parser": ^7.24.4 + "@vue/shared": 3.4.27 + entities: ^4.5.0 estree-walker: ^2.0.2 - source-map-js: ^1.0.2 - checksum: e758146d7805199b60166a3bc8f6f8a4fa8bedf814f5c33a77776fc46585e14f36c11c2f96fa54c8b895e3115716db613c557e705ccadd306c424a7d39585bf8 + source-map-js: ^1.2.0 + checksum: 7e32dd5d6046be56226b8567ba425df48d67d652bb2ca30ca674955dd4ded546cb9bfefe6a3fca6b2e3294b3fcc2025311982293e9f703b18aded642833987f4 languageName: node linkType: hard -"@vue/compiler-dom@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/compiler-dom@npm:3.3.13" +"@vue/compiler-dom@npm:3.4.27": + version: 3.4.27 + resolution: "@vue/compiler-dom@npm:3.4.27" dependencies: - "@vue/compiler-core": 3.3.13 - "@vue/shared": 3.3.13 - checksum: 8165ae90d827ba7b0d89382bc404fc52edf40c2fa8f4a54fb4bdd4ed730f33283ccf359795823f6a3c2f31d538a10b828f38dd32d512ebdcc329ebd78ad7a325 + "@vue/compiler-core": 3.4.27 + "@vue/shared": 3.4.27 + checksum: 12fe6bb552fdcc91ec21279a91b1693a98851b0319f5a8b3895a921d648cdcbca98000192aba91f4f63379d2601400cb5ad1b7dd897e8d815621836ff307820a languageName: node linkType: hard "@vue/compiler-sfc@npm:^3.2.37": - version: 3.3.13 - resolution: "@vue/compiler-sfc@npm:3.3.13" + version: 3.4.27 + resolution: "@vue/compiler-sfc@npm:3.4.27" dependencies: - "@babel/parser": ^7.23.5 - "@vue/compiler-core": 3.3.13 - "@vue/compiler-dom": 3.3.13 - "@vue/compiler-ssr": 3.3.13 - "@vue/reactivity-transform": 3.3.13 - "@vue/shared": 3.3.13 + "@babel/parser": ^7.24.4 + "@vue/compiler-core": 3.4.27 + "@vue/compiler-dom": 3.4.27 + "@vue/compiler-ssr": 3.4.27 + "@vue/shared": 3.4.27 estree-walker: ^2.0.2 - magic-string: ^0.30.5 - postcss: ^8.4.32 - source-map-js: ^1.0.2 - checksum: f78a9a01472a8effed49f524729c762588e38bcaed50a677e099fe1ddc66e3a9fb56a2f1f85020010a44e385e9ef01872d41b540eded28a52c054b887b77b488 + magic-string: ^0.30.10 + postcss: ^8.4.38 + source-map-js: ^1.2.0 + checksum: 9f8a05eb715a4752a51a2715c14e0f5b6175ce967b8851438f4ea3ba392b74edda227a067dc1e85625340f653f43bf69fbb80683a7a6c97c4d7eb4fcd4888013 languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/compiler-ssr@npm:3.3.13" +"@vue/compiler-ssr@npm:3.4.27": + version: 3.4.27 + resolution: "@vue/compiler-ssr@npm:3.4.27" dependencies: - "@vue/compiler-dom": 3.3.13 - "@vue/shared": 3.3.13 - checksum: 02f3999467a6290af8a77c112462b23faf34399e55f7ef51b0b9985d75363a1ffcfb915201cb8a5890d50ede75af52356e32d9b950f1be16532842e670fd6b60 + "@vue/compiler-dom": 3.4.27 + "@vue/shared": 3.4.27 + checksum: a9a3a2fd2700dcbe7e3ec27c8c41157ca1bca7ca492b15742b12ff2e7276fa9f0940af369686d6d031c08e6a0bb6b9fbef714d5f10333d6cf22c1b739fb7ce64 languageName: node linkType: hard -"@vue/reactivity-transform@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/reactivity-transform@npm:3.3.13" - dependencies: - "@babel/parser": ^7.23.5 - "@vue/compiler-core": 3.3.13 - "@vue/shared": 3.3.13 - estree-walker: ^2.0.2 - magic-string: ^0.30.5 - checksum: 6abe723dd33302635377acffd9a29121e48dea3dba720eefb26481fc78bfd5e4070674a5871c72c27905a4e01b3e8c27b73060c828a27f1e623ce2913f9a3af3 - languageName: node - linkType: hard - -"@vue/shared@npm:3.3.13": - version: 3.3.13 - resolution: "@vue/shared@npm:3.3.13" - checksum: 3f57cd2f4611962aa1a4e9a5926f160f200f1769015240ad02df0245fe25bd2303b88957f35a13fbb0bf8d3e5a649fd41f44f347a0cf29e84e8f41d70123f7bf +"@vue/shared@npm:3.4.27": + version: 3.4.27 + resolution: "@vue/shared@npm:3.4.27" + checksum: 1fac455e7d6b627ab38d1f6b9276671449f3a7ce2eef20bcdd5f21ea6906fc7154f0ab7e2a3af7719e0cd6c4230d44cbb4543a446b4a7f081970e0efbc2cba78 languageName: node linkType: hard @@ -1082,12 +1058,12 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": - version: 7.1.0 - resolution: "agent-base@npm:7.1.0" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" dependencies: debug: ^4.3.4 - checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f + checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 languageName: node linkType: hard @@ -1306,9 +1282,9 @@ __metadata: linkType: hard "binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 languageName: node linkType: hard @@ -1342,26 +1318,26 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 languageName: node linkType: hard "browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" + version: 4.23.0 + resolution: "browserslist@npm:4.23.0" dependencies: - caniuse-lite: ^1.0.30001565 - electron-to-chromium: ^1.4.601 + caniuse-lite: ^1.0.30001587 + electron-to-chromium: ^1.4.668 node-releases: ^2.0.14 update-browserslist-db: ^1.0.13 bin: browserslist: cli.js - checksum: 33ddfcd9145220099a7a1ac533cecfe5b7548ffeb29b313e1b57be6459000a1f8fa67e781cf4abee97268ac594d44134fcc4a6b2b4750ceddc9796e3a22076d9 + checksum: 436f49e796782ca751ebab7edc010cfc9c29f68536f387666cd70ea22f7105563f04dd62c6ff89cb24cc3254d17cba385f979eeeb3484d43e012412ff7e75def languageName: node linkType: hard @@ -1418,8 +1394,8 @@ __metadata: linkType: hard "cacache@npm:^18.0.0": - version: 18.0.2 - resolution: "cacache@npm:18.0.2" + version: 18.0.3 + resolution: "cacache@npm:18.0.3" dependencies: "@npmcli/fs": ^3.1.0 fs-minipass: ^3.0.0 @@ -1433,7 +1409,7 @@ __metadata: ssri: ^10.0.0 tar: ^6.1.11 unique-filename: ^3.0.0 - checksum: 0250df80e1ad0c828c956744850c5f742c24244e9deb5b7dc81bca90f8c10e011e132ecc58b64497cc1cad9a98968676147fb6575f4f94722f7619757b17a11b + checksum: b717fd9b36e9c3279bfde4545c3a8f6d5a539b084ee26a9504d48f83694beb724057d26e090b97540f9cc62bea18b9f6cf671c50e18fb7dac60eda9db691714f languageName: node linkType: hard @@ -1458,10 +1434,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001572 - resolution: "caniuse-lite@npm:1.0.30001572" - checksum: 7d017a99a38e29ccee4ed3fc0ef1eb90cf082fcd3a7909c5c536c4ba1d55c5b26ecc1e4ad82c1caa6bfadce526764b354608710c9b61a75bdc7ce8ca15c5fcf2 +"caniuse-lite@npm:^1.0.30001587": + version: 1.0.30001621 + resolution: "caniuse-lite@npm:1.0.30001621" + checksum: 0afb65bbf558faea769c16e831fbbd5600c684c0f6bb4ffbc0d38528671fb5cb5d88714804241a88c61872ce289f7c6333aef6cfdfb09277bda0dbdf0aab3459 languageName: node linkType: hard @@ -1529,8 +1505,8 @@ __metadata: linkType: hard "chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" dependencies: anymatch: ~3.1.2 braces: ~3.0.2 @@ -1543,7 +1519,7 @@ __metadata: dependenciesMeta: fsevents: optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c + checksum: d2f29f499705dcd4f6f3bbed79a9ce2388cf530460122eed3b9c48efeab7a4e28739c6551fd15bec9245c6b9eeca7a32baa64694d64d9b6faeb74ddb8c4a413d languageName: node linkType: hard @@ -1569,9 +1545,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 5ea3cb867a9bb609b6d476cd86590d105f3cfd6514db38ff71f63992ab40939c2feb68967faa15a6d2b1f90daa6416b79ea2de486e9e2485a6f8b66a21b4fb0a + version: 1.3.1 + resolution: "cjs-module-lexer@npm:1.3.1" + checksum: 75f20ac264a397ea5c63f9c2343a51ab878043666468f275e94862f7180ec1d764a400ec0c09085dcf0db3193c74a8b571519abd2bf4be0d2be510d1377c8d4b languageName: node linkType: hard @@ -1733,14 +1709,14 @@ __metadata: linkType: hard "dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" + version: 1.5.3 + resolution: "dedent@npm:1.5.3" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a languageName: node linkType: hard @@ -1780,9 +1756,9 @@ __metadata: linkType: hard "diff@npm:^5.0.0, diff@npm:^5.1.0": - version: 5.1.0 - resolution: "diff@npm:5.1.0" - checksum: c7bf0df7c9bfbe1cf8a678fd1b2137c4fb11be117a67bc18a0e03ae75105e8533dbfb1cda6b46beb3586ef5aed22143ef9d70713977d5fb1f9114e21455fba90 + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd languageName: node linkType: hard @@ -1796,8 +1772,8 @@ __metadata: linkType: hard "documentation@npm:^14.0.2": - version: 14.0.2 - resolution: "documentation@npm:14.0.2" + version: 14.0.3 + resolution: "documentation@npm:14.0.3" dependencies: "@babel/core": ^7.18.10 "@babel/generator": ^7.18.10 @@ -1845,7 +1821,7 @@ __metadata: optional: true bin: documentation: bin/documentation.js - checksum: fa6734ce55d3bc6397c900e8093044ba1a411949478dc46342e99f765422724e181d47d4cbcbf979aeb46add99174b995da985d705c8e432d9f9acd0e97116d5 + checksum: e8b3fc8ac40b596daab7368a442aacf602a90ee4969f0ad4f40e873dca89a562c07ff4dcd7624c6c43e205b4630e3ae4393b88627e75079758fcbe31ca8519a8 languageName: node linkType: hard @@ -1856,10 +1832,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.616 - resolution: "electron-to-chromium@npm:1.4.616" - checksum: 9fd53bd4e5cded61ee51164a0d23ced1d7677ab176ef8e28eb4a27ceaae1deb3bb0038024db48478507204bfcd48ef66866c078721915a9c7b019697cc5680bf +"electron-to-chromium@npm:^1.4.668": + version: 1.4.783 + resolution: "electron-to-chromium@npm:1.4.783" + checksum: 49dfd8614c8e28076ca82e241a4a246685440dacde5e2cdb85d57a0d5bcc1cbd5de3201b3158b94ad5f1016e91ab9bb0d4da8cfe46d2897400fb62e6a5be198e languageName: node linkType: hard @@ -1902,6 +1878,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -1925,10 +1908,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 1ec0977aa2772075493002bdbd549d595ff6e9393b1cb0d7d6fcaf78c750da0c158f180938365486f75cb69fba20294351caddfce1b46552a7b6c3cde52eaa02 languageName: node linkType: hard @@ -1994,15 +1977,6 @@ __metadata: languageName: node linkType: hard -"execspawn@npm:^1.0.1": - version: 1.0.1 - resolution: "execspawn@npm:1.0.1" - dependencies: - util-extend: ^1.0.1 - checksum: fc2be7fb6de7b4c4cd779ca3f6cf4bf19f0fd22e7967194dcec3c379ac7d914587652c933bac774f0b6bba8f15069969921065553f1e19eb58e25ab675f68689 - languageName: node - linkType: hard - "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -2053,12 +2027,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 languageName: node linkType: hard @@ -2236,18 +2210,18 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.10 - resolution: "glob@npm:10.3.10" +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.4.1 + resolution: "glob@npm:10.4.1" dependencies: foreground-child: ^3.1.0 - jackspeak: ^2.3.5 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + path-scurry: ^1.11.1 bin: glob: dist/esm/bin.mjs - checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + checksum: 5d33c686c80bf6877f4284adf99a8c3cbb2a6eccbc92342943fe5d4b42c01d78c1881f2223d950c92a938d0f857e12e37b86a8e5483ab2141822e053b67d0dde languageName: node linkType: hard @@ -2296,15 +2270,16 @@ __metadata: version: 0.0.0-use.local resolution: "gpt4all@workspace:." dependencies: - "@types/node": ^20.1.5 + "@types/node": ^20.12.12 documentation: ^14.0.2 - jest: ^29.5.0 + jest: ^29.7.0 md5-file: ^5.0.0 - node-addon-api: ^6.1.0 + node-addon-api: ^8.0.0 node-gyp: 9.x.x - node-gyp-build: ^4.6.0 - prebuildify: ^5.0.1 - prettier: ^2.8.8 + node-gyp-build: ~4.8.0 + prebuildify: ^6.0.1 + prettier: ^3.2.5 + rimraf: ^5.0.7 dependenciesMeta: node-gyp: optional: true @@ -2340,11 +2315,11 @@ __metadata: linkType: hard "hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard @@ -2511,12 +2486,12 @@ __metadata: linkType: hard "http-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "http-proxy-agent@npm:7.0.0" + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" dependencies: agent-base: ^7.1.0 debug: ^4.3.4 - checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 + checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 languageName: node linkType: hard @@ -2531,12 +2506,12 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.2 - resolution: "https-proxy-agent@npm:7.0.2" + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" dependencies: agent-base: ^7.0.2 debug: 4 - checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292 + checksum: daaab857a967a2519ddc724f91edbbd388d766ff141b9025b629f92b9408fc83cee8a27e11a907aede392938e9c398e240d643e178408a59e4073539cde8cfe9 languageName: node linkType: hard @@ -2629,10 +2604,13 @@ __metadata: languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.1 - resolution: "ip@npm:2.0.1" - checksum: d765c9fd212b8a99023a4cde6a558a054c298d640fec1020567494d257afd78ca77e37126b1a3ef0e053646ced79a816bf50621d38d5e768cdde0431fa3b0d35 +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: 1.1.0 + sprintf-js: ^1.1.3 + checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc languageName: node linkType: hard @@ -2805,15 +2783,15 @@ __metadata: linkType: hard "istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.1 - resolution: "istanbul-lib-instrument@npm:6.0.1" + version: 6.0.2 + resolution: "istanbul-lib-instrument@npm:6.0.2" dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 + "@babel/core": ^7.23.9 + "@babel/parser": ^7.23.9 + "@istanbuljs/schema": ^0.1.3 istanbul-lib-coverage: ^3.2.0 semver: ^7.5.4 - checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 + checksum: c10aa1e93a022f9767d7f41e6c07d244cc0a5c090fbb5522d70a5f21fcb98c52b7038850276c6fd1a7a17d1868c14a9d4eb8a24efe58a0ebb9a06f3da68131fe languageName: node linkType: hard @@ -2840,25 +2818,25 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.3": - version: 3.1.6 - resolution: "istanbul-reports@npm:3.1.6" + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 44c4c0582f287f02341e9720997f9e82c071627e1e862895745d5f52ec72c9b9f38e1d12370015d2a71dcead794f34c7732aaef3fab80a24bc617a21c3d911d6 + checksum: 2072db6e07bfbb4d0eb30e2700250636182398c1af811aea5032acb219d2080f7586923c09fa194029efd6b92361afb3dcbe1ebcc3ee6651d13340f7c6c4ed95 languageName: node linkType: hard -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.1.2 + resolution: "jackspeak@npm:3.1.2" dependencies: "@isaacs/cliui": ^8.0.2 "@pkgjs/parseargs": ^0.11.0 dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + checksum: 134276d5f785c518930701a0dcba1f3b0e9ce3e5b1c3e300898e2ae0bbd9b5195088b77252bf2110768de072c426e9e39f47e13912b0b002da4a3f4ff6e16eac languageName: node linkType: hard @@ -3282,7 +3260,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.5.0": +"jest@npm:^29.7.0": version: 29.7.0 resolution: "jest@npm:29.7.0" dependencies: @@ -3331,6 +3309,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -3426,10 +3411,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.2.0 - resolution: "lru-cache@npm:10.2.0" - checksum: eee7ddda4a7475deac51ac81d7dd78709095c6fa46e8350dc2d22462559a1faa3b81ed931d5464b13d48cbd7e08b46100b6f768c76833912bc444b99c37e25db +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.2.2 + resolution: "lru-cache@npm:10.2.2" + checksum: 98e8fc93691c546f719a76103ef2bee5a3ac823955c755a47641ec41f8c7fafa1baeaba466937cc1cbfa9cfd47e03536d10e2db3158a64ad91ff3a58a32c893e languageName: node linkType: hard @@ -3458,12 +3443,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.5": - version: 0.30.5 - resolution: "magic-string@npm:0.30.5" +"magic-string@npm:^0.30.10": + version: 0.30.10 + resolution: "magic-string@npm:0.30.10" dependencies: "@jridgewell/sourcemap-codec": ^1.4.15 - checksum: da10fecff0c0a7d3faf756913ce62bd6d5e7b0402be48c3b27bfd651b90e29677e279069a63b764bcdc1b8ecdcdb898f29a5c5ec510f2323e8d62ee057a6eb18 + checksum: 456fd47c39b296c47dff967e1965121ace35417eab7f45a99e681e725b8661b48e1573c366ee67a27715025b3740773c46b088f115421c7365ea4ea6fa10d399 languageName: node linkType: hard @@ -3501,8 +3486,8 @@ __metadata: linkType: hard "make-fetch-happen@npm:^13.0.0": - version: 13.0.0 - resolution: "make-fetch-happen@npm:13.0.0" + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" dependencies: "@npmcli/agent": ^2.0.0 cacache: ^18.0.0 @@ -3513,9 +3498,10 @@ __metadata: minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^0.6.3 + proc-log: ^4.2.0 promise-retry: ^2.0.1 ssri: ^10.0.0 - checksum: 7c7a6d381ce919dd83af398b66459a10e2fe8f4504f340d1d090d3fa3d1b0c93750220e1d898114c64467223504bd258612ba83efbc16f31b075cd56de24b4af + checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd languageName: node linkType: hard @@ -4083,12 +4069,12 @@ __metadata: linkType: hard "micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" dependencies: - braces: ^3.0.2 + braces: ^3.0.3 picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 languageName: node linkType: hard @@ -4117,12 +4103,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" +"minimatch@npm:^9.0.4": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" dependencies: brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + checksum: cf717f597ec3eed7dabc33153482a2e8d49f4fd3c26e58fd9c71a94c5029a0838728841b93f46bf1263b65a8010e2ee800d0dc9b004ab8ba8b6d1ec07cc115b5 languageName: node linkType: hard @@ -4167,8 +4153,8 @@ __metadata: linkType: hard "minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 @@ -4177,7 +4163,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 languageName: node linkType: hard @@ -4224,10 +4210,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard @@ -4302,31 +4288,31 @@ __metadata: linkType: hard "node-abi@npm:^3.3.0": - version: 3.52.0 - resolution: "node-abi@npm:3.52.0" + version: 3.62.0 + resolution: "node-abi@npm:3.62.0" dependencies: semver: ^7.3.5 - checksum: 2ef47937d058fa1f0817294fe5ac3ec1d370d3f8eb4931ea920b7e147033390058d3bc35b64d9161036ad2fda191aa1155005cea20ec50984312637221559354 + checksum: f480d26b5c3f4c329f2e084fe55e8ed2ec898d48c0135192009fa27e8d5760d272d6566c2a8ba348ca4740dbf6191fe90296b9e90d0aa2942cfd87bd44f0e977 languageName: node linkType: hard -"node-addon-api@npm:^6.1.0": - version: 6.1.0 - resolution: "node-addon-api@npm:6.1.0" +"node-addon-api@npm:^8.0.0": + version: 8.0.0 + resolution: "node-addon-api@npm:8.0.0" dependencies: node-gyp: latest - checksum: 3a539510e677cfa3a833aca5397300e36141aca064cdc487554f2017110709a03a95da937e98c2a14ec3c626af7b2d1b6dabe629a481f9883143d0d5bff07bf2 + checksum: 4996f919b40125b435beff2744a43d846e649421f97321c58a7e205c125514b2bb0f5b299291876fdbcecb47ecf06e507e9f59d2848b6e495abf99fe585e8a47 languageName: node linkType: hard -"node-gyp-build@npm:^4.6.0": - version: 4.7.1 - resolution: "node-gyp-build@npm:4.7.1" +"node-gyp-build@npm:~4.8.0": + version: 4.8.1 + resolution: "node-gyp-build@npm:4.8.1" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 2ef8248021489db03be3e8098977cdc797b80a9b12b77c6dcb89b0dc89b8c62e6a482672ee298f61021740ae7f080fb33154cfec8fb158cec620f57b0fae87c0 + checksum: fe6e95da6f4608c1a98655f6bf2fe4e8dd9c877cd13256056a8acaf585cc7f98718823fe9366be11b78c2f332d5a184b00cf07a4af96c9d8fea45f640c019f98 languageName: node linkType: hard @@ -4352,8 +4338,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 10.0.1 - resolution: "node-gyp@npm:10.0.1" + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 @@ -4367,7 +4353,7 @@ __metadata: which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 60a74e66d364903ce02049966303a57f898521d139860ac82744a5fdd9f7b7b3b61f75f284f3bfe6e6add3b8f1871ce305a1d41f775c7482de837b50c792223f + checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 languageName: node linkType: hard @@ -4397,13 +4383,13 @@ __metadata: linkType: hard "nopt@npm:^7.0.0": - version: 7.2.0 - resolution: "nopt@npm:7.2.0" + version: 7.2.1 + resolution: "nopt@npm:7.2.1" dependencies: abbrev: ^2.0.0 bin: nopt: bin/nopt.js - checksum: a9c0f57fb8cb9cc82ae47192ca2b7ef00e199b9480eed202482c962d61b59a7fbe7541920b2a5839a97b42ee39e288c0aed770e38057a608d7f579389dfde410 + checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 languageName: node linkType: hard @@ -4634,20 +4620,20 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: - lru-cache: ^9.1.1 || ^10.0.0 + lru-cache: ^10.2.0 minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 languageName: node linkType: hard @@ -4681,22 +4667,21 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.32": - version: 8.4.32 - resolution: "postcss@npm:8.4.32" +"postcss@npm:^8.4.38": + version: 8.4.38 + resolution: "postcss@npm:8.4.38" dependencies: nanoid: ^3.3.7 picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: 220d9d0bf5d65be7ed31006c523bfb11619461d296245c1231831f90150aeb4a31eab9983ac9c5c89759a3ca8b60b3e0d098574964e1691673c3ce5c494305ae + source-map-js: ^1.2.0 + checksum: 649f9e60a763ca4b5a7bbec446a069edf07f057f6d780a5a0070576b841538d1ecf7dd888f2fbfd1f76200e26c969e405aeeae66332e6927dbdc8bdcb90b9451 languageName: node linkType: hard -"prebuildify@npm:^5.0.1": - version: 5.0.1 - resolution: "prebuildify@npm:5.0.1" +"prebuildify@npm:^6.0.1": + version: 6.0.1 + resolution: "prebuildify@npm:6.0.1" dependencies: - execspawn: ^1.0.1 minimist: ^1.2.5 mkdirp-classic: ^0.5.3 node-abi: ^3.3.0 @@ -4705,16 +4690,16 @@ __metadata: tar-fs: ^2.1.0 bin: prebuildify: bin.js - checksum: d71a6410efe8a2819d629eff3290c57c6e125ca87004682d97caca18feedf498d492ab3af933a640ffbcb675b6b38fd4f51337e160916ab09cccef6c6719258c + checksum: 33b7ba29134d518ddfef7698434ecd0ac816b13ba603d7a5acf8590e04d7f736b24584e63da50e87c25b4a1e35588d54848d57cdf4cf09e625e843d1a583d930 languageName: node linkType: hard -"prettier@npm:^2.8.8": - version: 2.8.8 - resolution: "prettier@npm:2.8.8" +"prettier@npm:^3.2.5": + version: 3.2.5 + resolution: "prettier@npm:3.2.5" bin: - prettier: bin-prettier.js - checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 + prettier: bin/prettier.cjs + checksum: 2ee4e1417572372afb7a13bb446b34f20f1bf1747db77cf6ccaf57a9be005f2f15c40f903d41a6b79eec3f57fff14d32a20fb6dee1f126da48908926fe43c311 languageName: node linkType: hard @@ -4736,6 +4721,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -4764,9 +4756,9 @@ __metadata: linkType: hard "property-information@npm:^6.0.0": - version: 6.4.0 - resolution: "property-information@npm:6.4.0" - checksum: b5aed9a40e87730995f3ceed29839f137fa73b2a4cccfb8ed72ab8bddb8881cad05c3487c4aa168d7cb49a53db8089790c9f00f59d15b8380d2bb5383cdd1f24 + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 6e55664e2f64083b715011e5bafaa1e694faf36986c235b0907e95d09259cc37c38382e3cc94a4c3f56366e05336443db12c8a0f0968a8c0a1b1416eebfc8f53 languageName: node linkType: hard @@ -4788,16 +4780,16 @@ __metadata: linkType: hard "pure-rand@npm:^6.0.0": - version: 6.0.4 - resolution: "pure-rand@npm:6.0.4" - checksum: e1c4e69f8bf7303e5252756d67c3c7551385cd34d94a1f511fe099727ccbab74c898c03a06d4c4a24a89b51858781057b83ebbfe740d984240cdc04fead36068 + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 8d53bc02bed99eca0b65b505090152ee7e9bd67dd74f8ff32ba1c883b87234067c5bf68d2614759fb217d82594d7a92919e6df80f97885e7b12b42af4bd3316a languageName: node linkType: hard "react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard @@ -4999,6 +4991,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.7": + version: 5.0.7 + resolution: "rimraf@npm:5.0.7" + dependencies: + glob: ^10.3.7 + bin: + rimraf: dist/esm/bin.mjs + checksum: 884852abf8aefd4667448d87bdab04120a8641266c828cf382ac811713547eda18f81799d2146ffec3178f357d83d44ec01c10095949c82e23551660732bf14f + languageName: node + linkType: hard + "sade@npm:^1.7.3": version: 1.8.1 resolution: "sade@npm:1.8.1" @@ -5032,13 +5035,11 @@ __metadata: linkType: hard "semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 + version: 7.6.2 + resolution: "semver@npm:7.6.2" bin: semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d languageName: node linkType: hard @@ -5111,31 +5112,31 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.1": - version: 8.0.2 - resolution: "socks-proxy-agent@npm:8.0.2" +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.3 + resolution: "socks-proxy-agent@npm:8.0.3" dependencies: - agent-base: ^7.0.2 + agent-base: ^7.1.1 debug: ^4.3.4 socks: ^2.7.1 - checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d + checksum: 8fab38821c327c190c28f1658087bc520eb065d55bc07b4a0fdf8d1e0e7ad5d115abbb22a95f94f944723ea969dd771ad6416b1e3cde9060c4c71f705c8b85c5 languageName: node linkType: hard "socks@npm:^2.6.2, socks@npm:^2.7.1": - version: 2.7.1 - resolution: "socks@npm:2.7.1" + version: 2.8.3 + resolution: "socks@npm:2.8.3" dependencies: - ip: ^2.0.0 + ip-address: ^9.0.5 smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd languageName: node linkType: hard -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:^1.2.0": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 languageName: node linkType: hard @@ -5174,9 +5175,9 @@ __metadata: linkType: hard "spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + version: 2.5.0 + resolution: "spdx-exceptions@npm:2.5.0" + checksum: bb127d6e2532de65b912f7c99fc66097cdea7d64c10d3ec9b5e96524dbbd7d20e01cba818a6ddb2ae75e62bb0c63d5e277a7e555a85cbc8ab40044984fa4ae15 languageName: node linkType: hard @@ -5191,9 +5192,16 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.16 - resolution: "spdx-license-ids@npm:3.0.16" - checksum: 5cdaa85aaa24bd02f9353a2e357b4df0a4f205cb35655f3fd0a5674a4fb77081f28ffd425379214bc3be2c2b7593ce1215df6bcc75884aeee0a9811207feabe2 + version: 3.0.18 + resolution: "spdx-license-ids@npm:3.0.18" + checksum: 457825df5dd1fc0135b0bb848c896143f70945cc2da148afc71c73ed0837d1d651f809006e406d82109c9dd71a8cb39785a3604815fe46bc0548e9d3976f6b69 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 languageName: node linkType: hard @@ -5205,11 +5213,11 @@ __metadata: linkType: hard "ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" + version: 10.0.6 + resolution: "ssri@npm:10.0.6" dependencies: minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 languageName: node linkType: hard @@ -5273,12 +5281,12 @@ __metadata: linkType: hard "stringify-entities@npm:^4.0.0": - version: 4.0.3 - resolution: "stringify-entities@npm:4.0.3" + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" dependencies: character-entities-html4: ^2.0.0 character-entities-legacy: ^3.0.0 - checksum: 59e8f523b403bf7d415690e72ae52982decd6ea5426bd8b3f5c66225ddde73e766c0c0d91627df082d0794e30b19dd907ffb5864cef3602e4098d6777d7ca3c2 + checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 languageName: node linkType: hard @@ -5450,9 +5458,9 @@ __metadata: linkType: hard "trough@npm:^2.0.0": - version: 2.1.0 - resolution: "trough@npm:2.1.0" - checksum: a577bb561c2b401cc0e1d9e188fcfcdf63b09b151ff56a668da12197fe97cac15e3d77d5b51f426ccfd94255744a9118e9e9935afe81a3644fa1be9783c82886 + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 6097df63169aca1f9b08c263b1b501a9b878387f46e161dde93f6d0bba7febba93c95f876a293c5ea370f6cb03bcb687b2488c8955c3cfb66c2c0161ea8c00f6 languageName: node linkType: hard @@ -5607,16 +5615,16 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" + version: 1.0.16 + resolution: "update-browserslist-db@npm:1.0.16" dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 + escalade: ^3.1.2 + picocolors: ^1.0.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + checksum: 51b1f7189c9ea5925c80154b0a6fd3ec36106d07858d8f69826427d8edb4735d1801512c69eade38ba0814d7407d11f400d74440bbf3da0309f3d788017f35b2 languageName: node linkType: hard @@ -5627,13 +5635,6 @@ __metadata: languageName: node linkType: hard -"util-extend@npm:^1.0.1": - version: 1.0.3 - resolution: "util-extend@npm:1.0.3" - checksum: da57f399b331f40fe2cea5409b1f4939231433db9b52dac5593e4390a98b7b0d1318a0daefbcc48123fffe5026ef49f418b3e4df7a4cd7649a2583e559c608a5 - languageName: node - linkType: hard - "uvu@npm:^0.5.0": version: 0.5.6 resolution: "uvu@npm:0.5.6"