diff --git a/.github/workflows/build.js.yml b/.github/workflows/build.js.yml
index ed0053156..95ec5960e 100644
--- a/.github/workflows/build.js.yml
+++ b/.github/workflows/build.js.yml
@@ -63,6 +63,34 @@ jobs:
name: bailo_frontend
path: /tmp/bailo_frontend.tar
+ build_modelscan:
+ runs-on: ubuntu-latest
+ timeout-minutes: 20
+
+ steps:
+ # Clone repository
+ - uses: actions/checkout@v3
+
+ # Setup BuildX
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Build modelscan image
+ uses: docker/build-push-action@v3
+ with:
+ context: lib/modelscan_api
+ file: lib/modelscan_api/Dockerfile
+ tags: bailo_modelscan:latest
+ cache-from: type=gha,scope=modelscan
+ cache-to: type=gha,mode=max,scope=modelscan
+ outputs: type=docker,dest=/tmp/bailo_modelscan.tar
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: bailo_modelscan
+ path: /tmp/bailo_modelscan.tar
+
unit_testing:
runs-on: ubuntu-latest
@@ -107,7 +135,7 @@ jobs:
- run: npm run lint
kubernetes:
- needs: [build_backend, build_frontend]
+ needs: [build_backend, build_frontend, build_modelscan]
runs-on: ubuntu-latest
steps:
@@ -134,6 +162,11 @@ jobs:
with:
name: bailo_frontend
path: /tmp
+ - name: Download artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: bailo_modelscan
+ path: /tmp
- name: Start minikube
uses: medyagh/setup-minikube@master
@@ -146,6 +179,7 @@ jobs:
eval $(minikube -p minikube docker-env)
docker load -i /tmp/bailo_backend.tar
docker load -i /tmp/bailo_frontend.tar
+ docker load -i /tmp/bailo_modelscan.tar
# Install dependencies
- run: npm ci
@@ -193,6 +227,8 @@ jobs:
frontendTag: latest
backendRepository: "bailo_backend"
backendTag: latest
+ modelscanRepository: "bailo_modelscan"
+ modelscanTag: latest
# Used for k8s not openshift
ingress:
enabled: false
@@ -259,7 +295,7 @@ jobs:
run: kubectl logs -l app.kubernetes.io/instance=bailo --tail=-1
end_to_end:
- needs: [build_backend, build_frontend]
+ needs: [build_backend, build_frontend, build_modelscan]
runs-on: ubuntu-latest
steps:
@@ -287,14 +323,20 @@ jobs:
with:
name: bailo_frontend
path: /tmp
+ - name: Download artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: bailo_modelscan
+ path: /tmp
- name: Load image
run: |
docker load --input /tmp/bailo_frontend.tar
docker load --input /tmp/bailo_backend.tar
+ docker load --input /tmp/bailo_modelscan.tar
docker image ls -a
- rm -rf /tmp/bailo_frontend.tar /tmp/bailo_backend.tar
+ rm -rf /tmp/bailo_frontend.tar /tmp/bailo_backend.tar /tmp/bailo_modelscan.tar
# Create logs directory
- run: mkdir logs
diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml
index 5b820a6d1..e24419020 100644
--- a/.github/workflows/web.yml
+++ b/.github/workflows/web.yml
@@ -108,7 +108,7 @@ jobs:
env:
BASE_PATH: "/Bailo"
- name: Upload artifact
- uses: actions/upload-pages-artifact@v1
+ uses: actions/upload-pages-artifact@v3
with:
path: ./lib/landing/out
@@ -128,4 +128,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
- uses: actions/deploy-pages@v1
\ No newline at end of file
+ uses: actions/deploy-pages@v4
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4872f61ce..bced1f06f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,5 @@
stages:
+ - git_sync
- os_build
- aws_build
@@ -6,14 +7,31 @@ variables:
AWS_TAG: latest
OS_TAG: $CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA
-os-backend-build:
- stage: os_build
+opensrc-bailols:
+ stage: git_sync
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
+ - if: '$CI_COMMIT_BRANCH == "main" && $BFG == "true"'
when: always
allow_failure: true
- when: manual
allow_failure: true
+ image:
+ name: openjdk:latest
+ script:
+ - microdnf install -y git wget
+ - git clone --mirror "https://$OPENSRC_TOKEN_NAME:$OPENSRC_TOKEN@$OPENSRC_URL"
+ - wget https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
+ - java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 40M $OPENSRC_GIT_NAME
+ - cd $OPENSRC_GIT_NAME
+ - git reflog expire --expire=now --all && git gc --prune=now --aggressive
+ - git remote add $REPO_NAME "https://$LS_TOKEN_NAME:$LS_TOKEN@$LS_URL"
+ - git push -u $REPO_NAME main --force
+
+os-backend-build:
+ stage: os_build
+ rules:
+ - when: manual
+ allow_failure: true
image:
name: docker:latest
variables:
@@ -35,9 +53,6 @@ os-backend-build:
os-frontend-build:
stage: os_build
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
- when: always
- allow_failure: true
- when: manual
allow_failure: true
image:
@@ -58,13 +73,33 @@ os-frontend-build:
- docker tag frontend-ci:$OS_TAG $REGISTRY_URL/$OPENSHIFT_PROJECTNAME/frontend-ci:$OS_TAG
- docker push $REGISTRY_URL/$OPENSHIFT_PROJECTNAME/frontend-ci:$OS_TAG
-openshift-deploy:
+os-modelscan-build:
stage: os_build
- needs: ['os-frontend-build', 'os-backend-build']
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
- when: always
+ - when: manual
allow_failure: true
+ image:
+ name: docker:latest
+ variables:
+ DOCKER_HOST: tcp://docker:2375
+ DOCKER_TLS_CERTDIR: ''
+ services:
+ - name: docker:stable-dind
+ command:
+ - '--tls=false'
+ - '--host=tcp://0.0.0.0:2375'
+ before_script:
+ - docker login -u $OPENSHIFT_USER -p $OPENSHIFT_TOKEN $REGISTRY_URL
+ - cd lib/modelscan_api
+ script:
+ - DOCKER_BUILDKIT=1 docker build -t modelscan-ci:$OS_TAG .
+ - docker tag modelscan-ci:$OS_TAG $REGISTRY_URL/$OPENSHIFT_PROJECTNAME/modelscan-ci:$OS_TAG
+ - docker push $REGISTRY_URL/$OPENSHIFT_PROJECTNAME/modelscan-ci:$OS_TAG
+
+openshift-deploy:
+ stage: os_build
+ needs: ['os-frontend-build', 'os-backend-build', 'os-modelscan-build']
+ rules:
- when: manual
allow_failure: true
image:
@@ -99,6 +134,8 @@ openshift-deploy:
frontendTag: $OS_TAG
backendRepository: "$BACKEND_REPO"
backendTag: $OS_TAG
+ modelscanRepository: "$BACKEND_REPO"
+ modelscanTag: $OS_TAG
# Used for openshift
route:
enabled: true
@@ -123,9 +160,6 @@ openshift-deploy:
aws-backend-build:
stage: aws_build
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
- when: always
- allow_failure: true
- when: manual
allow_failure: true
image:
@@ -155,9 +189,6 @@ aws-backend-build:
aws-frontend-build:
stage: aws_build
rules:
- - if: '$CI_COMMIT_BRANCH == "main"'
- when: always
- allow_failure: true
- when: manual
allow_failure: true
image:
@@ -183,3 +214,32 @@ aws-frontend-build:
- docker tag $DOCKER_REGISTRY/$APP_NAME_FRONTEND:$AWS_TAG $DOCKER_REGISTRY/$APP_NAME_FRONTEND:$OS_TAG
- docker push $DOCKER_REGISTRY/$APP_NAME_FRONTEND:$AWS_TAG
- docker push $DOCKER_REGISTRY/$APP_NAME_FRONTEND:$OS_TAG
+
+aws-modelscan-build:
+ stage: aws_build
+ rules:
+ - when: manual
+ allow_failure: true
+ image:
+ name: docker:latest
+ variables:
+ DOCKER_HOST: tcp://docker:2375
+ DOCKER_TLS_CERTDIR: ''
+ services:
+ - name: docker:stable-dind
+ command:
+ - '--tls=false'
+ - '--host=tcp://0.0.0.0:2375'
+ before_script:
+ - apk add --no-cache curl jq python3 py3-pip
+ - pip install awscli --break-system-packages
+ - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
+ - aws --version
+ - docker info
+ - docker --version
+ - cd lib/modelscan_api
+ script:
+ - DOCKER_BUILDKIT=1 docker build -t $DOCKER_REGISTRY/$APP_NAME_MODELSCAN:$AWS_TAG .
+ - docker tag $DOCKER_REGISTRY/$APP_NAME_MODELSCAN:$AWS_TAG $DOCKER_REGISTRY/$APP_NAME_MODELSCAN:$OS_TAG
+ - docker push $DOCKER_REGISTRY/$APP_NAME_MODELSCAN:$AWS_TAG
+ - docker push $DOCKER_REGISTRY/$APP_NAME_MODELSCAN:$OS_TAG
diff --git a/README.md b/README.md
index 8dc172715..4ad29fcd3 100644
--- a/README.md
+++ b/README.md
@@ -134,11 +134,12 @@ something more secure.
We expect the administrator to provide their own forms of authentication. By default all users authenticate using as
'user'.
-You can test out your new deployment using the example models which can be found in `__tests__`
-[`minimal_binary.zip`](__tests__/example_models/minimal_binary.zip) and
-[`minimal_code.zip`](__tests__/example_models/minimal_code.zip). There are also example forms in the `scripts` folder
-[`minimal_upload_schema_examples.json`](backend/src/scripts/example_schemas/minimal_upload_schema_examples.json) and
-[`minimal_deployment_schema_examples.json`](backend/src/scripts/example_schemas/minimal_deployment_schema_examples.json).
+You can test out your new deployment using the example models which can be found in `frontend/cypress/fixtures`
+[`minimal_binary.zip`](frontend/cypress/fixtures/minimal_binary.zip) and
+[`minimal_code.zip`](frontend/cypress/fixtures/minimal_code.zip). There are also example forms in the `scripts` folder
+[`minimal_model_schema.json`](backend/src/scripts/example_schemas/minimal_model_schema.json),
+[`minimal_data_card_schema.json`](backend/src/scripts/example_schemas/minimal_data_card_schema.json) and
+[`minimal_access_request_schema.json`](backend/src/scripts/example_schemas/minimal_access_request_schema.json).
diff --git a/backend/Dockerfile b/backend/Dockerfile
index b8e288cc1..9fd4c2ba6 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
-FROM python:3.13.0-bullseye AS sphinx-docs
+FROM python:3.13.1-bullseye AS sphinx-docs
RUN apt update && apt install -y pandoc
diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev
index f13deaa44..b419fe982 100644
--- a/backend/Dockerfile.dev
+++ b/backend/Dockerfile.dev
@@ -1,4 +1,4 @@
-FROM python:3.13.0-bullseye AS sphinx-docs
+FROM python:3.13.1-bullseye AS sphinx-docs
RUN apt update && apt install -y pandoc
diff --git a/backend/config/default.cjs b/backend/config/default.cjs
index db97ed0fd..aab5979cb 100644
--- a/backend/config/default.cjs
+++ b/backend/config/default.cjs
@@ -222,6 +222,9 @@ module.exports = {
fileScanners: {
kinds: [],
+ retryDelayInMinutes: 60,
+ maxInitRetries: 5,
+ initRetryDelay: 5000,
},
},
diff --git a/backend/config/docker_compose.cjs b/backend/config/docker_compose.cjs
index 55319add5..41f6202ef 100644
--- a/backend/config/docker_compose.cjs
+++ b/backend/config/docker_compose.cjs
@@ -74,6 +74,9 @@ module.exports = {
connectors: {
fileScanners: {
kinds: ['clamAV', 'modelScan'],
+ retryDelayInMinutes: 60,
+ maxInitRetries: 5,
+ initRetryDelay: 5000,
},
},
}
diff --git a/backend/docs/README.md b/backend/docs/README.md
index 0f5235bf1..13d56c845 100644
--- a/backend/docs/README.md
+++ b/backend/docs/README.md
@@ -1,6 +1,6 @@
-# Bailo Python Client
+# Bailo Python Client Documentation
-A simple Python API Wrapper for Bailo
+The documentation for [a simple Python API Wrapper for Bailo](../../lib/python/README.md)
@@ -9,19 +9,15 @@ A simple Python API Wrapper for Bailo
Table of Contents
-
- Key Features
-
- -
- Installing
-
- -
- Getting Started
-
- -
- Development
+ Documentation
@@ -29,82 +25,27 @@ A simple Python API Wrapper for Bailo
-## Key Features
-
-- Uploading and downloading model binaries
-
-## Installing
-
-**Python 3.8.1 or higher is required**
-
-```bash
-pip install bailo
-```
-
-## Getting Started
-
-```python
-from bailo import Client, Model
-client = Client("http://localhost:8080")
-
-# Create a model
-yolo = Model.create(
- client=client,
- name="YoloV4",
- description="You only look once!",
- team_id="Uncategorised"
-)
-
-yolo.card_from_schema("minimal-general-v10-beta")
-
-# Create a new release
-my_release = yolo.create_release(version="0.1.0",
- notes="Beta")
-
-# Upload a file to the release
-with open("yolo.onnx") as f:
- my_release.upload("yolo", f)
-```
-
## Documentation
-Documenation is rendered with Sphinx and served [here](https://gchq.github.io/Bailo/docs/python/index.html).
+Documentation is rendered with Sphinx and served [here](https://gchq.github.io/Bailo/docs/python/index.html).
### Building locally
-From the docs directory run either `make html` or `make.bat` on Windows. This will build it in the backend directory by
-default.
-
-## Development
-
-### Install and add precommit
-
-If already working on Bailo you may be prompted to overwrite Husky. Follow the instructions given by Git CLI.
-
-```bash
-pip install pre-commit
-pre-commit install
-```
-
-### Install the package locally
-
-```bash
-pip install -e .
-```
-
-### Testing
+
+> [!IMPORTANT]
+> Python 3.8.1 or higher is required
+
-The package uses Pytest to test packages. Tests can be ran accordingly from within this directory. Tests are split into
-categories sections for automation purposes.
+#### Prerequisites
-In order to run integration tests make sure Bailo is running on `https://localhost:8080`:
+From within the `backend/docs` directory:
```bash
-pytest -m integration
+pip install bailo -r requirements.txt
+apt install -y pandoc
```
-Run all other tests:
+#### Building
-```bash
-pytest
-```
+From the docs directory run either `make html` (Linux & Mac) or `make.bat` (Windows). This will build it in the backend
+directory by default.
diff --git a/backend/docs/notebooks/access_requests_demo.ipynb b/backend/docs/notebooks/access_requests_demo.ipynb
index 8ba5b485f..9574736a1 100644
--- a/backend/docs/notebooks/access_requests_demo.ipynb
+++ b/backend/docs/notebooks/access_requests_demo.ipynb
@@ -78,7 +78,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "In this section, we'll create a new access request using the `AccessRequest.create()` classmethod. On the Bailo service, an access request must consist of at least 3 parameters upon creation. These are **model_id**, **schema_id** and **metadata**. Below, we use the `Client()` object created before when instantiating the new `AccessRequest()` object. We'll also need to create a new model on the service, which our access request will be for."
+ "In this section, we will create a new access request using the `AccessRequest.create()` classmethod. On the Bailo service, an access request must consist of at least 3 parameters upon creation. These are **model_id**, **schema_id** and **metadata**. Below, we use the `Client()` object created before when instantiating the new `AccessRequest()` object. We will also need to create a new model on the service, which our access request will be for."
]
},
{
@@ -87,7 +87,7 @@
"metadata": {},
"outputs": [],
"source": [
- "model = Model.create(client=client, name=\"YOLOv5\", description=\"YOLOv5 model for object detection.\", team_id=\"uncategorised\")\n",
+ "model = Model.create(client=client, name=\"YOLOv5\", description=\"YOLOv5 model for object detection.\")\n",
"model_id = model.model_id\n",
"\n",
"metadata = {\"overview\": {\"entities\": [\"user\"], \"name\": \"test\", \"endDate\": \"1970-01-01\"}}\n",
@@ -117,7 +117,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "In this section, we'll retrieve our previous access request using the `AccessRequest.from_id()` classmethod. This will create your `AccessRequest()` object as before, but using existing information retrieved from the service."
+ "In this section, we will retrieve our previous access request using the `AccessRequest.from_id()` classmethod. This will create your `AccessRequest()` object as before, but using existing information retrieved from the service."
]
},
{
diff --git a/backend/docs/notebooks/datacards_demo.ipynb b/backend/docs/notebooks/datacards_demo.ipynb
index a16a4c089..7ae0ad8d2 100644
--- a/backend/docs/notebooks/datacards_demo.ipynb
+++ b/backend/docs/notebooks/datacards_demo.ipynb
@@ -74,7 +74,7 @@
"\n",
"### Creating and updating the base datacard\n",
"\n",
- "In this section, we'll create a new datacard using the `Datacard.create()` classmethod. On the Bailo service, a datacard must consist of at least 4 parameters upon creation. These are **name**, **description**, **visibility** and **team_id**. Below, we use the `Client()` object created before when instantiating the new `Datacard()` object. \n",
+ "In this section, we will create a new datacard using the `Datacard.create()` classmethod. On the Bailo service, a datacard must consist of at least 4 parameters upon creation. These are **name**, **description** and **visibility**. Below, we use the `Client()` object created before when instantiating the new `Datacard()` object. \n",
"\n",
"NOTE: This creates the datacard on your Bailo service too! The `datacard_id` is assigned by the backend, and we will use this later to retrieve the datacard. *Like with models on Bailo, the actual datacard has not been populated at this stage.*"
]
@@ -85,7 +85,7 @@
"metadata": {},
"outputs": [],
"source": [
- "datacard = Datacard.create(client=client, name=\"ImageNet\", description=\"ImageNet dataset consisting of images.\", team_id=\"uncategorised\")\n",
+ "datacard = Datacard.create(client=client, name=\"ImageNet\", description=\"ImageNet dataset consisting of images.\")\n",
"\n",
"datacard_id = datacard.datacard_id"
]
@@ -131,7 +131,7 @@
"source": [
"If successful, the above will have created a new datacard, and the `data_card_version` attribute should be set to 1.\n",
"\n",
- "Next, we can populate the data using the `update_data_card()` method. This can be used any time you want to make changes, and the backend will create a new datacard version each time. We'll learn how to retrieve datacards later (either the latest, or a specific release).\n",
+ "Next, we can populate the data using the `update_data_card()` method. This can be used any time you want to make changes, and the backend will create a new datacard version each time. We will learn how to retrieve datacards later (either the latest, or a specific release).\n",
"\n",
"NOTE: Your datacard must match the schema, otherwise an error will be thrown."
]
@@ -170,7 +170,7 @@
"\n",
"### Using the .from_id() method\n",
"\n",
- "In this section, we'll retrieve our previous datacard using the `Datacard.from_id()` classmethod. This will create your `Datacard()` object as before, but using existing information retrieved from the service."
+ "In this section, we will retrieve our previous datacard using the `Datacard.from_id()` classmethod. This will create your `Datacard()` object as before, but using existing information retrieved from the service."
]
},
{
diff --git a/backend/docs/notebooks/experiment_tracking_demo.ipynb b/backend/docs/notebooks/experiment_tracking_demo.ipynb
index 4d6028355..0ac109e77 100644
--- a/backend/docs/notebooks/experiment_tracking_demo.ipynb
+++ b/backend/docs/notebooks/experiment_tracking_demo.ipynb
@@ -38,7 +38,7 @@
"\n",
"### Connecting with Bailo\n",
"\n",
- "In order to create an `Experiment()` object, you'll first need to have a Bailo `Model()` object, and thus a defined `Client()` too. We learned how to do this in a previous notebook, but this time we'll create a new model with a custom schema which supports model metrics. *More on that later...*"
+ "In order to create an `Experiment()` object, you'll first need to have a Bailo `Model()` object, and thus a defined `Client()` too. We learned how to do this in a previous notebook, but this time we will create a new model with a custom schema which supports model metrics. *More on that later...*"
]
},
{
@@ -69,7 +69,7 @@
"\n",
"# Creating a demo model\n",
"\n",
- "model = Model.create(client=client, name=\"YOLOv5\", description=\"YOLOv5 model for object detection.\", team_id=\"uncategorised\")"
+ "model = Model.create(client=client, name=\"YOLOv5\", description=\"YOLOv5 model for object detection.\")"
]
},
{
@@ -79,7 +79,7 @@
"source": [
"### Setting up MLFlow Tracking\n",
"\n",
- "In order to complete the integration element of this tutorial, we'll need to set up a local instance of MLFlow Tracking, and create a sample experiment run. *This will not contain any actual model training and is only to demonstrate the functionality of Bailo.*\n",
+ "In order to complete the integration element of this tutorial, we will need to set up a local instance of MLFlow Tracking, and create a sample experiment run. *This will not contain any actual model training and is only to demonstrate the functionality of Bailo.*\n",
"\n",
"Run `mlflow ui` on the command line. Typically this will run on **localhost:5000** and the UI can be accessed on a browser"
]
@@ -156,7 +156,7 @@
"\n",
"You can run experiments directly using the Bailo python client as follows.\n",
"\n",
- "**NOTE**: This will only work for sequential experiment runs, so if you're running experiments in parallel then it would be better to use **MLFlow Tracking**. We'll learn how to import completed experiments from MLFlow in the next section."
+ "**NOTE**: This will only work for sequential experiment runs, so if you're running experiments in parallel then it would be better to use **MLFlow Tracking**. We will learn how to import completed experiments from MLFlow in the next section."
]
},
{
@@ -218,7 +218,7 @@
"source": [
"## Importing existing experiments from MLFlow into Bailo\n",
"\n",
- "As previously mentioned, you can import existing experiments into the `Experiment()` class by using the `Experiment.from_mlflow()` method. You must provide the **MLFlow tracking URI** and the experiment ID. To get the experiement ID, go to the link provided in the cell \"Creating a dummy MLFlow experiment run\". In the details section you will see \"Experiment ID\", copy this ID and add it to the argument **experiment_id**. ![image.png](img/experiment_id.png)"
+ "You can import existing experiments into the `Experiment()` class by using the `Experiment.from_mlflow()` method. You must provide the **MLFlow tracking URI** and the experiment ID. To get the experiment ID, go to the link provided in the cell \"Creating a dummy MLFlow experiment run\". In the details section you will see \"Experiment ID\", copy this ID and add it to the argument **experiment_id**. ![image.png](img/experiment_id.png)"
]
},
{
diff --git a/backend/docs/notebooks/models_and_releases_demo_pytorch.ipynb b/backend/docs/notebooks/models_and_releases_demo_pytorch.ipynb
index 03827e9d2..988efe5ab 100644
--- a/backend/docs/notebooks/models_and_releases_demo_pytorch.ipynb
+++ b/backend/docs/notebooks/models_and_releases_demo_pytorch.ipynb
@@ -91,7 +91,7 @@
"\n",
"### Creating and updating the base model\n",
"\n",
- "In this section, we'll create a new model representing ResNet-50 using the `Model.create()` classmethod. On the Bailo service, a model must consist of at least 4 parameters upon creation. These are **name**, **description**, **visibility** and **team_id**. Other attributes like model cards, files, or releases are added later on. Below, we use the `Client()` object created before when instantiating the new `Model()` object. \n",
+ "In this section, we will create a new model representing ResNet-50 using the `Model.create()` classmethod. On the Bailo service, a model must consist of at least 4 parameters upon creation. These are **name**, **description** and **visibility**. Other attributes like model cards, files, or releases are added later on. Below, we use the `Client()` object created before when instantiating the new `Model()` object. \n",
"\n",
"NOTE: This creates the model on your Bailo service too! The `model_id` is assigned by the backend, and we will use this later to retrieve the model."
]
@@ -102,7 +102,7 @@
"metadata": {},
"outputs": [],
"source": [
- "model = Model.create(client=client, name=\"ResNet-50\", description=\"ResNet-50 model for image classification.\", team_id=\"uncategorised\")\n",
+ "model = Model.create(client=client, name=\"ResNet-50\", description=\"ResNet-50 model for image classification.\")\n",
"\n",
"model_id = model.model_id"
]
@@ -151,7 +151,7 @@
"\n",
"### Creating and populated a new model card with a template\n",
"\n",
- "When creating a model card from a template, we need to use a preexisting model card as our template. First we create a new model, to create the new model card we use the `card_from_template` method and pass our chosen template model's ID. \n",
+ "When creating a model card from a template, we need to use a pre-existing model card as our template. First we create a new model, to create the new model card we use the `card_from_template` method and pass our chosen template model's ID. \n",
"\n",
"\n"
]
@@ -163,7 +163,7 @@
"outputs": [],
"source": [
"model2 = Model.create(\n",
- " client=client, name=\"ResNet-50\", description=\"ResNet-50 model for image classification.\", team_id=\"uncategorised\"\n",
+ " client=client, name=\"ResNet-50\", description=\"ResNet-50 model for image classification.\"\n",
")\n",
"\n",
"model2_id = model2.model_id\n",
@@ -180,7 +180,7 @@
"source": [
"If successful, the above will have created a new model card, and the `model_card_version` attribute should be set to 1.\n",
"\n",
- "Next, we can populate the model card using the `update_model_card()` method. This can be used any time you want to make changes, and the backend will create a new model card version each time. We'll learn how to retrieve model cards later (either the latest, or a specific release).\n",
+ "Next, we can populate the model card using the `update_model_card()` method. This can be used any time you want to make changes, and the backend will create a new model card version each time. We will learn how to retrieve model cards later (either the latest, or a specific release).\n",
"\n",
"NOTE: Your model card must match the schema, otherwise an error will be thrown."
]
@@ -220,7 +220,7 @@
"\n",
"### Using the .from_id() method\n",
"\n",
- "In this section, we'll retrieve our previous model using the `Model.from_id()` classmethod. This will create your `Model()` object as before, but using existing information retrieved from the service."
+ "In this section, we will retrieve our previous model using the `Model.from_id()` classmethod. This will create your `Model()` object as before, but using existing information retrieved from the service."
]
},
{
@@ -337,7 +337,7 @@
"source": [
"### Downloading weights from the release\n",
"\n",
- "Similarly you can also download specific files from release using the `download()` method. In this case, we'll write them to a new file: **bailo_resnet50_weights.pth**. **NOTE**: `filename` refers to the filename on Bailo, and `path` is the local destination for your download.\n",
+ "You can also download specific files from release using the `download()` method. In this case, we will write them to a new file: **bailo_resnet50_weights.pth**. **NOTE**: `filename` refers to the filename on Bailo, and `path` is the local destination for your download.\n",
"\n",
"In addition to this, you can also use the `download_all()` method by providing a local directory path as `path`. By default, this will download all files, but you can provide `include` and `exclude` lists, e.g. `include=[\"*.txt\", \"*.json\"]` to only include TXT or JSON files. "
]
@@ -378,7 +378,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "If the message \"**All keys matched successfully**\" is displayed, we have successfully initated our model."
+ "If the message \"**All keys matched successfully**\" is displayed, we have successfully initiated our model."
]
},
{
@@ -400,7 +400,7 @@
"* Libraries used for the model (e.g. PyTorch).\n",
"* Model card search (string to be found in model cards).\n",
"\n",
- "In the below example, we'll just search for all models with no filters."
+ "In the below example, we will just search for all models with no filters."
]
},
{
diff --git a/backend/docs/notebooks/schemas_demo.ipynb b/backend/docs/notebooks/schemas_demo.ipynb
index 881da6ad0..e4eee22fc 100644
--- a/backend/docs/notebooks/schemas_demo.ipynb
+++ b/backend/docs/notebooks/schemas_demo.ipynb
@@ -1,198 +1,198 @@
{
- "cells": [
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Managing Schemas"
- ]
+ "cells": [
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Managing Schemas"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The Bailo python client enables intuitive interaction with the Bailo service, from within a python environment. This example notebook will run through the following concepts:\n",
+ "\n",
+ "* Creating a new schema on Bailo.\n",
+ "* Retrieving schemas from the service.\n",
+ "\n",
+ "Prerequisites:\n",
+ "\n",
+ "* Python 3.8.1 or higher (including a notebook environment for this demo).\n",
+ "* A local or remote Bailo service (see https://github.com/gchq/Bailo)."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introduction"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The Bailo python client is split into two sub-packages: **core** and **helper**.\n",
+ "\n",
+ "* **Core:** For direct interactions with the service endpoints.\n",
+ "* **Helper:** For more intuitive interactions with the service, using classes (e.g. Model) to handle operations.\n",
+ "\n",
+ "In order to create helper classes, you will first need to instantiate a `Client()` object from the core. By default, this object will not support any authentication. However, Bailo also supports PKI authentication, which you can use from Python by passing a `PkiAgent()` object into the `Client()` object when you instantiate it."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Necessary import statements\n",
+ "\n",
+ "from bailo import Client, Schema, SchemaKind\n",
+ "import random\n",
+ "import string\n",
+ "\n",
+ "# Instantiating the PkiAgent(), if using.\n",
+ "# agent = PkiAgent(cert='', key='', auth='')\n",
+ "\n",
+ "# Instantiating the Bailo client\n",
+ "\n",
+ "client = Client(\"http://127.0.0.1:8080\") # <- INSERT BAILO URL (if not hosting locally)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Creating a new schema"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this section, we will create a new schema using the `Schema.create()` classmethod. On the Bailo service, a schema must consist of 5 parameters upon creation. These are **schema_id**, **name**, **description**, **kind** and **json_schema**. Below, we use the `Client()` object created before when instantiating the new `Schema()` object. In this instance, **schema_id** is generated using a random generator function, however any unique identifier would suffice.\n",
+ "\n",
+ "NOTE: This creates the schema on your Bailo service too! This operation is typically reserved for administrators."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def random_generator(N=10):\n",
+ " return \"\".join(random.choices(string.ascii_uppercase + string.digits, k=N))\n",
+ "\n",
+ "json_schema = {\n",
+ " \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n",
+ " \"type\": \"object\",\n",
+ " \"properties\": {\n",
+ " \"overview\": {\n",
+ " \"title\": \"Overview\",\n",
+ " \"description\": \"Summary of the model functionality.\",\n",
+ " \"type\": \"object\",\n",
+ " \"properties\": {\n",
+ " \"modelOverview\": {\n",
+ " \"title\": \"What does the model do?\",\n",
+ " \"description\": \"A description of what the model does.\",\n",
+ " \"type\": \"string\",\n",
+ " \"minLength\": 1,\n",
+ " \"maxLength\": 5000,\n",
+ " },\n",
+ " \"tags\": {\n",
+ " \"title\": \"Descriptive tags for the model.\",\n",
+ " \"description\": \"These tags will be searchable and will help others find this model.\",\n",
+ " \"type\": \"array\",\n",
+ " \"widget\": \"tagSelectorBeta\",\n",
+ " \"items\": {\"type\": \"string\"},\n",
+ " \"uniqueItems\": True,\n",
+ " },\n",
+ " },\n",
+ " \"required\": [],\n",
+ " \"additionalProperties\": False,\n",
+ " },\n",
+ " },\n",
+ " \"required\": [],\n",
+ " \"additionalProperties\": False,\n",
+ "}\n",
+ "\n",
+ "schema = Schema.create(\n",
+ " client=client,\n",
+ " schema_id=random_generator(),\n",
+ " name=\"Test\",\n",
+ " description=\"Example Description\",\n",
+ " kind=SchemaKind.MODEL,\n",
+ " json_schema=json_schema\n",
+ ")\n",
+ "\n",
+ "schema_id = schema.schema_id "
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Retrieving an existing schema"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Using the .from_id() method"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this section, we will retrieve our previous schema using the `Schema.from_id()` classmethod. This will create your `Schema()` object as before, but using existing information retrieved from the service."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "schema = Schema.from_id(client=client, schema_id=schema_id)\n",
+ "\n",
+ "schema.description"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.12"
+ },
+ "orig_nbformat": 4
},
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The Bailo python client enables intuitive interaction with the Bailo service, from within a python environment. This example notebook will run through the following concepts:\n",
- "\n",
- "* Creating a new schema on Bailo.\n",
- "* Retrieving schemas from the service.\n",
- "\n",
- "Prerequisites:\n",
- "\n",
- "* Python 3.8.1 or higher (including a notebook environment for this demo).\n",
- "* A local or remote Bailo service (see https://github.com/gchq/Bailo)."
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Introduction"
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The Bailo python client is split into two sub-packages: **core** and **helper**.\n",
- "\n",
- "* **Core:** For direct interactions with the service endpoints.\n",
- "* **Helper:** For more intuitive interactions with the service, using classes (e.g. Model) to handle operations.\n",
- "\n",
- "In order to create helper classes, you will first need to instantiate a `Client()` object from the core. By default, this object will not support any authentication. However, Bailo also supports PKI authentication, which you can use from Python by passing a `PkiAgent()` object into the `Client()` object when you instantiate it."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Necessary import statements\n",
- "\n",
- "from bailo import Client, Schema, SchemaKind\n",
- "import random\n",
- "import string\n",
- "\n",
- "# Instantiating the PkiAgent(), if using.\n",
- "# agent = PkiAgent(cert='', key='', auth='')\n",
- "\n",
- "# Instantiating the Bailo client\n",
- "\n",
- "client = Client(\"http://127.0.0.1:8080\") # <- INSERT BAILO URL (if not hosting locally)"
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Creating a new schema"
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In this section, we'll create a new schema using the `Schema.create()` classmethod. On the Bailo service, a schema must consist of 5 parameters upon creation. These are **schema_id**, **name**, **description**, **kind** and **json_schema**. Below, we use the `Client()` object created before when instantiating the new `Schema()` object. In this instance, **schema_id** is generated using a random generator function, however any unique identifier would suffice.\n",
- "\n",
- "NOTE: This creates the schema on your Bailo service too! This operation is typically reserved for administrators."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def random_generator(N=10):\n",
- " return \"\".join(random.choices(string.ascii_uppercase + string.digits, k=N))\n",
- "\n",
- "json_schema = {\n",
- " \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n",
- " \"type\": \"object\",\n",
- " \"properties\": {\n",
- " \"overview\": {\n",
- " \"title\": \"Overview\",\n",
- " \"description\": \"Summary of the model functionality.\",\n",
- " \"type\": \"object\",\n",
- " \"properties\": {\n",
- " \"modelOverview\": {\n",
- " \"title\": \"What does the model do?\",\n",
- " \"description\": \"A description of what the model does.\",\n",
- " \"type\": \"string\",\n",
- " \"minLength\": 1,\n",
- " \"maxLength\": 5000,\n",
- " },\n",
- " \"tags\": {\n",
- " \"title\": \"Descriptive tags for the model.\",\n",
- " \"description\": \"These tags will be searchable and will help others find this model.\",\n",
- " \"type\": \"array\",\n",
- " \"widget\": \"tagSelectorBeta\",\n",
- " \"items\": {\"type\": \"string\"},\n",
- " \"uniqueItems\": True,\n",
- " },\n",
- " },\n",
- " \"required\": [],\n",
- " \"additionalProperties\": False,\n",
- " },\n",
- " },\n",
- " \"required\": [],\n",
- " \"additionalProperties\": False,\n",
- "}\n",
- "\n",
- "schema = Schema.create(\n",
- " client=client,\n",
- " schema_id=random_generator(),\n",
- " name=\"Test\",\n",
- " description=\"Example Description\",\n",
- " kind=SchemaKind.MODEL,\n",
- " json_schema=json_schema\n",
- ")\n",
- "\n",
- "schema_id = schema.schema_id "
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Retrieving an existing schema"
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Using the .from_id() method"
- ]
- },
- {
- "attachments": {},
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In this section, we'll retrieve our previous schema using the `Schema.from_id()` classmethod. This will create your `Schema()` object as before, but using existing information retrieved from the service."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "schema = Schema.from_id(client=client, schema_id=schema_id)\n",
- "\n",
- "schema.description"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.12"
- },
- "orig_nbformat": 4
- },
- "nbformat": 4,
- "nbformat_minor": 2
+ "nbformat": 4,
+ "nbformat_minor": 2
}
diff --git a/backend/package-lock.json b/backend/package-lock.json
index 697ced742..fdd1dba99 100644
--- a/backend/package-lock.json
+++ b/backend/package-lock.json
@@ -8,15 +8,15 @@
"license": "ISC",
"dependencies": {
"@asteasolutions/zod-to-openapi": "^7.2.0",
- "@aws-sdk/client-cognito-identity-provider": "3.666.0",
- "@aws-sdk/client-kms": "3.666.0",
+ "@aws-sdk/client-cognito-identity-provider": "3.708.0",
+ "@aws-sdk/client-kms": "3.699.0",
"@aws-sdk/client-s3": "3.666.0",
"@aws-sdk/lib-storage": "3.666.0",
"@opentelemetry/auto-instrumentations-node": "^0.52.0",
"@opentelemetry/exporter-logs-otlp-proto": "^0.53.0",
- "@opentelemetry/exporter-metrics-otlp-proto": "^0.53.0",
+ "@opentelemetry/exporter-metrics-otlp-proto": "^0.56.0",
"@opentelemetry/host-metrics": "^0.35.3",
- "@opentelemetry/sdk-metrics": "^1.26.0",
+ "@opentelemetry/sdk-metrics": "^1.28.0",
"@smithy/node-http-handler": "^3.1.2",
"@types/express-session": "^1.18.0",
"app-root-path": "^3.1.0",
@@ -41,16 +41,16 @@
"jsrsasign": "^11.1.0",
"lodash-es": "^4.17.21",
"mjml": "^4.15.3",
- "mongodb": "^6.9.0",
- "mongoose": "^6.13.3",
+ "mongodb": "^6.11.0",
+ "mongoose": "^6.13.5",
"mongoose-delete": "^1.0.2",
"morgan": "^1.10.0",
- "nanoid": "^5.0.8",
+ "nanoid": "^5.0.9",
"node-fetch": "^3.3.2",
- "nodemailer": "^6.9.15",
+ "nodemailer": "^6.9.16",
"outdent": "^0.8.0",
"pretty-bytes": "^6.1.1",
- "qs": "^6.12.2",
+ "qs": "^6.13.1",
"semver": "^7.6.3",
"shelljs": "^0.8.5",
"showdown": "^2.1.0",
@@ -64,7 +64,7 @@
"devDependencies": {
"@anatine/zod-mock": "^3.13.4",
"@faker-js/faker": "^8.4.1",
- "@swc/core": "^1.9.2",
+ "@swc/core": "^1.9.3",
"@types/archiver": "^6.0.3",
"@types/bcryptjs": "^2.4.6",
"@types/bunyan": "^1.8.11",
@@ -78,7 +78,7 @@
"@types/mongoose-delete": "^1.0.6",
"@types/morgan": "^1.9.9",
"@types/node": "^22.7.5",
- "@types/nodemailer": "^6.4.16",
+ "@types/nodemailer": "^6.4.17",
"@types/semver": "^7.5.8",
"@types/shelljs": "^0.8.15",
"@types/supertest": "^6.0.2",
@@ -382,49 +382,49 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.666.0.tgz",
- "integrity": "sha512-1m37H+TxmPg9HwxXfV5PV0MaP2rNw5oG926YIwSXEgCRJSDhK7uQDuPrZY5C4KRonuV7Izo16TimgnxZimQlPg==",
+ "version": "3.708.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.708.0.tgz",
+ "integrity": "sha512-xNUJ6mploA2+YEDW8O5ah6q3A93bJzs1nnz8nMS2WWWGN/l1rNbWMjfK2tsrdST0ULfvoRCycp7DgLUEawFYrw==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.666.0",
- "@aws-sdk/client-sts": "3.666.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/credential-provider-node": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/client-sso-oidc": "3.699.0",
+ "@aws-sdk/client-sts": "3.699.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-node": "3.699.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -433,46 +433,46 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/client-sso": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.666.0.tgz",
- "integrity": "sha512-+h5Xk64dM4on1MwjTYxlwtI8ilytU7zjTVRzMAYOysmH71Bc8YsLOfonFHvzhF/AXpKJu3f1BhM65S0tasPcrw==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.696.0.tgz",
+ "integrity": "sha512-q5TTkd08JS0DOkHfUL853tuArf7NrPeqoS5UOvqJho8ibV9Ak/a/HO4kNvy9Nj3cib/toHYHsQIEtecUPSUUrQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -481,47 +481,47 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/client-sso-oidc": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.666.0.tgz",
- "integrity": "sha512-mW//v5EvHMU2SulW1FqmjJJPDNhzySRb/YUU+jq9AFDIYUdjF6j6wM+iavCW/4gLqOct0RT7B62z8jqyHkUCEQ==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.699.0.tgz",
+ "integrity": "sha512-u8a1GorY5D1l+4FQAf4XBUC1T10/t7neuwT21r0ymrtMFSK2a9QqVHKMoLkvavAwyhJnARSBM9/UQC797PFOFw==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/credential-provider-node": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-node": "3.699.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -529,52 +529,52 @@
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.666.0"
+ "@aws-sdk/client-sts": "^3.699.0"
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/client-sts": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.666.0.tgz",
- "integrity": "sha512-tw8yxcxvaj0d/A4YJXIh3mISzsQe8rThIVKvpyhEdl1lEoz81skCccX5u3gHajciSdga/V0DxhBbsO+eE1bZkw==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.699.0.tgz",
+ "integrity": "sha512-++lsn4x2YXsZPIzFVwv3fSUVM55ZT0WRFmPeNilYIhZClxHLmVAWKH4I55cY9ry60/aTKYjzOXkWwyBKGsGvQg==",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.666.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/credential-provider-node": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/client-sso-oidc": "3.699.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-node": "3.699.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -583,19 +583,19 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/core": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.666.0.tgz",
- "integrity": "sha512-jxNjs0sAVX+CWwoa4kHUENLHuBwjT1EILBoctmQoiIb1v5KpKwZnSByHTpvUkFmbuwWQPEnJkJCqzIHjEmjisA==",
- "dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/core": "^2.4.8",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/signature-v4": "^4.2.0",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/util-middleware": "^3.0.7",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.696.0.tgz",
+ "integrity": "sha512-3c9III1k03DgvRZWg8vhVmfIXPG6hAciN9MzQTzqGngzWAELZF/WONRTRQuDFixVtarQatmLHYVw/atGeA2Byw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/core": "^2.5.3",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/signature-v4": "^4.2.2",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-middleware": "^3.0.10",
"fast-xml-parser": "4.4.1",
"tslib": "^2.6.2"
},
@@ -604,13 +604,14 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-env": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.664.0.tgz",
- "integrity": "sha512-95rE+9Voaco0nmKJrXqfJAxSSkSWqlBy76zomiZrUrv7YuijQtHCW8jte6v6UHAFAaBzgFsY7QqBxs15u9SM7g==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.696.0.tgz",
+ "integrity": "sha512-T9iMFnJL7YTlESLpVFT3fg1Lkb1lD+oiaIC8KMpepb01gDUBIpj9+Y+pA/cgRWW0yRxmkDXNazAE2qQTVFGJzA==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -618,18 +619,19 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-http": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.666.0.tgz",
- "integrity": "sha512-j1Cob+tYmJ/m9agSsFPdAhLfILBqZzolF17XJvmEzQC2edltQ6NR0Wd09GQvtiAFZy7gn1l40bKuxX6Tq5U6XQ==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.696.0.tgz",
+ "integrity": "sha512-GV6EbvPi2eq1+WgY/o2RFA3P7HGmnkIzCNmhwtALFlqMroLYWKE7PSeHw66Uh1dFQeVESn0/+hiUNhu1mB0emA==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/util-stream": "^3.1.9",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-stream": "^3.3.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -637,45 +639,46 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-ini": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.666.0.tgz",
- "integrity": "sha512-u09aUZJQNK8zVAKJKEOQ2mLsv39YxR20US00/WAPNW9sMWWhl4raT97tsalOUc6ZTHOEqHHmEVZXuscINnkaww==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.699.0.tgz",
+ "integrity": "sha512-dXmCqjJnKmG37Q+nLjPVu22mNkrGHY8hYoOt3Jo9R2zr5MYV7s/NHsCHr+7E+BZ+tfZYLRPeB1wkpTeHiEcdRw==",
"dependencies": {
- "@aws-sdk/credential-provider-env": "3.664.0",
- "@aws-sdk/credential-provider-http": "3.666.0",
- "@aws-sdk/credential-provider-process": "3.664.0",
- "@aws-sdk/credential-provider-sso": "3.666.0",
- "@aws-sdk/credential-provider-web-identity": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/credential-provider-imds": "^3.2.4",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-env": "3.696.0",
+ "@aws-sdk/credential-provider-http": "3.696.0",
+ "@aws-sdk/credential-provider-process": "3.696.0",
+ "@aws-sdk/credential-provider-sso": "3.699.0",
+ "@aws-sdk/credential-provider-web-identity": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/credential-provider-imds": "^3.2.6",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.666.0"
+ "@aws-sdk/client-sts": "^3.699.0"
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-node": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.666.0.tgz",
- "integrity": "sha512-C43L9kxAb2lvIZ+eKVuyX9xYrkpg+Zyq0fLasK1wekC6M/Qj/uqE1KFz9ddDE8Dv1HwiE+UZk5psM0KatQpPGQ==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.699.0.tgz",
+ "integrity": "sha512-MmEmNDo1bBtTgRmdNfdQksXu4uXe66s0p1hi1YPrn1h59Q605eq/xiWbGL6/3KdkViH6eGUuABeV2ODld86ylg==",
"dependencies": {
- "@aws-sdk/credential-provider-env": "3.664.0",
- "@aws-sdk/credential-provider-http": "3.666.0",
- "@aws-sdk/credential-provider-ini": "3.666.0",
- "@aws-sdk/credential-provider-process": "3.664.0",
- "@aws-sdk/credential-provider-sso": "3.666.0",
- "@aws-sdk/credential-provider-web-identity": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/credential-provider-imds": "^3.2.4",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/credential-provider-env": "3.696.0",
+ "@aws-sdk/credential-provider-http": "3.696.0",
+ "@aws-sdk/credential-provider-ini": "3.699.0",
+ "@aws-sdk/credential-provider-process": "3.696.0",
+ "@aws-sdk/credential-provider-sso": "3.699.0",
+ "@aws-sdk/credential-provider-web-identity": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/credential-provider-imds": "^3.2.6",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -683,14 +686,15 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-process": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.664.0.tgz",
- "integrity": "sha512-sQicIw/qWTsmMw8EUQNJXdrWV5SXaZc2zGdCQsQxhR6wwNO2/rZ5JmzdcwUADmleBVyPYk3KGLhcofF/qXT2Ng==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.696.0.tgz",
+ "integrity": "sha512-mL1RcFDe9sfmyU5K1nuFkO8UiJXXxLX4JO1gVaDIOvPqwStpUAwi3A1BoeZhWZZNQsiKI810RnYGo0E0WB/hUA==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -698,16 +702,17 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.666.0.tgz",
- "integrity": "sha512-aaa5Ig8hI7lSh1CSQP0oaLvjylz6+3mKUgdvw69zv0MdX3TUZiQRDCsfqK0P3VNsj/QSvBytSjuNDuSaYcACJg==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.699.0.tgz",
+ "integrity": "sha512-Ekp2cZG4pl9D8+uKWm4qO1xcm8/MeiI8f+dnlZm8aQzizeC+aXYy9GyoclSf6daK8KfRPiRfM7ZHBBL5dAfdMA==",
"dependencies": {
- "@aws-sdk/client-sso": "3.666.0",
- "@aws-sdk/token-providers": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/client-sso": "3.696.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/token-providers": "3.699.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -715,30 +720,31 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/credential-provider-web-identity": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.664.0.tgz",
- "integrity": "sha512-10ltP1BfSKRJVXd8Yr5oLbo+VSDskWbps0X3szSsxTk0Dju1xvkz7hoIjylWLvtGbvQ+yb2pmsJYKCudW/4DJg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.696.0.tgz",
+ "integrity": "sha512-XJ/CVlWChM0VCoc259vWguFUjJDn/QwDqHwbx+K9cg3v6yrqXfK5ai+p/6lx0nQpnk4JzPVeYYxWRpaTsGC9rg==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.664.0"
+ "@aws-sdk/client-sts": "^3.696.0"
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/middleware-host-header": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.664.0.tgz",
- "integrity": "sha512-4tCXJ+DZWTq38eLmFgnEmO8X4jfWpgPbWoCyVYpRHCPHq6xbrU65gfwS9jGx25L4YdEce641ChI9TKLryuUgRA==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.696.0.tgz",
+ "integrity": "sha512-zELJp9Ta2zkX7ELggMN9qMCgekqZhFC5V2rOr4hJDEb/Tte7gpfKSObAnw/3AYiVqt36sjHKfdkoTsuwGdEoDg==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -746,12 +752,12 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/middleware-logger": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.664.0.tgz",
- "integrity": "sha512-eNykMqQuv7eg9pAcaLro44fscIe1VkFfhm+gYnlxd+PH6xqapRki1E68VHehnIptnVBdqnWfEqLUSLGm9suqhg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.696.0.tgz",
+ "integrity": "sha512-KhkHt+8AjCxcR/5Zp3++YPJPpFQzxpr+jmONiT/Jw2yqnSngZ0Yspm5wGoRx2hS1HJbyZNuaOWEGuJoxLeBKfA==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -759,13 +765,13 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/middleware-recursion-detection": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.664.0.tgz",
- "integrity": "sha512-jq27WMZhm+dY8BWZ9Ipy3eXtZj0lJzpaKQE3A3tH5AOIlUV/gqrmnJ9CdqVVef4EJsq9Yil4ZzQjKKmPsxveQg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.696.0.tgz",
+ "integrity": "sha512-si/maV3Z0hH7qa99f9ru2xpS5HlfSVcasRlNUXKSDm611i7jFMWwGNLUOXFAOLhXotPX5G3Z6BLwL34oDeBMug==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -773,16 +779,16 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.666.0.tgz",
- "integrity": "sha512-d8XJ103SGCMsFIKEowpOaZr0W8AkLNd+3CS7W95yb6YmN7lcNGL54RtTSy3m8YJI6W2jXftPFN2oLG4K3aywVQ==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.696.0.tgz",
+ "integrity": "sha512-Lvyj8CTyxrHI6GHd2YVZKIRI5Fmnugt3cpJo0VrKKEgK5zMySwEZ1n4dqPK6czYRWKd5+WnYHYAuU+Wdk6Jsjw==",
"dependencies": {
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@smithy/core": "^2.4.8",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@smithy/core": "^2.5.3",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -790,15 +796,15 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/region-config-resolver": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.664.0.tgz",
- "integrity": "sha512-o/B8dg8K+9714RGYPgMxZgAChPe/MTSMkf/eHXTUFHNik5i1HgVKfac22njV2iictGy/6GhpFsKa1OWNYAkcUg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.696.0.tgz",
+ "integrity": "sha512-7EuH142lBXjI8yH6dVS/CZeiK/WZsmb/8zP6bQbVYpMrppSTgB3MzZZdxVZGzL5r8zPQOU10wLC4kIMy0qdBVQ==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"@smithy/util-config-provider": "^3.0.0",
- "@smithy/util-middleware": "^3.0.7",
+ "@smithy/util-middleware": "^3.0.10",
"tslib": "^2.6.2"
},
"engines": {
@@ -806,29 +812,29 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/token-providers": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.664.0.tgz",
- "integrity": "sha512-dBAvXW2/6bAxidvKARFxyCY2uCynYBKRFN00NhS1T5ggxm3sUnuTpWw1DTjl02CVPkacBOocZf10h8pQbHSK8w==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.699.0.tgz",
+ "integrity": "sha512-kuiEW9DWs7fNos/SM+y58HCPhcIzm1nEZLhe2/7/6+TvAYLuEWURYsbK48gzsxXlaJ2k/jGY3nIsA7RptbMOwA==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sso-oidc": "^3.664.0"
+ "@aws-sdk/client-sso-oidc": "^3.699.0"
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/types": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz",
- "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.696.0.tgz",
+ "integrity": "sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw==",
"dependencies": {
- "@smithy/types": "^3.5.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -836,13 +842,13 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/util-endpoints": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.664.0.tgz",
- "integrity": "sha512-KrXoHz6zmAahVHkyWMRT+P6xJaxItgmklxEDrT+npsUB4d5C/lhw16Crcp9TDi828fiZK3GYKRAmmNhvmzvBNg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.696.0.tgz",
+ "integrity": "sha512-T5s0IlBVX+gkb9g/I6CLt4yAZVzMSiGnbUqWihWsHvQR1WOoIcndQy/Oz/IJXT9T2ipoy7a80gzV6a5mglrioA==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/types": "^3.5.0",
- "@smithy/util-endpoints": "^2.1.3",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-endpoints": "^2.1.6",
"tslib": "^2.6.2"
},
"engines": {
@@ -850,25 +856,25 @@
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/util-user-agent-browser": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.664.0.tgz",
- "integrity": "sha512-c/PV3+f1ss4PpskHbcOxTZ6fntV2oXy/xcDR9nW+kVaz5cM1G702gF0rvGLKPqoBwkj2rWGe6KZvEBeLzynTUQ==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.696.0.tgz",
+ "integrity": "sha512-Z5rVNDdmPOe6ELoM5AhF/ja5tSjbe6ctSctDPb0JdDf4dT0v2MfwhJKzXju2RzX8Es/77Glh7MlaXLE0kCB9+Q==",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/types": "^3.7.1",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
}
},
"node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.666.0.tgz",
- "integrity": "sha512-DzbOMcAqrn51Z0fz5FvofaYmQA+sOJKO2cb8zQrix3TkzsTw1vRLo/cgQUJuJRGptbQCe1gnj7+21Gd5hpU6Ag==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.696.0.tgz",
+ "integrity": "sha512-KhKqcfyXIB0SCCt+qsu4eJjsfiOrNzK5dCV7RAW2YIpp+msxGUUX0NdRE9rkzjiv+3EMktgJm3eEIS+yxtlVdQ==",
"dependencies": {
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -883,50 +889,63 @@
}
}
},
+ "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/fetch-http-handler": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz",
+ "integrity": "sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.8",
+ "@smithy/querystring-builder": "^3.0.11",
+ "@smithy/types": "^3.7.2",
+ "@smithy/util-base64": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
"node_modules/@aws-sdk/client-kms": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.666.0.tgz",
- "integrity": "sha512-HzFJpVfKPEX1mlpI70Xg6IaUtFwRKv7hpuHEhbszJQdelt4YMeCjwq3ZAStFz7ad4QkCcACn1xoqv0jFD6EdBA==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.699.0.tgz",
+ "integrity": "sha512-YrUMb0JX0XBfBxUaeSu7TTTvVOpbaSmAHhvC0nYF9haagaJJpCoUXgCCeRJF6ZVjesda+mDN3OktRsfIIsCmeA==",
+ "license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.666.0",
- "@aws-sdk/client-sts": "3.666.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/credential-provider-node": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/client-sso-oidc": "3.699.0",
+ "@aws-sdk/client-sts": "3.699.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-node": "3.699.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -935,46 +954,47 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/client-sso": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.666.0.tgz",
- "integrity": "sha512-+h5Xk64dM4on1MwjTYxlwtI8ilytU7zjTVRzMAYOysmH71Bc8YsLOfonFHvzhF/AXpKJu3f1BhM65S0tasPcrw==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.696.0.tgz",
+ "integrity": "sha512-q5TTkd08JS0DOkHfUL853tuArf7NrPeqoS5UOvqJho8ibV9Ak/a/HO4kNvy9Nj3cib/toHYHsQIEtecUPSUUrQ==",
+ "license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -983,47 +1003,48 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/client-sso-oidc": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.666.0.tgz",
- "integrity": "sha512-mW//v5EvHMU2SulW1FqmjJJPDNhzySRb/YUU+jq9AFDIYUdjF6j6wM+iavCW/4gLqOct0RT7B62z8jqyHkUCEQ==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.699.0.tgz",
+ "integrity": "sha512-u8a1GorY5D1l+4FQAf4XBUC1T10/t7neuwT21r0ymrtMFSK2a9QqVHKMoLkvavAwyhJnARSBM9/UQC797PFOFw==",
+ "license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/credential-provider-node": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-node": "3.699.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -1031,52 +1052,53 @@
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.666.0"
+ "@aws-sdk/client-sts": "^3.699.0"
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/client-sts": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.666.0.tgz",
- "integrity": "sha512-tw8yxcxvaj0d/A4YJXIh3mISzsQe8rThIVKvpyhEdl1lEoz81skCccX5u3gHajciSdga/V0DxhBbsO+eE1bZkw==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.699.0.tgz",
+ "integrity": "sha512-++lsn4x2YXsZPIzFVwv3fSUVM55ZT0WRFmPeNilYIhZClxHLmVAWKH4I55cY9ry60/aTKYjzOXkWwyBKGsGvQg==",
+ "license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/client-sso-oidc": "3.666.0",
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/credential-provider-node": "3.666.0",
- "@aws-sdk/middleware-host-header": "3.664.0",
- "@aws-sdk/middleware-logger": "3.664.0",
- "@aws-sdk/middleware-recursion-detection": "3.664.0",
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/region-config-resolver": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@aws-sdk/util-user-agent-browser": "3.664.0",
- "@aws-sdk/util-user-agent-node": "3.666.0",
- "@smithy/config-resolver": "^3.0.9",
- "@smithy/core": "^2.4.8",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/hash-node": "^3.0.7",
- "@smithy/invalid-dependency": "^3.0.7",
- "@smithy/middleware-content-length": "^3.0.9",
- "@smithy/middleware-endpoint": "^3.1.4",
- "@smithy/middleware-retry": "^3.0.23",
- "@smithy/middleware-serde": "^3.0.7",
- "@smithy/middleware-stack": "^3.0.7",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/url-parser": "^3.0.7",
+ "@aws-sdk/client-sso-oidc": "3.699.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-node": "3.699.0",
+ "@aws-sdk/middleware-host-header": "3.696.0",
+ "@aws-sdk/middleware-logger": "3.696.0",
+ "@aws-sdk/middleware-recursion-detection": "3.696.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/region-config-resolver": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@aws-sdk/util-user-agent-browser": "3.696.0",
+ "@aws-sdk/util-user-agent-node": "3.696.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/core": "^2.5.3",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/hash-node": "^3.0.10",
+ "@smithy/invalid-dependency": "^3.0.10",
+ "@smithy/middleware-content-length": "^3.0.12",
+ "@smithy/middleware-endpoint": "^3.2.3",
+ "@smithy/middleware-retry": "^3.0.27",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-body-length-browser": "^3.0.0",
"@smithy/util-body-length-node": "^3.0.0",
- "@smithy/util-defaults-mode-browser": "^3.0.23",
- "@smithy/util-defaults-mode-node": "^3.0.23",
- "@smithy/util-endpoints": "^2.1.3",
- "@smithy/util-middleware": "^3.0.7",
- "@smithy/util-retry": "^3.0.7",
+ "@smithy/util-defaults-mode-browser": "^3.0.27",
+ "@smithy/util-defaults-mode-node": "^3.0.27",
+ "@smithy/util-endpoints": "^2.1.6",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -1085,19 +1107,20 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/core": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.666.0.tgz",
- "integrity": "sha512-jxNjs0sAVX+CWwoa4kHUENLHuBwjT1EILBoctmQoiIb1v5KpKwZnSByHTpvUkFmbuwWQPEnJkJCqzIHjEmjisA==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.696.0.tgz",
+ "integrity": "sha512-3c9III1k03DgvRZWg8vhVmfIXPG6hAciN9MzQTzqGngzWAELZF/WONRTRQuDFixVtarQatmLHYVw/atGeA2Byw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/core": "^2.4.8",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/signature-v4": "^4.2.0",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/util-middleware": "^3.0.7",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/core": "^2.5.3",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/signature-v4": "^4.2.2",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-middleware": "^3.0.10",
"fast-xml-parser": "4.4.1",
"tslib": "^2.6.2"
},
@@ -1106,13 +1129,15 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-env": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.664.0.tgz",
- "integrity": "sha512-95rE+9Voaco0nmKJrXqfJAxSSkSWqlBy76zomiZrUrv7YuijQtHCW8jte6v6UHAFAaBzgFsY7QqBxs15u9SM7g==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.696.0.tgz",
+ "integrity": "sha512-T9iMFnJL7YTlESLpVFT3fg1Lkb1lD+oiaIC8KMpepb01gDUBIpj9+Y+pA/cgRWW0yRxmkDXNazAE2qQTVFGJzA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1120,18 +1145,20 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-http": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.666.0.tgz",
- "integrity": "sha512-j1Cob+tYmJ/m9agSsFPdAhLfILBqZzolF17XJvmEzQC2edltQ6NR0Wd09GQvtiAFZy7gn1l40bKuxX6Tq5U6XQ==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.696.0.tgz",
+ "integrity": "sha512-GV6EbvPi2eq1+WgY/o2RFA3P7HGmnkIzCNmhwtALFlqMroLYWKE7PSeHw66Uh1dFQeVESn0/+hiUNhu1mB0emA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/fetch-http-handler": "^3.2.9",
- "@smithy/node-http-handler": "^3.2.4",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/smithy-client": "^3.4.0",
- "@smithy/types": "^3.5.0",
- "@smithy/util-stream": "^3.1.9",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/smithy-client": "^3.4.4",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-stream": "^3.3.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1139,45 +1166,48 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-ini": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.666.0.tgz",
- "integrity": "sha512-u09aUZJQNK8zVAKJKEOQ2mLsv39YxR20US00/WAPNW9sMWWhl4raT97tsalOUc6ZTHOEqHHmEVZXuscINnkaww==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.699.0.tgz",
+ "integrity": "sha512-dXmCqjJnKmG37Q+nLjPVu22mNkrGHY8hYoOt3Jo9R2zr5MYV7s/NHsCHr+7E+BZ+tfZYLRPeB1wkpTeHiEcdRw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/credential-provider-env": "3.664.0",
- "@aws-sdk/credential-provider-http": "3.666.0",
- "@aws-sdk/credential-provider-process": "3.664.0",
- "@aws-sdk/credential-provider-sso": "3.666.0",
- "@aws-sdk/credential-provider-web-identity": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/credential-provider-imds": "^3.2.4",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/credential-provider-env": "3.696.0",
+ "@aws-sdk/credential-provider-http": "3.696.0",
+ "@aws-sdk/credential-provider-process": "3.696.0",
+ "@aws-sdk/credential-provider-sso": "3.699.0",
+ "@aws-sdk/credential-provider-web-identity": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/credential-provider-imds": "^3.2.6",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.666.0"
+ "@aws-sdk/client-sts": "^3.699.0"
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-node": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.666.0.tgz",
- "integrity": "sha512-C43L9kxAb2lvIZ+eKVuyX9xYrkpg+Zyq0fLasK1wekC6M/Qj/uqE1KFz9ddDE8Dv1HwiE+UZk5psM0KatQpPGQ==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.699.0.tgz",
+ "integrity": "sha512-MmEmNDo1bBtTgRmdNfdQksXu4uXe66s0p1hi1YPrn1h59Q605eq/xiWbGL6/3KdkViH6eGUuABeV2ODld86ylg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/credential-provider-env": "3.664.0",
- "@aws-sdk/credential-provider-http": "3.666.0",
- "@aws-sdk/credential-provider-ini": "3.666.0",
- "@aws-sdk/credential-provider-process": "3.664.0",
- "@aws-sdk/credential-provider-sso": "3.666.0",
- "@aws-sdk/credential-provider-web-identity": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/credential-provider-imds": "^3.2.4",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/credential-provider-env": "3.696.0",
+ "@aws-sdk/credential-provider-http": "3.696.0",
+ "@aws-sdk/credential-provider-ini": "3.699.0",
+ "@aws-sdk/credential-provider-process": "3.696.0",
+ "@aws-sdk/credential-provider-sso": "3.699.0",
+ "@aws-sdk/credential-provider-web-identity": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/credential-provider-imds": "^3.2.6",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1185,14 +1215,16 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-process": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.664.0.tgz",
- "integrity": "sha512-sQicIw/qWTsmMw8EUQNJXdrWV5SXaZc2zGdCQsQxhR6wwNO2/rZ5JmzdcwUADmleBVyPYk3KGLhcofF/qXT2Ng==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.696.0.tgz",
+ "integrity": "sha512-mL1RcFDe9sfmyU5K1nuFkO8UiJXXxLX4JO1gVaDIOvPqwStpUAwi3A1BoeZhWZZNQsiKI810RnYGo0E0WB/hUA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1200,16 +1232,18 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-sso": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.666.0.tgz",
- "integrity": "sha512-aaa5Ig8hI7lSh1CSQP0oaLvjylz6+3mKUgdvw69zv0MdX3TUZiQRDCsfqK0P3VNsj/QSvBytSjuNDuSaYcACJg==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.699.0.tgz",
+ "integrity": "sha512-Ekp2cZG4pl9D8+uKWm4qO1xcm8/MeiI8f+dnlZm8aQzizeC+aXYy9GyoclSf6daK8KfRPiRfM7ZHBBL5dAfdMA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/client-sso": "3.666.0",
- "@aws-sdk/token-providers": "3.664.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/client-sso": "3.696.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/token-providers": "3.699.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1217,30 +1251,33 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/credential-provider-web-identity": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.664.0.tgz",
- "integrity": "sha512-10ltP1BfSKRJVXd8Yr5oLbo+VSDskWbps0X3szSsxTk0Dju1xvkz7hoIjylWLvtGbvQ+yb2pmsJYKCudW/4DJg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.696.0.tgz",
+ "integrity": "sha512-XJ/CVlWChM0VCoc259vWguFUjJDn/QwDqHwbx+K9cg3v6yrqXfK5ai+p/6lx0nQpnk4JzPVeYYxWRpaTsGC9rg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sts": "^3.664.0"
+ "@aws-sdk/client-sts": "^3.696.0"
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/middleware-host-header": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.664.0.tgz",
- "integrity": "sha512-4tCXJ+DZWTq38eLmFgnEmO8X4jfWpgPbWoCyVYpRHCPHq6xbrU65gfwS9jGx25L4YdEce641ChI9TKLryuUgRA==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.696.0.tgz",
+ "integrity": "sha512-zELJp9Ta2zkX7ELggMN9qMCgekqZhFC5V2rOr4hJDEb/Tte7gpfKSObAnw/3AYiVqt36sjHKfdkoTsuwGdEoDg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1248,12 +1285,13 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/middleware-logger": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.664.0.tgz",
- "integrity": "sha512-eNykMqQuv7eg9pAcaLro44fscIe1VkFfhm+gYnlxd+PH6xqapRki1E68VHehnIptnVBdqnWfEqLUSLGm9suqhg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.696.0.tgz",
+ "integrity": "sha512-KhkHt+8AjCxcR/5Zp3++YPJPpFQzxpr+jmONiT/Jw2yqnSngZ0Yspm5wGoRx2hS1HJbyZNuaOWEGuJoxLeBKfA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1261,13 +1299,14 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/middleware-recursion-detection": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.664.0.tgz",
- "integrity": "sha512-jq27WMZhm+dY8BWZ9Ipy3eXtZj0lJzpaKQE3A3tH5AOIlUV/gqrmnJ9CdqVVef4EJsq9Yil4ZzQjKKmPsxveQg==",
- "dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.696.0.tgz",
+ "integrity": "sha512-si/maV3Z0hH7qa99f9ru2xpS5HlfSVcasRlNUXKSDm611i7jFMWwGNLUOXFAOLhXotPX5G3Z6BLwL34oDeBMug==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1275,16 +1314,17 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.666.0.tgz",
- "integrity": "sha512-d8XJ103SGCMsFIKEowpOaZr0W8AkLNd+3CS7W95yb6YmN7lcNGL54RtTSy3m8YJI6W2jXftPFN2oLG4K3aywVQ==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.696.0.tgz",
+ "integrity": "sha512-Lvyj8CTyxrHI6GHd2YVZKIRI5Fmnugt3cpJo0VrKKEgK5zMySwEZ1n4dqPK6czYRWKd5+WnYHYAuU+Wdk6Jsjw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "3.666.0",
- "@aws-sdk/types": "3.664.0",
- "@aws-sdk/util-endpoints": "3.664.0",
- "@smithy/core": "^2.4.8",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/core": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@aws-sdk/util-endpoints": "3.696.0",
+ "@smithy/core": "^2.5.3",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1292,15 +1332,16 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/region-config-resolver": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.664.0.tgz",
- "integrity": "sha512-o/B8dg8K+9714RGYPgMxZgAChPe/MTSMkf/eHXTUFHNik5i1HgVKfac22njV2iictGy/6GhpFsKa1OWNYAkcUg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.696.0.tgz",
+ "integrity": "sha512-7EuH142lBXjI8yH6dVS/CZeiK/WZsmb/8zP6bQbVYpMrppSTgB3MzZZdxVZGzL5r8zPQOU10wLC4kIMy0qdBVQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"@smithy/util-config-provider": "^3.0.0",
- "@smithy/util-middleware": "^3.0.7",
+ "@smithy/util-middleware": "^3.0.10",
"tslib": "^2.6.2"
},
"engines": {
@@ -1308,29 +1349,31 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/token-providers": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.664.0.tgz",
- "integrity": "sha512-dBAvXW2/6bAxidvKARFxyCY2uCynYBKRFN00NhS1T5ggxm3sUnuTpWw1DTjl02CVPkacBOocZf10h8pQbHSK8w==",
+ "version": "3.699.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.699.0.tgz",
+ "integrity": "sha512-kuiEW9DWs7fNos/SM+y58HCPhcIzm1nEZLhe2/7/6+TvAYLuEWURYsbK48gzsxXlaJ2k/jGY3nIsA7RptbMOwA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/property-provider": "^3.1.7",
- "@smithy/shared-ini-file-loader": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/property-provider": "^3.1.9",
+ "@smithy/shared-ini-file-loader": "^3.1.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "@aws-sdk/client-sso-oidc": "^3.664.0"
+ "@aws-sdk/client-sso-oidc": "^3.699.0"
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/types": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz",
- "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.696.0.tgz",
+ "integrity": "sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.5.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1338,13 +1381,14 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/util-endpoints": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.664.0.tgz",
- "integrity": "sha512-KrXoHz6zmAahVHkyWMRT+P6xJaxItgmklxEDrT+npsUB4d5C/lhw16Crcp9TDi828fiZK3GYKRAmmNhvmzvBNg==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.696.0.tgz",
+ "integrity": "sha512-T5s0IlBVX+gkb9g/I6CLt4yAZVzMSiGnbUqWihWsHvQR1WOoIcndQy/Oz/IJXT9T2ipoy7a80gzV6a5mglrioA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/types": "^3.5.0",
- "@smithy/util-endpoints": "^2.1.3",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-endpoints": "^2.1.6",
"tslib": "^2.6.2"
},
"engines": {
@@ -1352,25 +1396,27 @@
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/util-user-agent-browser": {
- "version": "3.664.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.664.0.tgz",
- "integrity": "sha512-c/PV3+f1ss4PpskHbcOxTZ6fntV2oXy/xcDR9nW+kVaz5cM1G702gF0rvGLKPqoBwkj2rWGe6KZvEBeLzynTUQ==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.696.0.tgz",
+ "integrity": "sha512-Z5rVNDdmPOe6ELoM5AhF/ja5tSjbe6ctSctDPb0JdDf4dT0v2MfwhJKzXju2RzX8Es/77Glh7MlaXLE0kCB9+Q==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/types": "3.664.0",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/types": "^3.7.1",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
}
},
"node_modules/@aws-sdk/client-kms/node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.666.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.666.0.tgz",
- "integrity": "sha512-DzbOMcAqrn51Z0fz5FvofaYmQA+sOJKO2cb8zQrix3TkzsTw1vRLo/cgQUJuJRGptbQCe1gnj7+21Gd5hpU6Ag==",
+ "version": "3.696.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.696.0.tgz",
+ "integrity": "sha512-KhKqcfyXIB0SCCt+qsu4eJjsfiOrNzK5dCV7RAW2YIpp+msxGUUX0NdRE9rkzjiv+3EMktgJm3eEIS+yxtlVdQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/middleware-user-agent": "3.666.0",
- "@aws-sdk/types": "3.664.0",
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@aws-sdk/middleware-user-agent": "3.696.0",
+ "@aws-sdk/types": "3.696.0",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -1385,6 +1431,19 @@
}
}
},
+ "node_modules/@aws-sdk/client-kms/node_modules/@smithy/fetch-http-handler": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.1.tgz",
+ "integrity": "sha512-bH7QW0+JdX0bPBadXt8GwMof/jz0H28I84hU1Uet9ISpzUqXqRQ3fEZJ+ANPOhzSEczYvANNl3uDQDYArSFDtA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/querystring-builder": "^3.0.10",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-base64": "^3.0.0",
+ "tslib": "^2.6.2"
+ }
+ },
"node_modules/@aws-sdk/client-s3": {
"version": "3.666.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.666.0.tgz",
@@ -3429,9 +3488,9 @@
}
},
"node_modules/@mongodb-js/saslprep": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz",
- "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
+ "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
"dependencies": {
"sparse-bitfield": "^3.0.3"
}
@@ -3717,26 +3776,268 @@
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": {
+ "version": "0.54.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz",
+ "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz",
+ "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.54.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.54.0.tgz",
+ "integrity": "sha512-g+H7+QleVF/9lz4zhaR9Dt4VwApjqG5WWupy5CTMpWJfHB/nLxBbX73GBZDgdiNfh08nO3rNa6AS7fK8OhgF5g==",
+ "dependencies": {
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/otlp-transformer": "0.54.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.54.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.54.0.tgz",
+ "integrity": "sha512-jRexIASQQzdK4AjfNIBfn94itAq4Q8EXR9d3b/OVbhd3kKQKvMr7GkxYDjbeTbY7hHCOLcLfJ3dpYQYGOe8qOQ==",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.54.0",
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/resources": "1.27.0",
+ "@opentelemetry/sdk-logs": "0.54.0",
+ "@opentelemetry/sdk-metrics": "1.27.0",
+ "@opentelemetry/sdk-trace-base": "1.27.0",
+ "protobufjs": "^7.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.27.0.tgz",
+ "integrity": "sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.54.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.54.0.tgz",
+ "integrity": "sha512-HeWvOPiWhEw6lWvg+lCIi1WhJnIPbI4/OFZgHq9tKfpwF3LX6/kk3+GR8sGUGAEZfbjPElkkngzvd2s03zbD7Q==",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.54.0",
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/resources": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.27.0.tgz",
+ "integrity": "sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==",
+ "dependencies": {
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/resources": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.27.0.tgz",
+ "integrity": "sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/resources": "1.27.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto": {
+ "version": "0.53.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.53.0.tgz",
+ "integrity": "sha512-jhEcVL1deeWNmTUP05UZMriZPSWUBcfg94ng7JuBb1q2NExgnADQFl1VQQ+xo62/JepK+MxQe4xAwlsDQFbISA==",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.53.0",
+ "@opentelemetry/core": "1.26.0",
+ "@opentelemetry/otlp-exporter-base": "0.53.0",
+ "@opentelemetry/otlp-transformer": "0.53.0",
+ "@opentelemetry/resources": "1.26.0",
+ "@opentelemetry/sdk-logs": "0.53.0",
+ "@opentelemetry/sdk-trace-base": "1.26.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.56.0.tgz",
+ "integrity": "sha512-GD5QuCT6js+mDpb5OBO6OSyCH+k2Gy3xPHJV9BnjV8W6kpSuY8y2Samzs5vl23UcGMq6sHLAbs+Eq/VYsLMiVw==",
+ "dependencies": {
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/otlp-exporter-base": "0.56.0",
+ "@opentelemetry/otlp-transformer": "0.56.0",
+ "@opentelemetry/resources": "1.29.0",
+ "@opentelemetry/sdk-metrics": "1.29.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/api-logs": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.56.0.tgz",
+ "integrity": "sha512-Wr39+94UNNG3Ei9nv3pHd4AJ63gq5nSemMRpCd8fPwDL9rN3vK26lzxfH27mw16XzOSO+TpyQwBAMaLxaPWG0g==",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.29.0.tgz",
+ "integrity": "sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.56.0.tgz",
+ "integrity": "sha512-eURvv0fcmBE+KE1McUeRo+u0n18ZnUeSc7lDlW/dzlqFYasEbsztTK4v0Qf8C4vEY+aMTjPKUxBG0NX2Te3Pmw==",
+ "dependencies": {
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/otlp-transformer": "0.56.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.56.0.tgz",
+ "integrity": "sha512-kVkH/W2W7EpgWWpyU5VnnjIdSD7Y7FljQYObAQSKdRcejiwMj2glypZtUdfq1LTJcv4ht0jyTrw1D3CCxssNtQ==",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.56.0",
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0",
+ "@opentelemetry/sdk-logs": "0.56.0",
+ "@opentelemetry/sdk-metrics": "1.29.0",
+ "@opentelemetry/sdk-trace-base": "1.29.0",
+ "protobufjs": "^7.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.29.0.tgz",
+ "integrity": "sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/semantic-conventions": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": {
- "version": "0.54.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz",
- "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.56.0.tgz",
+ "integrity": "sha512-OS0WPBJF++R/cSl+terUjQH5PebloidB1Jbbecgg2rnCmQbTST9xsRes23bLfDQVRvmegmHqDh884h0aRdJyLw==",
"dependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api-logs": "0.56.0",
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0"
},
"engines": {
"node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz",
- "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.29.0.tgz",
+ "integrity": "sha512-hEOpAYLKXF3wGJpXOtWsxEtqBgde0SCv+w+jvr3/UusR4ll3QrENEGnSl1WDCyRrpqOQ5NCNOvZch9UFVa7MnQ==",
"dependencies": {
- "@opentelemetry/semantic-conventions": "1.27.0"
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0",
+ "@opentelemetry/semantic-conventions": "1.28.0"
},
"engines": {
"node": ">=14"
@@ -3745,13 +4046,25 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
- "version": "0.54.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.54.0.tgz",
- "integrity": "sha512-g+H7+QleVF/9lz4zhaR9Dt4VwApjqG5WWupy5CTMpWJfHB/nLxBbX73GBZDgdiNfh08nO3rNa6AS7fK8OhgF5g==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz",
+ "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.56.0.tgz",
+ "integrity": "sha512-1FZvTmgIts5crkVIETIpIJ9Gyp7dFqgNWeZmzAzmYzWBX2QBK9fdvxs9ZWbLFKR1j9nN0Urh/w/J+lDJgbSGNg==",
"dependencies": {
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/otlp-transformer": "0.54.0"
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/exporter-metrics-otlp-http": "0.56.0",
+ "@opentelemetry/otlp-exporter-base": "0.56.0",
+ "@opentelemetry/otlp-transformer": "0.56.0",
+ "@opentelemetry/resources": "1.29.0",
+ "@opentelemetry/sdk-metrics": "1.29.0"
},
"engines": {
"node": ">=14"
@@ -3760,33 +4073,23 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
- "version": "0.54.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.54.0.tgz",
- "integrity": "sha512-jRexIASQQzdK4AjfNIBfn94itAq4Q8EXR9d3b/OVbhd3kKQKvMr7GkxYDjbeTbY7hHCOLcLfJ3dpYQYGOe8qOQ==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/api-logs": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.56.0.tgz",
+ "integrity": "sha512-Wr39+94UNNG3Ei9nv3pHd4AJ63gq5nSemMRpCd8fPwDL9rN3vK26lzxfH27mw16XzOSO+TpyQwBAMaLxaPWG0g==",
"dependencies": {
- "@opentelemetry/api-logs": "0.54.0",
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/resources": "1.27.0",
- "@opentelemetry/sdk-logs": "0.54.0",
- "@opentelemetry/sdk-metrics": "1.27.0",
- "@opentelemetry/sdk-trace-base": "1.27.0",
- "protobufjs": "^7.3.0"
+ "@opentelemetry/api": "^1.3.0"
},
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/resources": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.27.0.tgz",
- "integrity": "sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.29.0.tgz",
+ "integrity": "sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==",
"dependencies": {
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/semantic-conventions": "1.27.0"
+ "@opentelemetry/semantic-conventions": "1.28.0"
},
"engines": {
"node": ">=14"
@@ -3795,45 +4098,48 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-logs": {
- "version": "0.54.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.54.0.tgz",
- "integrity": "sha512-HeWvOPiWhEw6lWvg+lCIi1WhJnIPbI4/OFZgHq9tKfpwF3LX6/kk3+GR8sGUGAEZfbjPElkkngzvd2s03zbD7Q==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.56.0.tgz",
+ "integrity": "sha512-eURvv0fcmBE+KE1McUeRo+u0n18ZnUeSc7lDlW/dzlqFYasEbsztTK4v0Qf8C4vEY+aMTjPKUxBG0NX2Te3Pmw==",
"dependencies": {
- "@opentelemetry/api-logs": "0.54.0",
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/resources": "1.27.0"
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/otlp-transformer": "0.56.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ "@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-metrics": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.27.0.tgz",
- "integrity": "sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.56.0.tgz",
+ "integrity": "sha512-kVkH/W2W7EpgWWpyU5VnnjIdSD7Y7FljQYObAQSKdRcejiwMj2glypZtUdfq1LTJcv4ht0jyTrw1D3CCxssNtQ==",
"dependencies": {
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/resources": "1.27.0"
+ "@opentelemetry/api-logs": "0.56.0",
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0",
+ "@opentelemetry/sdk-logs": "0.56.0",
+ "@opentelemetry/sdk-metrics": "1.29.0",
+ "@opentelemetry/sdk-trace-base": "1.29.0",
+ "protobufjs": "^7.3.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ "@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.27.0.tgz",
- "integrity": "sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.29.0.tgz",
+ "integrity": "sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ==",
"dependencies": {
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/resources": "1.27.0",
- "@opentelemetry/semantic-conventions": "1.27.0"
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/semantic-conventions": "1.28.0"
},
"engines": {
"node": ">=14"
@@ -3842,61 +4148,44 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-proto": {
- "version": "0.53.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.53.0.tgz",
- "integrity": "sha512-jhEcVL1deeWNmTUP05UZMriZPSWUBcfg94ng7JuBb1q2NExgnADQFl1VQQ+xo62/JepK+MxQe4xAwlsDQFbISA==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.56.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.56.0.tgz",
+ "integrity": "sha512-OS0WPBJF++R/cSl+terUjQH5PebloidB1Jbbecgg2rnCmQbTST9xsRes23bLfDQVRvmegmHqDh884h0aRdJyLw==",
"dependencies": {
- "@opentelemetry/api-logs": "0.53.0",
- "@opentelemetry/core": "1.26.0",
- "@opentelemetry/otlp-exporter-base": "0.53.0",
- "@opentelemetry/otlp-transformer": "0.53.0",
- "@opentelemetry/resources": "1.26.0",
- "@opentelemetry/sdk-logs": "0.53.0",
- "@opentelemetry/sdk-trace-base": "1.26.0"
+ "@opentelemetry/api-logs": "0.56.0",
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-metrics-otlp-http": {
- "version": "0.53.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.53.0.tgz",
- "integrity": "sha512-nvZtOk23pZOrTW10Za2WPd9pk4tWDvL6ALlHRFfInpcTjtOgCrv+fQDxpzosa5PeXvYeFFUO5aYCTnwiCX4Dzg==",
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.29.0.tgz",
+ "integrity": "sha512-hEOpAYLKXF3wGJpXOtWsxEtqBgde0SCv+w+jvr3/UusR4ll3QrENEGnSl1WDCyRrpqOQ5NCNOvZch9UFVa7MnQ==",
"dependencies": {
- "@opentelemetry/core": "1.26.0",
- "@opentelemetry/otlp-exporter-base": "0.53.0",
- "@opentelemetry/otlp-transformer": "0.53.0",
- "@opentelemetry/resources": "1.26.0",
- "@opentelemetry/sdk-metrics": "1.26.0"
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0",
+ "@opentelemetry/semantic-conventions": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/exporter-metrics-otlp-proto": {
- "version": "0.53.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.53.0.tgz",
- "integrity": "sha512-cO99cY04Oy+i8nfYoY0DOVRWVSb0unlerblvf4Fyt2Ls8CkUECLfgjfUXqdjOhBYOX/OZGOBSGetqqYFtKGdGA==",
- "dependencies": {
- "@opentelemetry/core": "1.26.0",
- "@opentelemetry/exporter-metrics-otlp-http": "0.53.0",
- "@opentelemetry/otlp-exporter-base": "0.53.0",
- "@opentelemetry/otlp-transformer": "0.53.0",
- "@opentelemetry/resources": "1.26.0",
- "@opentelemetry/sdk-metrics": "1.26.0"
- },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz",
+ "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==",
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
"node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
@@ -5250,6 +5539,22 @@
"@opentelemetry/api": "^1.3.0"
}
},
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.26.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz",
+ "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.26.0",
+ "@opentelemetry/resources": "1.26.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/propagation-utils": {
"version": "0.30.12",
"resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.12.tgz",
@@ -5552,12 +5857,12 @@
}
},
"node_modules/@opentelemetry/sdk-metrics": {
- "version": "1.26.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz",
- "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==",
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.29.0.tgz",
+ "integrity": "sha512-MkVtuzDjXZaUJSuJlHn6BSXjcQlMvHcsDV7LjY4P6AJeffMa4+kIGDjzsCf6DkAh6Vqlwag5EWEam3KZOX5Drw==",
"dependencies": {
- "@opentelemetry/core": "1.26.0",
- "@opentelemetry/resources": "1.26.0"
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/resources": "1.29.0"
},
"engines": {
"node": ">=14"
@@ -5566,6 +5871,43 @@
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.29.0.tgz",
+ "integrity": "sha512-gmT7vAreXl0DTHD2rVZcw3+l2g84+5XiHIqdBUxXbExymPCvSsGOpiwMmn8nkiJur28STV31wnhIDrzWDPzjfA==",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/resources": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.29.0.tgz",
+ "integrity": "sha512-s7mLXuHZE7RQr1wwweGcaRp3Q4UJJ0wazeGlc/N5/XSe6UyXfsh1UQGMADYeg7YwD+cEdMtU1yJAUXdnFzYzyQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.29.0",
+ "@opentelemetry/semantic-conventions": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz",
+ "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@opentelemetry/sdk-node": {
"version": "0.54.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.54.0.tgz",
@@ -6123,11 +6465,12 @@
]
},
"node_modules/@smithy/abort-controller": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz",
- "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==",
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.8.tgz",
+ "integrity": "sha512-+3DOBcUn5/rVjlxGvUPKc416SExarAQ+Qe0bqk30YSUjbepwpS7QN0cyKUSifvLJhdMZ0WPzPP5ymut0oonrpQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6152,14 +6495,15 @@
}
},
"node_modules/@smithy/config-resolver": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz",
- "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==",
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.12.tgz",
+ "integrity": "sha512-YAJP9UJFZRZ8N+UruTeq78zkdjUHmzsY62J4qKWZ4SXB4QXJ/+680EfXXgkYA2xj77ooMqtUY9m406zGNqwivQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^3.1.9",
- "@smithy/types": "^3.6.0",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"@smithy/util-config-provider": "^3.0.0",
- "@smithy/util-middleware": "^3.0.8",
+ "@smithy/util-middleware": "^3.0.10",
"tslib": "^2.6.2"
},
"engines": {
@@ -6167,16 +6511,17 @@
}
},
"node_modules/@smithy/core": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz",
- "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==",
+ "version": "2.5.4",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.4.tgz",
+ "integrity": "sha512-iFh2Ymn2sCziBRLPuOOxRPkuCx/2gBdXtBGuCUFLUe6bWYjKnhHyIPqGeNkLZ5Aco/5GjebRTBFiWID3sDbrKw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/middleware-serde": "^3.0.8",
- "@smithy/protocol-http": "^4.1.5",
- "@smithy/types": "^3.6.0",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"@smithy/util-body-length-browser": "^3.0.0",
- "@smithy/util-middleware": "^3.0.8",
- "@smithy/util-stream": "^3.2.1",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-stream": "^3.3.1",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -6185,14 +6530,15 @@
}
},
"node_modules/@smithy/credential-provider-imds": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz",
- "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.7.tgz",
+ "integrity": "sha512-cEfbau+rrWF8ylkmmVAObOmjbTIzKyUC5TkBL58SbLywD0RCBC4JAUKbmtSm2w5KUJNRPGgpGFMvE2FKnuNlWQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^3.1.9",
- "@smithy/property-provider": "^3.1.8",
- "@smithy/types": "^3.6.0",
- "@smithy/url-parser": "^3.0.8",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/property-provider": "^3.1.10",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
"tslib": "^2.6.2"
},
"engines": {
@@ -6285,11 +6631,12 @@
}
},
"node_modules/@smithy/hash-node": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.7.tgz",
- "integrity": "sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.10.tgz",
+ "integrity": "sha512-3zWGWCHI+FlJ5WJwx73Mw2llYR8aflVyZN5JhoqLxbdPZi6UyKSdCeXAWJw9ja22m6S6Tzz1KZ+kAaSwvydi0g==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.5.0",
+ "@smithy/types": "^3.7.1",
"@smithy/util-buffer-from": "^3.0.0",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
@@ -6312,11 +6659,12 @@
}
},
"node_modules/@smithy/invalid-dependency": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.7.tgz",
- "integrity": "sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.10.tgz",
+ "integrity": "sha512-Lp2L65vFi+cj0vFMu2obpPW69DU+6O5g3086lmI4XcnRCG8PxvpWC7XyaVwJCxsZFzueHjXnrOH/E0pl0zikfA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.5.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
}
},
@@ -6342,12 +6690,13 @@
}
},
"node_modules/@smithy/middleware-content-length": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.9.tgz",
- "integrity": "sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA==",
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.12.tgz",
+ "integrity": "sha512-1mDEXqzM20yywaMDuf5o9ue8OkJ373lSPbaSjyEvkWdqELhFMyNNgKGWL/rCSf4KME8B+HlHKuR8u9kRj8HzEQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6355,17 +6704,18 @@
}
},
"node_modules/@smithy/middleware-endpoint": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz",
- "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==",
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.4.tgz",
+ "integrity": "sha512-TybiW2LA3kYVd3e+lWhINVu1o26KJbBwOpADnf0L4x/35vLVica77XVR5hvV9+kWeTGeSJ3IHTcYxbRxlbwhsg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^2.5.1",
- "@smithy/middleware-serde": "^3.0.8",
- "@smithy/node-config-provider": "^3.1.9",
- "@smithy/shared-ini-file-loader": "^3.1.9",
- "@smithy/types": "^3.6.0",
- "@smithy/url-parser": "^3.0.8",
- "@smithy/util-middleware": "^3.0.8",
+ "@smithy/core": "^2.5.4",
+ "@smithy/middleware-serde": "^3.0.10",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/shared-ini-file-loader": "^3.1.11",
+ "@smithy/types": "^3.7.1",
+ "@smithy/url-parser": "^3.0.10",
+ "@smithy/util-middleware": "^3.0.10",
"tslib": "^2.6.2"
},
"engines": {
@@ -6373,17 +6723,18 @@
}
},
"node_modules/@smithy/middleware-retry": {
- "version": "3.0.25",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz",
- "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==",
- "dependencies": {
- "@smithy/node-config-provider": "^3.1.9",
- "@smithy/protocol-http": "^4.1.5",
- "@smithy/service-error-classification": "^3.0.8",
- "@smithy/smithy-client": "^3.4.2",
- "@smithy/types": "^3.6.0",
- "@smithy/util-middleware": "^3.0.8",
- "@smithy/util-retry": "^3.0.8",
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.28.tgz",
+ "integrity": "sha512-vK2eDfvIXG1U64FEUhYxoZ1JSj4XFbYWkK36iz02i3pFwWiDz1Q7jKhGTBCwx/7KqJNk4VS7d7cDLXFOvP7M+g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/service-error-classification": "^3.0.10",
+ "@smithy/smithy-client": "^3.4.5",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-middleware": "^3.0.10",
+ "@smithy/util-retry": "^3.0.10",
"tslib": "^2.6.2",
"uuid": "^9.0.1"
},
@@ -6404,11 +6755,12 @@
}
},
"node_modules/@smithy/middleware-serde": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz",
- "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.10.tgz",
+ "integrity": "sha512-MnAuhh+dD14F428ubSJuRnmRsfOpxSzvRhaGVTvd/lrUDE3kxzCCmH8lnVTvoNQnV2BbJ4c15QwZ3UdQBtFNZA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6416,11 +6768,12 @@
}
},
"node_modules/@smithy/middleware-stack": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz",
- "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.10.tgz",
+ "integrity": "sha512-grCHyoiARDBBGPyw2BeicpjgpsDFWZZxptbVKb3CRd/ZA15F/T6rZjCCuBUjJwdck1nwUuIxYtsS4H9DDpbP5w==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6428,13 +6781,14 @@
}
},
"node_modules/@smithy/node-config-provider": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz",
- "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==",
+ "version": "3.1.11",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.11.tgz",
+ "integrity": "sha512-URq3gT3RpDikh/8MBJUB+QGZzfS7Bm6TQTqoh4CqE8NBuyPkWa5eUXj0XFcFfeZVgg3WMh1u19iaXn8FvvXxZw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/property-provider": "^3.1.8",
- "@smithy/shared-ini-file-loader": "^3.1.9",
- "@smithy/types": "^3.6.0",
+ "@smithy/property-provider": "^3.1.10",
+ "@smithy/shared-ini-file-loader": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6442,14 +6796,15 @@
}
},
"node_modules/@smithy/node-http-handler": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz",
- "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.1.tgz",
+ "integrity": "sha512-fr+UAOMGWh6bn4YSEezBCpJn9Ukp9oR4D32sCjCo7U81evE11YePOQ58ogzyfgmjIO79YeOdfXXqr0jyhPQeMg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/abort-controller": "^3.1.6",
- "@smithy/protocol-http": "^4.1.5",
- "@smithy/querystring-builder": "^3.0.8",
- "@smithy/types": "^3.6.0",
+ "@smithy/abort-controller": "^3.1.8",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/querystring-builder": "^3.0.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6457,11 +6812,12 @@
}
},
"node_modules/@smithy/property-provider": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz",
- "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==",
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.10.tgz",
+ "integrity": "sha512-n1MJZGTorTH2DvyTVj+3wXnd4CzjJxyXeOgnTlgNVFxaaMeT4OteEp4QrzF8p9ee2yg42nvyVK6R/awLCakjeQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6469,11 +6825,11 @@
}
},
"node_modules/@smithy/protocol-http": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz",
- "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==",
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz",
+ "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.2",
"tslib": "^2.6.2"
},
"engines": {
@@ -6481,11 +6837,11 @@
}
},
"node_modules/@smithy/querystring-builder": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz",
- "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==",
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz",
+ "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.2",
"@smithy/util-uri-escape": "^3.0.0",
"tslib": "^2.6.2"
},
@@ -6494,11 +6850,12 @@
}
},
"node_modules/@smithy/querystring-parser": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz",
- "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.10.tgz",
+ "integrity": "sha512-Oa0XDcpo9SmjhiDD9ua2UyM3uU01ZTuIrNdZvzwUTykW1PM8o2yJvMh1Do1rY5sUQg4NDV70dMi0JhDx4GyxuQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6506,22 +6863,24 @@
}
},
"node_modules/@smithy/service-error-classification": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz",
- "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.10.tgz",
+ "integrity": "sha512-zHe642KCqDxXLuhs6xmHVgRwy078RfqxP2wRDpIyiF8EmsWXptMwnMwbVa50lw+WOGNrYm9zbaEg0oDe3PTtvQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0"
+ "@smithy/types": "^3.7.1"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/@smithy/shared-ini-file-loader": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz",
- "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==",
+ "version": "3.1.11",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.11.tgz",
+ "integrity": "sha512-AUdrIZHFtUgmfSN4Gq9nHu3IkHMa1YDcN+s061Nfm+6pQ0mJy85YQDB0tZBCmls0Vuj22pLwDPmL92+Hvfwwlg==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6529,15 +6888,16 @@
}
},
"node_modules/@smithy/signature-v4": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.0.tgz",
- "integrity": "sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.3.tgz",
+ "integrity": "sha512-pPSQQ2v2vu9vc8iew7sszLd0O09I5TRc5zhY71KA+Ao0xYazIG+uLeHbTJfIWGO3BGVLiXjUr3EEeCcEQLjpWQ==",
+ "license": "Apache-2.0",
"dependencies": {
"@smithy/is-array-buffer": "^3.0.0",
- "@smithy/protocol-http": "^4.1.4",
- "@smithy/types": "^3.5.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
"@smithy/util-hex-encoding": "^3.0.0",
- "@smithy/util-middleware": "^3.0.7",
+ "@smithy/util-middleware": "^3.0.10",
"@smithy/util-uri-escape": "^3.0.0",
"@smithy/util-utf8": "^3.0.0",
"tslib": "^2.6.2"
@@ -6547,16 +6907,17 @@
}
},
"node_modules/@smithy/smithy-client": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz",
- "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==",
+ "version": "3.4.5",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.5.tgz",
+ "integrity": "sha512-k0sybYT9zlP79sIKd1XGm4TmK0AS1nA2bzDHXx7m0nGi3RQ8dxxQUs4CPkSmQTKAo+KF9aINU3KzpGIpV7UoMw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^2.5.1",
- "@smithy/middleware-endpoint": "^3.2.1",
- "@smithy/middleware-stack": "^3.0.8",
- "@smithy/protocol-http": "^4.1.5",
- "@smithy/types": "^3.6.0",
- "@smithy/util-stream": "^3.2.1",
+ "@smithy/core": "^2.5.4",
+ "@smithy/middleware-endpoint": "^3.2.4",
+ "@smithy/middleware-stack": "^3.0.10",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/types": "^3.7.1",
+ "@smithy/util-stream": "^3.3.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6564,9 +6925,9 @@
}
},
"node_modules/@smithy/types": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz",
- "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==",
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz",
+ "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==",
"dependencies": {
"tslib": "^2.6.2"
},
@@ -6575,12 +6936,13 @@
}
},
"node_modules/@smithy/url-parser": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz",
- "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.10.tgz",
+ "integrity": "sha512-j90NUalTSBR2NaZTuruEgavSdh8MLirf58LoGSk4AtQfyIymogIhgnGUU2Mga2bkMkpSoC9gxb74xBXL5afKAQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/querystring-parser": "^3.0.8",
- "@smithy/types": "^3.6.0",
+ "@smithy/querystring-parser": "^3.0.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
}
},
@@ -6640,13 +7002,14 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
- "version": "3.0.25",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz",
- "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==",
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.28.tgz",
+ "integrity": "sha512-6bzwAbZpHRFVJsOztmov5PGDmJYsbNSoIEfHSJJyFLzfBGCCChiO3od9k7E/TLgrCsIifdAbB9nqbVbyE7wRUw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/property-provider": "^3.1.8",
- "@smithy/smithy-client": "^3.4.2",
- "@smithy/types": "^3.6.0",
+ "@smithy/property-provider": "^3.1.10",
+ "@smithy/smithy-client": "^3.4.5",
+ "@smithy/types": "^3.7.1",
"bowser": "^2.11.0",
"tslib": "^2.6.2"
},
@@ -6655,16 +7018,17 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
- "version": "3.0.25",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz",
- "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==",
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.28.tgz",
+ "integrity": "sha512-78ENJDorV1CjOQselGmm3+z7Yqjj5HWCbjzh0Ixuq736dh1oEnD9sAttSBNSLlpZsX8VQnmERqA2fEFlmqWn8w==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/config-resolver": "^3.0.10",
- "@smithy/credential-provider-imds": "^3.2.5",
- "@smithy/node-config-provider": "^3.1.9",
- "@smithy/property-provider": "^3.1.8",
- "@smithy/smithy-client": "^3.4.2",
- "@smithy/types": "^3.6.0",
+ "@smithy/config-resolver": "^3.0.12",
+ "@smithy/credential-provider-imds": "^3.2.7",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/property-provider": "^3.1.10",
+ "@smithy/smithy-client": "^3.4.5",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6672,12 +7036,13 @@
}
},
"node_modules/@smithy/util-endpoints": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.3.tgz",
- "integrity": "sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw==",
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.6.tgz",
+ "integrity": "sha512-mFV1t3ndBh0yZOJgWxO9J/4cHZVn5UG1D8DeCc6/echfNkeEJWu9LD7mgGH5fHrEdR7LDoWw7PQO6QiGpHXhgA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/node-config-provider": "^3.1.8",
- "@smithy/types": "^3.5.0",
+ "@smithy/node-config-provider": "^3.1.11",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6696,11 +7061,12 @@
}
},
"node_modules/@smithy/util-middleware": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz",
- "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.10.tgz",
+ "integrity": "sha512-eJO+/+RsrG2RpmY68jZdwQtnfsxjmPxzMlQpnHKjFPwrYqvlcT+fHdT+ZVwcjlWSrByOhGr9Ff2GG17efc192A==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^3.6.0",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6708,12 +7074,13 @@
}
},
"node_modules/@smithy/util-retry": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz",
- "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==",
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.10.tgz",
+ "integrity": "sha512-1l4qatFp4PiU6j7UsbasUHL2VU023NRB/gfaa1M0rDqVrRN4g3mCArLRyH3OuktApA4ye+yjWQHjdziunw2eWA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/service-error-classification": "^3.0.8",
- "@smithy/types": "^3.6.0",
+ "@smithy/service-error-classification": "^3.0.10",
+ "@smithy/types": "^3.7.1",
"tslib": "^2.6.2"
},
"engines": {
@@ -6721,13 +7088,14 @@
}
},
"node_modules/@smithy/util-stream": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz",
- "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.1.tgz",
+ "integrity": "sha512-Ff68R5lJh2zj+AUTvbAU/4yx+6QPRzg7+pI7M1FbtQHcRIp7xvguxVsQBKyB3fwiOwhAKu0lnNyYBaQfSW6TNw==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/fetch-http-handler": "^4.0.0",
- "@smithy/node-http-handler": "^3.2.5",
- "@smithy/types": "^3.6.0",
+ "@smithy/fetch-http-handler": "^4.1.1",
+ "@smithy/node-http-handler": "^3.3.1",
+ "@smithy/types": "^3.7.1",
"@smithy/util-base64": "^3.0.0",
"@smithy/util-buffer-from": "^3.0.0",
"@smithy/util-hex-encoding": "^3.0.0",
@@ -6739,13 +7107,14 @@
}
},
"node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz",
- "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.1.tgz",
+ "integrity": "sha512-bH7QW0+JdX0bPBadXt8GwMof/jz0H28I84hU1Uet9ISpzUqXqRQ3fEZJ+ANPOhzSEczYvANNl3uDQDYArSFDtA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@smithy/protocol-http": "^4.1.5",
- "@smithy/querystring-builder": "^3.0.8",
- "@smithy/types": "^3.6.0",
+ "@smithy/protocol-http": "^4.1.7",
+ "@smithy/querystring-builder": "^3.0.10",
+ "@smithy/types": "^3.7.1",
"@smithy/util-base64": "^3.0.0",
"tslib": "^2.6.2"
}
@@ -6787,14 +7156,15 @@
}
},
"node_modules/@swc/core": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.9.2.tgz",
- "integrity": "sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.9.3.tgz",
+ "integrity": "sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==",
"dev": true,
"hasInstallScript": true,
+ "license": "Apache-2.0",
"dependencies": {
"@swc/counter": "^0.1.3",
- "@swc/types": "^0.1.15"
+ "@swc/types": "^0.1.17"
},
"engines": {
"node": ">=10"
@@ -6804,16 +7174,16 @@
"url": "https://opencollective.com/swc"
},
"optionalDependencies": {
- "@swc/core-darwin-arm64": "1.9.2",
- "@swc/core-darwin-x64": "1.9.2",
- "@swc/core-linux-arm-gnueabihf": "1.9.2",
- "@swc/core-linux-arm64-gnu": "1.9.2",
- "@swc/core-linux-arm64-musl": "1.9.2",
- "@swc/core-linux-x64-gnu": "1.9.2",
- "@swc/core-linux-x64-musl": "1.9.2",
- "@swc/core-win32-arm64-msvc": "1.9.2",
- "@swc/core-win32-ia32-msvc": "1.9.2",
- "@swc/core-win32-x64-msvc": "1.9.2"
+ "@swc/core-darwin-arm64": "1.9.3",
+ "@swc/core-darwin-x64": "1.9.3",
+ "@swc/core-linux-arm-gnueabihf": "1.9.3",
+ "@swc/core-linux-arm64-gnu": "1.9.3",
+ "@swc/core-linux-arm64-musl": "1.9.3",
+ "@swc/core-linux-x64-gnu": "1.9.3",
+ "@swc/core-linux-x64-musl": "1.9.3",
+ "@swc/core-win32-arm64-msvc": "1.9.3",
+ "@swc/core-win32-ia32-msvc": "1.9.3",
+ "@swc/core-win32-x64-msvc": "1.9.3"
},
"peerDependencies": {
"@swc/helpers": "*"
@@ -6825,13 +7195,14 @@
}
},
"node_modules/@swc/core-darwin-arm64": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.9.2.tgz",
- "integrity": "sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.9.3.tgz",
+ "integrity": "sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"darwin"
@@ -6841,13 +7212,14 @@
}
},
"node_modules/@swc/core-darwin-x64": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.9.2.tgz",
- "integrity": "sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.9.3.tgz",
+ "integrity": "sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"darwin"
@@ -6857,13 +7229,14 @@
}
},
"node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.9.2.tgz",
- "integrity": "sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.9.3.tgz",
+ "integrity": "sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ==",
"cpu": [
"arm"
],
"dev": true,
+ "license": "Apache-2.0",
"optional": true,
"os": [
"linux"
@@ -6873,13 +7246,14 @@
}
},
"node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.9.2.tgz",
- "integrity": "sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.9.3.tgz",
+ "integrity": "sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"linux"
@@ -6889,13 +7263,14 @@
}
},
"node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.9.2.tgz",
- "integrity": "sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.9.3.tgz",
+ "integrity": "sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"linux"
@@ -6905,13 +7280,14 @@
}
},
"node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.9.2.tgz",
- "integrity": "sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.9.3.tgz",
+ "integrity": "sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"linux"
@@ -6921,13 +7297,14 @@
}
},
"node_modules/@swc/core-linux-x64-musl": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.9.2.tgz",
- "integrity": "sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.9.3.tgz",
+ "integrity": "sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"linux"
@@ -6937,13 +7314,14 @@
}
},
"node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.9.2.tgz",
- "integrity": "sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.9.3.tgz",
+ "integrity": "sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==",
"cpu": [
"arm64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"win32"
@@ -6953,13 +7331,14 @@
}
},
"node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.9.2.tgz",
- "integrity": "sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.9.3.tgz",
+ "integrity": "sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA==",
"cpu": [
"ia32"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"win32"
@@ -6969,13 +7348,14 @@
}
},
"node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.9.2",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.9.2.tgz",
- "integrity": "sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.9.3.tgz",
+ "integrity": "sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ==",
"cpu": [
"x64"
],
"dev": true,
+ "license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
"win32"
@@ -6988,7 +7368,8 @@
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
"integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0"
},
"node_modules/@swc/helpers": {
"version": "0.5.0",
@@ -7001,10 +7382,11 @@
}
},
"node_modules/@swc/types": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.15.tgz",
- "integrity": "sha512-XKaZ+dzDIQ9Ot9o89oJQ/aluI17+VvUnIpYJTcZtvv1iYX6MzHh3Ik2CSR7MdPKpPwfZXHBeCingb2b4PoDVdw==",
+ "version": "0.1.17",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz",
+ "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"@swc/counter": "^0.1.3"
}
@@ -7226,10 +7608,11 @@
}
},
"node_modules/@types/nodemailer": {
- "version": "6.4.16",
- "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.16.tgz",
- "integrity": "sha512-uz6hN6Pp0upXMcilM61CoKyjT7sskBoOWpptkjjJp8jIMlTdc3xG01U7proKkXzruMS4hS0zqtHNkNPFB20rKQ==",
+ "version": "6.4.17",
+ "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz",
+ "integrity": "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/node": "*"
}
@@ -8283,6 +8666,21 @@
"node": ">= 0.8"
}
},
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -9809,6 +10207,21 @@
"node": ">= 0.8"
}
},
+ "node_modules/express/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/express/node_modules/raw-body": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
@@ -11842,12 +12255,12 @@
}
},
"node_modules/mongodb": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz",
- "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.11.0.tgz",
+ "integrity": "sha512-yVbPw0qT268YKhG241vAMLaDQAPbRyTgo++odSgGc9kXnzOujQI60Iyj23B9sQQFPSvmNPvMZ3dsFz0aN55KgA==",
"dependencies": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
+ "@mongodb-js/saslprep": "^1.1.9",
+ "bson": "^6.10.0",
"mongodb-connection-string-url": "^3.0.0"
},
"engines": {
@@ -11904,9 +12317,9 @@
}
},
"node_modules/mongodb/node_modules/bson": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz",
- "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==",
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.1.tgz",
+ "integrity": "sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==",
"engines": {
"node": ">=16.20.1"
}
@@ -11944,9 +12357,10 @@
}
},
"node_modules/mongoose": {
- "version": "6.13.3",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.3.tgz",
- "integrity": "sha512-TCB/k6ZmkLZGZY/HJ78Ep45Za63591ZuZu5+HCISTe+0lsqbDeomqwezh+Ir7gMLa0wJwIy6CNkl5dxhCXTu9Q==",
+ "version": "6.13.5",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.13.5.tgz",
+ "integrity": "sha512-podJEaIF/5N2mQymkyyUzN2NeL/68MOyYjf3O0zsgCU2B2Omnhg6NhGHVavt9ZH/VxOrwKE9XphbuHDFK+T06g==",
+ "license": "MIT",
"dependencies": {
"bson": "^4.7.2",
"kareem": "2.5.1",
@@ -12081,9 +12495,9 @@
"optional": true
},
"node_modules/nanoid": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.8.tgz",
- "integrity": "sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==",
+ "version": "5.0.9",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz",
+ "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==",
"funding": [
{
"type": "github",
@@ -12161,9 +12575,10 @@
}
},
"node_modules/nodemailer": {
- "version": "6.9.15",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz",
- "integrity": "sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==",
+ "version": "6.9.16",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz",
+ "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==",
+ "license": "MIT-0",
"engines": {
"node": ">=6.0.0"
}
@@ -12724,9 +13139,10 @@
}
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.13.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz",
+ "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==",
+ "license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.6"
},
diff --git a/backend/package.json b/backend/package.json
index c6fbf21bb..96953ad5f 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -19,15 +19,15 @@
"license": "ISC",
"dependencies": {
"@asteasolutions/zod-to-openapi": "^7.2.0",
- "@aws-sdk/client-cognito-identity-provider": "3.666.0",
- "@aws-sdk/client-kms": "3.666.0",
+ "@aws-sdk/client-cognito-identity-provider": "3.708.0",
+ "@aws-sdk/client-kms": "3.699.0",
"@aws-sdk/client-s3": "3.666.0",
"@aws-sdk/lib-storage": "3.666.0",
"@opentelemetry/auto-instrumentations-node": "^0.52.0",
"@opentelemetry/exporter-logs-otlp-proto": "^0.53.0",
- "@opentelemetry/exporter-metrics-otlp-proto": "^0.53.0",
+ "@opentelemetry/exporter-metrics-otlp-proto": "^0.56.0",
"@opentelemetry/host-metrics": "^0.35.3",
- "@opentelemetry/sdk-metrics": "^1.26.0",
+ "@opentelemetry/sdk-metrics": "^1.28.0",
"@smithy/node-http-handler": "^3.1.2",
"@types/express-session": "^1.18.0",
"app-root-path": "^3.1.0",
@@ -52,16 +52,16 @@
"jsrsasign": "^11.1.0",
"lodash-es": "^4.17.21",
"mjml": "^4.15.3",
- "mongodb": "^6.9.0",
- "mongoose": "^6.13.3",
+ "mongodb": "^6.11.0",
+ "mongoose": "^6.13.5",
"mongoose-delete": "^1.0.2",
"morgan": "^1.10.0",
- "nanoid": "^5.0.8",
+ "nanoid": "^5.0.9",
"node-fetch": "^3.3.2",
- "nodemailer": "^6.9.15",
+ "nodemailer": "^6.9.16",
"outdent": "^0.8.0",
"pretty-bytes": "^6.1.1",
- "qs": "^6.12.2",
+ "qs": "^6.13.1",
"semver": "^7.6.3",
"shelljs": "^0.8.5",
"showdown": "^2.1.0",
@@ -75,7 +75,7 @@
"devDependencies": {
"@anatine/zod-mock": "^3.13.4",
"@faker-js/faker": "^8.4.1",
- "@swc/core": "^1.9.2",
+ "@swc/core": "^1.9.3",
"@types/archiver": "^6.0.3",
"@types/bcryptjs": "^2.4.6",
"@types/bunyan": "^1.8.11",
@@ -90,7 +90,7 @@
"@types/morgan": "^1.9.9",
"@types/semver": "^7.5.8",
"@types/node": "^22.7.5",
- "@types/nodemailer": "^6.4.16",
+ "@types/nodemailer": "^6.4.17",
"@types/shelljs": "^0.8.15",
"@types/supertest": "^6.0.2",
"@types/uuid": "^10.0.0",
diff --git a/backend/src/clients/modelScan.ts b/backend/src/clients/modelScan.ts
index 61928bf57..a71d48b8d 100644
--- a/backend/src/clients/modelScan.ts
+++ b/backend/src/clients/modelScan.ts
@@ -1,4 +1,5 @@
import fetch, { Response } from 'node-fetch'
+import { Readable } from 'stream'
import config from '../utils/config.js'
import { BadReq, InternalError } from '../utils/error.js'
@@ -65,13 +66,21 @@ export async function getModelScanInfo() {
return (await res.json()) as ModelScanInfoResponse
}
-export async function scanFile(file: Blob, file_name: string) {
+export async function scanStream(stream: Readable, fileName: string, fileSize: number) {
const url = `${config.avScanning.modelscan.protocol}://${config.avScanning.modelscan.host}:${config.avScanning.modelscan.port}`
let res: Response
try {
const formData = new FormData()
- formData.append('in_file', file, file_name)
+ formData.append(
+ 'in_file',
+ {
+ [Symbol.toStringTag]: 'File',
+ size: fileSize,
+ stream: () => stream,
+ },
+ fileName,
+ )
res = await fetch(`${url}/scan/file`, {
method: 'POST',
diff --git a/backend/src/connectors/audit/Base.ts b/backend/src/connectors/audit/Base.ts
index d023ddc04..86b7e7654 100644
--- a/backend/src/connectors/audit/Base.ts
+++ b/backend/src/connectors/audit/Base.ts
@@ -41,6 +41,7 @@ export const AuditInfo = {
ViewFile: { typeId: 'ViewFile', description: 'File Downloaded', auditKind: AuditKind.View },
ViewFiles: { typeId: 'ViewFiles', description: 'File Information Viewed', auditKind: AuditKind.View },
DeleteFile: { typeId: 'DeleteFile', description: 'File Information Deleted', auditKind: AuditKind.Delete },
+ UpdateFile: { typeId: 'UpdateFile', description: 'File Information Updated', auditKind: AuditKind.Update },
CreateRelease: { typeId: 'CreateRelease', description: 'Release Created', auditKind: AuditKind.Create },
ViewRelease: { typeId: 'ViewRelease', description: 'Release Viewed', auditKind: AuditKind.View },
@@ -139,6 +140,7 @@ export abstract class BaseAuditConnector {
abstract onViewFile(req: Request, file: FileInterfaceDoc)
abstract onViewFiles(req: Request, modelId: string, files: FileInterface[])
abstract onDeleteFile(req: Request, modelId: string, fileId: string)
+ abstract onUpdateFile(req: Request, modelId: string, fileId: string)
abstract onCreateRelease(req: Request, release: ReleaseDoc)
abstract onViewRelease(req: Request, release: ReleaseDoc)
diff --git a/backend/src/connectors/audit/__mocks__/index.ts b/backend/src/connectors/audit/__mocks__/index.ts
index 87b79c352..6c35ef7a6 100644
--- a/backend/src/connectors/audit/__mocks__/index.ts
+++ b/backend/src/connectors/audit/__mocks__/index.ts
@@ -14,6 +14,7 @@ const audit = {
onViewFiles: vi.fn(),
onDeleteFile: vi.fn(),
onCreateFile: vi.fn(),
+ onUpdateFile: vi.fn(),
onCreateRelease: vi.fn(),
onViewRelease: vi.fn(),
diff --git a/backend/src/connectors/audit/silly.ts b/backend/src/connectors/audit/silly.ts
index c7f26cd7a..2742f909e 100644
--- a/backend/src/connectors/audit/silly.ts
+++ b/backend/src/connectors/audit/silly.ts
@@ -32,6 +32,7 @@ export class SillyAuditConnector extends BaseAuditConnector {
onViewFile(_req: Request, _file: FileInterfaceDoc) {}
onViewFiles(_req: Request, _modelId: string, _files: FileInterface[]) {}
onDeleteFile(_req: Request, _modelId: string, _fileId: string) {}
+ onUpdateFile(_req: Request, _modelId: string, _fileId: string) {}
onCreateRelease(_req: Request, _release: ReleaseDoc) {}
onViewRelease(_req: Request, _release: ReleaseDoc) {}
onUpdateRelease(_req: Request, _release: ReleaseDoc) {}
diff --git a/backend/src/connectors/audit/stdout.ts b/backend/src/connectors/audit/stdout.ts
index 58365c8a8..7977d3297 100644
--- a/backend/src/connectors/audit/stdout.ts
+++ b/backend/src/connectors/audit/stdout.ts
@@ -101,6 +101,12 @@ export class StdoutAuditConnector extends BaseAuditConnector {
req.log.info(event, req.audit.description)
}
+ onUpdateFile(req: Request, modelId: string, fileId: string) {
+ this.checkEventType(AuditInfo.UpdateFile, req)
+ const event = this.generateEvent(req, { modelId, fileId })
+ req.log.info(event, req.audit.description)
+ }
+
onCreateRelease(req: Request, release: ReleaseDoc) {
this.checkEventType(AuditInfo.CreateRelease, req)
const event = this.generateEvent(req, { modelId: release.modelId, semver: release.semver })
diff --git a/backend/src/connectors/authorisation/actions.ts b/backend/src/connectors/authorisation/actions.ts
index 8093b2c94..23d534436 100644
--- a/backend/src/connectors/authorisation/actions.ts
+++ b/backend/src/connectors/authorisation/actions.ts
@@ -37,6 +37,7 @@ export const FileAction = {
// 'view' refers to the ability to see metadata about the file. 'download' lets the user view the file contents.
View: 'file:view',
Download: 'file:download',
+ Update: 'file:update',
} as const
export type FileActionKeys = (typeof FileAction)[keyof typeof FileAction]
@@ -80,6 +81,7 @@ export const ActionLookup = {
[FileAction.Upload]: TokenActions.FileWrite.id,
[FileAction.View]: TokenActions.FileRead.id,
[FileAction.Download]: TokenActions.FileRead.id,
+ [FileAction.Update]: TokenActions.FileWrite.id,
[ImageAction.Pull]: TokenActions.ImageRead.id,
[ImageAction.Push]: TokenActions.ImageWrite.id,
diff --git a/backend/src/connectors/fileScanning/Base.ts b/backend/src/connectors/fileScanning/Base.ts
index 2ea4bbd77..50a5ee248 100644
--- a/backend/src/connectors/fileScanning/Base.ts
+++ b/backend/src/connectors/fileScanning/Base.ts
@@ -1,11 +1,21 @@
-import { FileInterface, ScanStateKeys } from '../../models/File.js'
+import { FileInterface } from '../../models/File.js'
export interface FileScanResult {
toolName: string
+ scannerVersion?: string
state: ScanStateKeys
isInfected?: boolean
viruses?: string[]
+ lastRunAt: Date
}
+export const ScanState = {
+ NotScanned: 'notScanned',
+ InProgress: 'inProgress',
+ Complete: 'complete',
+ Error: 'error',
+} as const
+export type ScanStateKeys = (typeof ScanState)[keyof typeof ScanState]
+
export abstract class BaseFileScanningConnector {
abstract info(): string[]
abstract scan(file: FileInterface): Promise
diff --git a/backend/src/connectors/fileScanning/clamAv.ts b/backend/src/connectors/fileScanning/clamAv.ts
index e0331bcc7..6f2b9f364 100644
--- a/backend/src/connectors/fileScanning/clamAv.ts
+++ b/backend/src/connectors/fileScanning/clamAv.ts
@@ -2,11 +2,11 @@ import NodeClam from 'clamscan'
import { Readable } from 'stream'
import { getObjectStream } from '../../clients/s3.js'
-import { FileInterfaceDoc, ScanState } from '../../models/File.js'
+import { FileInterfaceDoc } from '../../models/File.js'
import log from '../../services/log.js'
import config from '../../utils/config.js'
import { ConfigurationError } from '../../utils/error.js'
-import { BaseFileScanningConnector, FileScanResult } from './Base.js'
+import { BaseFileScanningConnector, FileScanResult, ScanState } from './Base.js'
let av: NodeClam
export const clamAvToolName = 'Clam AV'
@@ -20,26 +20,42 @@ export class ClamAvFileScanningConnector extends BaseFileScanningConnector {
return [clamAvToolName]
}
- async init() {
- try {
- av = await new NodeClam().init({ clamdscan: config.avScanning.clamdscan })
- } catch (error) {
- throw ConfigurationError('Could not scan file as Clam AV is not running.', {
- clamAvConfig: config.avScanning.clamdscan,
- })
+ async init(retryCount: number = 1) {
+ log.info('Initialising Clam AV...')
+ if (retryCount <= config.connectors.fileScanners.maxInitRetries) {
+ setTimeout(async () => {
+ try {
+ av = await new NodeClam().init({ clamdscan: config.avScanning.clamdscan })
+ log.info('Clam AV initialised.')
+ } catch (error) {
+ log.warn(`Could not initialise Clam AV, retrying (attempt ${retryCount})...`)
+ this.init(++retryCount)
+ }
+ }, config.connectors.fileScanners.initRetryDelay)
+ } else {
+ throw ConfigurationError(
+ `Could not initialise Clam AV after ${retryCount} attempts, make sure that it is setup and configured correctly.`,
+ {
+ modelScanConfig: config.avScanning.modelscan,
+ },
+ )
}
}
async scan(file: FileInterfaceDoc): Promise {
if (!av) {
- throw ConfigurationError(
- 'Clam AV does not look like it is running. Check that it has been correctly initialised by calling the init function.',
+ return [
{
- clamAvConfig: config.avScanning.clamdscan,
+ toolName: clamAvToolName,
+ state: ScanState.Error,
+ scannerVersion: 'Unknown',
+ lastRunAt: new Date(),
},
- )
+ ]
}
const s3Stream = (await getObjectStream(file.bucket, file.path)).Body as Readable
+ const scannerVersion = await av.getVersion()
+ const modifiedVersion = scannerVersion.substring(scannerVersion.indexOf(' ') + 1, scannerVersion.indexOf('/'))
try {
const { isInfected, viruses } = await av.scanStream(s3Stream)
log.info(
@@ -50,8 +66,10 @@ export class ClamAvFileScanningConnector extends BaseFileScanningConnector {
{
toolName: clamAvToolName,
state: ScanState.Complete,
+ scannerVersion: modifiedVersion,
isInfected,
viruses,
+ lastRunAt: new Date(),
},
]
} catch (error) {
@@ -60,6 +78,8 @@ export class ClamAvFileScanningConnector extends BaseFileScanningConnector {
{
toolName: clamAvToolName,
state: ScanState.Error,
+ scannerVersion: modifiedVersion,
+ lastRunAt: new Date(),
},
]
}
diff --git a/backend/src/connectors/fileScanning/index.ts b/backend/src/connectors/fileScanning/index.ts
index 82d80652e..d4f373879 100644
--- a/backend/src/connectors/fileScanning/index.ts
+++ b/backend/src/connectors/fileScanning/index.ts
@@ -31,7 +31,7 @@ export function runFileScanners(cache = true) {
case FileScanKind.ModelScan:
try {
const scanner = new ModelScanFileScanningConnector()
- await scanner.ping()
+ await scanner.init()
fileScanConnectors.push(scanner)
} catch (error) {
throw ConfigurationError('Could not configure or initialise ModelScan')
diff --git a/backend/src/connectors/fileScanning/modelScan.ts b/backend/src/connectors/fileScanning/modelScan.ts
index 25d03f7e0..a9f01fa86 100644
--- a/backend/src/connectors/fileScanning/modelScan.ts
+++ b/backend/src/connectors/fileScanning/modelScan.ts
@@ -1,13 +1,12 @@
-import { Response } from 'node-fetch'
import { Readable } from 'stream'
-import { getModelScanInfo, scanFile } from '../../clients/modelScan.js'
+import { getModelScanInfo, scanStream } from '../../clients/modelScan.js'
import { getObjectStream } from '../../clients/s3.js'
-import { FileInterfaceDoc, ScanState } from '../../models/File.js'
+import { FileInterfaceDoc } from '../../models/File.js'
import log from '../../services/log.js'
import config from '../../utils/config.js'
import { ConfigurationError } from '../../utils/error.js'
-import { BaseFileScanningConnector, FileScanResult } from './Base.js'
+import { BaseFileScanningConnector, FileScanResult, ScanState } from './Base.js'
export const modelScanToolName = 'ModelScan'
@@ -20,13 +19,21 @@ export class ModelScanFileScanningConnector extends BaseFileScanningConnector {
return [modelScanToolName]
}
- async ping() {
- try {
- // discard the results as we only want to know if the endpoint is reachable
- await getModelScanInfo()
- } catch (error) {
+ async init(retryCount: number = 1) {
+ log.info('Initialising ModelScan...')
+ if (retryCount <= config.connectors.fileScanners.maxInitRetries) {
+ setTimeout(async () => {
+ try {
+ await getModelScanInfo()
+ log.info('ModelScan initialised.')
+ } catch (error) {
+ log.warn(`Could not initialise ModelScan, retrying (attempt ${retryCount})...`)
+ this.init(++retryCount)
+ }
+ }, config.connectors.fileScanners.initRetryDelay)
+ } else {
throw ConfigurationError(
- 'ModelScan does not look like it is running. Check that the service configuration is correct.',
+ `Could not initialise Model Scan after ${retryCount} attempts, make sure that it is setup and configured correctly.`,
{
modelScanConfig: config.avScanning.modelscan,
},
@@ -35,13 +42,26 @@ export class ModelScanFileScanningConnector extends BaseFileScanningConnector {
}
async scan(file: FileInterfaceDoc): Promise {
- this.ping()
+ this.init()
+
+ let modelscanVersion: string | undefined = undefined
+ try {
+ modelscanVersion = (await getModelScanInfo()).modelscanVersion
+ } catch (error) {
+ log.error('Could not run ModelScan as it is not running', error)
+ return [
+ {
+ toolName: modelScanToolName,
+ scannerVersion: 'Unknown',
+ state: ScanState.Error,
+ lastRunAt: new Date(),
+ },
+ ]
+ }
const s3Stream = (await getObjectStream(file.bucket, file.path)).Body as Readable
try {
- // TODO: see if it's possible to directly send the Readable stream rather than a blob
- const fileBlob = await new Response(s3Stream).blob()
- const scanResults = await scanFile(fileBlob, file.name)
+ const scanResults = await scanStream(s3Stream, file.name, file.size)
const issues = scanResults.summary.total_issues
const isInfected = issues > 0
@@ -59,8 +79,10 @@ export class ModelScanFileScanningConnector extends BaseFileScanningConnector {
{
toolName: modelScanToolName,
state: ScanState.Complete,
+ scannerVersion: modelscanVersion,
isInfected,
viruses,
+ lastRunAt: new Date(),
},
]
} catch (error) {
@@ -69,6 +91,7 @@ export class ModelScanFileScanningConnector extends BaseFileScanningConnector {
{
toolName: modelScanToolName,
state: ScanState.Error,
+ lastRunAt: new Date(),
},
]
}
diff --git a/backend/src/migrations/012_add_avscan_lastRanAt_property.ts b/backend/src/migrations/012_add_avscan_lastRanAt_property.ts
new file mode 100644
index 000000000..0ee044ffa
--- /dev/null
+++ b/backend/src/migrations/012_add_avscan_lastRanAt_property.ts
@@ -0,0 +1,17 @@
+import FileModel from '../models/File.js'
+
+export async function up() {
+ const files = await FileModel.find({})
+ for (const file of files) {
+ for (const avResult of file.avScan) {
+ if (avResult.lastRunAt === undefined) {
+ avResult.lastRunAt = file.createdAt
+ }
+ }
+ await file.save()
+ }
+}
+
+export async function down() {
+ /* NOOP */
+}
diff --git a/backend/src/models/File.ts b/backend/src/models/File.ts
index b4c9dc276..c785c714a 100644
--- a/backend/src/models/File.ts
+++ b/backend/src/models/File.ts
@@ -1,7 +1,7 @@
import { Document, model, ObjectId, Schema } from 'mongoose'
import MongooseDelete from 'mongoose-delete'
-import { FileScanResult } from '../connectors/fileScanning/Base.js'
+import { FileScanResult, ScanState } from '../connectors/fileScanning/Base.js'
// This interface stores information about the properties on the base object.
// It should be used for plain object representations, e.g. for sending to the
@@ -25,14 +25,6 @@ export interface FileInterface {
updatedAt: Date
}
-export const ScanState = {
- NotScanned: 'notScanned',
- InProgress: 'inProgress',
- Complete: 'complete',
- Error: 'error',
-} as const
-export type ScanStateKeys = (typeof ScanState)[keyof typeof ScanState]
-
// The doc type includes all values in the plain interface, as well as all the
// properties and functions that Mongoose provides. If a function takes in an
// object from Mongoose it should use this interface
@@ -52,9 +44,11 @@ const FileSchema = new Schema(
avScan: [
{
toolName: { type: String },
+ scannerVersion: { type: String },
state: { type: String, enum: Object.values(ScanState) },
isInfected: { type: Boolean },
viruses: [{ type: String }],
+ lastRunAt: { type: Schema.Types.Date },
},
],
diff --git a/backend/src/routes.ts b/backend/src/routes.ts
index 512ea6dfa..dd9f1934e 100644
--- a/backend/src/routes.ts
+++ b/backend/src/routes.ts
@@ -12,6 +12,7 @@ import { getEntities } from './routes/v2/entities/getEntities.js'
import { getEntitiesLookup } from './routes/v2/entities/getEntitiesLookup.js'
import { getEntityLookup } from './routes/v2/entities/getEntityLookup.js'
import { getFilescanningInfo } from './routes/v2/filescanning/getFilescanningInfo.js'
+import { putFileScan } from './routes/v2/filescanning/putFileScan.js'
import { deleteAccessRequest } from './routes/v2/model/accessRequest/deleteAccessRequest.js'
import { getAccessRequest } from './routes/v2/model/accessRequest/getAccessRequest.js'
import { getAccessRequestCurrentUserPermissions } from './routes/v2/model/accessRequest/getAccessRequestCurrentUserPermissions.js'
@@ -193,6 +194,7 @@ server.delete('/api/v2/user/token/:accessKey', ...deleteUserToken)
server.get('/api/v2/specification', ...getSpecification)
server.get('/api/v2/filescanning/info', ...getFilescanningInfo)
+server.put('/api/v2/filescanning/model/:modelId/file/:fileId/scan', ...putFileScan)
// Python docs
const __filename = fileURLToPath(import.meta.url)
diff --git a/backend/src/routes/v2/filescanning/putFileScan.ts b/backend/src/routes/v2/filescanning/putFileScan.ts
new file mode 100644
index 000000000..dc018dac7
--- /dev/null
+++ b/backend/src/routes/v2/filescanning/putFileScan.ts
@@ -0,0 +1,59 @@
+import bodyParser from 'body-parser'
+import { Request, Response } from 'express'
+import { z } from 'zod'
+
+import { AuditInfo } from '../../../connectors/audit/Base.js'
+import audit from '../../../connectors/audit/index.js'
+import { rerunFileScan } from '../../../services/file.js'
+import { registerPath } from '../../../services/specification.js'
+import { parse } from '../../../utils/validate.js'
+
+export const putFileScanSchema = z.object({
+ params: z.object({
+ modelId: z.string(),
+ fileId: z.string(),
+ }),
+ body: z.object({}),
+})
+
+registerPath({
+ method: 'put',
+ path: '/api/v2/filescanning/model/{modelId}/file/{fileId}/scan',
+ tags: ['filescanning'],
+ description: 'Manually re-request a new antivirus scan for a file',
+ schema: putFileScanSchema,
+ responses: {
+ 200: {
+ description: ``,
+ content: {
+ 'application/json': {
+ schema: z.object({
+ status: z.string().openapi({ example: 'File scan started' }),
+ }),
+ },
+ },
+ },
+ },
+})
+
+interface PutFileScanResponse {
+ status: string
+}
+
+export const putFileScan = [
+ bodyParser.json(),
+ async (req: Request, res: Response) => {
+ req.audit = AuditInfo.UpdateFile
+ const {
+ params: { modelId, fileId },
+ } = parse(req, putFileScanSchema)
+
+ await rerunFileScan(req.user, modelId, fileId)
+
+ await audit.onUpdateFile(req, modelId, fileId)
+
+ return res.json({
+ status: 'Scan started',
+ })
+ },
+]
diff --git a/backend/src/routes/v2/model/webhook/deleteWebhook.ts b/backend/src/routes/v2/model/webhook/deleteWebhook.ts
index 9c060c5f0..8430174e2 100644
--- a/backend/src/routes/v2/model/webhook/deleteWebhook.ts
+++ b/backend/src/routes/v2/model/webhook/deleteWebhook.ts
@@ -15,7 +15,7 @@ export const deleteWebhookSchema = z.object({
registerPath({
method: 'delete',
- path: '/api/v2/model/{modelId}/webhooks/{webhookId}',
+ path: '/api/v2/model/{modelId}/webhook/{webhookId}',
tags: ['webhook'],
description: 'Delete a file from a model.',
schema: deleteWebhookSchema,
diff --git a/backend/src/routes/v2/model/webhook/putWebhook.ts b/backend/src/routes/v2/model/webhook/putWebhook.ts
index 913308c53..95550563b 100644
--- a/backend/src/routes/v2/model/webhook/putWebhook.ts
+++ b/backend/src/routes/v2/model/webhook/putWebhook.ts
@@ -26,7 +26,7 @@ export const putWebhookSchema = z.object({
registerPath({
method: 'put',
- path: '/api/v2/model/{modelId}/webhooks/{webhookId}',
+ path: '/api/v2/model/{modelId}/webhook/{webhookId}',
tags: ['webhook'],
description: 'Update a webhook instance.',
schema: putWebhookSchema,
diff --git a/backend/src/routes/v2/schema/patchSchema.ts b/backend/src/routes/v2/schema/patchSchema.ts
index 86a32ec19..63884d4de 100644
--- a/backend/src/routes/v2/schema/patchSchema.ts
+++ b/backend/src/routes/v2/schema/patchSchema.ts
@@ -15,10 +15,14 @@ export const patchSchemaSchema = z.object({
required_error: 'Must specify schema id as URL parameter',
}),
}),
- body: z.object({
- active: z.boolean().optional(),
- hidden: z.boolean().optional(),
- }),
+ body: z
+ .object({
+ active: z.boolean().openapi({ example: true }).optional(),
+ hidden: z.boolean().openapi({ example: false }).optional(),
+ name: z.string().openapi({ example: 'Test Schema v1' }).optional(),
+ description: z.string().openapi({ example: 'This is an example of schema description' }).optional(),
+ })
+ .strict(),
})
registerPath({
diff --git a/backend/src/services/file.ts b/backend/src/services/file.ts
index 24400fe15..5257395c4 100644
--- a/backend/src/services/file.ts
+++ b/backend/src/services/file.ts
@@ -2,15 +2,16 @@ import { Schema } from 'mongoose'
import { Readable } from 'stream'
import { getObjectStream, putObjectStream } from '../clients/s3.js'
-import { FileAction } from '../connectors/authorisation/actions.js'
+import { FileAction, ModelAction } from '../connectors/authorisation/actions.js'
import authorisation from '../connectors/authorisation/index.js'
-import { FileScanResult } from '../connectors/fileScanning/Base.js'
+import { FileScanResult, ScanState } from '../connectors/fileScanning/Base.js'
import scanners from '../connectors/fileScanning/index.js'
-import FileModel, { ScanState } from '../models/File.js'
+import FileModel, { FileInterface } from '../models/File.js'
import { UserInterface } from '../models/User.js'
import config from '../utils/config.js'
import { BadReq, Forbidden, NotFound } from '../utils/error.js'
import { longId } from '../utils/id.js'
+import { plural } from '../utils/string.js'
import { getModelById } from './model.js'
import { removeFileFromReleases } from './release.js'
@@ -33,14 +34,18 @@ export async function uploadFile(user: UserInterface, modelId: string, name: str
}
const { fileSize } = await putObjectStream(bucket, path, stream)
+ if (fileSize === 0) {
+ throw BadReq(`Could not upload ${file.name} as it is an empty file.`, { file: file })
+ }
file.size = fileSize
await file.save()
- if (scanners.info()) {
- const resultsInprogress = scanners.info().map((scannerName) => ({
+ if (scanners.info() && fileSize > 0) {
+ const resultsInprogress: FileScanResult[] = scanners.info().map((scannerName) => ({
toolName: scannerName,
state: ScanState.InProgress,
+ lastRunAt: new Date(),
}))
await updateFileWithResults(file._id, resultsInprogress)
scanners.scan(file).then((resultsArray) => updateFileWithResults(file._id, resultsArray))
@@ -54,14 +59,14 @@ async function updateFileWithResults(_id: Schema.Types.ObjectId, results: FileSc
const updateExistingResult = await FileModel.updateOne(
{ _id, 'avScan.toolName': result.toolName },
{
- $set: { 'avScan.$': result },
+ $set: { 'avScan.$': { ...result } },
},
)
if (updateExistingResult.modifiedCount === 0) {
await FileModel.updateOne(
{ _id, avScan: { $exists: true } },
{
- $push: { avScan: { toolName: result.toolName, state: result.state } },
+ $push: { avScan: { toolName: result.toolName, state: result.state, lastRunAt: new Date() } },
},
)
}
@@ -152,3 +157,56 @@ export async function getTotalFileSize(fileIds: string[]) {
})
return totalSize.at(0).totalSize
}
+
+function fileScanDelay(file: FileInterface): number {
+ const delay = config.connectors.fileScanners.retryDelayInMinutes
+ if (delay === undefined) {
+ return 0
+ }
+ let minutesBeforeRetrying = 0
+ for (const scanResult of file.avScan) {
+ const delayInMilliseconds = delay * 60000
+ const scanTimeAtLimit = scanResult.lastRunAt.getTime() + delayInMilliseconds
+ if (scanTimeAtLimit > new Date().getTime()) {
+ minutesBeforeRetrying = scanTimeAtLimit - new Date().getTime()
+ break
+ }
+ }
+ return Math.round(minutesBeforeRetrying / 60000)
+}
+
+export async function rerunFileScan(user: UserInterface, modelId, fileId: string) {
+ const model = await getModelById(user, modelId)
+ if (!model) {
+ throw BadReq('Cannot find requested model', { modelId: modelId })
+ }
+ const file = await getFileById(user, fileId)
+ if (!file) {
+ throw BadReq('Cannot find requested file', { modelId: modelId, fileId: fileId })
+ }
+ const rerunFileScanAuth = await authorisation.file(user, modelId, file, FileAction.Update)
+ if (!rerunFileScanAuth.success) {
+ throw Forbidden(rerunFileScanAuth.info, { userDn: user.dn, modelId, file })
+ }
+ if (!file.size || file.size === 0) {
+ throw BadReq('Cannot run scan on an empty file')
+ }
+ const minutesBeforeRescanning = fileScanDelay(file)
+ if (minutesBeforeRescanning > 0) {
+ throw BadReq(`Please wait ${plural(minutesBeforeRescanning, 'minute')} before attempting a rescan ${file.name}`)
+ }
+ const auth = await authorisation.model(user, model, ModelAction.Update)
+ if (!auth.success) {
+ throw Forbidden(auth.info, { userDn: user.dn })
+ }
+ if (scanners.info()) {
+ const resultsInprogress = scanners.info().map((scannerName) => ({
+ toolName: scannerName,
+ state: ScanState.InProgress,
+ lastRunAt: new Date(),
+ }))
+ await updateFileWithResults(file._id, resultsInprogress)
+ scanners.scan(file).then((resultsArray) => updateFileWithResults(file._id, resultsArray))
+ }
+ return `Scan started for ${file.name}`
+}
diff --git a/backend/src/services/mirroredModel.ts b/backend/src/services/mirroredModel.ts
index 3e0399129..edf1f801c 100644
--- a/backend/src/services/mirroredModel.ts
+++ b/backend/src/services/mirroredModel.ts
@@ -10,8 +10,9 @@ import { sign } from '../clients/kms.js'
import { getObjectStream, putObjectStream } from '../clients/s3.js'
import { ModelAction } from '../connectors/authorisation/actions.js'
import authorisation from '../connectors/authorisation/index.js'
+import { ScanState } from '../connectors/fileScanning/Base.js'
import scanners from '../connectors/fileScanning/index.js'
-import { FileInterfaceDoc, ScanState } from '../models/File.js'
+import { FileInterfaceDoc } from '../models/File.js'
import { ModelDoc } from '../models/Model.js'
import { ModelCardRevisionInterface } from '../models/ModelCardRevision.js'
import { ReleaseDoc } from '../models/Release.js'
diff --git a/backend/src/services/schema.ts b/backend/src/services/schema.ts
index 4ff196b98..e2e98e690 100644
--- a/backend/src/services/schema.ts
+++ b/backend/src/services/schema.ts
@@ -82,7 +82,7 @@ export async function createSchema(user: UserInterface, schema: Partial>
+export type UpdateSchemaParams = Partial>
export async function updateSchema(user: UserInterface, schemaId: string, diff: UpdateSchemaParams) {
const schema = await getSchemaById(schemaId)
diff --git a/backend/src/utils/config.ts b/backend/src/utils/config.ts
index 065ab8572..dc7c263b7 100644
--- a/backend/src/utils/config.ts
+++ b/backend/src/utils/config.ts
@@ -41,6 +41,9 @@ export interface Config {
fileScanners: {
kinds: FileScanKindKeys[]
+ retryDelayInMinutes: number
+ maxInitRetries: number
+ initRetryDelay: number
}
}
diff --git a/backend/src/utils/string.ts b/backend/src/utils/string.ts
new file mode 100644
index 000000000..f70fdf76f
--- /dev/null
+++ b/backend/src/utils/string.ts
@@ -0,0 +1,3 @@
+export const plural = (value: number, phrase: string) => {
+ return `${value} ${phrase}${value === 1 ? '' : 's'}`
+}
diff --git a/backend/test/clients/__snapshots__/modelScan.spec.ts.snap b/backend/test/clients/__snapshots__/modelScan.spec.ts.snap
index 84097df6f..022587dc1 100644
--- a/backend/test/clients/__snapshots__/modelScan.spec.ts.snap
+++ b/backend/test/clients/__snapshots__/modelScan.spec.ts.snap
@@ -14,7 +14,7 @@ exports[`clients > modelScan > getModelScanInfo > success 1`] = `
]
`;
-exports[`clients > modelScan > scanFile > success 1`] = `
+exports[`clients > modelScan > scanStream > success 1`] = `
[
[
"undefined://undefined:undefined/scan/file",
@@ -23,10 +23,17 @@ exports[`clients > modelScan > scanFile > success 1`] = `
Symbol(state): [
{
"name": "in_file",
- "value": File {
- Symbol(kHandle): Blob {},
- Symbol(kLength): 0,
- Symbol(kType): "application/x-hdf5",
+ "value": FileLike {
+ Symbol(state): {
+ "blobLike": {
+ "size": 0,
+ "stream": [Function],
+ Symbol(Symbol.toStringTag): "File",
+ },
+ "lastModified": 0,
+ "name": "safe_model.h5",
+ "type": undefined,
+ },
},
},
],
diff --git a/backend/test/clients/modelScan.spec.ts b/backend/test/clients/modelScan.spec.ts
index 6a6485a6a..333fb290a 100644
--- a/backend/test/clients/modelScan.spec.ts
+++ b/backend/test/clients/modelScan.spec.ts
@@ -1,6 +1,7 @@
+import { PassThrough } from 'stream'
import { describe, expect, test, vi } from 'vitest'
-import { getModelScanInfo, scanFile } from '../../src/clients/modelScan.js'
+import { getModelScanInfo, scanStream } from '../../src/clients/modelScan.js'
const configMock = vi.hoisted(() => ({
avScanning: {
@@ -59,7 +60,7 @@ describe('clients > modelScan', () => {
expect(() => getModelScanInfo()).rejects.toThrowError(/^Unable to communicate with the ModelScan service./)
})
- test('scanFile > success', async () => {
+ test('scanStream > success', async () => {
const expectedResponse = {
summary: {
total_issues: 0,
@@ -90,28 +91,32 @@ describe('clients > modelScan', () => {
text: vi.fn(),
json: vi.fn(() => expectedResponse),
})
- const response = await scanFile(new Blob([''], { type: 'application/x-hdf5' }), 'safe_model.h5')
+ // force lastModified to be 0
+ const date = new Date(1970, 0, 1, 0)
+ vi.setSystemTime(date)
+
+ const response = await scanStream(new PassThrough(), 'safe_model.h5', 0)
expect(fetchMock.default).toBeCalled()
expect(fetchMock.default.mock.calls).toMatchSnapshot()
expect(response).toStrictEqual(expectedResponse)
})
- test('scanFile > bad response', async () => {
+ test('scanStream > bad response', async () => {
fetchMock.default.mockResolvedValueOnce({
ok: false,
text: vi.fn(() => 'Unrecognised response'),
json: vi.fn(),
})
- expect(() => scanFile(new Blob([''], { type: 'application/x-hdf5' }), 'safe_model.h5')).rejects.toThrowError(
+ expect(() => scanStream(new PassThrough(), 'safe_model.h5', 0)).rejects.toThrowError(
/^Unrecognised response returned by the ModelScan service./,
)
})
- test('scanFile > rejected', async () => {
- fetchMock.default.mockRejectedValueOnce('Unable to communicate with the inferencing service.')
+ test('scanStream > rejected', async () => {
+ fetchMock.default.mockRejectedValueOnce('Unable to communicate with the ModelScan service.')
- expect(() => scanFile(new Blob([''], { type: 'application/x-hdf5' }), 'safe_model.h5')).rejects.toThrowError(
+ expect(() => scanStream(new PassThrough(), 'safe_model.h5', 0)).rejects.toThrowError(
/^Unable to communicate with the ModelScan service./,
)
})
diff --git a/backend/test/connectors/authorisation/authorisation.spec.ts b/backend/test/connectors/authorisation/authorisation.spec.ts
index 10bd896f5..24bfb88b7 100644
--- a/backend/test/connectors/authorisation/authorisation.spec.ts
+++ b/backend/test/connectors/authorisation/authorisation.spec.ts
@@ -11,6 +11,7 @@ vi.mock('../../../src/connectors/authentication/index.js', () => ({
const fileScanResult: FileScanResult = {
state: 'complete',
+ lastRunAt: new Date(),
isInfected: false,
toolName: 'Test',
}
diff --git a/backend/test/models/Token.spec.ts b/backend/test/models/Token.spec.ts
index 096d7385e..d8eb4238c 100644
--- a/backend/test/models/Token.spec.ts
+++ b/backend/test/models/Token.spec.ts
@@ -7,6 +7,16 @@ const bcryptMocks = vi.hoisted(() => ({
}))
vi.mock('bcryptjs', () => ({ default: bcryptMocks }))
+const baseScannerMock = vi.hoisted(() => ({
+ ScanState: {
+ NotScanned: 'notScanned',
+ InProgress: 'inProgress',
+ Complete: 'complete',
+ Error: 'error',
+ },
+}))
+vi.mock('../../src/connectors/filescanning/Base.js', () => baseScannerMock)
+
const sha256Mocks = vi.hoisted(() => ({
digest: vi.fn(),
}))
diff --git a/backend/test/routes/filescanning/__snapshots__/putFileScan.spec.ts.snap b/backend/test/routes/filescanning/__snapshots__/putFileScan.spec.ts.snap
new file mode 100644
index 000000000..a97a14073
--- /dev/null
+++ b/backend/test/routes/filescanning/__snapshots__/putFileScan.spec.ts.snap
@@ -0,0 +1,11 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`routes > filescanning > putFileScan > 200 > ok 1`] = `
+{
+ "status": "Scan started",
+}
+`;
+
+exports[`routes > filescanning > putFileScan > audit > expected call 1`] = `"vespillo"`;
+
+exports[`routes > filescanning > putFileScan > audit > expected call 2`] = `"$vespillo"`;
diff --git a/backend/test/routes/filescanning/putFileScan.spec.ts b/backend/test/routes/filescanning/putFileScan.spec.ts
new file mode 100644
index 000000000..752a25c31
--- /dev/null
+++ b/backend/test/routes/filescanning/putFileScan.spec.ts
@@ -0,0 +1,39 @@
+import { describe, expect, test, vi } from 'vitest'
+
+import audit from '../../../src/connectors/audit/__mocks__/index.js'
+import { putFileScanSchema } from '../../../src/routes/v2/filescanning/putFileScan.js'
+import { createFixture, testPut } from '../../testUtils/routes.js'
+
+vi.mock('../../../src/utils/user.js')
+vi.mock('../../../src/connectors/audit/index.js')
+vi.mock('../../../src/connectors/authorisation/index.js')
+
+vi.mock('../../../src/services/file.js', () => ({
+ rerunFileScan: vi.fn(),
+}))
+
+describe('routes > filescanning > putFileScan', () => {
+ test('200 > ok', async () => {
+ const fixture = createFixture(putFileScanSchema)
+ const res = await testPut(
+ `/api/v2/filescanning/model/${fixture.params.modelId}/file/$${fixture.params.fileId}/scan`,
+ fixture,
+ )
+
+ expect(res.statusCode).toBe(200)
+ expect(res.body).matchSnapshot()
+ })
+
+ test('audit > expected call', async () => {
+ const fixture = createFixture(putFileScanSchema)
+ const res = await testPut(
+ `/api/v2/filescanning/model/${fixture.params.modelId}/file/$${fixture.params.fileId}/scan`,
+ fixture,
+ )
+
+ expect(res.statusCode).toBe(200)
+ expect(audit.onUpdateFile).toBeCalled()
+ expect(audit.onUpdateFile.mock.calls.at(0)?.at(1)).toMatchSnapshot()
+ expect(audit.onUpdateFile.mock.calls.at(0)?.at(2)).toMatchSnapshot()
+ })
+})
diff --git a/backend/test/routes/model/accessRequest/postAccessRequest.spec.ts b/backend/test/routes/model/accessRequest/postAccessRequest.spec.ts
index c0bf1c810..27bd46196 100644
--- a/backend/test/routes/model/accessRequest/postAccessRequest.spec.ts
+++ b/backend/test/routes/model/accessRequest/postAccessRequest.spec.ts
@@ -16,9 +16,20 @@ vi.mock('../../../../src/services/accessRequest.js', async () => ({
const fileScanResult: FileScanResult = {
state: 'complete',
isInfected: false,
+ lastRunAt: new Date(),
toolName: 'Test',
}
+const baseScannerMock = vi.hoisted(() => ({
+ ScanState: {
+ NotScanned: 'notScanned',
+ InProgress: 'inProgress',
+ Complete: 'complete',
+ Error: 'error',
+ },
+}))
+vi.mock('../../src/connectors/filescanning/Base.js', () => baseScannerMock)
+
const fileScanningMock = vi.hoisted(() => ({
info: vi.fn(() => []),
scan: vi.fn(() => new Promise(() => [fileScanResult])),
diff --git a/backend/test/routes/schema/__snapshots__/patchSchema.spec.ts.snap b/backend/test/routes/schema/__snapshots__/patchSchema.spec.ts.snap
index da7ac868f..b01f634de 100644
--- a/backend/test/routes/schema/__snapshots__/patchSchema.spec.ts.snap
+++ b/backend/test/routes/schema/__snapshots__/patchSchema.spec.ts.snap
@@ -1,17 +1,64 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[`routes > schema > putSchema > audit > expected call 1`] = `
+exports[`routes > schema > patchSchema > audit > expected call 1`] = `
{
"active": false,
+ "description": "vespillo",
"hidden": false,
+ "name": "Jaime Hilll",
}
`;
-exports[`routes > schema > putSchema > successfully updates the schema 1`] = `
+exports[`routes > schema > patchSchema > patchSchema > audit > expected call 1`] = `
+{
+ "active": false,
+ "description": "vespillo",
+ "hidden": false,
+ "name": "Jaime Hilll",
+}
+`;
+
+exports[`routes > schema > patchSchema > patchSchema > successfully updates the schema 1`] = `
{
"schema": {
"active": false,
+ "description": "vespillo",
"hidden": false,
+ "name": "Jaime Hilll",
+ },
+}
+`;
+
+exports[`routes > schema > patchSchema > successfully updates the schema 1`] = `
+{
+ "schema": {
+ "active": false,
+ "description": "vespillo",
+ "hidden": false,
+ "name": "Jaime Hilll",
+ },
+}
+`;
+
+exports[`routes > schema > patchSchema > throws 400 when trying to update id property 1`] = `
+{
+ "error": {
+ "context": {
+ "errors": [
+ {
+ "code": "unrecognized_keys",
+ "keys": [
+ "id",
+ ],
+ "message": "Unrecognized key(s) in object: 'id'",
+ "path": [
+ "body",
+ ],
+ },
+ ],
+ },
+ "message": "Path: body - Message: Unrecognized key(s) in object: 'id'",
+ "name": "Bailo Error",
},
}
`;
diff --git a/backend/test/routes/schema/patchSchema.spec.ts b/backend/test/routes/schema/patchSchema.spec.ts
index 299dd3f4e..eaf194c28 100644
--- a/backend/test/routes/schema/patchSchema.spec.ts
+++ b/backend/test/routes/schema/patchSchema.spec.ts
@@ -15,16 +15,31 @@ const mockSchemaService = vi.hoisted(() => {
})
vi.mock('../../../src/services/schema.js', () => mockSchemaService)
-describe('routes > schema > putSchema', async () => {
+describe('routes > schema > patchSchema', async () => {
test('successfully updates the schema', async () => {
const fixture = createFixture(patchSchemaSchema)
mockSchemaService.updateSchema.mockResolvedValue(fixture.body)
- const res = await testPatch(`/api/v2/schema/${fixture.params.schemaId}`, { body: { active: false, hidden: false } })
+ const res = await testPatch(`/api/v2/schema/${fixture.params.schemaId}`, {
+ body: { active: false, hidden: false, name: fixture.body.name, description: fixture.body.description },
+ })
expect(res.statusCode).toBe(200)
expect(res.body).matchSnapshot()
- expect(res.body.schema.active).toBe(false)
- expect(res.body.schema.hidden).toBe(false)
+ expect(res.body.schema.active).toBe(fixture.body.active)
+ expect(res.body.schema.hidden).toBe(fixture.body.hidden)
+ expect(res.body.schema.name).toBe(fixture.body.name)
+ expect(res.body.schema.description).toBe(fixture.body.description)
+ })
+
+ test('throws 400 when trying to update id property', async () => {
+ const fixture = createFixture(patchSchemaSchema)
+ mockSchemaService.updateSchema.mockResolvedValue(fixture.body)
+ const res = await testPatch(`/api/v2/schema/${fixture.params.schemaId}`, {
+ body: { id: 'new-id' },
+ })
+
+ expect(res.statusCode).toBe(400)
+ expect(res.body).matchSnapshot()
})
test('audit > expected call', async () => {
diff --git a/backend/test/services/file.spec.ts b/backend/test/services/file.spec.ts
index 99df49326..88bb4c0f1 100644
--- a/backend/test/services/file.spec.ts
+++ b/backend/test/services/file.spec.ts
@@ -3,7 +3,7 @@ import { describe, expect, test, vi } from 'vitest'
import { FileAction } from '../../src/connectors/authorisation/actions.js'
import authorisation from '../../src/connectors/authorisation/index.js'
-import { FileScanResult } from '../../src/connectors/fileScanning/Base.js'
+import { FileScanResult, ScanState } from '../../src/connectors/fileScanning/Base.js'
import { UserInterface } from '../../src/models/User.js'
import {
downloadFile,
@@ -11,6 +11,7 @@ import {
getFilesByModel,
getTotalFileSize,
removeFile,
+ rerunFileScan,
uploadFile,
} from '../../src/services/file.js'
@@ -43,6 +44,9 @@ const configMock = vi.hoisted(
connectors: {
fileScanners: {
kinds: ['clamAV'],
+ retryDelayInMinutes: 5,
+ maxInitRetries: 5,
+ initRetryDelay: 5000,
},
},
}) as any,
@@ -56,6 +60,7 @@ const fileScanResult: FileScanResult = {
state: 'complete',
isInfected: false,
toolName: 'Test',
+ lastRunAt: new Date(),
}
const fileScanningMock = vi.hoisted(() => ({
@@ -99,6 +104,16 @@ const fileModelMocks = vi.hoisted(() => {
})
vi.mock('../../src/models/File.js', () => ({ default: fileModelMocks }))
+const baseScannerMock = vi.hoisted(() => ({
+ ScanState: {
+ NotScanned: 'notScanned',
+ InProgress: 'inProgress',
+ Complete: 'complete',
+ Error: 'error',
+ },
+}))
+vi.mock('../../src/connectors/filescanning/Base.js', () => baseScannerMock)
+
const clamscan = vi.hoisted(() => ({ on: vi.fn() }))
vi.mock('clamscan', () => ({
__esModule: true,
@@ -346,4 +361,37 @@ describe('services > file', () => {
expect(size).toBe(42)
})
+
+ test('rerunFileScan > successfully reruns a file scan', async () => {
+ const createdAtTimeInMilliseconds = new Date().getTime() - 2000000
+ fileModelMocks.findOne.mockResolvedValueOnce({
+ name: 'file.txt',
+ avScan: [{ state: ScanState.Complete, lastRunAt: new Date(createdAtTimeInMilliseconds) }],
+ size: 123,
+ })
+ const scanStatus = await rerunFileScan({} as any, 'model123', 'file123')
+ expect(scanStatus).toBe('Scan started for file.txt')
+ })
+
+ test('rerunFileScan > throws bad request when attemtping to upload an empty file', async () => {
+ fileModelMocks.findOne.mockResolvedValueOnce({
+ name: 'file.txt',
+ avScan: [{ state: ScanState.Complete }],
+ size: 0,
+ })
+ await expect(rerunFileScan({} as any, 'model123', 'file123')).rejects.toThrowError(
+ /^Cannot run scan on an empty file/,
+ )
+ })
+
+ test('rerunFileScan > does not rerun file scan before delay is over', async () => {
+ fileModelMocks.findOne.mockResolvedValueOnce({
+ name: 'file.txt',
+ avScan: [{ state: ScanState.Complete, lastRunAt: new Date() }],
+ size: 123,
+ })
+ await expect(rerunFileScan({} as any, 'model123', 'file123')).rejects.toThrowError(
+ /^Please wait 5 minutes before attempting a rescan file.txt/,
+ )
+ })
})
diff --git a/backend/test/services/mirroredModel.spec.ts b/backend/test/services/mirroredModel.spec.ts
index 578ce5a6a..600decc77 100644
--- a/backend/test/services/mirroredModel.spec.ts
+++ b/backend/test/services/mirroredModel.spec.ts
@@ -9,6 +9,7 @@ import { exportModel, importModel } from '../../src/services/mirroredModel.js'
const fileScanResult: FileScanResult = {
state: 'complete',
isInfected: false,
+ lastRunAt: new Date(),
toolName: 'Test',
}
@@ -23,6 +24,16 @@ const fflateMock = vi.hoisted(() => ({
}))
vi.mock('fflate', async () => fflateMock)
+const baseScannerMock = vi.hoisted(() => ({
+ ScanState: {
+ NotScanned: 'notScanned',
+ InProgress: 'inProgress',
+ Complete: 'complete',
+ Error: 'error',
+ },
+}))
+vi.mock('../../src/connectors/filescanning/Base.js', () => baseScannerMock)
+
const bufferMock = vi.hoisted(() => ({
unzipSync: vi.fn(),
}))
diff --git a/frontend/actions/fileScanning.ts b/frontend/actions/fileScanning.ts
index c3732c9e3..5c51a2f3e 100644
--- a/frontend/actions/fileScanning.ts
+++ b/frontend/actions/fileScanning.ts
@@ -18,3 +18,10 @@ export function useGetFileScannerInfo() {
isScannersError: error,
}
}
+
+export function rerunFileScan(modelId: string, fileId: string) {
+ return fetch(`/api/v2/filescanning/model/${modelId}/file/${fileId}/scan`, {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ })
+}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 361be8c1b..da23dd692 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -9,7 +9,7 @@
"@emotion/cache": "^11.11.0",
"@emotion/react": "^11.11.4",
"@emotion/server": "^11.11.0",
- "@emotion/styled": "^11.11.5",
+ "@emotion/styled": "^11.13.5",
"@fontsource/pacifico": "^5.0.13",
"@mdx-js/loader": "^3.0.1",
"@mdx-js/react": "^3.0.1",
@@ -552,15 +552,16 @@
}
},
"node_modules/@emotion/babel-plugin": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
- "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
+ "license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.16.7",
"@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/serialize": "^1.1.2",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.3.3",
"babel-plugin-macros": "^3.1.0",
"convert-source-map": "^1.5.0",
"escape-string-regexp": "^4.0.0",
@@ -569,6 +570,12 @@
"stylis": "4.2.0"
}
},
+ "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
"node_modules/@emotion/cache": {
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
@@ -582,18 +589,26 @@
}
},
"node_modules/@emotion/hash": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
- "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
+ "license": "MIT"
},
"node_modules/@emotion/is-prop-valid": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
- "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
+ "license": "MIT",
"dependencies": {
- "@emotion/memoize": "^0.8.1"
+ "@emotion/memoize": "^0.9.0"
}
},
+ "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
"node_modules/@emotion/memoize": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
@@ -623,17 +638,24 @@
}
},
"node_modules/@emotion/serialize": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz",
- "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==",
- "dependencies": {
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/unitless": "^0.8.1",
- "@emotion/utils": "^1.2.1",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.10.0",
+ "@emotion/utils": "^1.4.2",
"csstype": "^3.0.2"
}
},
+ "node_modules/@emotion/serialize/node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
+ "license": "MIT"
+ },
"node_modules/@emotion/server": {
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/@emotion/server/-/server-11.11.0.tgz",
@@ -659,16 +681,17 @@
"integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
},
"node_modules/@emotion/styled": {
- "version": "11.11.5",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz",
- "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==",
+ "version": "11.13.5",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz",
+ "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/is-prop-valid": "^1.2.2",
- "@emotion/serialize": "^1.1.4",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1"
+ "@emotion/babel-plugin": "^11.13.5",
+ "@emotion/is-prop-valid": "^1.3.0",
+ "@emotion/serialize": "^1.3.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+ "@emotion/utils": "^1.4.2"
},
"peerDependencies": {
"@emotion/react": "^11.0.0-rc.0",
@@ -681,22 +704,25 @@
}
},
"node_modules/@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
+ "license": "MIT"
},
"node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
- "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz",
+ "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==",
+ "license": "MIT",
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@emotion/utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
- "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
+ "license": "MIT"
},
"node_modules/@emotion/weak-memoize": {
"version": "0.3.1",
@@ -10973,9 +10999,9 @@
"optional": true
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
diff --git a/frontend/package.json b/frontend/package.json
index 9461419e7..291f85f9e 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,7 +16,7 @@
"@emotion/cache": "^11.11.0",
"@emotion/react": "^11.11.4",
"@emotion/server": "^11.11.0",
- "@emotion/styled": "^11.11.5",
+ "@emotion/styled": "^11.13.5",
"@fontsource/pacifico": "^5.0.13",
"@mdx-js/loader": "^3.0.1",
"@mdx-js/react": "^3.0.1",
diff --git a/frontend/pages/docs/administration/helm/configuration.mdx b/frontend/pages/docs/administration/helm/configuration.mdx
index 2c24f7ff0..f4becc52b 100644
--- a/frontend/pages/docs/administration/helm/configuration.mdx
+++ b/frontend/pages/docs/administration/helm/configuration.mdx
@@ -34,6 +34,8 @@ image:
frontendTag: 'v2.1.2'
backendRepository: ''
backendTag: 'v2.1.2'
+ modelscanRepository: ''
+ modelscanTag: 'v1.0.0'
```
To create these images, follow the instructions in [Building Bailo Images](../building-the-bailo-image).
diff --git a/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx b/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx
index 63d60b677..23e4a470d 100644
--- a/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx
+++ b/frontend/pages/docs/v1/administration/getting-started/building-the-bailo-image.mdx
@@ -9,6 +9,7 @@ frontend and one for the backend.
# Bailo uses a monorepo, so images should be built from the root directory
$ docker build -t "bailo-backend" -f ./backend/Dockerfile .
$ docker build -t "bailo-frontend" -f ./frontend/Dockerfile .
+$ docker build -t "bailo-modelscan" -f ./lib/modelscan_api/Dockerfile .
```
Ensure you do not use the development Dockerfiles (called `Dockerfile.dev`) as they expect the application to be mounted
diff --git a/frontend/pages/model/[modelId].tsx b/frontend/pages/model/[modelId].tsx
index 06ee35017..3ad65b7ea 100644
--- a/frontend/pages/model/[modelId].tsx
+++ b/frontend/pages/model/[modelId].tsx
@@ -102,6 +102,7 @@ export default function Model() {
-
+
<>
{userCanReview && }
diff --git a/frontend/src/MuiForms/DateSelector.tsx b/frontend/src/MuiForms/DateSelector.tsx
index 6cd5b9452..db078e3ef 100644
--- a/frontend/src/MuiForms/DateSelector.tsx
+++ b/frontend/src/MuiForms/DateSelector.tsx
@@ -15,7 +15,7 @@ interface DateSelectorProps {
readOnly?: boolean
formContext?: any
value: string
- onChange: (newValue: string) => void
+ onChange: (newValue: string | undefined) => void
InputProps?: any
}
@@ -26,6 +26,8 @@ export default function DateSelector(props: DateSelectorProps) {
const handleChange = (dateInput: Dayjs | null) => {
if (dateInput && dateInput.isValid()) {
onChange(dateInput.format('YYYY-MM-DD'))
+ } else {
+ onChange(undefined)
}
}
diff --git a/frontend/src/common/EditableText.tsx b/frontend/src/common/EditableText.tsx
new file mode 100644
index 000000000..03ed033eb
--- /dev/null
+++ b/frontend/src/common/EditableText.tsx
@@ -0,0 +1,88 @@
+import EditIcon from '@mui/icons-material/Edit'
+import { Box, Button, IconButton, Stack, TextField, Tooltip, Typography } from '@mui/material'
+import { useCallback, useMemo, useState } from 'react'
+import RichTextEditor from 'src/common/RichTextEditor'
+
+interface EditableTextProps {
+ value: string
+ onSubmit: (newValue: string) => void
+ tooltipText?: string
+ submitButtonText?: string
+ multiline?: boolean
+ richText?: boolean
+}
+
+export default function EditableText({
+ value,
+ onSubmit,
+ tooltipText = 'Edit this text',
+ submitButtonText = 'Submit',
+ multiline = false,
+ richText = false,
+}: EditableTextProps) {
+ const [isEditMode, setIsEditMode] = useState(false)
+ const [newValue, setNewValue] = useState(value)
+
+ const handleCancelOnClick = useCallback(() => {
+ setIsEditMode(false)
+ setNewValue(value)
+ }, [value])
+
+ const handleSubmit = () => {
+ setIsEditMode(false)
+ onSubmit(newValue)
+ }
+
+ const submitButtons = useMemo(() => {
+ return (
+
+
+
+
+ )
+ }, [handleCancelOnClick, submitButtonText])
+
+ return (
+ <>
+ {!isEditMode && (
+
+
+ setIsEditMode(true)}>
+
+
+
+ {value}
+
+ )}
+ {isEditMode && (
+
+ {richText ? (
+
+ setNewValue(input)}
+ aria-label='Schema description'
+ />
+ {submitButtons}
+
+ ) : (
+
+ setNewValue(event.target.value)}
+ size='small'
+ multiline={multiline}
+ />
+ {submitButtons}
+
+ )}
+
+ )}
+ >
+ )
+}
diff --git a/frontend/src/common/PageWithTabs.tsx b/frontend/src/common/PageWithTabs.tsx
index e99508bd5..d96bdac5a 100644
--- a/frontend/src/common/PageWithTabs.tsx
+++ b/frontend/src/common/PageWithTabs.tsx
@@ -17,9 +17,24 @@ export interface PageTab {
disabledText?: string
}
+interface PageWithTabsProps {
+ title: string
+ subheading?: string
+ additionalInfo?: string
+ tabs: PageTab[]
+ actionButtonTitle?: string
+ displayActionButton?: boolean
+ actionButtonOnClick?: () => void
+ requiredUrlParams?: ParsedUrlQuery
+ titleToCopy?: string
+ subheadingToCopy?: string
+ sourceModelId?: string
+}
+
export default function PageWithTabs({
title,
subheading,
+ additionalInfo,
tabs,
actionButtonTitle = '',
displayActionButton = false,
@@ -28,18 +43,7 @@ export default function PageWithTabs({
titleToCopy = '',
subheadingToCopy = '',
sourceModelId = '',
-}: {
- title: string
- subheading?: string
- tabs: PageTab[]
- actionButtonTitle?: string
- displayActionButton?: boolean
- actionButtonOnClick?: () => void
- requiredUrlParams?: ParsedUrlQuery
- titleToCopy?: string
- subheadingToCopy?: string
- sourceModelId?: string
-}) {
+}: PageWithTabsProps) {
const router = useRouter()
const { tab } = router.query
@@ -157,6 +161,7 @@ export default function PageWithTabs({
)}
{sourceModelId && Mirrored from {sourceModelId} (read-only)}
+ {additionalInfo}
(null)
+ const sendNotification = useNotification()
const { scanners, isScannersLoading, isScannersError } = useGetFileScannerInfo()
const open = Boolean(anchorEl)
@@ -37,10 +41,10 @@ export default function FileDownload({ modelId, file }: FileDownloadProps) {
const chipDetails = useCallback((file: FileInterface): ChipDetails => {
if (file.avScan === undefined) {
- return { label: 'Virus scan results could not be found.', colour: 'warning', icon: }
+ return { label: 'Virus scan results could not be found', colour: 'warning', icon: }
}
if (file.avScan.some((scan) => scan.state === ScanState.Error)) {
- return { label: 'One or more virus scanning tools failed.', colour: 'warning', icon: }
+ return { label: 'One or more virus scanning tools failed', colour: 'warning', icon: }
}
if (threatsFound(file)) {
return {
@@ -52,6 +56,33 @@ export default function FileDownload({ modelId, file }: FileDownloadProps) {
return { label: 'Virus scan passed', colour: 'success', icon: }
}, [])
+ const handleRerunFileScanOnClick = useCallback(async () => {
+ const res = await rerunFileScan(modelId, (file as FileInterface)._id)
+ if (!res.ok) {
+ sendNotification({
+ variant: 'error',
+ msg: await getErrorMessage(res),
+ anchorOrigin: { horizontal: 'center', vertical: 'bottom' },
+ })
+ } else {
+ sendNotification({
+ variant: 'success',
+ msg: `${file.name} is being rescanned`,
+ anchorOrigin: { horizontal: 'center', vertical: 'bottom' },
+ })
+ }
+ }, [file, modelId, sendNotification])
+
+ const rerunFileScanButton = useMemo(() => {
+ return (
+
+
+
+
+
+ )
+ }, [handleRerunFileScanOnClick])
+
const avChip = useMemo(() => {
if (
!isFileInterface(file) ||
@@ -89,22 +120,32 @@ export default function FileDownload({ modelId, file }: FileDownloadProps) {
{file.avScan.map((scanResult) => (
{scanResult.isInfected ? (
- <>
+
{scanResult.toolName} found the following threats:
+ {scanResult.scannerVersion && (
+
+ )}
+ Last ran at: {formatDateTimeString(scanResult.lastRunAt)}
{scanResult.viruses && scanResult.viruses.map((virus) => - {virus}
)}
- >
+
) : (
-
- {scanResult.state === 'error' ? : }
-
- {scanResult.toolName}
- {scanResult.state === 'error' ? ' was not able to be run' : ' did not find any threats'}
-
+
+
+ {scanResult.state === 'error' ? : }
+
+ {scanResult.toolName}
+ {scanResult.state === 'error' ? ' was not able to be run' : ' did not find any threats'}
+
+
+ {scanResult.scannerVersion && (
+
+ )}
+ Last ran at: {formatDateTimeString(scanResult.lastRunAt)}
)}
@@ -126,23 +167,22 @@ export default function FileDownload({ modelId, file }: FileDownloadProps) {
return (
<>
{isFileInterface(file) && (
-
-
-
-
-
-
- {file.name}
-
-
-
- {scanners.length > 0 && avChip}
+
+
+
+
+ {file.name}
+
+
+
+ {scanners.length > 0 && (
+
+ {avChip}
+ {rerunFileScanButton}
-
-
- {prettyBytes(file.size)}
-
-
+ )}
+ {prettyBytes(file.size)}
+
)}
>
)
diff --git a/frontend/src/schemas/SchemaList.tsx b/frontend/src/schemas/SchemaList.tsx
index 869b2d062..5763ad879 100644
--- a/frontend/src/schemas/SchemaList.tsx
+++ b/frontend/src/schemas/SchemaList.tsx
@@ -1,18 +1,4 @@
-import ExpandLessIcon from '@mui/icons-material/ExpandLess'
-import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
-import {
- Button,
- Card,
- Chip,
- List,
- ListItem,
- ListItemButton,
- ListItemText,
- Menu,
- MenuItem,
- Stack,
- Typography,
-} from '@mui/material'
+import { Card, List, ListItemButton, ListItemText, Typography } from '@mui/material'
import { useTheme } from '@mui/material/styles'
import { useListModels } from 'actions/model'
import { useGetReviewRequestsForUser } from 'actions/review'
@@ -23,6 +9,7 @@ import EmptyBlob from 'src/common/EmptyBlob'
import Loading from 'src/common/Loading'
import Link from 'src/Link'
import MessageAlert from 'src/MessageAlert'
+import SchemaListItem from 'src/schemas/SchemaListItem'
import { EntryKind, SchemaInterface, SchemaKind, SchemaKindKeys } from 'types/types'
import { getErrorMessage } from 'utils/fetcher'
import { camelCaseToSentenceCase, camelCaseToTitleCase } from 'utils/stringUtils'
@@ -91,7 +78,7 @@ export default function SchemaList({ schemaKind }: SchemaDisplayProps) {
setOpenMenuSchemaId(null)
}, [])
- const handlePatchSchema = useCallback(
+ const handleEditSchema = useCallback(
async (schemaId: SchemaInterface['id'], diff: Partial) => {
handleCloseMenu()
setErrorMessage('')
@@ -133,57 +120,21 @@ export default function SchemaList({ schemaKind }: SchemaDisplayProps) {
schemas.map((schema, index) => {
const open = !!anchorEl && openMenuSchemaId === schema.id
return (
-
- {schema.name}
-
-
- {schema.hidden && }
- : }
- onClick={(event) => handleOpenMenu(event, schema.id)}
- >
- Actions
-
-
-
-
+
)
}),
- [schemas, openMenuSchemaId, anchorEl, handleCloseMenu, handleOpenMenu, handlePatchSchema, handleDeleteSchema],
+ [schemas, anchorEl, openMenuSchemaId, handleCloseMenu, handleDeleteSchema, handleOpenMenu, handleEditSchema],
)
const objectsToDeleteList = useMemo(() => {
diff --git a/frontend/src/schemas/SchemaListItem.tsx b/frontend/src/schemas/SchemaListItem.tsx
new file mode 100644
index 000000000..f4d36ece6
--- /dev/null
+++ b/frontend/src/schemas/SchemaListItem.tsx
@@ -0,0 +1,95 @@
+import ExpandLessIcon from '@mui/icons-material/ExpandLess'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import { Button, Chip, ListItem, ListItemText, Menu, MenuItem, Stack } from '@mui/material'
+import EditableText from 'src/common/EditableText'
+import { SchemaInterface } from 'types/types'
+
+interface SchemaListItemProps {
+ schema: SchemaInterface
+ schemasLength: number
+ index: number
+ open: boolean
+ anchorEl: null | HTMLElement
+ onMenuClose: () => void
+ onOpenMenuClick: (event, schemaId: string) => void
+ onEditSchemaClick: (schemaId: string, partialSchema: Partial) => void
+ onDeleteSchemaClick: (schemaId: string) => void
+}
+export default function SchemaListItem({
+ schema,
+ schemasLength,
+ index,
+ open,
+ anchorEl,
+ onMenuClose,
+ onDeleteSchemaClick,
+ onOpenMenuClick,
+ onEditSchemaClick,
+}: SchemaListItemProps) {
+ return (
+
+ onEditSchemaClick(schema.id, { name: newValue })}
+ tooltipText='Edit schema name'
+ />
+ }
+ secondary={
+ onEditSchemaClick(schema.id, { description: newValue })}
+ tooltipText='Edit schema description'
+ richText
+ />
+ }
+ />
+
+
+ {schema.hidden && }
+ : }
+ onClick={(event) => onOpenMenuClick(event, schema.id)}
+ >
+ Actions
+
+
+
+
+ )
+}
diff --git a/frontend/types/types.ts b/frontend/types/types.ts
index f391e090a..0d73f3782 100644
--- a/frontend/types/types.ts
+++ b/frontend/types/types.ts
@@ -88,9 +88,11 @@ export interface FileInterface {
export interface AvScanResult {
state: ScanStateKeys
+ scannerVersion?: string
isInfected?: boolean
viruses?: Array
toolName: string
+ lastRunAt: string
}
export const ScanState = {
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..b1fd2b8eb
--- /dev/null
+++ b/index.html
@@ -0,0 +1 @@
+It looks like you are trying to access MongoDB over HTTP on the native driver port.
diff --git a/infrastructure/helm/README.md b/infrastructure/helm/README.md
index 7fc5fadab..f6b37b6da 100644
--- a/infrastructure/helm/README.md
+++ b/infrastructure/helm/README.md
@@ -49,6 +49,8 @@ image:
frontendTag: tag
backendRepository: 'image-registry-openshift-imagestreams'
backendTag: tag
+ modelscanRepository: 'image-registry-openshift-imagestreams'
+ modelscanTag: tag
route:
enabled: true
@@ -73,6 +75,8 @@ image:
frontendTag: tag
backendRepository: 'aws-elastic-container-registry'
backendTag: tag
+ modelscanRepository: 'aws-elastic-container-registry'
+ modelscanTag: tag
ingress:
enabled: true
diff --git a/infrastructure/helm/bailo/templates/bailo/bailo.configmap.yaml b/infrastructure/helm/bailo/templates/bailo/bailo.configmap.yaml
index c4f19bfb7..a8de82287 100644
--- a/infrastructure/helm/bailo/templates/bailo/bailo.configmap.yaml
+++ b/infrastructure/helm/bailo/templates/bailo/bailo.configmap.yaml
@@ -67,6 +67,12 @@ data:
host: '{{ include "bailo.fullname" . }}-clamav',
port: {{ .Values.clamav.port }},
},
+
+ modelscan: {
+ host: '{{ include "bailo.fullname" . }}-modelscan',
+ port: {{ .Values.modelscan.port }},
+ protocol: '{{ .Values.modelscan.protocol }}',
+ },
},
smtp: {
@@ -181,8 +187,8 @@ data:
},
helpPopoverText: {
- manualEntryAccess: {{ .Values.config.ui.helpPopoverText.manualEntryAccess }}
- }
+ manualEntryAccess: '{{ .Values.config.ui.helpPopoverText.manualEntryAccess }}'
+ },
},
connectors: {
@@ -200,6 +206,9 @@ data:
fileScanners: {
kinds: {{ toJson .Values.connectors.fileScanners.kinds }}
+ retryDelayInMinutes: {{ .Values.connectors.fileScanners.retryDelayInMinutes}}
+ maxInitRetries: {{ .Values.connectors.fileScanners.maxInitRetries}}
+ initRetryDelay: {{ .Values.connectors.fileScanners.initRetryDelay}}
},
},
diff --git a/infrastructure/helm/bailo/templates/modelscan/modelscan.deployment.yaml b/infrastructure/helm/bailo/templates/modelscan/modelscan.deployment.yaml
new file mode 100644
index 000000000..af8da3126
--- /dev/null
+++ b/infrastructure/helm/bailo/templates/modelscan/modelscan.deployment.yaml
@@ -0,0 +1,50 @@
+{{- if .Values.modelscan.enabled }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "bailo.fullname" . }}-modelscan
+ labels:
+ {{- include "bailo.labels" . | nindent 4 }}
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ name: modelscan
+ template:
+ metadata:
+ labels:
+ name: modelscan
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ include "bailo.fullname" . }}-modelscan
+ ports:
+ - name: modelscanport
+ containerPort: {{ .Values.modelscan.port }}
+ protocol: TCP
+ image: "{{ .Values.image.modelscanRepository }}:{{ .Values.image.modelscanTag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ resources:
+ requests:
+ memory: "100Mi"
+ ephemeral-storage: "100Mi"
+ cpu: "200m"
+ limits:
+ memory: "1Gi"
+ ephemeral-storage: "300Mi"
+ cpu: "1"
+ volumeMounts:
+ - name: tmp
+ mountPath: /tmp
+ securityContext:
+ allowPrivilegeEscalation: false
+ volumes:
+ - name: tmp
+ emptyDir: {}
+ - name: modelscan-log
+ emptyDir: {}
+{{- end }}
diff --git a/infrastructure/helm/bailo/templates/modelscan/modelscan.service.yaml b/infrastructure/helm/bailo/templates/modelscan/modelscan.service.yaml
new file mode 100644
index 000000000..10efebb44
--- /dev/null
+++ b/infrastructure/helm/bailo/templates/modelscan/modelscan.service.yaml
@@ -0,0 +1,17 @@
+{{- if .Values.modelscan.enabled }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "bailo.fullname" . }}-modelscan
+ labels:
+ {{- include "bailo.labels" . | nindent 4 }}
+spec:
+ ports:
+ - port: {{ .Values.modelscan.port }}
+ targetPort: {{ .Values.modelscan.port }}
+ protocol: TCP
+ name: {{ .Values.modelscan.protocol }}
+ selector:
+ name: modelscan
+{{- end }}
diff --git a/infrastructure/helm/bailo/values.yaml b/infrastructure/helm/bailo/values.yaml
index f0dac1160..3b1dcab26 100644
--- a/infrastructure/helm/bailo/values.yaml
+++ b/infrastructure/helm/bailo/values.yaml
@@ -8,6 +8,8 @@ image:
frontendTag: imageTag
backendRepository: "backend-image-registry.location"
backendTag: imageTag
+ modelscanRepository: "modelscan-image-registry.location"
+ modelscanTag: imageTag
pullPolicy: IfNotPresent
imagePullSecrets: []
@@ -63,7 +65,7 @@ route:
enabled: false # false for k8s | aws
appPublicRoute: "route-url" # can also be used for aws loadbalancer url
-# Oauth | Congnito
+# Oauth | Cognito
# using bash for generating cookie secret example
# dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64 | tr -d -- '\n' | tr -- '+/' '-_'; echo
cookie:
@@ -76,7 +78,7 @@ oauth:
secret: "cognito app client secret"
dynamic: [] # example 'scope'
response: [] #example 'tokens', 'raw', 'jwt'
- callback: "" # exmaple /
+ callback: "" # example /
subdomain: "cognito domain"
identityProviderClient:
userPoolId: "region_id"
@@ -118,11 +120,11 @@ mongodb:
enabled: true
ssl: false
sslValidate: false
- host: "" # serviceName:mongoport/collectioname or serviceName-headless:mongoport/collectionname for mongodb replicaset. see template/_helper.tpl and templates/bailo/bailo.configmap.yaml.
+ host: "" # serviceName:mongoport/collectionname or serviceName-headless:mongoport/collectionname for mongodb replicaset. see template/_helper.tpl and templates/bailo/bailo.configmap.yaml.
livenessProbe:
enabled: false
readinessProbe:
- enabled: false #Rediness probe failed: /bitnami/scripts/readiness-probe.sh: line 9: mongosh: command not found
+ enabled: false #Readiness probe failed: /bitnami/scripts/readiness-probe.sh: line 9: mongosh: command not found
auth:
rootUser: ""
rootPassword: ""
@@ -135,7 +137,7 @@ mongodb:
port: 27017
collectionName: bailo # Collection name in Mongo
persistence:
- #enabled: false # Required for aws. EKS is not able to handle dynamic creation of PVC using this helm chart. Instead /templates/storage.yaml handles eks storage. Stoage is not removed when deployed mongodb is removed.
+ #enabled: false # Required for aws. EKS is not able to handle dynamic creation of PVC using this helm chart. Instead /templates/storage.yaml handles eks storage. Storage is not removed when deployed mongodb is removed.
size: 10Gi
containerSecurityContext:
enabled: false
@@ -165,7 +167,7 @@ minio:
api: 31111 # default 9000
useSSL: false
persistence:
- #enabled: false # Required for aws. EKS is not able to handle dynamic creation of PVC using this helm chart. Instead /templates/storage.yaml handles eks storage. Stoage is not removed when deployed minio is removed.
+ #enabled: false # Required for aws. EKS is not able to handle dynamic creation of PVC using this helm chart. Instead /templates/storage.yaml handles eks storage. Storage is not removed when deployed minio is removed.
size: 20Gi
containerSecurityContext:
enabled: false
@@ -196,7 +198,7 @@ registry:
# Nginx Dependencies
nginxAuth:
- repository: nginxinc/nginx-unprivileged # runs Nginx as non-root unrivileged user.
+ repository: nginxinc/nginx-unprivileged # runs Nginx as non-root unprivileged user.
tag: latest
#host: "bailo-nginx" # service name
port: 8080
@@ -261,6 +263,9 @@ connectors:
fileScanners:
kinds: []
+ retryDelayInMinutes: 60
+ maxInitRetries: 5
+ initRetryDelay: 5000
instrumentation:
enabled: false
@@ -299,3 +304,11 @@ clamav:
accessModes:
- ReadWriteOnce
size: 10G
+
+modelscan:
+ enabled: false
+ protocol: http
+ port: 3311
+ accessModes:
+ - ReadWriteOnce
+ size: 20G # modelscan saves each incoming file to the disk so needs plenty of storage
diff --git a/lib/landing/package-lock.json b/lib/landing/package-lock.json
index 4f0e56fda..89463bdcf 100644
--- a/lib/landing/package-lock.json
+++ b/lib/landing/package-lock.json
@@ -5343,9 +5343,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
@@ -10932,9 +10932,9 @@
}
},
"nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="
},
"natural-compare": {
"version": "1.4.0",
diff --git a/lib/modelscan_api/Dockerfile b/lib/modelscan_api/Dockerfile
index ff7929b22..39a60d8f8 100644
--- a/lib/modelscan_api/Dockerfile
+++ b/lib/modelscan_api/Dockerfile
@@ -1,4 +1,4 @@
-FROM python:3.12-slim-bullseye
+FROM python:3.12.8-slim-bullseye
# Prevents Python from writing pyc files.
ENV PYTHONDONTWRITEBYTECODE=1
diff --git a/lib/modelscan_api/Dockerfile.dev b/lib/modelscan_api/Dockerfile.dev
index 374d480de..ea1d18386 100644
--- a/lib/modelscan_api/Dockerfile.dev
+++ b/lib/modelscan_api/Dockerfile.dev
@@ -1,4 +1,4 @@
-FROM python:3.12-slim-bullseye
+FROM python:3.12.8-slim-bullseye
# Prevents Python from writing pyc files.
ENV PYTHONDONTWRITEBYTECODE=1
diff --git a/lib/modelscan_api/bailo_modelscan_api/config.py b/lib/modelscan_api/bailo_modelscan_api/config.py
index ee1d75e6b..b6f6435e6 100644
--- a/lib/modelscan_api/bailo_modelscan_api/config.py
+++ b/lib/modelscan_api/bailo_modelscan_api/config.py
@@ -24,6 +24,7 @@ class Settings(BaseSettings):
Bailo ModelScan API allows for easy programmatic interfacing with ProtectAI's ModelScan package to scan and detect potential threats within files stored in Bailo.
You can upload files and view modelscan's result."""
+ # Update frontend/pages/docs/administration/helm/configuration.mdx if bumping this.
app_version: str = "1.0.0"
# download_dir is used if it evaluates, otherwise a temporary directory is used.
download_dir: Optional[str] = None
diff --git a/lib/modelscan_api/bailo_modelscan_api/main.py b/lib/modelscan_api/bailo_modelscan_api/main.py
index 53e5f1230..6bf107dca 100644
--- a/lib/modelscan_api/bailo_modelscan_api/main.py
+++ b/lib/modelscan_api/bailo_modelscan_api/main.py
@@ -41,11 +41,13 @@ def get_settings() -> Settings:
dependencies=[Depends(get_settings)],
)
-# Instantiating ModelScan
-modelscan_model = ModelScan(settings=get_settings().modelscan_settings)
-
class ApiInformation(BaseModel):
+ """Minimal typed information about the API endpoint.
+
+ :param BaseModel: Pydantic super class
+ """
+
apiName: str
apiVersion: str
scannerName: str
@@ -59,7 +61,7 @@ class ApiInformation(BaseModel):
status_code=HTTPStatus.OK.value,
response_description="A populated ApiInformation object",
)
-def info(settings: Annotated[Settings, Depends(get_settings)]) -> ApiInformation:
+async def info(settings: Annotated[Settings, Depends(get_settings)]) -> ApiInformation:
"""Information about the API.
:return: a JSON representable object with keys from ApiInformation
@@ -121,7 +123,7 @@ def info(settings: Annotated[Settings, Depends(get_settings)]) -> ApiInformation
},
},
)
-def scan_file(
+async def scan_file(
in_file: UploadFile,
background_tasks: BackgroundTasks,
settings: Annotated[Settings, Depends(get_settings)],
@@ -135,6 +137,9 @@ def scan_file(
"""
logger.info("Called the API endpoint to scan an uploaded file")
try:
+ # Instantiate ModelScan
+ modelscan_model = ModelScan(settings=settings.modelscan_settings)
+
# Use Setting's download_dir if defined else use a temporary directory.
with TemporaryDirectory() if not settings.download_dir else nullcontext(settings.download_dir) as download_dir:
if in_file.filename and str(in_file.filename).strip():
@@ -190,7 +195,8 @@ def scan_file(
finally:
try:
# Clean up the downloaded file as a background task to allow returning sooner.
- # If using a temporary dir then this would happen anyway, but if Settings' download_dir evaluates then this is required.
+ # If using a temporary dir then this would happen anyway, but if Settings' download_dir evaluates
+ # then this is required.
logger.info("Cleaning up downloaded file.")
background_tasks.add_task(Path.unlink, pathlib_path, missing_ok=True)
except UnboundLocalError:
diff --git a/lib/modelscan_api/requirements.txt b/lib/modelscan_api/requirements.txt
index e7de62581..7c5d6646a 100644
--- a/lib/modelscan_api/requirements.txt
+++ b/lib/modelscan_api/requirements.txt
@@ -1,5 +1,5 @@
fastapi[standard]>=0.115.0,<0.116.0
modelscan[tensorflow,h5py]>=0.8.0,<0.9.0
pydantic_settings>=2.6.1,<2.7.0
-python-multipart==0.0.17
+python-multipart==0.0.18
uvicorn>=0.32.0,<0.33.0
diff --git a/lib/python/README.md b/lib/python/README.md
index d08e411d3..33207a877 100644
--- a/lib/python/README.md
+++ b/lib/python/README.md
@@ -17,10 +17,17 @@ A simple Python API Wrapper for Bailo
Getting Started
+
+ Documentation
+
+
Development
@@ -35,7 +42,10 @@ A simple Python API Wrapper for Bailo
## Installing
-**Python 3.8.1 or higher is required**
+
+> [!IMPORTANT]
+> Python 3.8.1 or higher is required
+
```bash
pip install bailo
@@ -51,8 +61,7 @@ client = Client("http://localhost:8080")
yolo = Model.create(
client=client,
name="YoloV4",
- description="You only look once!",
- team_id="Uncategorised"
+ description="You only look once!"
)
yolo.card_from_schema("minimal-general-v10")
@@ -68,21 +77,11 @@ with open("yolo.onnx") as f:
## Documentation
-Documenation is rendered with Sphinx and served [here](https://gchq.github.io/Bailo/docs/python/index.html).
+Documentation is rendered with Sphinx and served [here](https://gchq.github.io/Bailo/docs/python/index.html).
### Building locally
-#### prerequisites
-
-From within the `backend/docs` directory:
-
-```bash
-pip install bailo -r requirements.txt
-apt install -y pandoc
-```
-
-From the docs directory run either `make html` or `make.bat` on Windows. This will build it in the backend directory by
-default.
+Refer to [backend/docs/README.md](../../backend/docs/README.md) for local build steps.
## Development
diff --git a/lib/python/src/bailo/core/agent.py b/lib/python/src/bailo/core/agent.py
index 78a397f06..21799c2e4 100644
--- a/lib/python/src/bailo/core/agent.py
+++ b/lib/python/src/bailo/core/agent.py
@@ -64,19 +64,14 @@ def put(self, *args, **kwargs):
class PkiAgent(Agent):
- def __init__(
- self,
- cert: str,
- key: str,
- auth: str,
- ):
+ def __init__(self, cert: str, key: str, auth: str, **kwargs):
"""Initiate an agent for PKI authentication.
:param cert: Path to cert file
:param key: Path to key file
:param auth: Path to certificate authority file
"""
- super().__init__(verify=auth)
+ super().__init__(verify=auth, **kwargs)
self.cert = cert
self.key = key
@@ -102,13 +97,14 @@ def __init__(
self,
access_key: str | None = None,
secret_key: str | None = None,
+ **kwargs,
):
"""Initiate an agent for API token authentication.
:param access_key: Access key
:param secret_key: Secret key
"""
- super().__init__()
+ super().__init__(**kwargs)
if access_key is None:
logger.info("Access key not provided. Trying other sources...")
diff --git a/lib/python/src/bailo/core/client.py b/lib/python/src/bailo/core/client.py
index b3056935d..120c2aa29 100644
--- a/lib/python/src/bailo/core/client.py
+++ b/lib/python/src/bailo/core/client.py
@@ -24,7 +24,6 @@ def post_model(
name: str,
kind: EntryKind,
description: str,
- team_id: str,
visibility: ModelVisibility | None = None,
):
"""Create a model.
@@ -180,7 +179,7 @@ def model_card_from_schema(
def model_card_from_template(self, model_id: str, template_id: str | None):
"""Create a model card using a given template ID (previously created models, model ID)
:param model_id: Unique model ID
- :param tempate_id Previous model's unique ID to be used as template for new model card
+ :param template_id Previous model's unique ID to be used as template for new model card
:return: JSON response object
"""
return self.agent.post(
@@ -536,86 +535,6 @@ def get_model_user_roles(
f"{self.url}/v2/model/{model_id}/roles/mine",
).json()
- def post_team(
- self,
- team_id: str,
- name: str,
- description: str,
- ):
- """
- Create new team.
-
- :param team_id: Unique team ID
- :param name: Team name
- :param description: Team description
- :return: JSON response object
- """
- return self.agent.post(
- f"{self.url}/v2/teams",
- json={
- "id": team_id,
- "name": name,
- "description": description,
- },
- ).json()
-
- def get_all_teams(
- self,
- ):
- """
- Get all teams.
-
- :return: JSON response object
- """
- return self.agent.get(
- f"{self.url}/v2/teams",
- ).json()
-
- def get_user_teams(
- self,
- ):
- """
- Get user teams.
-
- :return: JSON response object
- """
- return self.agent.get(
- f"{self.url}/v2/teams/mine",
- ).json()
-
- def get_team(
- self,
- team_id: str,
- ):
- """Retrieve a specific team given its unique ID.
-
- :param team_id: Unique team ID
- :return: JSON response object
- """
- return self.agent.get(
- f"{self.url}/v2/team/{team_id}",
- ).json()
-
- def patch_team(
- self,
- team_id: str,
- name: str | None = None,
- description: str | None = None,
- ):
- """Update a team given its unique ID.
-
- :param team_id: Unique team ID
- :param name: Name of team, defaults to None
- :param description: Description of team, defaults to None
- :return: JSON response object
- """
- filtered_json = filter_none({"name": name, "description": description})
-
- return self.agent.patch(
- f"{self.url}/v2/team/{team_id}",
- json=filtered_json,
- ).json()
-
def get_access_request(self, model_id: str, access_request_id: str):
"""Retrieve a specific access request given its unique ID.
diff --git a/lib/python/src/bailo/helper/__init__.py b/lib/python/src/bailo/helper/__init__.py
index bc75f96ec..438de8d5f 100644
--- a/lib/python/src/bailo/helper/__init__.py
+++ b/lib/python/src/bailo/helper/__init__.py
@@ -17,6 +17,5 @@
client=client,
name="YoloV4",
description="You only look once!",
- team_id="Uncategorised"
)
"""
diff --git a/lib/python/src/bailo/helper/datacard.py b/lib/python/src/bailo/helper/datacard.py
index 723eaa482..1c3dd0f36 100644
--- a/lib/python/src/bailo/helper/datacard.py
+++ b/lib/python/src/bailo/helper/datacard.py
@@ -46,7 +46,6 @@ def create(
client: Client,
name: str,
description: str,
- team_id: str,
visibility: ModelVisibility | None = None,
) -> Datacard:
"""Build a datacard from Bailo and upload it.
@@ -54,7 +53,6 @@ def create(
:param client: A client object used to interact with Bailo
:param name: Name of datacard
:param description: Description of datacard
- :param team_id: A unique team ID
:param visibility: Visibility of datacard, using ModelVisibility enum (e.g Public or Private), defaults to None
:return: Datacard object
"""
@@ -62,7 +60,6 @@ def create(
name=name,
kind=EntryKind.DATACARD,
description=description,
- team_id=team_id,
visibility=visibility,
)
datacard_id = res["model"]["id"]
diff --git a/lib/python/src/bailo/helper/entry.py b/lib/python/src/bailo/helper/entry.py
index 93f468d4a..185b247d3 100644
--- a/lib/python/src/bailo/helper/entry.py
+++ b/lib/python/src/bailo/helper/entry.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from typing import Any
import logging
import warnings
+from typing import Any
from bailo.core.client import Client
-from bailo.core.enums import EntryKind, ModelVisibility, MinimalSchema
+from bailo.core.enums import EntryKind, MinimalSchema, ModelVisibility
logger = logging.getLogger(__name__)
@@ -17,7 +17,7 @@ class Entry:
:param id: A unique ID for the entry
:param name: Name of the entry
:param description: Description of the entry
- :param visibility: Visibility of model, using ModelVisiblility enum (i.e. Public or Private), defaults to None
+ :param visibility: Visibility of model, using ModelVisibility enum (i.e. Public or Private), defaults to None
:param kind: Represents whether entry type (i.e. Model or Datacard)
"""
@@ -55,7 +55,7 @@ def update(self) -> None:
logger.info(f"ID %s updated locally and on server.", self.id)
- def card_from_schema(self, schema_id: str) -> None:
+ def card_from_schema(self, schema_id: str | None = None) -> None:
"""Create a card using a schema on Bailo.
:param schema_id: A unique schema ID, defaults to None. If None, either minimal-general-v10 or minimal-data-card-v10 is used
@@ -63,8 +63,10 @@ def card_from_schema(self, schema_id: str) -> None:
if schema_id is None:
if self.kind == EntryKind.MODEL:
schema_id = MinimalSchema.MODEL
- if self.kind == EntryKind.DATACARD:
+ elif self.kind == EntryKind.DATACARD:
schema_id = MinimalSchema.DATACARD
+ else:
+ raise NotImplementedError(f"No default schema set for {self.kind=}")
res = self.client.model_card_from_schema(model_id=self.id, schema_id=schema_id)
self.__unpack_card(res["card"])
diff --git a/lib/python/src/bailo/helper/model.py b/lib/python/src/bailo/helper/model.py
index 9d1b9dfd6..305b8a466 100644
--- a/lib/python/src/bailo/helper/model.py
+++ b/lib/python/src/bailo/helper/model.py
@@ -1,14 +1,14 @@
from __future__ import annotations
+import logging
import os
import shutil
import tempfile
-from typing import Any
-import logging
import warnings
+from typing import Any
from bailo.core.client import Client
-from bailo.core.enums import EntryKind, ModelVisibility, MinimalSchema
+from bailo.core.enums import EntryKind, MinimalSchema, ModelVisibility
from bailo.core.exceptions import BailoException
from bailo.core.utils import NestedDict
from bailo.helper.entry import Entry
@@ -60,7 +60,6 @@ def create(
client: Client,
name: str,
description: str,
- team_id: str,
visibility: ModelVisibility | None = None,
) -> Model:
"""Build a model from Bailo and upload it.
@@ -68,7 +67,6 @@ def create(
:param client: A client object used to interact with Bailo
:param name: Name of model
:param description: Description of model
- :param team_id: A unique team ID
:param visibility: Visibility of model, using ModelVisibility enum (e.g Public or Private), defaults to None
:return: Model object
"""
@@ -76,7 +74,6 @@ def create(
name=name,
kind=EntryKind.MODEL,
description=description,
- team_id=team_id,
visibility=visibility,
)
model_id = res["model"]["id"]
@@ -160,7 +157,6 @@ def from_mlflow(
cls,
client: Client,
mlflow_uri: str,
- team_id: str,
name: str,
schema_id: str = MinimalSchema.MODEL,
version: str | None = None,
@@ -171,7 +167,6 @@ def from_mlflow(
:param client: A client object used to interact with Bailo
:param mlflow_uri: MLFlow server URI
- :param team_id: A unique team ID
:param name: Name of model (on MLFlow). Same name will be used on Bailo
:param schema_id: A unique schema ID, only required when files is True, defaults to minimal-general-v10
:param version: Specific MLFlow model version to import, defaults to None
@@ -207,7 +202,6 @@ def from_mlflow(
name=name,
kind=EntryKind.MODEL,
description=description,
- team_id=team_id,
visibility=visibility,
)
model_id = bailo_res["model"]["id"]
@@ -228,13 +222,13 @@ def from_mlflow(
run_id = sel_model.run_id
if run_id is None:
raise BailoException(
- "MLFlow model does not have an assosciated run_id, therefore artifacts cannot be transfered."
+ "MLFlow model does not have an associated run_id, therefore artifacts cannot be transferred."
)
mlflow_run = mlflow_client.get_run(run_id)
artifact_uri: str = str(mlflow_run.info.artifact_uri)
if artifact_uri is None:
- raise BailoException("Artifact URI could not be found, therefore artifacts cannot be transfered.")
+ raise BailoException("Artifact URI could not be found, therefore artifacts cannot be transferred.")
if mlflow.artifacts.list_artifacts(artifact_uri=artifact_uri) is not None:
temp_dir = os.path.join(tempfile.gettempdir(), "mlflow_model")
@@ -342,7 +336,7 @@ def get_images(self):
"""
res = self.client.get_all_images(model_id=self.model_id)
- logger.info(f"Images for %s retreived successfully.", self.model_id)
+ logger.info(f"Images for %s retrieved successfully.", self.model_id)
return res["images"]
diff --git a/lib/python/src/bailo/helper/release.py b/lib/python/src/bailo/helper/release.py
index fc5af4d3c..21af74b60 100644
--- a/lib/python/src/bailo/helper/release.py
+++ b/lib/python/src/bailo/helper/release.py
@@ -1,18 +1,18 @@
from __future__ import annotations
-import os
import fnmatch
+import logging
+import os
import shutil
from io import BytesIO
from typing import Any
-import logging
-from tqdm import tqdm
-from tqdm.utils import CallbackIOWrapper
from bailo.core.client import Client
from bailo.core.exceptions import BailoException
from bailo.core.utils import NO_COLOR
from semantic_version import Version
+from tqdm import tqdm
+from tqdm.utils import CallbackIOWrapper
BLOCK_SIZE = 1024
logger = logging.getLogger(__name__)
@@ -62,7 +62,6 @@ def __init__(
self.files = files
self.images = images
self.draft = draft
- self.files = files
@classmethod
def create(
@@ -267,7 +266,7 @@ def upload(self, path: str, data: BytesIO | None = None) -> str: # type: ignore
# If no datastream object provided
name = os.path.split(path)[-1]
if data is None:
- # If we havent passed in a file object, we must create one from the path.
+ # If we haven't passed in a file object, we must create one from the path.
# Check if file exists, if it does the zip required
zip_required = not os.path.isfile(path)
diff --git a/lib/python/tests/conftest.py b/lib/python/tests/conftest.py
index 8b71d6ed5..85dfeefae 100644
--- a/lib/python/tests/conftest.py
+++ b/lib/python/tests/conftest.py
@@ -37,7 +37,6 @@ def example_model(integration_client, metrics_schema):
client=integration_client,
name="Yolo-v4",
description="You only look once!",
- team_id="team_id",
visibility=ModelVisibility.PUBLIC,
)
model.card_from_schema(metrics_schema.schema_id)
diff --git a/lib/python/tests/test_client.py b/lib/python/tests/test_client.py
index 52a822e58..0067a84b2 100644
--- a/lib/python/tests/test_client.py
+++ b/lib/python/tests/test_client.py
@@ -17,7 +17,6 @@ def test_post_model(requests_mock):
kind=EntryKind.MODEL,
description="test",
visibility=ModelVisibility.PUBLIC,
- team_id="uncategorised",
)
assert result == {"success": True}
@@ -244,60 +243,6 @@ def test_get_model_user_roles(requests_mock):
assert result == {"success": True}
-def test_post_team(requests_mock):
- requests_mock.post("https://example.com/api/v2/teams", json={"success": True})
-
- client = Client("https://example.com")
- result = client.post_team(
- team_id="test_id",
- name="test",
- description="test",
- )
-
- assert result == {"success": True}
-
-
-def test_get_all_teams(requests_mock):
- requests_mock.get("https://example.com/api/v2/teams", json={"success": True})
-
- client = Client("https://example.com")
- result = client.get_all_teams()
-
- assert result == {"success": True}
-
-
-def test_get_user_teams(requests_mock):
- requests_mock.get("https://example.com/api/v2/teams/mine", json={"success": True})
-
- client = Client("https://example.com")
- result = client.get_user_teams()
-
- assert result == {"success": True}
-
-
-def test_get_team(requests_mock):
- requests_mock.get("https://example.com/api/v2/team/test_id", json={"success": True})
-
- client = Client("https://example.com")
- result = client.get_team(
- team_id="test_id",
- )
-
- assert result == {"success": True}
-
-
-def test_patch_team(requests_mock):
- requests_mock.patch("https://example.com/api/v2/team/test_id", json={"success": True})
-
- client = Client("https://example.com")
- result = client.patch_team(
- team_id="test_id",
- name="name",
- )
-
- assert result == {"success": True}
-
-
def test_get_access_request(requests_mock):
requests_mock.get(
"https://example.com/api/v2/model/test_id/access-request/test_id",
diff --git a/lib/python/tests/test_datacard.py b/lib/python/tests/test_datacard.py
index 4505dc60f..cf978b2ab 100644
--- a/lib/python/tests/test_datacard.py
+++ b/lib/python/tests/test_datacard.py
@@ -11,16 +11,15 @@ def test_datacard(local_datacard):
@pytest.mark.integration
@pytest.mark.parametrize(
- ("name", "description", "team_id", "visibility"),
+ ("name", "description", "visibility"),
[
- ("test-datacard", "test", "Uncategorised", ModelVisibility.PUBLIC),
- ("test-datacard", "test", "Uncategorised", None),
+ ("test-datacard", "test", ModelVisibility.PUBLIC),
+ ("test-datacard", "test", None),
],
)
def test_create_get_from_id_and_update(
name: str,
description: str,
- team_id: str,
visibility: ModelVisibility | None,
integration_client: Client,
):
@@ -29,7 +28,6 @@ def test_create_get_from_id_and_update(
client=integration_client,
name=name,
description=description,
- team_id=team_id,
visibility=visibility,
)
datacard.card_from_schema("minimal-data-card-v10")
@@ -52,7 +50,6 @@ def test_get_and_update_latest_data_card(integration_client):
client=integration_client,
name="test-datacard",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
@@ -69,7 +66,6 @@ def get_data_card_without_creation(integration_client):
client=integration_client,
name="test-datacard",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
datacard.card_from_schema("minimal-data-card-v10")
@@ -84,7 +80,6 @@ def test_get_model_as_datacard(integration_client):
client=integration_client,
name="test-model",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
diff --git a/lib/python/tests/test_model.py b/lib/python/tests/test_model.py
index 3c001810f..b6e3d22f9 100644
--- a/lib/python/tests/test_model.py
+++ b/lib/python/tests/test_model.py
@@ -18,16 +18,15 @@ def test_create_experiment_from_model(local_model):
@pytest.mark.integration
@pytest.mark.parametrize(
- ("name", "description", "team_id", "visibility"),
+ ("name", "description", "visibility"),
[
- ("test-model", "test", "Uncategorised", ModelVisibility.PUBLIC),
- ("test-model", "test", "Uncategorised", None),
+ ("test-model", "test", ModelVisibility.PUBLIC),
+ ("test-model", "test", None),
],
)
def test_create_get_from_id_and_update(
name: str,
description: str,
- team_id: str,
visibility: ModelVisibility | None,
integration_client: Client,
):
@@ -36,7 +35,6 @@ def test_create_get_from_id_and_update(
client=integration_client,
name=name,
description=description,
- team_id=team_id,
visibility=visibility,
)
model.card_from_schema("minimal-general-v10")
@@ -73,7 +71,6 @@ def test_get_and_update_latest_model_card(integration_client):
client=integration_client,
name="test-model",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
@@ -90,7 +87,6 @@ def get_model_card_without_creation(integration_client):
client=integration_client,
name="test-model",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
model.card_from_schema("minimal-general-v10")
@@ -105,7 +101,6 @@ def test_get_releases(integration_client):
client=integration_client,
name="test-model",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
model.card_from_schema("minimal-general-v10")
@@ -128,7 +123,6 @@ def test_create_release_without_model_card(integration_client):
client=integration_client,
name="test-model",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
@@ -142,7 +136,6 @@ def test_get_datacard_as_model(integration_client):
client=integration_client,
name="test-datacard",
description="test",
- team_id="Uncategorised",
visibility=ModelVisibility.PUBLIC,
)
@@ -190,7 +183,6 @@ def test_import_model_from_mlflow(integration_client, mlflow_model, request):
model = Model.from_mlflow(
client=integration_client,
mlflow_uri=request.config.mlflow_uri,
- team_id="Uncategorised",
schema_id="minimal-general-v10",
name=mlflow_model,
)
@@ -205,7 +197,6 @@ def test_import_nonexistent_model_from_mlflow(integration_client, request):
model = Model.from_mlflow(
client=integration_client,
mlflow_uri=request.config.mlflow_uri,
- team_id="Uncategorised",
schema_id="minimal-general-v10",
name="fake-model-name",
)
@@ -217,7 +208,6 @@ def test_import_model_files_no_run(integration_client, mlflow_model_no_run, requ
model = Model.from_mlflow(
client=integration_client,
mlflow_uri=request.config.mlflow_uri,
- team_id="Uncategorised",
schema_id="minimal-general-v10",
name=mlflow_model_no_run,
)
@@ -229,7 +219,6 @@ def test_import_model_no_schema(integration_client, mlflow_model, request):
model = Model.from_mlflow(
client=integration_client,
mlflow_uri=request.config.mlflow_uri,
- team_id="Uncategorised",
name=mlflow_model,
)
diff --git a/package-lock.json b/package-lock.json
index 3dee526d1..685e37e85 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.4.0",
"hasInstallScript": true,
"devDependencies": {
- "husky": "^9.1.6",
+ "husky": "^9.1.7",
"lint-staged": "^15.2.10",
"prettier": "^3.3.3"
}
@@ -247,10 +247,11 @@
}
},
"node_modules/husky": {
- "version": "9.1.6",
- "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz",
- "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==",
+ "version": "9.1.7",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
+ "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"dev": true,
+ "license": "MIT",
"bin": {
"husky": "bin.js"
},
diff --git a/package.json b/package.json
index 577888043..8aa98d3d0 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
"prepare": "husky"
},
"devDependencies": {
- "husky": "^9.1.6",
+ "husky": "^9.1.7",
"lint-staged": "^15.2.10",
"prettier": "^3.3.3"
}