diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..c6ef1f9 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "master", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml new file mode 100644 index 0000000..1c73b02 --- /dev/null +++ b/.github/workflows/pull_request.yaml @@ -0,0 +1,51 @@ +name: Pull request + +on: + pull_request: + branches: [master] + +jobs: + precheck: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18] + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - uses: pnpm/action-setup@v2 + with: + run_install: false + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + + - name: Node packages audit + run: pnpm audit + + - name: Install dependencies + run: pnpm install --frozen-lockfile + env: + CI: 1 + + - name: Check PR contains changeset + run: pnpm changeset status --since=origin/master + + - name: Open API schema changes + run: | + pnpm --filter "@qdrant/js-client-rest" codegen:openapi-typescript + if ( git diff-index HEAD | grep -q README.md || exit ) then + echo "Generated schema changed. Please update with pnpm -r codegen:openapi-typescript."; + exit 1 + fi + + - name: Run checks + run: pnpm -r pre-check + + - name: Open API integration tests + run: cd packages/js-client-rest && ./tests/integration-tests.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..91d396a --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,54 @@ +name: Release + +on: + push: + branches: [master] + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18] + steps: + - uses: actions/checkout@v3 + + - uses: pnpm/action-setup@v2 + with: + run_install: false + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + scope: "@qdrant" + node-version: ${{ matrix.node-version }} + cache: "pnpm" + cache-dependency-path: "pnpm-lock.yaml" + + - name: Node packages audit + run: pnpm audit + + - name: Install Dependencies + run: | + pnpm install --frozen-lockfile + env: + CI: 1 + + - name: Add registry path to .npmrc + run: | + cat << EOF > "$HOME/.npmrc" + //registry.npmjs.org/:_authToken=$NPM_TOKEN + EOF + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create release pull request or publish to npm + id: changesets + uses: changesets/action@v1 + with: + publish: pnpm release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae25086 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +**/yarn.lock +**/package-lock.json +**/node_modules/ +**/.pnpm-store/ +**/*.env +**/*.log +**/.DS_Store +**/.idea +**/.vscode/* +!.vscode/settings.json +**/*.tsbuildinfo +**/dist diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..730b238 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +pnpm -r pre-commit diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..2c06060 --- /dev/null +++ b/.npmrc @@ -0,0 +1,7 @@ +loglevel = warn +save-exact = true +engine-strict = true +node-version=18.0.0 +strict-peer-dependencies = true +auto-install-peers = true +lockfile = true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..03191c9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18.0.0 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..68d9116 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +**/node_modules/ +**/dist/ +**/src/openapi/ +**/src/proto/ +**/pnpm-lock.yaml diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..5e037a3 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,10 @@ +tabWidth: 4 +singleQuote: true +printWidth: 120 +trailingComma: all +bracketSpacing: false +overrides: + - files: "*.yaml" + options: + tabWidth: 2 + singleQuote: false diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c952610 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "eslint.workingDirectories": ["packages/js-client-rest", "packages/js-client-grpc"] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..41e2195 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,54 @@ +# Contributing to Qdrant-JS + +We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features + +## We Develop with Github + +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests + +Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://docs.github.com/en/get-started/quickstart/github-flow)). We actively welcome your pull requests: + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. If the Qdrant Open API has changed, update it with: `codegen:openapi-typescript`. +4. Make sure your code lints: `pnpm pre-check`. The root package installs a `pre-commit` hook with [husky](https://github.com/typicode/husky/) to automate this check. +5. Ensure the test suite passes: `pnpm test`. +6. Ensure the integration test suite passes: `pnpm test:integration`. +7. When ready, use [Changesets](https://github.com/changesets/changesets): `pnpm changeset` to describe the change(s). The generated markdown files in the `.changeset` directory should be committed to the repository. +8. Issue that pull request! + +## Any contributions you make will be under the Apache License 2.0 + +In short, when you submit code changes, your submissions are understood to be under the same [Apache License 2.0](https://choosealicense.com/licenses/apache-2.0/) that covers the project. Feel free to contact the maintainers if that's a concern. + +## Report bugs using Github's [issues](https://github.com/qdrant/qdrant-js/issues) + +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy! + +## Write bug reports with detail, background, and sample code + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! + - Give sample code if you can. +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) + +## Use a Consistent Coding Style + +If you are modifying TypeScript code, make sure it has no warnings from ESLint or Prettier. +The project uses the [eslint](https://eslint.org/) formatter together with prettier. Please ensure your code editor is appropriately configured to handle mono-repo projects. + +## License + +By contributing, you agree that your contributions will be licensed under its Apache License 2.0. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..494eedd --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021-2023 Qdrant Solutions GmbH. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4b982e --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# JavaScript Qdrant SDK + +This repository contains packages of the JS SDK for the [Qdrant](https://github.com/qdrant/qdrant) vector search engine. + +- [JS Client REST](./packages/js-client-rest) +- [JS Client gRPC](./packages/js-client-grpc) (coming soon) diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..60d288d --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,32 @@ +# Release guidelines + +New releases are made from the `master` branch following semver. Major and minor versions align with Qdrant's engine releases, whilst patch are reserved for fixes regarding the current minor release. + +## Dictionary + +- **AC**: All Contributors - public and private members +- **RC**: Release Coordinator - solve private member in charge of one-at-a-time releases. + +## Manual steps + +1. Add new changeset to describe the changes `pnpm changeset` (**AC**) +2. Decide on a semver release, bump version in package.json file(s) and update the changelog: `pnpm changeset version` (**RC**) + +> In some cases, you may want to merge a change without doing any releases (such as when you only change tests or build tools). In this case, you can run `pnpm changeset --empty`. This will add a special changeset that does not release anything. + +## Automation + +The [changesets](https://github.com/changesets/action) Github Action within `release.yaml` will run on push to the `master` branch and match against the `baseBranch` specified in [`.changeset/config.json`](./.changeset/config.json). This does two possible things: + +1. Finds a `changeset`, in which case it will: + + - open a pull request with the branch `changeset-release/master` against the `baseBranch` containing the automatic versioning and changelog changes. + +2. Finds a new changeset version, in which case it will: + + - commit the version and changelog changes, push the changes to the `baseBranch` + - create the relevant `git tag`(s) for the packages + - create a GitHub release with the changelog and artifacts + - publish the package(s) to npmjs.com + +Learn more about `changeset` by heading to their [documentation](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). diff --git a/package.json b/package.json new file mode 100644 index 0000000..dbe8fb1 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "private": true, + "name": "@qdrant/monorepo", + "version": "0.0.0", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + }, + "packageManager": "pnpm@8.3.0", + "scripts": { + "prepare": "node ./prepare.cjs", + "release": "pnpm --filter='@qdrant/js-client-rest' prepublishOnly && pnpm --filter='@qdrant/qdrant-js' prepublishOnly && pnpm changeset publish" + }, + "devDependencies": { + "@changesets/cli": "2.26.1", + "husky": "8.0.3", + "is-ci": "3.0.1", + "prettier": "2.8.7", + "typescript": "5.0.4" + } +} diff --git a/packages/js-client-grpc/LICENSE b/packages/js-client-grpc/LICENSE new file mode 100644 index 0000000..8973e7b --- /dev/null +++ b/packages/js-client-grpc/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021-2023 Qdrant Solutions GmbH. + Copyright 2021-2023 Buf Technologies, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/packages/js-client-grpc/buf.gen.yaml b/packages/js-client-grpc/buf.gen.yaml new file mode 100644 index 0000000..697cb7b --- /dev/null +++ b/packages/js-client-grpc/buf.gen.yaml @@ -0,0 +1,12 @@ +# buf.gen.yaml defines a local generation template. +# For details, see https://docs.buf.build/configuration/v1/buf-gen-yaml +version: v1 +plugins: + # This will invoke protoc-gen-es and write output to src/gen + - name: es + out: src/proto + opt: target=ts + # This will invoke protoc-gen-connect-es + - name: connect-es + out: src/proto + opt: target=ts diff --git a/packages/js-client-grpc/examples/README.md b/packages/js-client-grpc/examples/README.md new file mode 100644 index 0000000..faccd96 --- /dev/null +++ b/packages/js-client-grpc/examples/README.md @@ -0,0 +1,5 @@ +# Examples + +```shell +QDRANT_API_KEY= QDRANT_URL= node --loader ts-node/esm index.ts +``` diff --git a/packages/js-client-grpc/examples/index.ts b/packages/js-client-grpc/examples/index.ts new file mode 100644 index 0000000..c9e86dc --- /dev/null +++ b/packages/js-client-grpc/examples/index.ts @@ -0,0 +1,49 @@ +import {maybe} from '@sevinf/maybe'; +import {Transport, createPromiseClient} from '@bufbuild/connect'; +import {createGrpcTransport} from '@bufbuild/connect-node'; +import {Qdrant} from '../src/proto/qdrant_connect.js'; + +process.on('uncaughtException', (e) => { + console.log(e); +}); +process.on('unhandledRejection', (e, promise) => { + console.log(String(e), String(promise)); +}); +// Listen to Ctr + C and exit +process.once('SIGINT', () => { + process.exit(130); +}); + +async function main(): Promise { + const apiKey = maybe(process.env.QDRANT_API_KEY).orThrow(); + const url = maybe(process.env.QDRANT_URL).orThrow(); + + const headers = new Headers(); + headers.set('api-key', apiKey); + // A transport for clients using the gRPC protocol with Node.js `http2` module + const transport: Transport = createGrpcTransport({ + baseUrl: url, + httpVersion: '2', + nodeOptions: { + port: 6334, + }, + }); + + const client = createPromiseClient(Qdrant, transport); + const result = await client.healthCheck({}, {headers}); + + console.log(result); + + return 0; +} + +main() + .then((code) => { + if (code !== 0) { + process.exit(code); + } + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); diff --git a/packages/js-client-grpc/examples/tsconfig.json b/packages/js-client-grpc/examples/tsconfig.json new file mode 100644 index 0000000..561d899 --- /dev/null +++ b/packages/js-client-grpc/examples/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "ts-node": { + "transpileOnly": true, + "esm": true + } +} diff --git a/packages/js-client-grpc/package.json b/packages/js-client-grpc/package.json new file mode 100644 index 0000000..ffc0150 --- /dev/null +++ b/packages/js-client-grpc/package.json @@ -0,0 +1,38 @@ +{ + "private": true, + "name": "@qdrant/js-client-grpc", + "version": "0.0.0", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + }, + "repository": { + "type": "git", + "url": "https://github.com/qdrant/qrant-js" + }, + "bugs": { + "url": "https://github.com/qdrant/qrant-js/issues" + }, + "homepage": "https://github.com/qdrant/qrant-js#readme", + "license": "Apache-2.0", + "type": "module", + "scripts": { + "codegen:buf": "buf generate proto" + }, + "dependencies": { + "@bufbuild/connect": "0.8.4", + "@bufbuild/connect-node": "0.8.4", + "@bufbuild/protobuf": "1.2.0", + "@sevinf/maybe": "0.5.0" + }, + "devDependencies": { + "@bufbuild/buf": "1.15.0-1", + "@bufbuild/protoc-gen-connect-es": "0.8.4", + "@bufbuild/protoc-gen-es": "1.2.0", + "ts-node": "10.9.1", + "typescript": "5.0.4" + }, + "peerDependencies": { + "typescript": ">=4.1" + } +} diff --git a/packages/js-client-grpc/proto/buf.yaml b/packages/js-client-grpc/proto/buf.yaml new file mode 100644 index 0000000..42f15ad --- /dev/null +++ b/packages/js-client-grpc/proto/buf.yaml @@ -0,0 +1,11 @@ +version: v1beta1 +deps: [] +build: + roots: + - . +breaking: + use: + - FILE +lint: + use: + - DEFAULT diff --git a/packages/js-client-grpc/proto/collections.proto b/packages/js-client-grpc/proto/collections.proto new file mode 100644 index 0000000..dff83cf --- /dev/null +++ b/packages/js-client-grpc/proto/collections.proto @@ -0,0 +1,312 @@ +syntax = "proto3"; +package qdrant; + +message VectorParams { + uint64 size = 1; // Size of the vectors + Distance distance = 2; // Distance function used for comparing vectors +} + +message VectorParamsMap { + map map = 1; +} + +message VectorsConfig { + oneof config { + VectorParams params = 1; + VectorParamsMap params_map = 2; + } +} + +message GetCollectionInfoRequest { + string collection_name = 1; // Name of the collection +} + +message ListCollectionsRequest { +} + +message CollectionDescription { + string name = 1; // Name of the collection +} + +message GetCollectionInfoResponse { + CollectionInfo result = 1; + double time = 2; // Time spent to process +} + +message ListCollectionsResponse { + repeated CollectionDescription collections = 1; + double time = 2; // Time spent to process +} + +enum Distance { + UnknownDistance = 0; + Cosine = 1; + Euclid = 2; + Dot = 3; +} + +enum CollectionStatus { + UnknownCollectionStatus = 0; + Green = 1; // All segments are ready + Yellow = 2; // Optimization in process + Red = 3; // Something went wrong +} + +enum PayloadSchemaType { + UnknownType = 0; + Keyword = 1; + Integer = 2; + Float = 3; + Geo = 4; + Text = 5; +} + +enum QuantizationType { + UnknownQuantization = 0; + Int8 = 1; +} + +message OptimizerStatus { + bool ok = 1; + string error = 2; +} + +message HnswConfigDiff { + /* + Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. + */ + optional uint64 m = 1; + /* + Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index. + */ + optional uint64 ef_construct = 2; + /* + Minimal size (in KiloBytes) of vectors for additional payload-based indexing. + If payload chunk is smaller than `full_scan_threshold` additional indexing won't be used - + in this case full-scan search should be preferred by query planner and additional indexing is not required. + Note: 1Kb = 1 vector of size 256 + */ + optional uint64 full_scan_threshold = 3; + /* + Number of parallel threads used for background index building. If 0 - auto selection. + */ + optional uint64 max_indexing_threads = 4; + /* + Store HNSW index on disk. If set to false, index will be stored in RAM. + */ + optional bool on_disk = 5; + /* + Number of additional payload-aware links per node in the index graph. If not set - regular M parameter will be used. + */ + optional uint64 payload_m = 6; +} + +message WalConfigDiff { + optional uint64 wal_capacity_mb = 1; // Size of a single WAL block file + optional uint64 wal_segments_ahead = 2; // Number of segments to create in advance +} + +message OptimizersConfigDiff { + /* + The minimal fraction of deleted vectors in a segment, required to perform segment optimization + */ + optional double deleted_threshold = 1; + /* + The minimal number of vectors in a segment, required to perform segment optimization + */ + optional uint64 vacuum_min_vector_number = 2; + /* + Target amount of segments optimizer will try to keep. + Real amount of segments may vary depending on multiple parameters: + + - Amount of stored points. + - Current write RPS. + + It is recommended to select default number of segments as a factor of the number of search threads, + so that each segment would be handled evenly by one of the threads. + */ + optional uint64 default_segment_number = 3; + /* + Do not create segments larger this size (in KiloBytes). + Large segments might require disproportionately long indexation times, + therefore it makes sense to limit the size of segments. + + If indexation speed have more priority for your - make this parameter lower. + If search speed is more important - make this parameter higher. + Note: 1Kb = 1 vector of size 256 + */ + optional uint64 max_segment_size = 4; + /* + Maximum size (in KiloBytes) of vectors to store in-memory per segment. + Segments larger than this threshold will be stored as read-only memmaped file. + To enable memmap storage, lower the threshold + Note: 1Kb = 1 vector of size 256 + */ + optional uint64 memmap_threshold = 5; + /* + Maximum size (in KiloBytes) of vectors allowed for plain index. + Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md + Note: 1Kb = 1 vector of size 256 + */ + optional uint64 indexing_threshold = 6; + /* + Interval between forced flushes. + */ + optional uint64 flush_interval_sec = 7; + /* + Max number of threads, which can be used for optimization. If 0 - `NUM_CPU - 1` will be used + */ + optional uint64 max_optimization_threads = 8; +} + +message ScalarQuantization { + QuantizationType type = 1; // Type of quantization + optional float quantile = 2; // Number of bits to use for quantization + optional bool always_ram = 3; // If true - quantized vectors always will be stored in RAM, ignoring the config of main storage +} + +message QuantizationConfig { + oneof quantization { + ScalarQuantization scalar = 1; + } +} + +message CreateCollection { + string collection_name = 1; // Name of the collection + reserved 2; // Deprecated + reserved 3; // Deprecated + optional HnswConfigDiff hnsw_config = 4; // Configuration of vector index + optional WalConfigDiff wal_config = 5; // Configuration of the Write-Ahead-Log + optional OptimizersConfigDiff optimizers_config = 6; // Configuration of the optimizers + optional uint32 shard_number = 7; // Number of shards in the collection, default = 1 + optional bool on_disk_payload = 8; // If true - point's payload will not be stored in memory + optional uint64 timeout = 9; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + optional VectorsConfig vectors_config = 10; // Configuration for vectors + optional uint32 replication_factor = 11; // Number of replicas of each shard that network tries to maintain, default = 1 + optional uint32 write_consistency_factor = 12; // How many replicas should apply the operation for us to consider it successful, default = 1 + optional string init_from_collection = 13; // Specify name of the other collection to copy data from + optional QuantizationConfig quantization_config = 14; +} + +message UpdateCollection { + string collection_name = 1; // Name of the collection + optional OptimizersConfigDiff optimizers_config = 2; // New configuration parameters for the collection + optional uint64 timeout = 3; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied + optional CollectionParamsDiff params = 4; // New configuration parameters for the collection +} + +message DeleteCollection { + string collection_name = 1; // Name of the collection + optional uint64 timeout = 2; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied +} + +message CollectionOperationResponse { + bool result = 1; // if operation made changes + double time = 2; // Time spent to process +} + +message CollectionParams { + reserved 1; // Deprecated + reserved 2; // Deprecated + uint32 shard_number = 3; // Number of shards in collection + bool on_disk_payload = 4; // If true - point's payload will not be stored in memory + optional VectorsConfig vectors_config = 5; // Configuration for vectors + optional uint32 replication_factor = 6; // Number of replicas of each shard that network tries to maintain + optional uint32 write_consistency_factor = 7; // How many replicas should apply the operation for us to consider it successful +} + +message CollectionParamsDiff { + optional uint32 replication_factor = 1; // Number of replicas of each shard that network tries to maintain + optional uint32 write_consistency_factor = 2; // How many replicas should apply the operation for us to consider it successful +} + +message CollectionConfig { + CollectionParams params = 1; // Collection parameters + HnswConfigDiff hnsw_config = 2; // Configuration of vector index + OptimizersConfigDiff optimizer_config = 3; // Configuration of the optimizers + WalConfigDiff wal_config = 4; // Configuration of the Write-Ahead-Log + optional QuantizationConfig quantization_config = 5; // Configuration of the vector quantization +} + +enum TokenizerType { + Unknown = 0; + Prefix = 1; + Whitespace = 2; + Word = 3; +} + +message TextIndexParams { + TokenizerType tokenizer = 1; // Tokenizer type + optional bool lowercase = 2; // If true - all tokens will be lowercased + optional uint64 min_token_len = 3; // Minimal token length + optional uint64 max_token_len = 4; // Maximal token length +} + +message PayloadIndexParams { + oneof index_params { + TextIndexParams text_index_params = 1; // Parameters for text index + } +} + +message PayloadSchemaInfo { + PayloadSchemaType data_type = 1; // Field data type + optional PayloadIndexParams params = 2; // Field index parameters + optional uint64 points = 3; // Number of points indexed within this field indexed +} + +message CollectionInfo { + CollectionStatus status = 1; // operating condition of the collection + OptimizerStatus optimizer_status = 2; // status of collection optimizers + uint64 vectors_count = 3; // number of vectors in the collection + uint64 segments_count = 4; // Number of independent segments + reserved 5; // Deprecated + reserved 6; // Deprecated + CollectionConfig config = 7; // Configuration + map payload_schema = 8; // Collection data types + uint64 points_count = 9; // number of points in the collection + optional uint64 indexed_vectors_count = 10; // number of indexed vectors in the collection. +} + +message ChangeAliases { + repeated AliasOperations actions = 1; // List of actions + optional uint64 timeout = 2; // Wait timeout for operation commit in seconds, if not specified - default value will be supplied +} + +message AliasOperations { + oneof action { + CreateAlias create_alias = 1; + RenameAlias rename_alias = 2; + DeleteAlias delete_alias = 3; + } +} + +message CreateAlias { + string collection_name = 1; // Name of the collection + string alias_name = 2; // New name of the alias +} + +message RenameAlias { + string old_alias_name = 1; // Name of the alias to rename + string new_alias_name = 2; // Name of the alias +} + +message DeleteAlias { + string alias_name = 1; // Name of the alias +} + +message ListAliasesRequest { +} + +message ListCollectionAliasesRequest { + string collection_name = 1; // Name of the collection +} + +message AliasDescription { + string alias_name = 1; // Name of the alias + string collection_name = 2; // Name of the collection +} + +message ListAliasesResponse { + repeated AliasDescription aliases = 1; + double time = 2; // Time spent to process +} diff --git a/packages/js-client-grpc/proto/collections_service.proto b/packages/js-client-grpc/proto/collections_service.proto new file mode 100644 index 0000000..e096ed3 --- /dev/null +++ b/packages/js-client-grpc/proto/collections_service.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +import "collections.proto"; + +package qdrant; + +service Collections { + /* + Get detailed information about specified existing collection + */ + rpc Get (GetCollectionInfoRequest) returns (GetCollectionInfoResponse) {} + /* + Get list name of all existing collections + */ + rpc List (ListCollectionsRequest) returns (ListCollectionsResponse) {} + /* + Create new collection with given parameters + */ + rpc Create (CreateCollection) returns (CollectionOperationResponse) {} + /* + Update parameters of the existing collection + */ + rpc Update (UpdateCollection) returns (CollectionOperationResponse) {} + /* + Drop collection and all associated data + */ + rpc Delete (DeleteCollection) returns (CollectionOperationResponse) {} + /* + Update Aliases of the existing collection + */ + rpc UpdateAliases (ChangeAliases) returns (CollectionOperationResponse) {} + /* + Get list of all aliases for a collection + */ + rpc ListCollectionAliases (ListCollectionAliasesRequest) returns (ListAliasesResponse) {} + /* + Get list of all aliases for all existing collections + */ + rpc ListAliases (ListAliasesRequest) returns (ListAliasesResponse) {} +} diff --git a/packages/js-client-grpc/proto/json_with_int.proto b/packages/js-client-grpc/proto/json_with_int.proto new file mode 100644 index 0000000..8d03757 --- /dev/null +++ b/packages/js-client-grpc/proto/json_with_int.proto @@ -0,0 +1,61 @@ +// Fork of the google.protobuf.Value with explicit support for integer values + +syntax = "proto3"; + +package qdrant; + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +message Struct { + // Unordered map of dynamically typed values. + map fields = 1; +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of that +// variants, absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +message Value { + // The kind of value. + oneof kind { + // Represents a null value. + NullValue null_value = 1; + // Represents a double value. + double double_value = 2; + // Represents an integer value + int64 integer_value = 3; + // Represents a string value. + string string_value = 4; + // Represents a boolean value. + bool bool_value = 5; + // Represents a structured value. + Struct struct_value = 6; + // Represents a repeated `Value`. + ListValue list_value = 7; + } +} + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +enum NullValue { + // Null value. + NULL_VALUE = 0; +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +message ListValue { + // Repeated field of dynamically typed values. + repeated Value values = 1; +} diff --git a/packages/js-client-grpc/proto/points.proto b/packages/js-client-grpc/proto/points.proto new file mode 100644 index 0000000..7dc355a --- /dev/null +++ b/packages/js-client-grpc/proto/points.proto @@ -0,0 +1,447 @@ +syntax = "proto3"; + +package qdrant; + +import "json_with_int.proto"; +import "collections.proto"; + + +enum WriteOrderingType { + Weak = 0; // Write operations may be reordered, works faster, default + Medium = 1; // Write operations go through dynamically selected leader, may be inconsistent for a short period of time in case of leader change + Strong = 2; // Write operations go through the permanent leader, consistent, but may be unavailable if leader is down +} + +message WriteOrdering { + WriteOrderingType type = 1; // Write ordering guarantees +} + +enum ReadConsistencyType { + All = 0; // Send request to all nodes and return points which are present on all of them + Majority = 1; // Send requests to all nodes and return points which are present on majority of them + Quorum = 2; // Send requests to half + 1 nodes, return points which are present on all of them +} + +message ReadConsistency { + oneof value { + ReadConsistencyType type = 1; // Common read consistency configurations + uint64 factor = 2; // Send request to a specified number of nodes, and return points which are present on all of them + } +} + +// --------------------------------------------- +// ------------- Point Id Requests ------------- +// --------------------------------------------- + +message PointId { + oneof point_id_options { + uint64 num = 1; // Numerical ID of the point + string uuid = 2; // UUID + } +} + +message Vector { + repeated float data = 1; +} + +// --------------------------------------------- +// ---------------- RPC Requests --------------- +// --------------------------------------------- + +message UpsertPoints { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + repeated PointStruct points = 3; + optional WriteOrdering ordering = 4; // Write ordering guarantees +} + +message DeletePoints { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + PointsSelector points = 3; // Affected points + optional WriteOrdering ordering = 4; // Write ordering guarantees +} + +message GetPoints { + string collection_name = 1; // name of the collection + repeated PointId ids = 2; // List of points to retrieve + reserved 3; // deprecated "with_vector" field + WithPayloadSelector with_payload = 4; // Options for specifying which payload to include or not + optional WithVectorsSelector with_vectors = 5; // Options for specifying which vectors to include into response + optional ReadConsistency read_consistency = 6; // Options for specifying read consistency guarantees +} + +message SetPayloadPoints { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + map payload = 3; // New payload values + reserved 4; // List of point to modify, deprecated + optional PointsSelector points_selector = 5; // Affected points + optional WriteOrdering ordering = 6; // Write ordering guarantees +} + +message DeletePayloadPoints { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + repeated string keys = 3; // List of keys to delete + reserved 4; // Affected points, deprecated + optional PointsSelector points_selector = 5; // Affected points + optional WriteOrdering ordering = 6; // Write ordering guarantees +} + +message ClearPayloadPoints { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + PointsSelector points = 3; // Affected points + optional WriteOrdering ordering = 4; // Write ordering guarantees +} + +enum FieldType { + FieldTypeKeyword = 0; + FieldTypeInteger = 1; + FieldTypeFloat = 2; + FieldTypeGeo = 3; + FieldTypeText = 4; +} + +message CreateFieldIndexCollection { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + string field_name = 3; // Field name to index + optional FieldType field_type = 4; // Field type. + optional PayloadIndexParams field_index_params = 5; // Payload index params. + optional WriteOrdering ordering = 6; // Write ordering guarantees +} + +message DeleteFieldIndexCollection { + string collection_name = 1; // name of the collection + optional bool wait = 2; // Wait until the changes have been applied? + string field_name = 3; // Field name to delete + optional WriteOrdering ordering = 4; // Write ordering guarantees +} + +message PayloadIncludeSelector { + repeated string fields = 1; // List of payload keys to include into result +} + +message PayloadExcludeSelector { + repeated string fields = 1; // List of payload keys to exclude from the result +} + +message WithPayloadSelector { + oneof selector_options { + bool enable = 1; // If `true` - return all payload, if `false` - none + PayloadIncludeSelector include = 2; + PayloadExcludeSelector exclude = 3; + } +} + +message NamedVectors { + map vectors = 1; +} + +message Vectors { + oneof vectors_options { + Vector vector = 1; + NamedVectors vectors = 2; + } +} + +message VectorsSelector { + repeated string names = 1; // List of vectors to include into result +} + +message WithVectorsSelector { + oneof selector_options { + bool enable = 1; // If `true` - return all vectors, if `false` - none + VectorsSelector include = 2; // List of payload keys to include into result + } +} + +message QuantizationSearchParams { + /* + If set to true, search will ignore quantized vector data + */ + optional bool ignore = 1; + + /* + If true, use original vectors to re-score top-k results. Default is true. + */ + optional bool rescore = 2; +} + +message SearchParams { + /* + Params relevant to HNSW index. Size of the beam in a beam-search. + Larger the value - more accurate the result, more time required for search. + */ + optional uint64 hnsw_ef = 1; + + /* + Search without approximation. If set to true, search may run long but with exact results. + */ + optional bool exact = 2; + + /* + If set to true, search will ignore quantized vector data + */ + optional QuantizationSearchParams quantization = 3; +} + +message SearchPoints { + string collection_name = 1; // name of the collection + repeated float vector = 2; // vector + Filter filter = 3; // Filter conditions - return only those points that satisfy the specified conditions + uint64 limit = 4; // Max number of result + reserved 5; // deprecated "with_vector" field + WithPayloadSelector with_payload = 6; // Options for specifying which payload to include or not + SearchParams params = 7; // Search config + optional float score_threshold = 8; // If provided - cut off results with worse scores + optional uint64 offset = 9; // Offset of the result + optional string vector_name = 10; // Which vector to use for search, if not specified - use default vector + optional WithVectorsSelector with_vectors = 11; // Options for specifying which vectors to include into response + optional ReadConsistency read_consistency = 12; // Options for specifying read consistency guarantees +} + +message SearchBatchPoints { + string collection_name = 1; // Name of the collection + repeated SearchPoints search_points = 2; + optional ReadConsistency read_consistency = 3; // Options for specifying read consistency guarantees +} + +message ScrollPoints { + string collection_name = 1; + Filter filter = 2; // Filter conditions - return only those points that satisfy the specified conditions + optional PointId offset = 3; // Start with this ID + optional uint32 limit = 4; // Max number of result + reserved 5; // deprecated "with_vector" field + WithPayloadSelector with_payload = 6; // Options for specifying which payload to include or not + optional WithVectorsSelector with_vectors = 7; // Options for specifying which vectors to include into response + optional ReadConsistency read_consistency = 8; // Options for specifying read consistency guarantees +} + +message LookupLocation { + string collection_name = 1; + optional string vector_name = 2; // Which vector to use for search, if not specified - use default vector +} + +message RecommendPoints { + string collection_name = 1; // name of the collection + repeated PointId positive = 2; // Look for vectors closest to those + repeated PointId negative = 3; // Try to avoid vectors like this + Filter filter = 4; // Filter conditions - return only those points that satisfy the specified conditions + uint64 limit = 5; // Max number of result + reserved 6; // deprecated "with_vector" field + WithPayloadSelector with_payload = 7; // Options for specifying which payload to include or not + SearchParams params = 8; // Search config + optional float score_threshold = 9; // If provided - cut off results with worse scores + optional uint64 offset = 10; // Offset of the result + optional string using = 11; // Define which vector to use for recommendation, if not specified - default vector + optional WithVectorsSelector with_vectors = 12; // Options for specifying which vectors to include into response + optional LookupLocation lookup_from = 13; // Name of the collection to use for points lookup, if not specified - use current collection + optional ReadConsistency read_consistency = 14; // Options for specifying read consistency guarantees +} + +message RecommendBatchPoints { + string collection_name = 1; // Name of the collection + repeated RecommendPoints recommend_points = 2; + optional ReadConsistency read_consistency = 3; // Options for specifying read consistency guarantees +} + +message CountPoints { + string collection_name = 1; // name of the collection + Filter filter = 2; // Filter conditions - return only those points that satisfy the specified conditions + optional bool exact = 3; // If `true` - return exact count, if `false` - return approximate count +} + +// --------------------------------------------- +// ---------------- RPC Response --------------- +// --------------------------------------------- + +message PointsOperationResponse { + UpdateResult result = 1; + double time = 2; // Time spent to process +} + +message UpdateResult { + uint64 operation_id = 1; // Number of operation + UpdateStatus status = 2; // Operation status +} + +enum UpdateStatus { + UnknownUpdateStatus = 0; + Acknowledged = 1; // Update is received, but not processed yet + Completed = 2; // Update is applied and ready for search +} + +message ScoredPoint { + PointId id = 1; // Point id + map payload = 2; // Payload + float score = 3; // Similarity score + reserved 4; // deprecated "vector" field + uint64 version = 5; // Last update operation applied to this point + optional Vectors vectors = 6; // Vectors to search +} + +message SearchResponse { + repeated ScoredPoint result = 1; + double time = 2; // Time spent to process +} + +message BatchResult { + repeated ScoredPoint result = 1; +} + +message SearchBatchResponse { + repeated BatchResult result = 1; + double time = 2; // Time spent to process +} + +message CountResponse { + CountResult result = 1; + double time = 2; // Time spent to process +} + +message ScrollResponse { + optional PointId next_page_offset = 1; // Use this offset for the next query + repeated RetrievedPoint result = 2; + double time = 3; // Time spent to process +} + +message CountResult { + uint64 count = 1; +} + +message RetrievedPoint { + PointId id = 1; + map payload = 2; + reserved 3; // deprecated "vector" field + optional Vectors vectors = 4; +} + +message GetResponse { + repeated RetrievedPoint result = 1; + double time = 2; // Time spent to process +} + +message RecommendResponse { + repeated ScoredPoint result = 1; + double time = 2; // Time spent to process +} + +message RecommendBatchResponse { + repeated BatchResult result = 1; + double time = 2; // Time spent to process +} + +// --------------------------------------------- +// ------------- Filter Conditions ------------- +// --------------------------------------------- + +message Filter { + repeated Condition should = 1; // At least one of those conditions should match + repeated Condition must = 2; // All conditions must match + repeated Condition must_not = 3; // All conditions must NOT match +} + +message Condition { + oneof condition_one_of { + FieldCondition field = 1; + IsEmptyCondition is_empty = 2; + HasIdCondition has_id = 3; + Filter filter = 4; + } +} + +message IsEmptyCondition { + string key = 1; +} + +message HasIdCondition { + repeated PointId has_id = 1; +} + +message FieldCondition { + string key = 1; + Match match = 2; // Check if point has field with a given value + Range range = 3; // Check if points value lies in a given range + GeoBoundingBox geo_bounding_box = 4; // Check if points geo location lies in a given area + GeoRadius geo_radius = 5; // Check if geo point is within a given radius + ValuesCount values_count = 6; // Check number of values for a specific field +} + +message Match { + oneof match_value { + string keyword = 1; // Match string keyword + int64 integer = 2; // Match integer + bool boolean = 3; // Match boolean + string text = 4; // Match text + RepeatedStrings keywords = 5; // Match multiple keywords + RepeatedIntegers integers = 6; // Match multiple integers + } +} + +message RepeatedStrings { + repeated string strings = 1; +} + +message RepeatedIntegers { + repeated int64 integers = 1; +} + +message Range { + optional double lt = 1; + optional double gt = 2; + optional double gte = 3; + optional double lte = 4; +} + +message GeoBoundingBox { + GeoPoint top_left = 1; // north-west corner + GeoPoint bottom_right = 2; // south-east corner +} + +message GeoRadius { + GeoPoint center = 1; // Center of the circle + float radius = 2; // In meters +} + +message ValuesCount { + optional uint64 lt = 1; + optional uint64 gt = 2; + optional uint64 gte = 3; + optional uint64 lte = 4; +} + +// --------------------------------------------- +// -------------- Points Selector -------------- +// --------------------------------------------- + +message PointsSelector { + oneof points_selector_one_of { + PointsIdsList points = 1; + Filter filter = 2; + } +} + +message PointsIdsList { + repeated PointId ids = 1; +} + +// --------------------------------------------- +// ------------------- Point ------------------- +// --------------------------------------------- + + +message PointStruct { + PointId id = 1; + reserved 2; // deprecated "vector" field + map payload = 3; + optional Vectors vectors = 4; +} + + +message GeoPoint { + double lon = 1; + double lat = 2; +} diff --git a/packages/js-client-grpc/proto/points_service.proto b/packages/js-client-grpc/proto/points_service.proto new file mode 100644 index 0000000..52a8f6e --- /dev/null +++ b/packages/js-client-grpc/proto/points_service.proto @@ -0,0 +1,70 @@ +syntax = "proto3"; + +import "points.proto"; + +package qdrant; + +import "google/protobuf/struct.proto"; + +service Points { + /* + Perform insert + updates on points. If point with given ID already exists - it will be overwritten. + */ + rpc Upsert (UpsertPoints) returns (PointsOperationResponse) {} + /* + Delete points + */ + rpc Delete (DeletePoints) returns (PointsOperationResponse) {} + /* + Retrieve points + */ + rpc Get (GetPoints) returns (GetResponse) {} + /* + Set payload for points + */ + rpc SetPayload (SetPayloadPoints) returns (PointsOperationResponse) {} + /* + Overwrite payload for points + */ + rpc OverwritePayload (SetPayloadPoints) returns (PointsOperationResponse) {} + /* + Delete specified key payload for points + */ + rpc DeletePayload (DeletePayloadPoints) returns (PointsOperationResponse) {} + /* + Remove all payload for specified points + */ + rpc ClearPayload (ClearPayloadPoints) returns (PointsOperationResponse) {} + /* + Create index for field in collection + */ + rpc CreateFieldIndex (CreateFieldIndexCollection) returns (PointsOperationResponse) {} + /* + Delete field index for collection + */ + rpc DeleteFieldIndex (DeleteFieldIndexCollection) returns (PointsOperationResponse) {} + /* + Retrieve closest points based on vector similarity and given filtering conditions + */ + rpc Search (SearchPoints) returns (SearchResponse) {} + /* + Retrieve closest points based on vector similarity and given filtering conditions + */ + rpc SearchBatch (SearchBatchPoints) returns (SearchBatchResponse) {} + /* + Iterate over all or filtered points points + */ + rpc Scroll (ScrollPoints) returns (ScrollResponse) {} + /* + Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + rpc Recommend (RecommendPoints) returns (RecommendResponse) {} + /* + Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + rpc RecommendBatch (RecommendBatchPoints) returns (RecommendBatchResponse) {} + /* + Count points in collection with given filtering conditions + */ + rpc Count (CountPoints) returns (CountResponse) {} +} \ No newline at end of file diff --git a/packages/js-client-grpc/proto/qdrant.proto b/packages/js-client-grpc/proto/qdrant.proto new file mode 100644 index 0000000..f526ea4 --- /dev/null +++ b/packages/js-client-grpc/proto/qdrant.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +import "collections_service.proto"; +import "points_service.proto"; +import "snapshots_service.proto"; + +package qdrant; + +service Qdrant { + rpc HealthCheck (HealthCheckRequest) returns (HealthCheckReply) {} +} + +message HealthCheckRequest { +} + +message HealthCheckReply { + string title = 1; + string version = 2; +} diff --git a/packages/js-client-grpc/proto/snapshots_service.proto b/packages/js-client-grpc/proto/snapshots_service.proto new file mode 100644 index 0000000..5770268 --- /dev/null +++ b/packages/js-client-grpc/proto/snapshots_service.proto @@ -0,0 +1,75 @@ +syntax = "proto3"; + +package qdrant; + +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; + +service Snapshots { + /* + Create collection snapshot + */ + rpc Create (CreateSnapshotRequest) returns (CreateSnapshotResponse) {} + /* + List collection snapshots + */ + rpc List (ListSnapshotsRequest) returns (ListSnapshotsResponse) {} + /* + Delete collection snapshots + */ + rpc Delete (DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} + /* + Create full storage snapshot + */ + rpc CreateFull (CreateFullSnapshotRequest) returns (CreateSnapshotResponse) {} + /* + List full storage snapshots + */ + rpc ListFull (ListFullSnapshotsRequest) returns (ListSnapshotsResponse) {} + /* + List full storage snapshots + */ + rpc DeleteFull (DeleteFullSnapshotRequest) returns (DeleteSnapshotResponse) {} + +} + +message CreateFullSnapshotRequest {} + +message ListFullSnapshotsRequest {} + +message DeleteFullSnapshotRequest { + string snapshot_name = 1; // Name of the full snapshot +} + +message CreateSnapshotRequest { + string collection_name = 1; // Name of the collection +} + +message ListSnapshotsRequest { + string collection_name = 1; // Name of the collection +} + +message DeleteSnapshotRequest { + string collection_name = 1; // Name of the collection + string snapshot_name = 2; // Name of the collection snapshot +} + +message SnapshotDescription { + string name = 1; // Name of the snapshot + google.protobuf.Timestamp creation_time = 2; // Creation time of the snapshot + int64 size = 3; // Size of the snapshot in bytes +} + +message CreateSnapshotResponse { + SnapshotDescription snapshot_description = 1; + double time = 2; // Time spent to process +} + +message ListSnapshotsResponse { + repeated SnapshotDescription snapshot_descriptions = 1; + double time = 2; // Time spent to process +} + +message DeleteSnapshotResponse { + double time = 1; // Time spent to process +} diff --git a/packages/js-client-grpc/src/proto/collections_pb.ts b/packages/js-client-grpc/src/proto/collections_pb.ts new file mode 100644 index 0000000..fd8710d --- /dev/null +++ b/packages/js-client-grpc/src/proto/collections_pb.ts @@ -0,0 +1,2032 @@ +// @generated by protoc-gen-es v1.2.0 with parameter "target=ts" +// @generated from file collections.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3, protoInt64 } from "@bufbuild/protobuf"; + +/** + * @generated from enum qdrant.Distance + */ +export enum Distance { + /** + * @generated from enum value: UnknownDistance = 0; + */ + UnknownDistance = 0, + + /** + * @generated from enum value: Cosine = 1; + */ + Cosine = 1, + + /** + * @generated from enum value: Euclid = 2; + */ + Euclid = 2, + + /** + * @generated from enum value: Dot = 3; + */ + Dot = 3, +} +// Retrieve enum metadata with: proto3.getEnumType(Distance) +proto3.util.setEnumType(Distance, "qdrant.Distance", [ + { no: 0, name: "UnknownDistance" }, + { no: 1, name: "Cosine" }, + { no: 2, name: "Euclid" }, + { no: 3, name: "Dot" }, +]); + +/** + * @generated from enum qdrant.CollectionStatus + */ +export enum CollectionStatus { + /** + * @generated from enum value: UnknownCollectionStatus = 0; + */ + UnknownCollectionStatus = 0, + + /** + * All segments are ready + * + * @generated from enum value: Green = 1; + */ + Green = 1, + + /** + * Optimization in process + * + * @generated from enum value: Yellow = 2; + */ + Yellow = 2, + + /** + * Something went wrong + * + * @generated from enum value: Red = 3; + */ + Red = 3, +} +// Retrieve enum metadata with: proto3.getEnumType(CollectionStatus) +proto3.util.setEnumType(CollectionStatus, "qdrant.CollectionStatus", [ + { no: 0, name: "UnknownCollectionStatus" }, + { no: 1, name: "Green" }, + { no: 2, name: "Yellow" }, + { no: 3, name: "Red" }, +]); + +/** + * @generated from enum qdrant.PayloadSchemaType + */ +export enum PayloadSchemaType { + /** + * @generated from enum value: UnknownType = 0; + */ + UnknownType = 0, + + /** + * @generated from enum value: Keyword = 1; + */ + Keyword = 1, + + /** + * @generated from enum value: Integer = 2; + */ + Integer = 2, + + /** + * @generated from enum value: Float = 3; + */ + Float = 3, + + /** + * @generated from enum value: Geo = 4; + */ + Geo = 4, + + /** + * @generated from enum value: Text = 5; + */ + Text = 5, +} +// Retrieve enum metadata with: proto3.getEnumType(PayloadSchemaType) +proto3.util.setEnumType(PayloadSchemaType, "qdrant.PayloadSchemaType", [ + { no: 0, name: "UnknownType" }, + { no: 1, name: "Keyword" }, + { no: 2, name: "Integer" }, + { no: 3, name: "Float" }, + { no: 4, name: "Geo" }, + { no: 5, name: "Text" }, +]); + +/** + * @generated from enum qdrant.QuantizationType + */ +export enum QuantizationType { + /** + * @generated from enum value: UnknownQuantization = 0; + */ + UnknownQuantization = 0, + + /** + * @generated from enum value: Int8 = 1; + */ + Int8 = 1, +} +// Retrieve enum metadata with: proto3.getEnumType(QuantizationType) +proto3.util.setEnumType(QuantizationType, "qdrant.QuantizationType", [ + { no: 0, name: "UnknownQuantization" }, + { no: 1, name: "Int8" }, +]); + +/** + * @generated from enum qdrant.TokenizerType + */ +export enum TokenizerType { + /** + * @generated from enum value: Unknown = 0; + */ + Unknown = 0, + + /** + * @generated from enum value: Prefix = 1; + */ + Prefix = 1, + + /** + * @generated from enum value: Whitespace = 2; + */ + Whitespace = 2, + + /** + * @generated from enum value: Word = 3; + */ + Word = 3, +} +// Retrieve enum metadata with: proto3.getEnumType(TokenizerType) +proto3.util.setEnumType(TokenizerType, "qdrant.TokenizerType", [ + { no: 0, name: "Unknown" }, + { no: 1, name: "Prefix" }, + { no: 2, name: "Whitespace" }, + { no: 3, name: "Word" }, +]); + +/** + * @generated from message qdrant.VectorParams + */ +export class VectorParams extends Message { + /** + * Size of the vectors + * + * @generated from field: uint64 size = 1; + */ + size = protoInt64.zero; + + /** + * Distance function used for comparing vectors + * + * @generated from field: qdrant.Distance distance = 2; + */ + distance = Distance.UnknownDistance; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.VectorParams"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "size", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 2, name: "distance", kind: "enum", T: proto3.getEnumType(Distance) }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): VectorParams { + return new VectorParams().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): VectorParams { + return new VectorParams().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): VectorParams { + return new VectorParams().fromJsonString(jsonString, options); + } + + static equals(a: VectorParams | PlainMessage | undefined, b: VectorParams | PlainMessage | undefined): boolean { + return proto3.util.equals(VectorParams, a, b); + } +} + +/** + * @generated from message qdrant.VectorParamsMap + */ +export class VectorParamsMap extends Message { + /** + * @generated from field: map map = 1; + */ + map: { [key: string]: VectorParams } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.VectorParamsMap"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "map", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: VectorParams} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): VectorParamsMap { + return new VectorParamsMap().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): VectorParamsMap { + return new VectorParamsMap().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): VectorParamsMap { + return new VectorParamsMap().fromJsonString(jsonString, options); + } + + static equals(a: VectorParamsMap | PlainMessage | undefined, b: VectorParamsMap | PlainMessage | undefined): boolean { + return proto3.util.equals(VectorParamsMap, a, b); + } +} + +/** + * @generated from message qdrant.VectorsConfig + */ +export class VectorsConfig extends Message { + /** + * @generated from oneof qdrant.VectorsConfig.config + */ + config: { + /** + * @generated from field: qdrant.VectorParams params = 1; + */ + value: VectorParams; + case: "params"; + } | { + /** + * @generated from field: qdrant.VectorParamsMap params_map = 2; + */ + value: VectorParamsMap; + case: "paramsMap"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.VectorsConfig"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "params", kind: "message", T: VectorParams, oneof: "config" }, + { no: 2, name: "params_map", kind: "message", T: VectorParamsMap, oneof: "config" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): VectorsConfig { + return new VectorsConfig().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): VectorsConfig { + return new VectorsConfig().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): VectorsConfig { + return new VectorsConfig().fromJsonString(jsonString, options); + } + + static equals(a: VectorsConfig | PlainMessage | undefined, b: VectorsConfig | PlainMessage | undefined): boolean { + return proto3.util.equals(VectorsConfig, a, b); + } +} + +/** + * @generated from message qdrant.GetCollectionInfoRequest + */ +export class GetCollectionInfoRequest extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GetCollectionInfoRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetCollectionInfoRequest { + return new GetCollectionInfoRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetCollectionInfoRequest { + return new GetCollectionInfoRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetCollectionInfoRequest { + return new GetCollectionInfoRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetCollectionInfoRequest | PlainMessage | undefined, b: GetCollectionInfoRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetCollectionInfoRequest, a, b); + } +} + +/** + * @generated from message qdrant.ListCollectionsRequest + */ +export class ListCollectionsRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListCollectionsRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListCollectionsRequest { + return new ListCollectionsRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListCollectionsRequest { + return new ListCollectionsRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListCollectionsRequest { + return new ListCollectionsRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListCollectionsRequest | PlainMessage | undefined, b: ListCollectionsRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListCollectionsRequest, a, b); + } +} + +/** + * @generated from message qdrant.CollectionDescription + */ +export class CollectionDescription extends Message { + /** + * Name of the collection + * + * @generated from field: string name = 1; + */ + name = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CollectionDescription"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CollectionDescription { + return new CollectionDescription().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CollectionDescription { + return new CollectionDescription().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CollectionDescription { + return new CollectionDescription().fromJsonString(jsonString, options); + } + + static equals(a: CollectionDescription | PlainMessage | undefined, b: CollectionDescription | PlainMessage | undefined): boolean { + return proto3.util.equals(CollectionDescription, a, b); + } +} + +/** + * @generated from message qdrant.GetCollectionInfoResponse + */ +export class GetCollectionInfoResponse extends Message { + /** + * @generated from field: qdrant.CollectionInfo result = 1; + */ + result?: CollectionInfo; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GetCollectionInfoResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: CollectionInfo }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetCollectionInfoResponse { + return new GetCollectionInfoResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetCollectionInfoResponse { + return new GetCollectionInfoResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetCollectionInfoResponse { + return new GetCollectionInfoResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetCollectionInfoResponse | PlainMessage | undefined, b: GetCollectionInfoResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetCollectionInfoResponse, a, b); + } +} + +/** + * @generated from message qdrant.ListCollectionsResponse + */ +export class ListCollectionsResponse extends Message { + /** + * @generated from field: repeated qdrant.CollectionDescription collections = 1; + */ + collections: CollectionDescription[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListCollectionsResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collections", kind: "message", T: CollectionDescription, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListCollectionsResponse { + return new ListCollectionsResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListCollectionsResponse { + return new ListCollectionsResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListCollectionsResponse { + return new ListCollectionsResponse().fromJsonString(jsonString, options); + } + + static equals(a: ListCollectionsResponse | PlainMessage | undefined, b: ListCollectionsResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ListCollectionsResponse, a, b); + } +} + +/** + * @generated from message qdrant.OptimizerStatus + */ +export class OptimizerStatus extends Message { + /** + * @generated from field: bool ok = 1; + */ + ok = false; + + /** + * @generated from field: string error = 2; + */ + error = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.OptimizerStatus"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "ok", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 2, name: "error", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): OptimizerStatus { + return new OptimizerStatus().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): OptimizerStatus { + return new OptimizerStatus().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): OptimizerStatus { + return new OptimizerStatus().fromJsonString(jsonString, options); + } + + static equals(a: OptimizerStatus | PlainMessage | undefined, b: OptimizerStatus | PlainMessage | undefined): boolean { + return proto3.util.equals(OptimizerStatus, a, b); + } +} + +/** + * @generated from message qdrant.HnswConfigDiff + */ +export class HnswConfigDiff extends Message { + /** + * + * Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. + * + * @generated from field: optional uint64 m = 1; + */ + m?: bigint; + + /** + * + * Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index. + * + * @generated from field: optional uint64 ef_construct = 2; + */ + efConstruct?: bigint; + + /** + * + * Minimal size (in KiloBytes) of vectors for additional payload-based indexing. + * If payload chunk is smaller than `full_scan_threshold` additional indexing won't be used - + * in this case full-scan search should be preferred by query planner and additional indexing is not required. + * Note: 1Kb = 1 vector of size 256 + * + * @generated from field: optional uint64 full_scan_threshold = 3; + */ + fullScanThreshold?: bigint; + + /** + * + * Number of parallel threads used for background index building. If 0 - auto selection. + * + * @generated from field: optional uint64 max_indexing_threads = 4; + */ + maxIndexingThreads?: bigint; + + /** + * + * Store HNSW index on disk. If set to false, index will be stored in RAM. + * + * @generated from field: optional bool on_disk = 5; + */ + onDisk?: boolean; + + /** + * + * Number of additional payload-aware links per node in the index graph. If not set - regular M parameter will be used. + * + * @generated from field: optional uint64 payload_m = 6; + */ + payloadM?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.HnswConfigDiff"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "m", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 2, name: "ef_construct", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 3, name: "full_scan_threshold", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 4, name: "max_indexing_threads", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 5, name: "on_disk", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 6, name: "payload_m", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): HnswConfigDiff { + return new HnswConfigDiff().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): HnswConfigDiff { + return new HnswConfigDiff().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): HnswConfigDiff { + return new HnswConfigDiff().fromJsonString(jsonString, options); + } + + static equals(a: HnswConfigDiff | PlainMessage | undefined, b: HnswConfigDiff | PlainMessage | undefined): boolean { + return proto3.util.equals(HnswConfigDiff, a, b); + } +} + +/** + * @generated from message qdrant.WalConfigDiff + */ +export class WalConfigDiff extends Message { + /** + * Size of a single WAL block file + * + * @generated from field: optional uint64 wal_capacity_mb = 1; + */ + walCapacityMb?: bigint; + + /** + * Number of segments to create in advance + * + * @generated from field: optional uint64 wal_segments_ahead = 2; + */ + walSegmentsAhead?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.WalConfigDiff"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "wal_capacity_mb", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 2, name: "wal_segments_ahead", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): WalConfigDiff { + return new WalConfigDiff().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): WalConfigDiff { + return new WalConfigDiff().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): WalConfigDiff { + return new WalConfigDiff().fromJsonString(jsonString, options); + } + + static equals(a: WalConfigDiff | PlainMessage | undefined, b: WalConfigDiff | PlainMessage | undefined): boolean { + return proto3.util.equals(WalConfigDiff, a, b); + } +} + +/** + * @generated from message qdrant.OptimizersConfigDiff + */ +export class OptimizersConfigDiff extends Message { + /** + * + * The minimal fraction of deleted vectors in a segment, required to perform segment optimization + * + * @generated from field: optional double deleted_threshold = 1; + */ + deletedThreshold?: number; + + /** + * + * The minimal number of vectors in a segment, required to perform segment optimization + * + * @generated from field: optional uint64 vacuum_min_vector_number = 2; + */ + vacuumMinVectorNumber?: bigint; + + /** + * + * Target amount of segments optimizer will try to keep. + * Real amount of segments may vary depending on multiple parameters: + * + * - Amount of stored points. + * - Current write RPS. + * + * It is recommended to select default number of segments as a factor of the number of search threads, + * so that each segment would be handled evenly by one of the threads. + * + * @generated from field: optional uint64 default_segment_number = 3; + */ + defaultSegmentNumber?: bigint; + + /** + * + * Do not create segments larger this size (in KiloBytes). + * Large segments might require disproportionately long indexation times, + * therefore it makes sense to limit the size of segments. + * + * If indexation speed have more priority for your - make this parameter lower. + * If search speed is more important - make this parameter higher. + * Note: 1Kb = 1 vector of size 256 + * + * @generated from field: optional uint64 max_segment_size = 4; + */ + maxSegmentSize?: bigint; + + /** + * + * Maximum size (in KiloBytes) of vectors to store in-memory per segment. + * Segments larger than this threshold will be stored as read-only memmaped file. + * To enable memmap storage, lower the threshold + * Note: 1Kb = 1 vector of size 256 + * + * @generated from field: optional uint64 memmap_threshold = 5; + */ + memmapThreshold?: bigint; + + /** + * + * Maximum size (in KiloBytes) of vectors allowed for plain index. + * Default value based on https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md + * Note: 1Kb = 1 vector of size 256 + * + * @generated from field: optional uint64 indexing_threshold = 6; + */ + indexingThreshold?: bigint; + + /** + * + * Interval between forced flushes. + * + * @generated from field: optional uint64 flush_interval_sec = 7; + */ + flushIntervalSec?: bigint; + + /** + * + * Max number of threads, which can be used for optimization. If 0 - `NUM_CPU - 1` will be used + * + * @generated from field: optional uint64 max_optimization_threads = 8; + */ + maxOptimizationThreads?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.OptimizersConfigDiff"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "deleted_threshold", kind: "scalar", T: 1 /* ScalarType.DOUBLE */, opt: true }, + { no: 2, name: "vacuum_min_vector_number", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 3, name: "default_segment_number", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 4, name: "max_segment_size", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 5, name: "memmap_threshold", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 6, name: "indexing_threshold", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 7, name: "flush_interval_sec", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 8, name: "max_optimization_threads", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): OptimizersConfigDiff { + return new OptimizersConfigDiff().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): OptimizersConfigDiff { + return new OptimizersConfigDiff().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): OptimizersConfigDiff { + return new OptimizersConfigDiff().fromJsonString(jsonString, options); + } + + static equals(a: OptimizersConfigDiff | PlainMessage | undefined, b: OptimizersConfigDiff | PlainMessage | undefined): boolean { + return proto3.util.equals(OptimizersConfigDiff, a, b); + } +} + +/** + * @generated from message qdrant.ScalarQuantization + */ +export class ScalarQuantization extends Message { + /** + * Type of quantization + * + * @generated from field: qdrant.QuantizationType type = 1; + */ + type = QuantizationType.UnknownQuantization; + + /** + * Number of bits to use for quantization + * + * @generated from field: optional float quantile = 2; + */ + quantile?: number; + + /** + * If true - quantized vectors always will be stored in RAM, ignoring the config of main storage + * + * @generated from field: optional bool always_ram = 3; + */ + alwaysRam?: boolean; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ScalarQuantization"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(QuantizationType) }, + { no: 2, name: "quantile", kind: "scalar", T: 2 /* ScalarType.FLOAT */, opt: true }, + { no: 3, name: "always_ram", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScalarQuantization { + return new ScalarQuantization().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScalarQuantization { + return new ScalarQuantization().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScalarQuantization { + return new ScalarQuantization().fromJsonString(jsonString, options); + } + + static equals(a: ScalarQuantization | PlainMessage | undefined, b: ScalarQuantization | PlainMessage | undefined): boolean { + return proto3.util.equals(ScalarQuantization, a, b); + } +} + +/** + * @generated from message qdrant.QuantizationConfig + */ +export class QuantizationConfig extends Message { + /** + * @generated from oneof qdrant.QuantizationConfig.quantization + */ + quantization: { + /** + * @generated from field: qdrant.ScalarQuantization scalar = 1; + */ + value: ScalarQuantization; + case: "scalar"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.QuantizationConfig"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "scalar", kind: "message", T: ScalarQuantization, oneof: "quantization" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): QuantizationConfig { + return new QuantizationConfig().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): QuantizationConfig { + return new QuantizationConfig().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): QuantizationConfig { + return new QuantizationConfig().fromJsonString(jsonString, options); + } + + static equals(a: QuantizationConfig | PlainMessage | undefined, b: QuantizationConfig | PlainMessage | undefined): boolean { + return proto3.util.equals(QuantizationConfig, a, b); + } +} + +/** + * @generated from message qdrant.CreateCollection + */ +export class CreateCollection extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Configuration of vector index + * + * @generated from field: optional qdrant.HnswConfigDiff hnsw_config = 4; + */ + hnswConfig?: HnswConfigDiff; + + /** + * Configuration of the Write-Ahead-Log + * + * @generated from field: optional qdrant.WalConfigDiff wal_config = 5; + */ + walConfig?: WalConfigDiff; + + /** + * Configuration of the optimizers + * + * @generated from field: optional qdrant.OptimizersConfigDiff optimizers_config = 6; + */ + optimizersConfig?: OptimizersConfigDiff; + + /** + * Number of shards in the collection, default = 1 + * + * @generated from field: optional uint32 shard_number = 7; + */ + shardNumber?: number; + + /** + * If true - point's payload will not be stored in memory + * + * @generated from field: optional bool on_disk_payload = 8; + */ + onDiskPayload?: boolean; + + /** + * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * + * @generated from field: optional uint64 timeout = 9; + */ + timeout?: bigint; + + /** + * Configuration for vectors + * + * @generated from field: optional qdrant.VectorsConfig vectors_config = 10; + */ + vectorsConfig?: VectorsConfig; + + /** + * Number of replicas of each shard that network tries to maintain, default = 1 + * + * @generated from field: optional uint32 replication_factor = 11; + */ + replicationFactor?: number; + + /** + * How many replicas should apply the operation for us to consider it successful, default = 1 + * + * @generated from field: optional uint32 write_consistency_factor = 12; + */ + writeConsistencyFactor?: number; + + /** + * Specify name of the other collection to copy data from + * + * @generated from field: optional string init_from_collection = 13; + */ + initFromCollection?: string; + + /** + * @generated from field: optional qdrant.QuantizationConfig quantization_config = 14; + */ + quantizationConfig?: QuantizationConfig; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CreateCollection"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "hnsw_config", kind: "message", T: HnswConfigDiff, opt: true }, + { no: 5, name: "wal_config", kind: "message", T: WalConfigDiff, opt: true }, + { no: 6, name: "optimizers_config", kind: "message", T: OptimizersConfigDiff, opt: true }, + { no: 7, name: "shard_number", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 8, name: "on_disk_payload", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 9, name: "timeout", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 10, name: "vectors_config", kind: "message", T: VectorsConfig, opt: true }, + { no: 11, name: "replication_factor", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 12, name: "write_consistency_factor", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 13, name: "init_from_collection", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 14, name: "quantization_config", kind: "message", T: QuantizationConfig, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateCollection { + return new CreateCollection().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateCollection { + return new CreateCollection().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateCollection { + return new CreateCollection().fromJsonString(jsonString, options); + } + + static equals(a: CreateCollection | PlainMessage | undefined, b: CreateCollection | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateCollection, a, b); + } +} + +/** + * @generated from message qdrant.UpdateCollection + */ +export class UpdateCollection extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * New configuration parameters for the collection + * + * @generated from field: optional qdrant.OptimizersConfigDiff optimizers_config = 2; + */ + optimizersConfig?: OptimizersConfigDiff; + + /** + * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * + * @generated from field: optional uint64 timeout = 3; + */ + timeout?: bigint; + + /** + * New configuration parameters for the collection + * + * @generated from field: optional qdrant.CollectionParamsDiff params = 4; + */ + params?: CollectionParamsDiff; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.UpdateCollection"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "optimizers_config", kind: "message", T: OptimizersConfigDiff, opt: true }, + { no: 3, name: "timeout", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 4, name: "params", kind: "message", T: CollectionParamsDiff, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpdateCollection { + return new UpdateCollection().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpdateCollection { + return new UpdateCollection().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpdateCollection { + return new UpdateCollection().fromJsonString(jsonString, options); + } + + static equals(a: UpdateCollection | PlainMessage | undefined, b: UpdateCollection | PlainMessage | undefined): boolean { + return proto3.util.equals(UpdateCollection, a, b); + } +} + +/** + * @generated from message qdrant.DeleteCollection + */ +export class DeleteCollection extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * + * @generated from field: optional uint64 timeout = 2; + */ + timeout?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeleteCollection"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "timeout", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteCollection { + return new DeleteCollection().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteCollection { + return new DeleteCollection().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteCollection { + return new DeleteCollection().fromJsonString(jsonString, options); + } + + static equals(a: DeleteCollection | PlainMessage | undefined, b: DeleteCollection | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteCollection, a, b); + } +} + +/** + * @generated from message qdrant.CollectionOperationResponse + */ +export class CollectionOperationResponse extends Message { + /** + * if operation made changes + * + * @generated from field: bool result = 1; + */ + result = false; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CollectionOperationResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CollectionOperationResponse { + return new CollectionOperationResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CollectionOperationResponse { + return new CollectionOperationResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CollectionOperationResponse { + return new CollectionOperationResponse().fromJsonString(jsonString, options); + } + + static equals(a: CollectionOperationResponse | PlainMessage | undefined, b: CollectionOperationResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(CollectionOperationResponse, a, b); + } +} + +/** + * @generated from message qdrant.CollectionParams + */ +export class CollectionParams extends Message { + /** + * Number of shards in collection + * + * @generated from field: uint32 shard_number = 3; + */ + shardNumber = 0; + + /** + * If true - point's payload will not be stored in memory + * + * @generated from field: bool on_disk_payload = 4; + */ + onDiskPayload = false; + + /** + * Configuration for vectors + * + * @generated from field: optional qdrant.VectorsConfig vectors_config = 5; + */ + vectorsConfig?: VectorsConfig; + + /** + * Number of replicas of each shard that network tries to maintain + * + * @generated from field: optional uint32 replication_factor = 6; + */ + replicationFactor?: number; + + /** + * How many replicas should apply the operation for us to consider it successful + * + * @generated from field: optional uint32 write_consistency_factor = 7; + */ + writeConsistencyFactor?: number; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CollectionParams"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 3, name: "shard_number", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 4, name: "on_disk_payload", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 5, name: "vectors_config", kind: "message", T: VectorsConfig, opt: true }, + { no: 6, name: "replication_factor", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 7, name: "write_consistency_factor", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CollectionParams { + return new CollectionParams().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CollectionParams { + return new CollectionParams().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CollectionParams { + return new CollectionParams().fromJsonString(jsonString, options); + } + + static equals(a: CollectionParams | PlainMessage | undefined, b: CollectionParams | PlainMessage | undefined): boolean { + return proto3.util.equals(CollectionParams, a, b); + } +} + +/** + * @generated from message qdrant.CollectionParamsDiff + */ +export class CollectionParamsDiff extends Message { + /** + * Number of replicas of each shard that network tries to maintain + * + * @generated from field: optional uint32 replication_factor = 1; + */ + replicationFactor?: number; + + /** + * How many replicas should apply the operation for us to consider it successful + * + * @generated from field: optional uint32 write_consistency_factor = 2; + */ + writeConsistencyFactor?: number; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CollectionParamsDiff"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "replication_factor", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 2, name: "write_consistency_factor", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CollectionParamsDiff { + return new CollectionParamsDiff().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CollectionParamsDiff { + return new CollectionParamsDiff().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CollectionParamsDiff { + return new CollectionParamsDiff().fromJsonString(jsonString, options); + } + + static equals(a: CollectionParamsDiff | PlainMessage | undefined, b: CollectionParamsDiff | PlainMessage | undefined): boolean { + return proto3.util.equals(CollectionParamsDiff, a, b); + } +} + +/** + * @generated from message qdrant.CollectionConfig + */ +export class CollectionConfig extends Message { + /** + * Collection parameters + * + * @generated from field: qdrant.CollectionParams params = 1; + */ + params?: CollectionParams; + + /** + * Configuration of vector index + * + * @generated from field: qdrant.HnswConfigDiff hnsw_config = 2; + */ + hnswConfig?: HnswConfigDiff; + + /** + * Configuration of the optimizers + * + * @generated from field: qdrant.OptimizersConfigDiff optimizer_config = 3; + */ + optimizerConfig?: OptimizersConfigDiff; + + /** + * Configuration of the Write-Ahead-Log + * + * @generated from field: qdrant.WalConfigDiff wal_config = 4; + */ + walConfig?: WalConfigDiff; + + /** + * Configuration of the vector quantization + * + * @generated from field: optional qdrant.QuantizationConfig quantization_config = 5; + */ + quantizationConfig?: QuantizationConfig; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CollectionConfig"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "params", kind: "message", T: CollectionParams }, + { no: 2, name: "hnsw_config", kind: "message", T: HnswConfigDiff }, + { no: 3, name: "optimizer_config", kind: "message", T: OptimizersConfigDiff }, + { no: 4, name: "wal_config", kind: "message", T: WalConfigDiff }, + { no: 5, name: "quantization_config", kind: "message", T: QuantizationConfig, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CollectionConfig { + return new CollectionConfig().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CollectionConfig { + return new CollectionConfig().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CollectionConfig { + return new CollectionConfig().fromJsonString(jsonString, options); + } + + static equals(a: CollectionConfig | PlainMessage | undefined, b: CollectionConfig | PlainMessage | undefined): boolean { + return proto3.util.equals(CollectionConfig, a, b); + } +} + +/** + * @generated from message qdrant.TextIndexParams + */ +export class TextIndexParams extends Message { + /** + * Tokenizer type + * + * @generated from field: qdrant.TokenizerType tokenizer = 1; + */ + tokenizer = TokenizerType.Unknown; + + /** + * If true - all tokens will be lowercased + * + * @generated from field: optional bool lowercase = 2; + */ + lowercase?: boolean; + + /** + * Minimal token length + * + * @generated from field: optional uint64 min_token_len = 3; + */ + minTokenLen?: bigint; + + /** + * Maximal token length + * + * @generated from field: optional uint64 max_token_len = 4; + */ + maxTokenLen?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.TextIndexParams"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "tokenizer", kind: "enum", T: proto3.getEnumType(TokenizerType) }, + { no: 2, name: "lowercase", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "min_token_len", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 4, name: "max_token_len", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TextIndexParams { + return new TextIndexParams().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TextIndexParams { + return new TextIndexParams().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TextIndexParams { + return new TextIndexParams().fromJsonString(jsonString, options); + } + + static equals(a: TextIndexParams | PlainMessage | undefined, b: TextIndexParams | PlainMessage | undefined): boolean { + return proto3.util.equals(TextIndexParams, a, b); + } +} + +/** + * @generated from message qdrant.PayloadIndexParams + */ +export class PayloadIndexParams extends Message { + /** + * @generated from oneof qdrant.PayloadIndexParams.index_params + */ + indexParams: { + /** + * Parameters for text index + * + * @generated from field: qdrant.TextIndexParams text_index_params = 1; + */ + value: TextIndexParams; + case: "textIndexParams"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PayloadIndexParams"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "text_index_params", kind: "message", T: TextIndexParams, oneof: "index_params" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PayloadIndexParams { + return new PayloadIndexParams().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PayloadIndexParams { + return new PayloadIndexParams().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PayloadIndexParams { + return new PayloadIndexParams().fromJsonString(jsonString, options); + } + + static equals(a: PayloadIndexParams | PlainMessage | undefined, b: PayloadIndexParams | PlainMessage | undefined): boolean { + return proto3.util.equals(PayloadIndexParams, a, b); + } +} + +/** + * @generated from message qdrant.PayloadSchemaInfo + */ +export class PayloadSchemaInfo extends Message { + /** + * Field data type + * + * @generated from field: qdrant.PayloadSchemaType data_type = 1; + */ + dataType = PayloadSchemaType.UnknownType; + + /** + * Field index parameters + * + * @generated from field: optional qdrant.PayloadIndexParams params = 2; + */ + params?: PayloadIndexParams; + + /** + * Number of points indexed within this field indexed + * + * @generated from field: optional uint64 points = 3; + */ + points?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PayloadSchemaInfo"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "data_type", kind: "enum", T: proto3.getEnumType(PayloadSchemaType) }, + { no: 2, name: "params", kind: "message", T: PayloadIndexParams, opt: true }, + { no: 3, name: "points", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PayloadSchemaInfo { + return new PayloadSchemaInfo().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PayloadSchemaInfo { + return new PayloadSchemaInfo().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PayloadSchemaInfo { + return new PayloadSchemaInfo().fromJsonString(jsonString, options); + } + + static equals(a: PayloadSchemaInfo | PlainMessage | undefined, b: PayloadSchemaInfo | PlainMessage | undefined): boolean { + return proto3.util.equals(PayloadSchemaInfo, a, b); + } +} + +/** + * @generated from message qdrant.CollectionInfo + */ +export class CollectionInfo extends Message { + /** + * operating condition of the collection + * + * @generated from field: qdrant.CollectionStatus status = 1; + */ + status = CollectionStatus.UnknownCollectionStatus; + + /** + * status of collection optimizers + * + * @generated from field: qdrant.OptimizerStatus optimizer_status = 2; + */ + optimizerStatus?: OptimizerStatus; + + /** + * number of vectors in the collection + * + * @generated from field: uint64 vectors_count = 3; + */ + vectorsCount = protoInt64.zero; + + /** + * Number of independent segments + * + * @generated from field: uint64 segments_count = 4; + */ + segmentsCount = protoInt64.zero; + + /** + * Configuration + * + * @generated from field: qdrant.CollectionConfig config = 7; + */ + config?: CollectionConfig; + + /** + * Collection data types + * + * @generated from field: map payload_schema = 8; + */ + payloadSchema: { [key: string]: PayloadSchemaInfo } = {}; + + /** + * number of points in the collection + * + * @generated from field: uint64 points_count = 9; + */ + pointsCount = protoInt64.zero; + + /** + * number of indexed vectors in the collection. + * + * @generated from field: optional uint64 indexed_vectors_count = 10; + */ + indexedVectorsCount?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CollectionInfo"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "status", kind: "enum", T: proto3.getEnumType(CollectionStatus) }, + { no: 2, name: "optimizer_status", kind: "message", T: OptimizerStatus }, + { no: 3, name: "vectors_count", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 4, name: "segments_count", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 7, name: "config", kind: "message", T: CollectionConfig }, + { no: 8, name: "payload_schema", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: PayloadSchemaInfo} }, + { no: 9, name: "points_count", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 10, name: "indexed_vectors_count", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CollectionInfo { + return new CollectionInfo().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CollectionInfo { + return new CollectionInfo().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CollectionInfo { + return new CollectionInfo().fromJsonString(jsonString, options); + } + + static equals(a: CollectionInfo | PlainMessage | undefined, b: CollectionInfo | PlainMessage | undefined): boolean { + return proto3.util.equals(CollectionInfo, a, b); + } +} + +/** + * @generated from message qdrant.ChangeAliases + */ +export class ChangeAliases extends Message { + /** + * List of actions + * + * @generated from field: repeated qdrant.AliasOperations actions = 1; + */ + actions: AliasOperations[] = []; + + /** + * Wait timeout for operation commit in seconds, if not specified - default value will be supplied + * + * @generated from field: optional uint64 timeout = 2; + */ + timeout?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ChangeAliases"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "actions", kind: "message", T: AliasOperations, repeated: true }, + { no: 2, name: "timeout", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ChangeAliases { + return new ChangeAliases().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ChangeAliases { + return new ChangeAliases().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ChangeAliases { + return new ChangeAliases().fromJsonString(jsonString, options); + } + + static equals(a: ChangeAliases | PlainMessage | undefined, b: ChangeAliases | PlainMessage | undefined): boolean { + return proto3.util.equals(ChangeAliases, a, b); + } +} + +/** + * @generated from message qdrant.AliasOperations + */ +export class AliasOperations extends Message { + /** + * @generated from oneof qdrant.AliasOperations.action + */ + action: { + /** + * @generated from field: qdrant.CreateAlias create_alias = 1; + */ + value: CreateAlias; + case: "createAlias"; + } | { + /** + * @generated from field: qdrant.RenameAlias rename_alias = 2; + */ + value: RenameAlias; + case: "renameAlias"; + } | { + /** + * @generated from field: qdrant.DeleteAlias delete_alias = 3; + */ + value: DeleteAlias; + case: "deleteAlias"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.AliasOperations"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "create_alias", kind: "message", T: CreateAlias, oneof: "action" }, + { no: 2, name: "rename_alias", kind: "message", T: RenameAlias, oneof: "action" }, + { no: 3, name: "delete_alias", kind: "message", T: DeleteAlias, oneof: "action" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): AliasOperations { + return new AliasOperations().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): AliasOperations { + return new AliasOperations().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): AliasOperations { + return new AliasOperations().fromJsonString(jsonString, options); + } + + static equals(a: AliasOperations | PlainMessage | undefined, b: AliasOperations | PlainMessage | undefined): boolean { + return proto3.util.equals(AliasOperations, a, b); + } +} + +/** + * @generated from message qdrant.CreateAlias + */ +export class CreateAlias extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * New name of the alias + * + * @generated from field: string alias_name = 2; + */ + aliasName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CreateAlias"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "alias_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateAlias { + return new CreateAlias().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateAlias { + return new CreateAlias().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateAlias { + return new CreateAlias().fromJsonString(jsonString, options); + } + + static equals(a: CreateAlias | PlainMessage | undefined, b: CreateAlias | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateAlias, a, b); + } +} + +/** + * @generated from message qdrant.RenameAlias + */ +export class RenameAlias extends Message { + /** + * Name of the alias to rename + * + * @generated from field: string old_alias_name = 1; + */ + oldAliasName = ""; + + /** + * Name of the alias + * + * @generated from field: string new_alias_name = 2; + */ + newAliasName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RenameAlias"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "old_alias_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "new_alias_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RenameAlias { + return new RenameAlias().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RenameAlias { + return new RenameAlias().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RenameAlias { + return new RenameAlias().fromJsonString(jsonString, options); + } + + static equals(a: RenameAlias | PlainMessage | undefined, b: RenameAlias | PlainMessage | undefined): boolean { + return proto3.util.equals(RenameAlias, a, b); + } +} + +/** + * @generated from message qdrant.DeleteAlias + */ +export class DeleteAlias extends Message { + /** + * Name of the alias + * + * @generated from field: string alias_name = 1; + */ + aliasName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeleteAlias"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "alias_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteAlias { + return new DeleteAlias().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteAlias { + return new DeleteAlias().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteAlias { + return new DeleteAlias().fromJsonString(jsonString, options); + } + + static equals(a: DeleteAlias | PlainMessage | undefined, b: DeleteAlias | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteAlias, a, b); + } +} + +/** + * @generated from message qdrant.ListAliasesRequest + */ +export class ListAliasesRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListAliasesRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListAliasesRequest { + return new ListAliasesRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListAliasesRequest { + return new ListAliasesRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListAliasesRequest { + return new ListAliasesRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListAliasesRequest | PlainMessage | undefined, b: ListAliasesRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListAliasesRequest, a, b); + } +} + +/** + * @generated from message qdrant.ListCollectionAliasesRequest + */ +export class ListCollectionAliasesRequest extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListCollectionAliasesRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListCollectionAliasesRequest { + return new ListCollectionAliasesRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListCollectionAliasesRequest { + return new ListCollectionAliasesRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListCollectionAliasesRequest { + return new ListCollectionAliasesRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListCollectionAliasesRequest | PlainMessage | undefined, b: ListCollectionAliasesRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListCollectionAliasesRequest, a, b); + } +} + +/** + * @generated from message qdrant.AliasDescription + */ +export class AliasDescription extends Message { + /** + * Name of the alias + * + * @generated from field: string alias_name = 1; + */ + aliasName = ""; + + /** + * Name of the collection + * + * @generated from field: string collection_name = 2; + */ + collectionName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.AliasDescription"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "alias_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): AliasDescription { + return new AliasDescription().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): AliasDescription { + return new AliasDescription().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): AliasDescription { + return new AliasDescription().fromJsonString(jsonString, options); + } + + static equals(a: AliasDescription | PlainMessage | undefined, b: AliasDescription | PlainMessage | undefined): boolean { + return proto3.util.equals(AliasDescription, a, b); + } +} + +/** + * @generated from message qdrant.ListAliasesResponse + */ +export class ListAliasesResponse extends Message { + /** + * @generated from field: repeated qdrant.AliasDescription aliases = 1; + */ + aliases: AliasDescription[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListAliasesResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "aliases", kind: "message", T: AliasDescription, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListAliasesResponse { + return new ListAliasesResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListAliasesResponse { + return new ListAliasesResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListAliasesResponse { + return new ListAliasesResponse().fromJsonString(jsonString, options); + } + + static equals(a: ListAliasesResponse | PlainMessage | undefined, b: ListAliasesResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ListAliasesResponse, a, b); + } +} + diff --git a/packages/js-client-grpc/src/proto/collections_service_connect.ts b/packages/js-client-grpc/src/proto/collections_service_connect.ts new file mode 100644 index 0000000..6e185fa --- /dev/null +++ b/packages/js-client-grpc/src/proto/collections_service_connect.ts @@ -0,0 +1,113 @@ +// @generated by protoc-gen-connect-es v0.8.4 with parameter "target=ts" +// @generated from file collections_service.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { ChangeAliases, CollectionOperationResponse, CreateCollection, DeleteCollection, GetCollectionInfoRequest, GetCollectionInfoResponse, ListAliasesRequest, ListAliasesResponse, ListCollectionAliasesRequest, ListCollectionsRequest, ListCollectionsResponse, UpdateCollection } from "./collections_pb.js"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * @generated from service qdrant.Collections + */ +export const Collections = { + typeName: "qdrant.Collections", + methods: { + /** + * + * Get detailed information about specified existing collection + * + * @generated from rpc qdrant.Collections.Get + */ + get: { + name: "Get", + I: GetCollectionInfoRequest, + O: GetCollectionInfoResponse, + kind: MethodKind.Unary, + }, + /** + * + * Get list name of all existing collections + * + * @generated from rpc qdrant.Collections.List + */ + list: { + name: "List", + I: ListCollectionsRequest, + O: ListCollectionsResponse, + kind: MethodKind.Unary, + }, + /** + * + * Create new collection with given parameters + * + * @generated from rpc qdrant.Collections.Create + */ + create: { + name: "Create", + I: CreateCollection, + O: CollectionOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Update parameters of the existing collection + * + * @generated from rpc qdrant.Collections.Update + */ + update: { + name: "Update", + I: UpdateCollection, + O: CollectionOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Drop collection and all associated data + * + * @generated from rpc qdrant.Collections.Delete + */ + delete: { + name: "Delete", + I: DeleteCollection, + O: CollectionOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Update Aliases of the existing collection + * + * @generated from rpc qdrant.Collections.UpdateAliases + */ + updateAliases: { + name: "UpdateAliases", + I: ChangeAliases, + O: CollectionOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Get list of all aliases for a collection + * + * @generated from rpc qdrant.Collections.ListCollectionAliases + */ + listCollectionAliases: { + name: "ListCollectionAliases", + I: ListCollectionAliasesRequest, + O: ListAliasesResponse, + kind: MethodKind.Unary, + }, + /** + * + * Get list of all aliases for all existing collections + * + * @generated from rpc qdrant.Collections.ListAliases + */ + listAliases: { + name: "ListAliases", + I: ListAliasesRequest, + O: ListAliasesResponse, + kind: MethodKind.Unary, + }, + } +} as const; + diff --git a/packages/js-client-grpc/src/proto/json_with_int_pb.ts b/packages/js-client-grpc/src/proto/json_with_int_pb.ts new file mode 100644 index 0000000..413a007 --- /dev/null +++ b/packages/js-client-grpc/src/proto/json_with_int_pb.ts @@ -0,0 +1,230 @@ +// Fork of the google.protobuf.Value with explicit support for integer values + +// @generated by protoc-gen-es v1.2.0 with parameter "target=ts" +// @generated from file json_with_int.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3 } from "@bufbuild/protobuf"; + +/** + * `NullValue` is a singleton enumeration to represent the null value for the + * `Value` type union. + * + * The JSON representation for `NullValue` is JSON `null`. + * + * @generated from enum qdrant.NullValue + */ +export enum NullValue { + /** + * Null value. + * + * @generated from enum value: NULL_VALUE = 0; + */ + NULL_VALUE = 0, +} +// Retrieve enum metadata with: proto3.getEnumType(NullValue) +proto3.util.setEnumType(NullValue, "qdrant.NullValue", [ + { no: 0, name: "NULL_VALUE" }, +]); + +/** + * `Struct` represents a structured data value, consisting of fields + * which map to dynamically typed values. In some languages, `Struct` + * might be supported by a native representation. For example, in + * scripting languages like JS a struct is represented as an + * object. The details of that representation are described together + * with the proto support for the language. + * + * The JSON representation for `Struct` is JSON object. + * + * @generated from message qdrant.Struct + */ +export class Struct extends Message { + /** + * Unordered map of dynamically typed values. + * + * @generated from field: map fields = 1; + */ + fields: { [key: string]: Value } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Struct"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "fields", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Struct { + return new Struct().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Struct { + return new Struct().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Struct { + return new Struct().fromJsonString(jsonString, options); + } + + static equals(a: Struct | PlainMessage | undefined, b: Struct | PlainMessage | undefined): boolean { + return proto3.util.equals(Struct, a, b); + } +} + +/** + * `Value` represents a dynamically typed value which can be either + * null, a number, a string, a boolean, a recursive struct value, or a + * list of values. A producer of value is expected to set one of that + * variants, absence of any variant indicates an error. + * + * The JSON representation for `Value` is JSON value. + * + * @generated from message qdrant.Value + */ +export class Value extends Message { + /** + * The kind of value. + * + * @generated from oneof qdrant.Value.kind + */ + kind: { + /** + * Represents a null value. + * + * @generated from field: qdrant.NullValue null_value = 1; + */ + value: NullValue; + case: "nullValue"; + } | { + /** + * Represents a double value. + * + * @generated from field: double double_value = 2; + */ + value: number; + case: "doubleValue"; + } | { + /** + * Represents an integer value + * + * @generated from field: int64 integer_value = 3; + */ + value: bigint; + case: "integerValue"; + } | { + /** + * Represents a string value. + * + * @generated from field: string string_value = 4; + */ + value: string; + case: "stringValue"; + } | { + /** + * Represents a boolean value. + * + * @generated from field: bool bool_value = 5; + */ + value: boolean; + case: "boolValue"; + } | { + /** + * Represents a structured value. + * + * @generated from field: qdrant.Struct struct_value = 6; + */ + value: Struct; + case: "structValue"; + } | { + /** + * Represents a repeated `Value`. + * + * @generated from field: qdrant.ListValue list_value = 7; + */ + value: ListValue; + case: "listValue"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Value"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "null_value", kind: "enum", T: proto3.getEnumType(NullValue), oneof: "kind" }, + { no: 2, name: "double_value", kind: "scalar", T: 1 /* ScalarType.DOUBLE */, oneof: "kind" }, + { no: 3, name: "integer_value", kind: "scalar", T: 3 /* ScalarType.INT64 */, oneof: "kind" }, + { no: 4, name: "string_value", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "kind" }, + { no: 5, name: "bool_value", kind: "scalar", T: 8 /* ScalarType.BOOL */, oneof: "kind" }, + { no: 6, name: "struct_value", kind: "message", T: Struct, oneof: "kind" }, + { no: 7, name: "list_value", kind: "message", T: ListValue, oneof: "kind" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Value { + return new Value().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Value { + return new Value().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Value { + return new Value().fromJsonString(jsonString, options); + } + + static equals(a: Value | PlainMessage | undefined, b: Value | PlainMessage | undefined): boolean { + return proto3.util.equals(Value, a, b); + } +} + +/** + * `ListValue` is a wrapper around a repeated field of values. + * + * The JSON representation for `ListValue` is JSON array. + * + * @generated from message qdrant.ListValue + */ +export class ListValue extends Message { + /** + * Repeated field of dynamically typed values. + * + * @generated from field: repeated qdrant.Value values = 1; + */ + values: Value[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListValue"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "values", kind: "message", T: Value, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListValue { + return new ListValue().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListValue { + return new ListValue().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListValue { + return new ListValue().fromJsonString(jsonString, options); + } + + static equals(a: ListValue | PlainMessage | undefined, b: ListValue | PlainMessage | undefined): boolean { + return proto3.util.equals(ListValue, a, b); + } +} + diff --git a/packages/js-client-grpc/src/proto/points_pb.ts b/packages/js-client-grpc/src/proto/points_pb.ts new file mode 100644 index 0000000..9826be0 --- /dev/null +++ b/packages/js-client-grpc/src/proto/points_pb.ts @@ -0,0 +1,3264 @@ +// @generated by protoc-gen-es v1.2.0 with parameter "target=ts" +// @generated from file points.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3, protoInt64 } from "@bufbuild/protobuf"; +import { Value } from "./json_with_int_pb.js"; +import { PayloadIndexParams } from "./collections_pb.js"; + +/** + * @generated from enum qdrant.WriteOrderingType + */ +export enum WriteOrderingType { + /** + * Write operations may be reordered, works faster, default + * + * @generated from enum value: Weak = 0; + */ + Weak = 0, + + /** + * Write operations go through dynamically selected leader, may be inconsistent for a short period of time in case of leader change + * + * @generated from enum value: Medium = 1; + */ + Medium = 1, + + /** + * Write operations go through the permanent leader, consistent, but may be unavailable if leader is down + * + * @generated from enum value: Strong = 2; + */ + Strong = 2, +} +// Retrieve enum metadata with: proto3.getEnumType(WriteOrderingType) +proto3.util.setEnumType(WriteOrderingType, "qdrant.WriteOrderingType", [ + { no: 0, name: "Weak" }, + { no: 1, name: "Medium" }, + { no: 2, name: "Strong" }, +]); + +/** + * @generated from enum qdrant.ReadConsistencyType + */ +export enum ReadConsistencyType { + /** + * Send request to all nodes and return points which are present on all of them + * + * @generated from enum value: All = 0; + */ + All = 0, + + /** + * Send requests to all nodes and return points which are present on majority of them + * + * @generated from enum value: Majority = 1; + */ + Majority = 1, + + /** + * Send requests to half + 1 nodes, return points which are present on all of them + * + * @generated from enum value: Quorum = 2; + */ + Quorum = 2, +} +// Retrieve enum metadata with: proto3.getEnumType(ReadConsistencyType) +proto3.util.setEnumType(ReadConsistencyType, "qdrant.ReadConsistencyType", [ + { no: 0, name: "All" }, + { no: 1, name: "Majority" }, + { no: 2, name: "Quorum" }, +]); + +/** + * @generated from enum qdrant.FieldType + */ +export enum FieldType { + /** + * @generated from enum value: FieldTypeKeyword = 0; + */ + FieldTypeKeyword = 0, + + /** + * @generated from enum value: FieldTypeInteger = 1; + */ + FieldTypeInteger = 1, + + /** + * @generated from enum value: FieldTypeFloat = 2; + */ + FieldTypeFloat = 2, + + /** + * @generated from enum value: FieldTypeGeo = 3; + */ + FieldTypeGeo = 3, + + /** + * @generated from enum value: FieldTypeText = 4; + */ + FieldTypeText = 4, +} +// Retrieve enum metadata with: proto3.getEnumType(FieldType) +proto3.util.setEnumType(FieldType, "qdrant.FieldType", [ + { no: 0, name: "FieldTypeKeyword" }, + { no: 1, name: "FieldTypeInteger" }, + { no: 2, name: "FieldTypeFloat" }, + { no: 3, name: "FieldTypeGeo" }, + { no: 4, name: "FieldTypeText" }, +]); + +/** + * @generated from enum qdrant.UpdateStatus + */ +export enum UpdateStatus { + /** + * @generated from enum value: UnknownUpdateStatus = 0; + */ + UnknownUpdateStatus = 0, + + /** + * Update is received, but not processed yet + * + * @generated from enum value: Acknowledged = 1; + */ + Acknowledged = 1, + + /** + * Update is applied and ready for search + * + * @generated from enum value: Completed = 2; + */ + Completed = 2, +} +// Retrieve enum metadata with: proto3.getEnumType(UpdateStatus) +proto3.util.setEnumType(UpdateStatus, "qdrant.UpdateStatus", [ + { no: 0, name: "UnknownUpdateStatus" }, + { no: 1, name: "Acknowledged" }, + { no: 2, name: "Completed" }, +]); + +/** + * @generated from message qdrant.WriteOrdering + */ +export class WriteOrdering extends Message { + /** + * Write ordering guarantees + * + * @generated from field: qdrant.WriteOrderingType type = 1; + */ + type = WriteOrderingType.Weak; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.WriteOrdering"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(WriteOrderingType) }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): WriteOrdering { + return new WriteOrdering().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): WriteOrdering { + return new WriteOrdering().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): WriteOrdering { + return new WriteOrdering().fromJsonString(jsonString, options); + } + + static equals(a: WriteOrdering | PlainMessage | undefined, b: WriteOrdering | PlainMessage | undefined): boolean { + return proto3.util.equals(WriteOrdering, a, b); + } +} + +/** + * @generated from message qdrant.ReadConsistency + */ +export class ReadConsistency extends Message { + /** + * @generated from oneof qdrant.ReadConsistency.value + */ + value: { + /** + * Common read consistency configurations + * + * @generated from field: qdrant.ReadConsistencyType type = 1; + */ + value: ReadConsistencyType; + case: "type"; + } | { + /** + * Send request to a specified number of nodes, and return points which are present on all of them + * + * @generated from field: uint64 factor = 2; + */ + value: bigint; + case: "factor"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ReadConsistency"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(ReadConsistencyType), oneof: "value" }, + { no: 2, name: "factor", kind: "scalar", T: 4 /* ScalarType.UINT64 */, oneof: "value" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ReadConsistency { + return new ReadConsistency().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ReadConsistency { + return new ReadConsistency().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ReadConsistency { + return new ReadConsistency().fromJsonString(jsonString, options); + } + + static equals(a: ReadConsistency | PlainMessage | undefined, b: ReadConsistency | PlainMessage | undefined): boolean { + return proto3.util.equals(ReadConsistency, a, b); + } +} + +/** + * @generated from message qdrant.PointId + */ +export class PointId extends Message { + /** + * @generated from oneof qdrant.PointId.point_id_options + */ + pointIdOptions: { + /** + * Numerical ID of the point + * + * @generated from field: uint64 num = 1; + */ + value: bigint; + case: "num"; + } | { + /** + * UUID + * + * @generated from field: string uuid = 2; + */ + value: string; + case: "uuid"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PointId"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "num", kind: "scalar", T: 4 /* ScalarType.UINT64 */, oneof: "point_id_options" }, + { no: 2, name: "uuid", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "point_id_options" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PointId { + return new PointId().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PointId { + return new PointId().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PointId { + return new PointId().fromJsonString(jsonString, options); + } + + static equals(a: PointId | PlainMessage | undefined, b: PointId | PlainMessage | undefined): boolean { + return proto3.util.equals(PointId, a, b); + } +} + +/** + * @generated from message qdrant.Vector + */ +export class Vector extends Message { + /** + * @generated from field: repeated float data = 1; + */ + data: number[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Vector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "data", kind: "scalar", T: 2 /* ScalarType.FLOAT */, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Vector { + return new Vector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Vector { + return new Vector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Vector { + return new Vector().fromJsonString(jsonString, options); + } + + static equals(a: Vector | PlainMessage | undefined, b: Vector | PlainMessage | undefined): boolean { + return proto3.util.equals(Vector, a, b); + } +} + +/** + * @generated from message qdrant.UpsertPoints + */ +export class UpsertPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * @generated from field: repeated qdrant.PointStruct points = 3; + */ + points: PointStruct[] = []; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 4; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.UpsertPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "points", kind: "message", T: PointStruct, repeated: true }, + { no: 4, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpsertPoints { + return new UpsertPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpsertPoints { + return new UpsertPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpsertPoints { + return new UpsertPoints().fromJsonString(jsonString, options); + } + + static equals(a: UpsertPoints | PlainMessage | undefined, b: UpsertPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(UpsertPoints, a, b); + } +} + +/** + * @generated from message qdrant.DeletePoints + */ +export class DeletePoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * Affected points + * + * @generated from field: qdrant.PointsSelector points = 3; + */ + points?: PointsSelector; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 4; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeletePoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "points", kind: "message", T: PointsSelector }, + { no: 4, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeletePoints { + return new DeletePoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeletePoints { + return new DeletePoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeletePoints { + return new DeletePoints().fromJsonString(jsonString, options); + } + + static equals(a: DeletePoints | PlainMessage | undefined, b: DeletePoints | PlainMessage | undefined): boolean { + return proto3.util.equals(DeletePoints, a, b); + } +} + +/** + * @generated from message qdrant.GetPoints + */ +export class GetPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * List of points to retrieve + * + * @generated from field: repeated qdrant.PointId ids = 2; + */ + ids: PointId[] = []; + + /** + * Options for specifying which payload to include or not + * + * @generated from field: qdrant.WithPayloadSelector with_payload = 4; + */ + withPayload?: WithPayloadSelector; + + /** + * Options for specifying which vectors to include into response + * + * @generated from field: optional qdrant.WithVectorsSelector with_vectors = 5; + */ + withVectors?: WithVectorsSelector; + + /** + * Options for specifying read consistency guarantees + * + * @generated from field: optional qdrant.ReadConsistency read_consistency = 6; + */ + readConsistency?: ReadConsistency; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GetPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "ids", kind: "message", T: PointId, repeated: true }, + { no: 4, name: "with_payload", kind: "message", T: WithPayloadSelector }, + { no: 5, name: "with_vectors", kind: "message", T: WithVectorsSelector, opt: true }, + { no: 6, name: "read_consistency", kind: "message", T: ReadConsistency, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetPoints { + return new GetPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetPoints { + return new GetPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetPoints { + return new GetPoints().fromJsonString(jsonString, options); + } + + static equals(a: GetPoints | PlainMessage | undefined, b: GetPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(GetPoints, a, b); + } +} + +/** + * @generated from message qdrant.SetPayloadPoints + */ +export class SetPayloadPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * New payload values + * + * @generated from field: map payload = 3; + */ + payload: { [key: string]: Value } = {}; + + /** + * Affected points + * + * @generated from field: optional qdrant.PointsSelector points_selector = 5; + */ + pointsSelector?: PointsSelector; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 6; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SetPayloadPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "payload", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + { no: 5, name: "points_selector", kind: "message", T: PointsSelector, opt: true }, + { no: 6, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SetPayloadPoints { + return new SetPayloadPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SetPayloadPoints { + return new SetPayloadPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SetPayloadPoints { + return new SetPayloadPoints().fromJsonString(jsonString, options); + } + + static equals(a: SetPayloadPoints | PlainMessage | undefined, b: SetPayloadPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(SetPayloadPoints, a, b); + } +} + +/** + * @generated from message qdrant.DeletePayloadPoints + */ +export class DeletePayloadPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * List of keys to delete + * + * @generated from field: repeated string keys = 3; + */ + keys: string[] = []; + + /** + * Affected points + * + * @generated from field: optional qdrant.PointsSelector points_selector = 5; + */ + pointsSelector?: PointsSelector; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 6; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeletePayloadPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "keys", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + { no: 5, name: "points_selector", kind: "message", T: PointsSelector, opt: true }, + { no: 6, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeletePayloadPoints { + return new DeletePayloadPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeletePayloadPoints { + return new DeletePayloadPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeletePayloadPoints { + return new DeletePayloadPoints().fromJsonString(jsonString, options); + } + + static equals(a: DeletePayloadPoints | PlainMessage | undefined, b: DeletePayloadPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(DeletePayloadPoints, a, b); + } +} + +/** + * @generated from message qdrant.ClearPayloadPoints + */ +export class ClearPayloadPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * Affected points + * + * @generated from field: qdrant.PointsSelector points = 3; + */ + points?: PointsSelector; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 4; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ClearPayloadPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "points", kind: "message", T: PointsSelector }, + { no: 4, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ClearPayloadPoints { + return new ClearPayloadPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ClearPayloadPoints { + return new ClearPayloadPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ClearPayloadPoints { + return new ClearPayloadPoints().fromJsonString(jsonString, options); + } + + static equals(a: ClearPayloadPoints | PlainMessage | undefined, b: ClearPayloadPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(ClearPayloadPoints, a, b); + } +} + +/** + * @generated from message qdrant.CreateFieldIndexCollection + */ +export class CreateFieldIndexCollection extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * Field name to index + * + * @generated from field: string field_name = 3; + */ + fieldName = ""; + + /** + * Field type. + * + * @generated from field: optional qdrant.FieldType field_type = 4; + */ + fieldType?: FieldType; + + /** + * Payload index params. + * + * @generated from field: optional qdrant.PayloadIndexParams field_index_params = 5; + */ + fieldIndexParams?: PayloadIndexParams; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 6; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CreateFieldIndexCollection"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "field_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "field_type", kind: "enum", T: proto3.getEnumType(FieldType), opt: true }, + { no: 5, name: "field_index_params", kind: "message", T: PayloadIndexParams, opt: true }, + { no: 6, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateFieldIndexCollection { + return new CreateFieldIndexCollection().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateFieldIndexCollection { + return new CreateFieldIndexCollection().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateFieldIndexCollection { + return new CreateFieldIndexCollection().fromJsonString(jsonString, options); + } + + static equals(a: CreateFieldIndexCollection | PlainMessage | undefined, b: CreateFieldIndexCollection | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateFieldIndexCollection, a, b); + } +} + +/** + * @generated from message qdrant.DeleteFieldIndexCollection + */ +export class DeleteFieldIndexCollection extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Wait until the changes have been applied? + * + * @generated from field: optional bool wait = 2; + */ + wait?: boolean; + + /** + * Field name to delete + * + * @generated from field: string field_name = 3; + */ + fieldName = ""; + + /** + * Write ordering guarantees + * + * @generated from field: optional qdrant.WriteOrdering ordering = 4; + */ + ordering?: WriteOrdering; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeleteFieldIndexCollection"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "wait", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "field_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "ordering", kind: "message", T: WriteOrdering, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteFieldIndexCollection { + return new DeleteFieldIndexCollection().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteFieldIndexCollection { + return new DeleteFieldIndexCollection().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteFieldIndexCollection { + return new DeleteFieldIndexCollection().fromJsonString(jsonString, options); + } + + static equals(a: DeleteFieldIndexCollection | PlainMessage | undefined, b: DeleteFieldIndexCollection | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteFieldIndexCollection, a, b); + } +} + +/** + * @generated from message qdrant.PayloadIncludeSelector + */ +export class PayloadIncludeSelector extends Message { + /** + * List of payload keys to include into result + * + * @generated from field: repeated string fields = 1; + */ + fields: string[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PayloadIncludeSelector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "fields", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PayloadIncludeSelector { + return new PayloadIncludeSelector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PayloadIncludeSelector { + return new PayloadIncludeSelector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PayloadIncludeSelector { + return new PayloadIncludeSelector().fromJsonString(jsonString, options); + } + + static equals(a: PayloadIncludeSelector | PlainMessage | undefined, b: PayloadIncludeSelector | PlainMessage | undefined): boolean { + return proto3.util.equals(PayloadIncludeSelector, a, b); + } +} + +/** + * @generated from message qdrant.PayloadExcludeSelector + */ +export class PayloadExcludeSelector extends Message { + /** + * List of payload keys to exclude from the result + * + * @generated from field: repeated string fields = 1; + */ + fields: string[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PayloadExcludeSelector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "fields", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PayloadExcludeSelector { + return new PayloadExcludeSelector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PayloadExcludeSelector { + return new PayloadExcludeSelector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PayloadExcludeSelector { + return new PayloadExcludeSelector().fromJsonString(jsonString, options); + } + + static equals(a: PayloadExcludeSelector | PlainMessage | undefined, b: PayloadExcludeSelector | PlainMessage | undefined): boolean { + return proto3.util.equals(PayloadExcludeSelector, a, b); + } +} + +/** + * @generated from message qdrant.WithPayloadSelector + */ +export class WithPayloadSelector extends Message { + /** + * @generated from oneof qdrant.WithPayloadSelector.selector_options + */ + selectorOptions: { + /** + * If `true` - return all payload, if `false` - none + * + * @generated from field: bool enable = 1; + */ + value: boolean; + case: "enable"; + } | { + /** + * @generated from field: qdrant.PayloadIncludeSelector include = 2; + */ + value: PayloadIncludeSelector; + case: "include"; + } | { + /** + * @generated from field: qdrant.PayloadExcludeSelector exclude = 3; + */ + value: PayloadExcludeSelector; + case: "exclude"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.WithPayloadSelector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "enable", kind: "scalar", T: 8 /* ScalarType.BOOL */, oneof: "selector_options" }, + { no: 2, name: "include", kind: "message", T: PayloadIncludeSelector, oneof: "selector_options" }, + { no: 3, name: "exclude", kind: "message", T: PayloadExcludeSelector, oneof: "selector_options" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): WithPayloadSelector { + return new WithPayloadSelector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): WithPayloadSelector { + return new WithPayloadSelector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): WithPayloadSelector { + return new WithPayloadSelector().fromJsonString(jsonString, options); + } + + static equals(a: WithPayloadSelector | PlainMessage | undefined, b: WithPayloadSelector | PlainMessage | undefined): boolean { + return proto3.util.equals(WithPayloadSelector, a, b); + } +} + +/** + * @generated from message qdrant.NamedVectors + */ +export class NamedVectors extends Message { + /** + * @generated from field: map vectors = 1; + */ + vectors: { [key: string]: Vector } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.NamedVectors"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "vectors", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Vector} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): NamedVectors { + return new NamedVectors().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): NamedVectors { + return new NamedVectors().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): NamedVectors { + return new NamedVectors().fromJsonString(jsonString, options); + } + + static equals(a: NamedVectors | PlainMessage | undefined, b: NamedVectors | PlainMessage | undefined): boolean { + return proto3.util.equals(NamedVectors, a, b); + } +} + +/** + * @generated from message qdrant.Vectors + */ +export class Vectors extends Message { + /** + * @generated from oneof qdrant.Vectors.vectors_options + */ + vectorsOptions: { + /** + * @generated from field: qdrant.Vector vector = 1; + */ + value: Vector; + case: "vector"; + } | { + /** + * @generated from field: qdrant.NamedVectors vectors = 2; + */ + value: NamedVectors; + case: "vectors"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Vectors"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "vector", kind: "message", T: Vector, oneof: "vectors_options" }, + { no: 2, name: "vectors", kind: "message", T: NamedVectors, oneof: "vectors_options" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Vectors { + return new Vectors().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Vectors { + return new Vectors().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Vectors { + return new Vectors().fromJsonString(jsonString, options); + } + + static equals(a: Vectors | PlainMessage | undefined, b: Vectors | PlainMessage | undefined): boolean { + return proto3.util.equals(Vectors, a, b); + } +} + +/** + * @generated from message qdrant.VectorsSelector + */ +export class VectorsSelector extends Message { + /** + * List of vectors to include into result + * + * @generated from field: repeated string names = 1; + */ + names: string[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.VectorsSelector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "names", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): VectorsSelector { + return new VectorsSelector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): VectorsSelector { + return new VectorsSelector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): VectorsSelector { + return new VectorsSelector().fromJsonString(jsonString, options); + } + + static equals(a: VectorsSelector | PlainMessage | undefined, b: VectorsSelector | PlainMessage | undefined): boolean { + return proto3.util.equals(VectorsSelector, a, b); + } +} + +/** + * @generated from message qdrant.WithVectorsSelector + */ +export class WithVectorsSelector extends Message { + /** + * @generated from oneof qdrant.WithVectorsSelector.selector_options + */ + selectorOptions: { + /** + * If `true` - return all vectors, if `false` - none + * + * @generated from field: bool enable = 1; + */ + value: boolean; + case: "enable"; + } | { + /** + * List of payload keys to include into result + * + * @generated from field: qdrant.VectorsSelector include = 2; + */ + value: VectorsSelector; + case: "include"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.WithVectorsSelector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "enable", kind: "scalar", T: 8 /* ScalarType.BOOL */, oneof: "selector_options" }, + { no: 2, name: "include", kind: "message", T: VectorsSelector, oneof: "selector_options" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): WithVectorsSelector { + return new WithVectorsSelector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): WithVectorsSelector { + return new WithVectorsSelector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): WithVectorsSelector { + return new WithVectorsSelector().fromJsonString(jsonString, options); + } + + static equals(a: WithVectorsSelector | PlainMessage | undefined, b: WithVectorsSelector | PlainMessage | undefined): boolean { + return proto3.util.equals(WithVectorsSelector, a, b); + } +} + +/** + * @generated from message qdrant.QuantizationSearchParams + */ +export class QuantizationSearchParams extends Message { + /** + * + * If set to true, search will ignore quantized vector data + * + * @generated from field: optional bool ignore = 1; + */ + ignore?: boolean; + + /** + * + * If true, use original vectors to re-score top-k results. Default is true. + * + * @generated from field: optional bool rescore = 2; + */ + rescore?: boolean; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.QuantizationSearchParams"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "ignore", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 2, name: "rescore", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): QuantizationSearchParams { + return new QuantizationSearchParams().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): QuantizationSearchParams { + return new QuantizationSearchParams().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): QuantizationSearchParams { + return new QuantizationSearchParams().fromJsonString(jsonString, options); + } + + static equals(a: QuantizationSearchParams | PlainMessage | undefined, b: QuantizationSearchParams | PlainMessage | undefined): boolean { + return proto3.util.equals(QuantizationSearchParams, a, b); + } +} + +/** + * @generated from message qdrant.SearchParams + */ +export class SearchParams extends Message { + /** + * + * Params relevant to HNSW index. Size of the beam in a beam-search. + * Larger the value - more accurate the result, more time required for search. + * + * @generated from field: optional uint64 hnsw_ef = 1; + */ + hnswEf?: bigint; + + /** + * + * Search without approximation. If set to true, search may run long but with exact results. + * + * @generated from field: optional bool exact = 2; + */ + exact?: boolean; + + /** + * + * If set to true, search will ignore quantized vector data + * + * @generated from field: optional qdrant.QuantizationSearchParams quantization = 3; + */ + quantization?: QuantizationSearchParams; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SearchParams"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "hnsw_ef", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 2, name: "exact", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 3, name: "quantization", kind: "message", T: QuantizationSearchParams, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchParams { + return new SearchParams().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchParams { + return new SearchParams().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchParams { + return new SearchParams().fromJsonString(jsonString, options); + } + + static equals(a: SearchParams | PlainMessage | undefined, b: SearchParams | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchParams, a, b); + } +} + +/** + * @generated from message qdrant.SearchPoints + */ +export class SearchPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * vector + * + * @generated from field: repeated float vector = 2; + */ + vector: number[] = []; + + /** + * Filter conditions - return only those points that satisfy the specified conditions + * + * @generated from field: qdrant.Filter filter = 3; + */ + filter?: Filter; + + /** + * Max number of result + * + * @generated from field: uint64 limit = 4; + */ + limit = protoInt64.zero; + + /** + * Options for specifying which payload to include or not + * + * @generated from field: qdrant.WithPayloadSelector with_payload = 6; + */ + withPayload?: WithPayloadSelector; + + /** + * Search config + * + * @generated from field: qdrant.SearchParams params = 7; + */ + params?: SearchParams; + + /** + * If provided - cut off results with worse scores + * + * @generated from field: optional float score_threshold = 8; + */ + scoreThreshold?: number; + + /** + * Offset of the result + * + * @generated from field: optional uint64 offset = 9; + */ + offset?: bigint; + + /** + * Which vector to use for search, if not specified - use default vector + * + * @generated from field: optional string vector_name = 10; + */ + vectorName?: string; + + /** + * Options for specifying which vectors to include into response + * + * @generated from field: optional qdrant.WithVectorsSelector with_vectors = 11; + */ + withVectors?: WithVectorsSelector; + + /** + * Options for specifying read consistency guarantees + * + * @generated from field: optional qdrant.ReadConsistency read_consistency = 12; + */ + readConsistency?: ReadConsistency; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SearchPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "vector", kind: "scalar", T: 2 /* ScalarType.FLOAT */, repeated: true }, + { no: 3, name: "filter", kind: "message", T: Filter }, + { no: 4, name: "limit", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 6, name: "with_payload", kind: "message", T: WithPayloadSelector }, + { no: 7, name: "params", kind: "message", T: SearchParams }, + { no: 8, name: "score_threshold", kind: "scalar", T: 2 /* ScalarType.FLOAT */, opt: true }, + { no: 9, name: "offset", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 10, name: "vector_name", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 11, name: "with_vectors", kind: "message", T: WithVectorsSelector, opt: true }, + { no: 12, name: "read_consistency", kind: "message", T: ReadConsistency, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchPoints { + return new SearchPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchPoints { + return new SearchPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchPoints { + return new SearchPoints().fromJsonString(jsonString, options); + } + + static equals(a: SearchPoints | PlainMessage | undefined, b: SearchPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchPoints, a, b); + } +} + +/** + * @generated from message qdrant.SearchBatchPoints + */ +export class SearchBatchPoints extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * @generated from field: repeated qdrant.SearchPoints search_points = 2; + */ + searchPoints: SearchPoints[] = []; + + /** + * Options for specifying read consistency guarantees + * + * @generated from field: optional qdrant.ReadConsistency read_consistency = 3; + */ + readConsistency?: ReadConsistency; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SearchBatchPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "search_points", kind: "message", T: SearchPoints, repeated: true }, + { no: 3, name: "read_consistency", kind: "message", T: ReadConsistency, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchBatchPoints { + return new SearchBatchPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchBatchPoints { + return new SearchBatchPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchBatchPoints { + return new SearchBatchPoints().fromJsonString(jsonString, options); + } + + static equals(a: SearchBatchPoints | PlainMessage | undefined, b: SearchBatchPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchBatchPoints, a, b); + } +} + +/** + * @generated from message qdrant.ScrollPoints + */ +export class ScrollPoints extends Message { + /** + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Filter conditions - return only those points that satisfy the specified conditions + * + * @generated from field: qdrant.Filter filter = 2; + */ + filter?: Filter; + + /** + * Start with this ID + * + * @generated from field: optional qdrant.PointId offset = 3; + */ + offset?: PointId; + + /** + * Max number of result + * + * @generated from field: optional uint32 limit = 4; + */ + limit?: number; + + /** + * Options for specifying which payload to include or not + * + * @generated from field: qdrant.WithPayloadSelector with_payload = 6; + */ + withPayload?: WithPayloadSelector; + + /** + * Options for specifying which vectors to include into response + * + * @generated from field: optional qdrant.WithVectorsSelector with_vectors = 7; + */ + withVectors?: WithVectorsSelector; + + /** + * Options for specifying read consistency guarantees + * + * @generated from field: optional qdrant.ReadConsistency read_consistency = 8; + */ + readConsistency?: ReadConsistency; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ScrollPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "filter", kind: "message", T: Filter }, + { no: 3, name: "offset", kind: "message", T: PointId, opt: true }, + { no: 4, name: "limit", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true }, + { no: 6, name: "with_payload", kind: "message", T: WithPayloadSelector }, + { no: 7, name: "with_vectors", kind: "message", T: WithVectorsSelector, opt: true }, + { no: 8, name: "read_consistency", kind: "message", T: ReadConsistency, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScrollPoints { + return new ScrollPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScrollPoints { + return new ScrollPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScrollPoints { + return new ScrollPoints().fromJsonString(jsonString, options); + } + + static equals(a: ScrollPoints | PlainMessage | undefined, b: ScrollPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(ScrollPoints, a, b); + } +} + +/** + * @generated from message qdrant.LookupLocation + */ +export class LookupLocation extends Message { + /** + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Which vector to use for search, if not specified - use default vector + * + * @generated from field: optional string vector_name = 2; + */ + vectorName?: string; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.LookupLocation"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "vector_name", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): LookupLocation { + return new LookupLocation().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): LookupLocation { + return new LookupLocation().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): LookupLocation { + return new LookupLocation().fromJsonString(jsonString, options); + } + + static equals(a: LookupLocation | PlainMessage | undefined, b: LookupLocation | PlainMessage | undefined): boolean { + return proto3.util.equals(LookupLocation, a, b); + } +} + +/** + * @generated from message qdrant.RecommendPoints + */ +export class RecommendPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Look for vectors closest to those + * + * @generated from field: repeated qdrant.PointId positive = 2; + */ + positive: PointId[] = []; + + /** + * Try to avoid vectors like this + * + * @generated from field: repeated qdrant.PointId negative = 3; + */ + negative: PointId[] = []; + + /** + * Filter conditions - return only those points that satisfy the specified conditions + * + * @generated from field: qdrant.Filter filter = 4; + */ + filter?: Filter; + + /** + * Max number of result + * + * @generated from field: uint64 limit = 5; + */ + limit = protoInt64.zero; + + /** + * Options for specifying which payload to include or not + * + * @generated from field: qdrant.WithPayloadSelector with_payload = 7; + */ + withPayload?: WithPayloadSelector; + + /** + * Search config + * + * @generated from field: qdrant.SearchParams params = 8; + */ + params?: SearchParams; + + /** + * If provided - cut off results with worse scores + * + * @generated from field: optional float score_threshold = 9; + */ + scoreThreshold?: number; + + /** + * Offset of the result + * + * @generated from field: optional uint64 offset = 10; + */ + offset?: bigint; + + /** + * Define which vector to use for recommendation, if not specified - default vector + * + * @generated from field: optional string using = 11; + */ + using?: string; + + /** + * Options for specifying which vectors to include into response + * + * @generated from field: optional qdrant.WithVectorsSelector with_vectors = 12; + */ + withVectors?: WithVectorsSelector; + + /** + * Name of the collection to use for points lookup, if not specified - use current collection + * + * @generated from field: optional qdrant.LookupLocation lookup_from = 13; + */ + lookupFrom?: LookupLocation; + + /** + * Options for specifying read consistency guarantees + * + * @generated from field: optional qdrant.ReadConsistency read_consistency = 14; + */ + readConsistency?: ReadConsistency; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RecommendPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "positive", kind: "message", T: PointId, repeated: true }, + { no: 3, name: "negative", kind: "message", T: PointId, repeated: true }, + { no: 4, name: "filter", kind: "message", T: Filter }, + { no: 5, name: "limit", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 7, name: "with_payload", kind: "message", T: WithPayloadSelector }, + { no: 8, name: "params", kind: "message", T: SearchParams }, + { no: 9, name: "score_threshold", kind: "scalar", T: 2 /* ScalarType.FLOAT */, opt: true }, + { no: 10, name: "offset", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 11, name: "using", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 12, name: "with_vectors", kind: "message", T: WithVectorsSelector, opt: true }, + { no: 13, name: "lookup_from", kind: "message", T: LookupLocation, opt: true }, + { no: 14, name: "read_consistency", kind: "message", T: ReadConsistency, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RecommendPoints { + return new RecommendPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RecommendPoints { + return new RecommendPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RecommendPoints { + return new RecommendPoints().fromJsonString(jsonString, options); + } + + static equals(a: RecommendPoints | PlainMessage | undefined, b: RecommendPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(RecommendPoints, a, b); + } +} + +/** + * @generated from message qdrant.RecommendBatchPoints + */ +export class RecommendBatchPoints extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * @generated from field: repeated qdrant.RecommendPoints recommend_points = 2; + */ + recommendPoints: RecommendPoints[] = []; + + /** + * Options for specifying read consistency guarantees + * + * @generated from field: optional qdrant.ReadConsistency read_consistency = 3; + */ + readConsistency?: ReadConsistency; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RecommendBatchPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "recommend_points", kind: "message", T: RecommendPoints, repeated: true }, + { no: 3, name: "read_consistency", kind: "message", T: ReadConsistency, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RecommendBatchPoints { + return new RecommendBatchPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RecommendBatchPoints { + return new RecommendBatchPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RecommendBatchPoints { + return new RecommendBatchPoints().fromJsonString(jsonString, options); + } + + static equals(a: RecommendBatchPoints | PlainMessage | undefined, b: RecommendBatchPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(RecommendBatchPoints, a, b); + } +} + +/** + * @generated from message qdrant.CountPoints + */ +export class CountPoints extends Message { + /** + * name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Filter conditions - return only those points that satisfy the specified conditions + * + * @generated from field: qdrant.Filter filter = 2; + */ + filter?: Filter; + + /** + * If `true` - return exact count, if `false` - return approximate count + * + * @generated from field: optional bool exact = 3; + */ + exact?: boolean; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CountPoints"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "filter", kind: "message", T: Filter }, + { no: 3, name: "exact", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CountPoints { + return new CountPoints().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CountPoints { + return new CountPoints().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CountPoints { + return new CountPoints().fromJsonString(jsonString, options); + } + + static equals(a: CountPoints | PlainMessage | undefined, b: CountPoints | PlainMessage | undefined): boolean { + return proto3.util.equals(CountPoints, a, b); + } +} + +/** + * @generated from message qdrant.PointsOperationResponse + */ +export class PointsOperationResponse extends Message { + /** + * @generated from field: qdrant.UpdateResult result = 1; + */ + result?: UpdateResult; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PointsOperationResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: UpdateResult }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PointsOperationResponse { + return new PointsOperationResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PointsOperationResponse { + return new PointsOperationResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PointsOperationResponse { + return new PointsOperationResponse().fromJsonString(jsonString, options); + } + + static equals(a: PointsOperationResponse | PlainMessage | undefined, b: PointsOperationResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(PointsOperationResponse, a, b); + } +} + +/** + * @generated from message qdrant.UpdateResult + */ +export class UpdateResult extends Message { + /** + * Number of operation + * + * @generated from field: uint64 operation_id = 1; + */ + operationId = protoInt64.zero; + + /** + * Operation status + * + * @generated from field: qdrant.UpdateStatus status = 2; + */ + status = UpdateStatus.UnknownUpdateStatus; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.UpdateResult"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "operation_id", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 2, name: "status", kind: "enum", T: proto3.getEnumType(UpdateStatus) }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpdateResult { + return new UpdateResult().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpdateResult { + return new UpdateResult().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpdateResult { + return new UpdateResult().fromJsonString(jsonString, options); + } + + static equals(a: UpdateResult | PlainMessage | undefined, b: UpdateResult | PlainMessage | undefined): boolean { + return proto3.util.equals(UpdateResult, a, b); + } +} + +/** + * @generated from message qdrant.ScoredPoint + */ +export class ScoredPoint extends Message { + /** + * Point id + * + * @generated from field: qdrant.PointId id = 1; + */ + id?: PointId; + + /** + * Payload + * + * @generated from field: map payload = 2; + */ + payload: { [key: string]: Value } = {}; + + /** + * Similarity score + * + * @generated from field: float score = 3; + */ + score = 0; + + /** + * Last update operation applied to this point + * + * @generated from field: uint64 version = 5; + */ + version = protoInt64.zero; + + /** + * Vectors to search + * + * @generated from field: optional qdrant.Vectors vectors = 6; + */ + vectors?: Vectors; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ScoredPoint"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "message", T: PointId }, + { no: 2, name: "payload", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + { no: 3, name: "score", kind: "scalar", T: 2 /* ScalarType.FLOAT */ }, + { no: 5, name: "version", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + { no: 6, name: "vectors", kind: "message", T: Vectors, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScoredPoint { + return new ScoredPoint().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScoredPoint { + return new ScoredPoint().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScoredPoint { + return new ScoredPoint().fromJsonString(jsonString, options); + } + + static equals(a: ScoredPoint | PlainMessage | undefined, b: ScoredPoint | PlainMessage | undefined): boolean { + return proto3.util.equals(ScoredPoint, a, b); + } +} + +/** + * @generated from message qdrant.SearchResponse + */ +export class SearchResponse extends Message { + /** + * @generated from field: repeated qdrant.ScoredPoint result = 1; + */ + result: ScoredPoint[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SearchResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchResponse { + return new SearchResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchResponse { + return new SearchResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchResponse { + return new SearchResponse().fromJsonString(jsonString, options); + } + + static equals(a: SearchResponse | PlainMessage | undefined, b: SearchResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchResponse, a, b); + } +} + +/** + * @generated from message qdrant.BatchResult + */ +export class BatchResult extends Message { + /** + * @generated from field: repeated qdrant.ScoredPoint result = 1; + */ + result: ScoredPoint[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.BatchResult"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): BatchResult { + return new BatchResult().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): BatchResult { + return new BatchResult().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): BatchResult { + return new BatchResult().fromJsonString(jsonString, options); + } + + static equals(a: BatchResult | PlainMessage | undefined, b: BatchResult | PlainMessage | undefined): boolean { + return proto3.util.equals(BatchResult, a, b); + } +} + +/** + * @generated from message qdrant.SearchBatchResponse + */ +export class SearchBatchResponse extends Message { + /** + * @generated from field: repeated qdrant.BatchResult result = 1; + */ + result: BatchResult[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SearchBatchResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: BatchResult, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SearchBatchResponse { + return new SearchBatchResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SearchBatchResponse { + return new SearchBatchResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SearchBatchResponse { + return new SearchBatchResponse().fromJsonString(jsonString, options); + } + + static equals(a: SearchBatchResponse | PlainMessage | undefined, b: SearchBatchResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(SearchBatchResponse, a, b); + } +} + +/** + * @generated from message qdrant.CountResponse + */ +export class CountResponse extends Message { + /** + * @generated from field: qdrant.CountResult result = 1; + */ + result?: CountResult; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CountResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: CountResult }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CountResponse { + return new CountResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CountResponse { + return new CountResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CountResponse { + return new CountResponse().fromJsonString(jsonString, options); + } + + static equals(a: CountResponse | PlainMessage | undefined, b: CountResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(CountResponse, a, b); + } +} + +/** + * @generated from message qdrant.ScrollResponse + */ +export class ScrollResponse extends Message { + /** + * Use this offset for the next query + * + * @generated from field: optional qdrant.PointId next_page_offset = 1; + */ + nextPageOffset?: PointId; + + /** + * @generated from field: repeated qdrant.RetrievedPoint result = 2; + */ + result: RetrievedPoint[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 3; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ScrollResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "next_page_offset", kind: "message", T: PointId, opt: true }, + { no: 2, name: "result", kind: "message", T: RetrievedPoint, repeated: true }, + { no: 3, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ScrollResponse { + return new ScrollResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ScrollResponse { + return new ScrollResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ScrollResponse { + return new ScrollResponse().fromJsonString(jsonString, options); + } + + static equals(a: ScrollResponse | PlainMessage | undefined, b: ScrollResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ScrollResponse, a, b); + } +} + +/** + * @generated from message qdrant.CountResult + */ +export class CountResult extends Message { + /** + * @generated from field: uint64 count = 1; + */ + count = protoInt64.zero; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CountResult"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "count", kind: "scalar", T: 4 /* ScalarType.UINT64 */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CountResult { + return new CountResult().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CountResult { + return new CountResult().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CountResult { + return new CountResult().fromJsonString(jsonString, options); + } + + static equals(a: CountResult | PlainMessage | undefined, b: CountResult | PlainMessage | undefined): boolean { + return proto3.util.equals(CountResult, a, b); + } +} + +/** + * @generated from message qdrant.RetrievedPoint + */ +export class RetrievedPoint extends Message { + /** + * @generated from field: qdrant.PointId id = 1; + */ + id?: PointId; + + /** + * @generated from field: map payload = 2; + */ + payload: { [key: string]: Value } = {}; + + /** + * @generated from field: optional qdrant.Vectors vectors = 4; + */ + vectors?: Vectors; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RetrievedPoint"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "message", T: PointId }, + { no: 2, name: "payload", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + { no: 4, name: "vectors", kind: "message", T: Vectors, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RetrievedPoint { + return new RetrievedPoint().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RetrievedPoint { + return new RetrievedPoint().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RetrievedPoint { + return new RetrievedPoint().fromJsonString(jsonString, options); + } + + static equals(a: RetrievedPoint | PlainMessage | undefined, b: RetrievedPoint | PlainMessage | undefined): boolean { + return proto3.util.equals(RetrievedPoint, a, b); + } +} + +/** + * @generated from message qdrant.GetResponse + */ +export class GetResponse extends Message { + /** + * @generated from field: repeated qdrant.RetrievedPoint result = 1; + */ + result: RetrievedPoint[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GetResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: RetrievedPoint, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetResponse { + return new GetResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetResponse { + return new GetResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetResponse { + return new GetResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetResponse | PlainMessage | undefined, b: GetResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetResponse, a, b); + } +} + +/** + * @generated from message qdrant.RecommendResponse + */ +export class RecommendResponse extends Message { + /** + * @generated from field: repeated qdrant.ScoredPoint result = 1; + */ + result: ScoredPoint[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RecommendResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: ScoredPoint, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RecommendResponse { + return new RecommendResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RecommendResponse { + return new RecommendResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RecommendResponse { + return new RecommendResponse().fromJsonString(jsonString, options); + } + + static equals(a: RecommendResponse | PlainMessage | undefined, b: RecommendResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(RecommendResponse, a, b); + } +} + +/** + * @generated from message qdrant.RecommendBatchResponse + */ +export class RecommendBatchResponse extends Message { + /** + * @generated from field: repeated qdrant.BatchResult result = 1; + */ + result: BatchResult[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RecommendBatchResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "result", kind: "message", T: BatchResult, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RecommendBatchResponse { + return new RecommendBatchResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RecommendBatchResponse { + return new RecommendBatchResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RecommendBatchResponse { + return new RecommendBatchResponse().fromJsonString(jsonString, options); + } + + static equals(a: RecommendBatchResponse | PlainMessage | undefined, b: RecommendBatchResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(RecommendBatchResponse, a, b); + } +} + +/** + * @generated from message qdrant.Filter + */ +export class Filter extends Message { + /** + * At least one of those conditions should match + * + * @generated from field: repeated qdrant.Condition should = 1; + */ + should: Condition[] = []; + + /** + * All conditions must match + * + * @generated from field: repeated qdrant.Condition must = 2; + */ + must: Condition[] = []; + + /** + * All conditions must NOT match + * + * @generated from field: repeated qdrant.Condition must_not = 3; + */ + mustNot: Condition[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Filter"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "should", kind: "message", T: Condition, repeated: true }, + { no: 2, name: "must", kind: "message", T: Condition, repeated: true }, + { no: 3, name: "must_not", kind: "message", T: Condition, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Filter { + return new Filter().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Filter { + return new Filter().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Filter { + return new Filter().fromJsonString(jsonString, options); + } + + static equals(a: Filter | PlainMessage | undefined, b: Filter | PlainMessage | undefined): boolean { + return proto3.util.equals(Filter, a, b); + } +} + +/** + * @generated from message qdrant.Condition + */ +export class Condition extends Message { + /** + * @generated from oneof qdrant.Condition.condition_one_of + */ + conditionOneOf: { + /** + * @generated from field: qdrant.FieldCondition field = 1; + */ + value: FieldCondition; + case: "field"; + } | { + /** + * @generated from field: qdrant.IsEmptyCondition is_empty = 2; + */ + value: IsEmptyCondition; + case: "isEmpty"; + } | { + /** + * @generated from field: qdrant.HasIdCondition has_id = 3; + */ + value: HasIdCondition; + case: "hasId"; + } | { + /** + * @generated from field: qdrant.Filter filter = 4; + */ + value: Filter; + case: "filter"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Condition"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "field", kind: "message", T: FieldCondition, oneof: "condition_one_of" }, + { no: 2, name: "is_empty", kind: "message", T: IsEmptyCondition, oneof: "condition_one_of" }, + { no: 3, name: "has_id", kind: "message", T: HasIdCondition, oneof: "condition_one_of" }, + { no: 4, name: "filter", kind: "message", T: Filter, oneof: "condition_one_of" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Condition { + return new Condition().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Condition { + return new Condition().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Condition { + return new Condition().fromJsonString(jsonString, options); + } + + static equals(a: Condition | PlainMessage | undefined, b: Condition | PlainMessage | undefined): boolean { + return proto3.util.equals(Condition, a, b); + } +} + +/** + * @generated from message qdrant.IsEmptyCondition + */ +export class IsEmptyCondition extends Message { + /** + * @generated from field: string key = 1; + */ + key = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.IsEmptyCondition"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): IsEmptyCondition { + return new IsEmptyCondition().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): IsEmptyCondition { + return new IsEmptyCondition().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): IsEmptyCondition { + return new IsEmptyCondition().fromJsonString(jsonString, options); + } + + static equals(a: IsEmptyCondition | PlainMessage | undefined, b: IsEmptyCondition | PlainMessage | undefined): boolean { + return proto3.util.equals(IsEmptyCondition, a, b); + } +} + +/** + * @generated from message qdrant.HasIdCondition + */ +export class HasIdCondition extends Message { + /** + * @generated from field: repeated qdrant.PointId has_id = 1; + */ + hasId: PointId[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.HasIdCondition"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "has_id", kind: "message", T: PointId, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): HasIdCondition { + return new HasIdCondition().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): HasIdCondition { + return new HasIdCondition().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): HasIdCondition { + return new HasIdCondition().fromJsonString(jsonString, options); + } + + static equals(a: HasIdCondition | PlainMessage | undefined, b: HasIdCondition | PlainMessage | undefined): boolean { + return proto3.util.equals(HasIdCondition, a, b); + } +} + +/** + * @generated from message qdrant.FieldCondition + */ +export class FieldCondition extends Message { + /** + * @generated from field: string key = 1; + */ + key = ""; + + /** + * Check if point has field with a given value + * + * @generated from field: qdrant.Match match = 2; + */ + match?: Match; + + /** + * Check if points value lies in a given range + * + * @generated from field: qdrant.Range range = 3; + */ + range?: Range; + + /** + * Check if points geo location lies in a given area + * + * @generated from field: qdrant.GeoBoundingBox geo_bounding_box = 4; + */ + geoBoundingBox?: GeoBoundingBox; + + /** + * Check if geo point is within a given radius + * + * @generated from field: qdrant.GeoRadius geo_radius = 5; + */ + geoRadius?: GeoRadius; + + /** + * Check number of values for a specific field + * + * @generated from field: qdrant.ValuesCount values_count = 6; + */ + valuesCount?: ValuesCount; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.FieldCondition"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "match", kind: "message", T: Match }, + { no: 3, name: "range", kind: "message", T: Range }, + { no: 4, name: "geo_bounding_box", kind: "message", T: GeoBoundingBox }, + { no: 5, name: "geo_radius", kind: "message", T: GeoRadius }, + { no: 6, name: "values_count", kind: "message", T: ValuesCount }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): FieldCondition { + return new FieldCondition().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): FieldCondition { + return new FieldCondition().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): FieldCondition { + return new FieldCondition().fromJsonString(jsonString, options); + } + + static equals(a: FieldCondition | PlainMessage | undefined, b: FieldCondition | PlainMessage | undefined): boolean { + return proto3.util.equals(FieldCondition, a, b); + } +} + +/** + * @generated from message qdrant.Match + */ +export class Match extends Message { + /** + * @generated from oneof qdrant.Match.match_value + */ + matchValue: { + /** + * Match string keyword + * + * @generated from field: string keyword = 1; + */ + value: string; + case: "keyword"; + } | { + /** + * Match integer + * + * @generated from field: int64 integer = 2; + */ + value: bigint; + case: "integer"; + } | { + /** + * Match boolean + * + * @generated from field: bool boolean = 3; + */ + value: boolean; + case: "boolean"; + } | { + /** + * Match text + * + * @generated from field: string text = 4; + */ + value: string; + case: "text"; + } | { + /** + * Match multiple keywords + * + * @generated from field: qdrant.RepeatedStrings keywords = 5; + */ + value: RepeatedStrings; + case: "keywords"; + } | { + /** + * Match multiple integers + * + * @generated from field: qdrant.RepeatedIntegers integers = 6; + */ + value: RepeatedIntegers; + case: "integers"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Match"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "keyword", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "match_value" }, + { no: 2, name: "integer", kind: "scalar", T: 3 /* ScalarType.INT64 */, oneof: "match_value" }, + { no: 3, name: "boolean", kind: "scalar", T: 8 /* ScalarType.BOOL */, oneof: "match_value" }, + { no: 4, name: "text", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "match_value" }, + { no: 5, name: "keywords", kind: "message", T: RepeatedStrings, oneof: "match_value" }, + { no: 6, name: "integers", kind: "message", T: RepeatedIntegers, oneof: "match_value" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Match { + return new Match().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Match { + return new Match().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Match { + return new Match().fromJsonString(jsonString, options); + } + + static equals(a: Match | PlainMessage | undefined, b: Match | PlainMessage | undefined): boolean { + return proto3.util.equals(Match, a, b); + } +} + +/** + * @generated from message qdrant.RepeatedStrings + */ +export class RepeatedStrings extends Message { + /** + * @generated from field: repeated string strings = 1; + */ + strings: string[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RepeatedStrings"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "strings", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RepeatedStrings { + return new RepeatedStrings().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RepeatedStrings { + return new RepeatedStrings().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RepeatedStrings { + return new RepeatedStrings().fromJsonString(jsonString, options); + } + + static equals(a: RepeatedStrings | PlainMessage | undefined, b: RepeatedStrings | PlainMessage | undefined): boolean { + return proto3.util.equals(RepeatedStrings, a, b); + } +} + +/** + * @generated from message qdrant.RepeatedIntegers + */ +export class RepeatedIntegers extends Message { + /** + * @generated from field: repeated int64 integers = 1; + */ + integers: bigint[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.RepeatedIntegers"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "integers", kind: "scalar", T: 3 /* ScalarType.INT64 */, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RepeatedIntegers { + return new RepeatedIntegers().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RepeatedIntegers { + return new RepeatedIntegers().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RepeatedIntegers { + return new RepeatedIntegers().fromJsonString(jsonString, options); + } + + static equals(a: RepeatedIntegers | PlainMessage | undefined, b: RepeatedIntegers | PlainMessage | undefined): boolean { + return proto3.util.equals(RepeatedIntegers, a, b); + } +} + +/** + * @generated from message qdrant.Range + */ +export class Range extends Message { + /** + * @generated from field: optional double lt = 1; + */ + lt?: number; + + /** + * @generated from field: optional double gt = 2; + */ + gt?: number; + + /** + * @generated from field: optional double gte = 3; + */ + gte?: number; + + /** + * @generated from field: optional double lte = 4; + */ + lte?: number; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.Range"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "lt", kind: "scalar", T: 1 /* ScalarType.DOUBLE */, opt: true }, + { no: 2, name: "gt", kind: "scalar", T: 1 /* ScalarType.DOUBLE */, opt: true }, + { no: 3, name: "gte", kind: "scalar", T: 1 /* ScalarType.DOUBLE */, opt: true }, + { no: 4, name: "lte", kind: "scalar", T: 1 /* ScalarType.DOUBLE */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Range { + return new Range().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Range { + return new Range().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Range { + return new Range().fromJsonString(jsonString, options); + } + + static equals(a: Range | PlainMessage | undefined, b: Range | PlainMessage | undefined): boolean { + return proto3.util.equals(Range, a, b); + } +} + +/** + * @generated from message qdrant.GeoBoundingBox + */ +export class GeoBoundingBox extends Message { + /** + * north-west corner + * + * @generated from field: qdrant.GeoPoint top_left = 1; + */ + topLeft?: GeoPoint; + + /** + * south-east corner + * + * @generated from field: qdrant.GeoPoint bottom_right = 2; + */ + bottomRight?: GeoPoint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GeoBoundingBox"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "top_left", kind: "message", T: GeoPoint }, + { no: 2, name: "bottom_right", kind: "message", T: GeoPoint }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GeoBoundingBox { + return new GeoBoundingBox().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GeoBoundingBox { + return new GeoBoundingBox().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GeoBoundingBox { + return new GeoBoundingBox().fromJsonString(jsonString, options); + } + + static equals(a: GeoBoundingBox | PlainMessage | undefined, b: GeoBoundingBox | PlainMessage | undefined): boolean { + return proto3.util.equals(GeoBoundingBox, a, b); + } +} + +/** + * @generated from message qdrant.GeoRadius + */ +export class GeoRadius extends Message { + /** + * Center of the circle + * + * @generated from field: qdrant.GeoPoint center = 1; + */ + center?: GeoPoint; + + /** + * In meters + * + * @generated from field: float radius = 2; + */ + radius = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GeoRadius"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "center", kind: "message", T: GeoPoint }, + { no: 2, name: "radius", kind: "scalar", T: 2 /* ScalarType.FLOAT */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GeoRadius { + return new GeoRadius().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GeoRadius { + return new GeoRadius().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GeoRadius { + return new GeoRadius().fromJsonString(jsonString, options); + } + + static equals(a: GeoRadius | PlainMessage | undefined, b: GeoRadius | PlainMessage | undefined): boolean { + return proto3.util.equals(GeoRadius, a, b); + } +} + +/** + * @generated from message qdrant.ValuesCount + */ +export class ValuesCount extends Message { + /** + * @generated from field: optional uint64 lt = 1; + */ + lt?: bigint; + + /** + * @generated from field: optional uint64 gt = 2; + */ + gt?: bigint; + + /** + * @generated from field: optional uint64 gte = 3; + */ + gte?: bigint; + + /** + * @generated from field: optional uint64 lte = 4; + */ + lte?: bigint; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ValuesCount"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "lt", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 2, name: "gt", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 3, name: "gte", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + { no: 4, name: "lte", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ValuesCount { + return new ValuesCount().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ValuesCount { + return new ValuesCount().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ValuesCount { + return new ValuesCount().fromJsonString(jsonString, options); + } + + static equals(a: ValuesCount | PlainMessage | undefined, b: ValuesCount | PlainMessage | undefined): boolean { + return proto3.util.equals(ValuesCount, a, b); + } +} + +/** + * @generated from message qdrant.PointsSelector + */ +export class PointsSelector extends Message { + /** + * @generated from oneof qdrant.PointsSelector.points_selector_one_of + */ + pointsSelectorOneOf: { + /** + * @generated from field: qdrant.PointsIdsList points = 1; + */ + value: PointsIdsList; + case: "points"; + } | { + /** + * @generated from field: qdrant.Filter filter = 2; + */ + value: Filter; + case: "filter"; + } | { case: undefined; value?: undefined } = { case: undefined }; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PointsSelector"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "points", kind: "message", T: PointsIdsList, oneof: "points_selector_one_of" }, + { no: 2, name: "filter", kind: "message", T: Filter, oneof: "points_selector_one_of" }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PointsSelector { + return new PointsSelector().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PointsSelector { + return new PointsSelector().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PointsSelector { + return new PointsSelector().fromJsonString(jsonString, options); + } + + static equals(a: PointsSelector | PlainMessage | undefined, b: PointsSelector | PlainMessage | undefined): boolean { + return proto3.util.equals(PointsSelector, a, b); + } +} + +/** + * @generated from message qdrant.PointsIdsList + */ +export class PointsIdsList extends Message { + /** + * @generated from field: repeated qdrant.PointId ids = 1; + */ + ids: PointId[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PointsIdsList"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "ids", kind: "message", T: PointId, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PointsIdsList { + return new PointsIdsList().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PointsIdsList { + return new PointsIdsList().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PointsIdsList { + return new PointsIdsList().fromJsonString(jsonString, options); + } + + static equals(a: PointsIdsList | PlainMessage | undefined, b: PointsIdsList | PlainMessage | undefined): boolean { + return proto3.util.equals(PointsIdsList, a, b); + } +} + +/** + * @generated from message qdrant.PointStruct + */ +export class PointStruct extends Message { + /** + * @generated from field: qdrant.PointId id = 1; + */ + id?: PointId; + + /** + * @generated from field: map payload = 3; + */ + payload: { [key: string]: Value } = {}; + + /** + * @generated from field: optional qdrant.Vectors vectors = 4; + */ + vectors?: Vectors; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.PointStruct"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "message", T: PointId }, + { no: 3, name: "payload", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: Value} }, + { no: 4, name: "vectors", kind: "message", T: Vectors, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): PointStruct { + return new PointStruct().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): PointStruct { + return new PointStruct().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): PointStruct { + return new PointStruct().fromJsonString(jsonString, options); + } + + static equals(a: PointStruct | PlainMessage | undefined, b: PointStruct | PlainMessage | undefined): boolean { + return proto3.util.equals(PointStruct, a, b); + } +} + +/** + * @generated from message qdrant.GeoPoint + */ +export class GeoPoint extends Message { + /** + * @generated from field: double lon = 1; + */ + lon = 0; + + /** + * @generated from field: double lat = 2; + */ + lat = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.GeoPoint"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "lon", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + { no: 2, name: "lat", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GeoPoint { + return new GeoPoint().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GeoPoint { + return new GeoPoint().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GeoPoint { + return new GeoPoint().fromJsonString(jsonString, options); + } + + static equals(a: GeoPoint | PlainMessage | undefined, b: GeoPoint | PlainMessage | undefined): boolean { + return proto3.util.equals(GeoPoint, a, b); + } +} + diff --git a/packages/js-client-grpc/src/proto/points_service_connect.ts b/packages/js-client-grpc/src/proto/points_service_connect.ts new file mode 100644 index 0000000..93a39ae --- /dev/null +++ b/packages/js-client-grpc/src/proto/points_service_connect.ts @@ -0,0 +1,197 @@ +// @generated by protoc-gen-connect-es v0.8.4 with parameter "target=ts" +// @generated from file points_service.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { ClearPayloadPoints, CountPoints, CountResponse, CreateFieldIndexCollection, DeleteFieldIndexCollection, DeletePayloadPoints, DeletePoints, GetPoints, GetResponse, PointsOperationResponse, RecommendBatchPoints, RecommendBatchResponse, RecommendPoints, RecommendResponse, ScrollPoints, ScrollResponse, SearchBatchPoints, SearchBatchResponse, SearchPoints, SearchResponse, SetPayloadPoints, UpsertPoints } from "./points_pb.js"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * @generated from service qdrant.Points + */ +export const Points = { + typeName: "qdrant.Points", + methods: { + /** + * + * Perform insert + updates on points. If point with given ID already exists - it will be overwritten. + * + * @generated from rpc qdrant.Points.Upsert + */ + upsert: { + name: "Upsert", + I: UpsertPoints, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Delete points + * + * @generated from rpc qdrant.Points.Delete + */ + delete: { + name: "Delete", + I: DeletePoints, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Retrieve points + * + * @generated from rpc qdrant.Points.Get + */ + get: { + name: "Get", + I: GetPoints, + O: GetResponse, + kind: MethodKind.Unary, + }, + /** + * + * Set payload for points + * + * @generated from rpc qdrant.Points.SetPayload + */ + setPayload: { + name: "SetPayload", + I: SetPayloadPoints, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Overwrite payload for points + * + * @generated from rpc qdrant.Points.OverwritePayload + */ + overwritePayload: { + name: "OverwritePayload", + I: SetPayloadPoints, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Delete specified key payload for points + * + * @generated from rpc qdrant.Points.DeletePayload + */ + deletePayload: { + name: "DeletePayload", + I: DeletePayloadPoints, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Remove all payload for specified points + * + * @generated from rpc qdrant.Points.ClearPayload + */ + clearPayload: { + name: "ClearPayload", + I: ClearPayloadPoints, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Create index for field in collection + * + * @generated from rpc qdrant.Points.CreateFieldIndex + */ + createFieldIndex: { + name: "CreateFieldIndex", + I: CreateFieldIndexCollection, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Delete field index for collection + * + * @generated from rpc qdrant.Points.DeleteFieldIndex + */ + deleteFieldIndex: { + name: "DeleteFieldIndex", + I: DeleteFieldIndexCollection, + O: PointsOperationResponse, + kind: MethodKind.Unary, + }, + /** + * + * Retrieve closest points based on vector similarity and given filtering conditions + * + * @generated from rpc qdrant.Points.Search + */ + search: { + name: "Search", + I: SearchPoints, + O: SearchResponse, + kind: MethodKind.Unary, + }, + /** + * + * Retrieve closest points based on vector similarity and given filtering conditions + * + * @generated from rpc qdrant.Points.SearchBatch + */ + searchBatch: { + name: "SearchBatch", + I: SearchBatchPoints, + O: SearchBatchResponse, + kind: MethodKind.Unary, + }, + /** + * + * Iterate over all or filtered points points + * + * @generated from rpc qdrant.Points.Scroll + */ + scroll: { + name: "Scroll", + I: ScrollPoints, + O: ScrollResponse, + kind: MethodKind.Unary, + }, + /** + * + * Look for the points which are closer to stored positive examples and at the same time further to negative examples. + * + * @generated from rpc qdrant.Points.Recommend + */ + recommend: { + name: "Recommend", + I: RecommendPoints, + O: RecommendResponse, + kind: MethodKind.Unary, + }, + /** + * + * Look for the points which are closer to stored positive examples and at the same time further to negative examples. + * + * @generated from rpc qdrant.Points.RecommendBatch + */ + recommendBatch: { + name: "RecommendBatch", + I: RecommendBatchPoints, + O: RecommendBatchResponse, + kind: MethodKind.Unary, + }, + /** + * + * Count points in collection with given filtering conditions + * + * @generated from rpc qdrant.Points.Count + */ + count: { + name: "Count", + I: CountPoints, + O: CountResponse, + kind: MethodKind.Unary, + }, + } +} as const; + diff --git a/packages/js-client-grpc/src/proto/qdrant_connect.ts b/packages/js-client-grpc/src/proto/qdrant_connect.ts new file mode 100644 index 0000000..d90317c --- /dev/null +++ b/packages/js-client-grpc/src/proto/qdrant_connect.ts @@ -0,0 +1,26 @@ +// @generated by protoc-gen-connect-es v0.8.4 with parameter "target=ts" +// @generated from file qdrant.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { HealthCheckReply, HealthCheckRequest } from "./qdrant_pb.js"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * @generated from service qdrant.Qdrant + */ +export const Qdrant = { + typeName: "qdrant.Qdrant", + methods: { + /** + * @generated from rpc qdrant.Qdrant.HealthCheck + */ + healthCheck: { + name: "HealthCheck", + I: HealthCheckRequest, + O: HealthCheckReply, + kind: MethodKind.Unary, + }, + } +} as const; + diff --git a/packages/js-client-grpc/src/proto/qdrant_pb.ts b/packages/js-client-grpc/src/proto/qdrant_pb.ts new file mode 100644 index 0000000..f45b86b --- /dev/null +++ b/packages/js-client-grpc/src/proto/qdrant_pb.ts @@ -0,0 +1,82 @@ +// @generated by protoc-gen-es v1.2.0 with parameter "target=ts" +// @generated from file qdrant.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3 } from "@bufbuild/protobuf"; + +/** + * @generated from message qdrant.HealthCheckRequest + */ +export class HealthCheckRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.HealthCheckRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): HealthCheckRequest { + return new HealthCheckRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): HealthCheckRequest { + return new HealthCheckRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): HealthCheckRequest { + return new HealthCheckRequest().fromJsonString(jsonString, options); + } + + static equals(a: HealthCheckRequest | PlainMessage | undefined, b: HealthCheckRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(HealthCheckRequest, a, b); + } +} + +/** + * @generated from message qdrant.HealthCheckReply + */ +export class HealthCheckReply extends Message { + /** + * @generated from field: string title = 1; + */ + title = ""; + + /** + * @generated from field: string version = 2; + */ + version = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.HealthCheckReply"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "title", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "version", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): HealthCheckReply { + return new HealthCheckReply().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): HealthCheckReply { + return new HealthCheckReply().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): HealthCheckReply { + return new HealthCheckReply().fromJsonString(jsonString, options); + } + + static equals(a: HealthCheckReply | PlainMessage | undefined, b: HealthCheckReply | PlainMessage | undefined): boolean { + return proto3.util.equals(HealthCheckReply, a, b); + } +} + diff --git a/packages/js-client-grpc/src/proto/snapshots_service_connect.ts b/packages/js-client-grpc/src/proto/snapshots_service_connect.ts new file mode 100644 index 0000000..50c81ad --- /dev/null +++ b/packages/js-client-grpc/src/proto/snapshots_service_connect.ts @@ -0,0 +1,89 @@ +// @generated by protoc-gen-connect-es v0.8.4 with parameter "target=ts" +// @generated from file snapshots_service.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { CreateFullSnapshotRequest, CreateSnapshotRequest, CreateSnapshotResponse, DeleteFullSnapshotRequest, DeleteSnapshotRequest, DeleteSnapshotResponse, ListFullSnapshotsRequest, ListSnapshotsRequest, ListSnapshotsResponse } from "./snapshots_service_pb.js"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * @generated from service qdrant.Snapshots + */ +export const Snapshots = { + typeName: "qdrant.Snapshots", + methods: { + /** + * + * Create collection snapshot + * + * @generated from rpc qdrant.Snapshots.Create + */ + create: { + name: "Create", + I: CreateSnapshotRequest, + O: CreateSnapshotResponse, + kind: MethodKind.Unary, + }, + /** + * + * List collection snapshots + * + * @generated from rpc qdrant.Snapshots.List + */ + list: { + name: "List", + I: ListSnapshotsRequest, + O: ListSnapshotsResponse, + kind: MethodKind.Unary, + }, + /** + * + * Delete collection snapshots + * + * @generated from rpc qdrant.Snapshots.Delete + */ + delete: { + name: "Delete", + I: DeleteSnapshotRequest, + O: DeleteSnapshotResponse, + kind: MethodKind.Unary, + }, + /** + * + * Create full storage snapshot + * + * @generated from rpc qdrant.Snapshots.CreateFull + */ + createFull: { + name: "CreateFull", + I: CreateFullSnapshotRequest, + O: CreateSnapshotResponse, + kind: MethodKind.Unary, + }, + /** + * + * List full storage snapshots + * + * @generated from rpc qdrant.Snapshots.ListFull + */ + listFull: { + name: "ListFull", + I: ListFullSnapshotsRequest, + O: ListSnapshotsResponse, + kind: MethodKind.Unary, + }, + /** + * + * List full storage snapshots + * + * @generated from rpc qdrant.Snapshots.DeleteFull + */ + deleteFull: { + name: "DeleteFull", + I: DeleteFullSnapshotRequest, + O: DeleteSnapshotResponse, + kind: MethodKind.Unary, + }, + } +} as const; + diff --git a/packages/js-client-grpc/src/proto/snapshots_service_pb.ts b/packages/js-client-grpc/src/proto/snapshots_service_pb.ts new file mode 100644 index 0000000..f46248e --- /dev/null +++ b/packages/js-client-grpc/src/proto/snapshots_service_pb.ts @@ -0,0 +1,418 @@ +// @generated by protoc-gen-es v1.2.0 with parameter "target=ts" +// @generated from file snapshots_service.proto (package qdrant, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf"; + +/** + * @generated from message qdrant.CreateFullSnapshotRequest + */ +export class CreateFullSnapshotRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CreateFullSnapshotRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateFullSnapshotRequest { + return new CreateFullSnapshotRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateFullSnapshotRequest { + return new CreateFullSnapshotRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateFullSnapshotRequest { + return new CreateFullSnapshotRequest().fromJsonString(jsonString, options); + } + + static equals(a: CreateFullSnapshotRequest | PlainMessage | undefined, b: CreateFullSnapshotRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateFullSnapshotRequest, a, b); + } +} + +/** + * @generated from message qdrant.ListFullSnapshotsRequest + */ +export class ListFullSnapshotsRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListFullSnapshotsRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListFullSnapshotsRequest { + return new ListFullSnapshotsRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListFullSnapshotsRequest { + return new ListFullSnapshotsRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListFullSnapshotsRequest { + return new ListFullSnapshotsRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListFullSnapshotsRequest | PlainMessage | undefined, b: ListFullSnapshotsRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListFullSnapshotsRequest, a, b); + } +} + +/** + * @generated from message qdrant.DeleteFullSnapshotRequest + */ +export class DeleteFullSnapshotRequest extends Message { + /** + * Name of the full snapshot + * + * @generated from field: string snapshot_name = 1; + */ + snapshotName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeleteFullSnapshotRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "snapshot_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteFullSnapshotRequest { + return new DeleteFullSnapshotRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteFullSnapshotRequest { + return new DeleteFullSnapshotRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteFullSnapshotRequest { + return new DeleteFullSnapshotRequest().fromJsonString(jsonString, options); + } + + static equals(a: DeleteFullSnapshotRequest | PlainMessage | undefined, b: DeleteFullSnapshotRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteFullSnapshotRequest, a, b); + } +} + +/** + * @generated from message qdrant.CreateSnapshotRequest + */ +export class CreateSnapshotRequest extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CreateSnapshotRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateSnapshotRequest { + return new CreateSnapshotRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateSnapshotRequest { + return new CreateSnapshotRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateSnapshotRequest { + return new CreateSnapshotRequest().fromJsonString(jsonString, options); + } + + static equals(a: CreateSnapshotRequest | PlainMessage | undefined, b: CreateSnapshotRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateSnapshotRequest, a, b); + } +} + +/** + * @generated from message qdrant.ListSnapshotsRequest + */ +export class ListSnapshotsRequest extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListSnapshotsRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListSnapshotsRequest { + return new ListSnapshotsRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListSnapshotsRequest { + return new ListSnapshotsRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListSnapshotsRequest { + return new ListSnapshotsRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListSnapshotsRequest | PlainMessage | undefined, b: ListSnapshotsRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListSnapshotsRequest, a, b); + } +} + +/** + * @generated from message qdrant.DeleteSnapshotRequest + */ +export class DeleteSnapshotRequest extends Message { + /** + * Name of the collection + * + * @generated from field: string collection_name = 1; + */ + collectionName = ""; + + /** + * Name of the collection snapshot + * + * @generated from field: string snapshot_name = 2; + */ + snapshotName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeleteSnapshotRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "collection_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "snapshot_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteSnapshotRequest { + return new DeleteSnapshotRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteSnapshotRequest { + return new DeleteSnapshotRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteSnapshotRequest { + return new DeleteSnapshotRequest().fromJsonString(jsonString, options); + } + + static equals(a: DeleteSnapshotRequest | PlainMessage | undefined, b: DeleteSnapshotRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteSnapshotRequest, a, b); + } +} + +/** + * @generated from message qdrant.SnapshotDescription + */ +export class SnapshotDescription extends Message { + /** + * Name of the snapshot + * + * @generated from field: string name = 1; + */ + name = ""; + + /** + * Creation time of the snapshot + * + * @generated from field: google.protobuf.Timestamp creation_time = 2; + */ + creationTime?: Timestamp; + + /** + * Size of the snapshot in bytes + * + * @generated from field: int64 size = 3; + */ + size = protoInt64.zero; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.SnapshotDescription"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "creation_time", kind: "message", T: Timestamp }, + { no: 3, name: "size", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SnapshotDescription { + return new SnapshotDescription().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SnapshotDescription { + return new SnapshotDescription().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SnapshotDescription { + return new SnapshotDescription().fromJsonString(jsonString, options); + } + + static equals(a: SnapshotDescription | PlainMessage | undefined, b: SnapshotDescription | PlainMessage | undefined): boolean { + return proto3.util.equals(SnapshotDescription, a, b); + } +} + +/** + * @generated from message qdrant.CreateSnapshotResponse + */ +export class CreateSnapshotResponse extends Message { + /** + * @generated from field: qdrant.SnapshotDescription snapshot_description = 1; + */ + snapshotDescription?: SnapshotDescription; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.CreateSnapshotResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "snapshot_description", kind: "message", T: SnapshotDescription }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateSnapshotResponse { + return new CreateSnapshotResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateSnapshotResponse { + return new CreateSnapshotResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateSnapshotResponse { + return new CreateSnapshotResponse().fromJsonString(jsonString, options); + } + + static equals(a: CreateSnapshotResponse | PlainMessage | undefined, b: CreateSnapshotResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateSnapshotResponse, a, b); + } +} + +/** + * @generated from message qdrant.ListSnapshotsResponse + */ +export class ListSnapshotsResponse extends Message { + /** + * @generated from field: repeated qdrant.SnapshotDescription snapshot_descriptions = 1; + */ + snapshotDescriptions: SnapshotDescription[] = []; + + /** + * Time spent to process + * + * @generated from field: double time = 2; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.ListSnapshotsResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "snapshot_descriptions", kind: "message", T: SnapshotDescription, repeated: true }, + { no: 2, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListSnapshotsResponse { + return new ListSnapshotsResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListSnapshotsResponse { + return new ListSnapshotsResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListSnapshotsResponse { + return new ListSnapshotsResponse().fromJsonString(jsonString, options); + } + + static equals(a: ListSnapshotsResponse | PlainMessage | undefined, b: ListSnapshotsResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ListSnapshotsResponse, a, b); + } +} + +/** + * @generated from message qdrant.DeleteSnapshotResponse + */ +export class DeleteSnapshotResponse extends Message { + /** + * Time spent to process + * + * @generated from field: double time = 1; + */ + time = 0; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "qdrant.DeleteSnapshotResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "time", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteSnapshotResponse { + return new DeleteSnapshotResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteSnapshotResponse { + return new DeleteSnapshotResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteSnapshotResponse { + return new DeleteSnapshotResponse().fromJsonString(jsonString, options); + } + + static equals(a: DeleteSnapshotResponse | PlainMessage | undefined, b: DeleteSnapshotResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteSnapshotResponse, a, b); + } +} + diff --git a/packages/js-client-grpc/tsconfig.json b/packages/js-client-grpc/tsconfig.json new file mode 100644 index 0000000..fde62c8 --- /dev/null +++ b/packages/js-client-grpc/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"] + }, + "include": ["src", "examples"] +} diff --git a/packages/js-client-rest/.eslintrc.json b/packages/js-client-rest/.eslintrc.json new file mode 100644 index 0000000..4254a6f --- /dev/null +++ b/packages/js-client-rest/.eslintrc.json @@ -0,0 +1,32 @@ +{ + "root": true, + "env": { + "node": true + }, + "ignorePatterns": "generated_schema.ts", + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": ["./tsconfig.json"] + }, + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:@typescript-eslint/strict" + ], + "rules": { + "object-shorthand": "warn", + "arrow-body-style": "warn", + // "no-unused-vars": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "all", + "argsIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ], + "@typescript-eslint/consistent-type-definitions": "off" + } +} diff --git a/packages/js-client-rest/LICENSE b/packages/js-client-rest/LICENSE new file mode 100644 index 0000000..494eedd --- /dev/null +++ b/packages/js-client-rest/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021-2023 Qdrant Solutions GmbH. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/packages/js-client-rest/README.md b/packages/js-client-rest/README.md new file mode 100644 index 0000000..c1cec66 --- /dev/null +++ b/packages/js-client-rest/README.md @@ -0,0 +1,54 @@ +# JavaScript Qdrant REST Client + +This repository contains the REST client for the [Qdrant](https://github.com/qdrant/qdrant) vector search engine. + +## Installation + +```shell +npm install @qdrant/js-client-rest +# or +yarn add @qdrant/js-client-rest +# or +pnpm i @qdrant/js-client-rest +``` + +## Usage + +Run the Qdrant Docker container: + +```shell +docker run -p 6333:6333 qdrant/qdrant +``` + +## Instantiate a client + +```ts +import {QdrantClient} from '@qdrant/js-client-rest'; + +const client = new QdrantClient({host: 'localhost', port: 6333}); +// or +const client = new QdrantClient({url: 'http://localhost:6333'}); +``` + +## Make requests + +Using one of the available facade methods: + +```ts +try { + const result = await client.getCollections(); + console.log('List of collections:', result.collections); +} catch (err) { + console.error('Could not get collections:', err); +} +``` + +Or directly using an endpoint from the API: + +```ts +await client.api('collections').getCollections(); +``` + +## Releases + +Major and minor versions align with Qdrant's engine releases, whilst patch are reserved for fixes regarding the current minor release. Check out [RELEASE.md](../../RELEASE.md) for more info on release guidelines. diff --git a/packages/js-client-rest/examples/README.md b/packages/js-client-rest/examples/README.md new file mode 100644 index 0000000..faccd96 --- /dev/null +++ b/packages/js-client-rest/examples/README.md @@ -0,0 +1,5 @@ +# Examples + +```shell +QDRANT_API_KEY= QDRANT_URL= node --loader ts-node/esm index.ts +``` diff --git a/packages/js-client-rest/examples/index.ts b/packages/js-client-rest/examples/index.ts new file mode 100644 index 0000000..7504102 --- /dev/null +++ b/packages/js-client-rest/examples/index.ts @@ -0,0 +1,40 @@ +import {maybe} from '@sevinf/maybe'; +import {QdrantClient} from '../src/qdrant-client.js'; + +process.on('uncaughtException', (e) => { + console.log(e); +}); +process.on('unhandledRejection', (e, promise) => { + console.log(String(e), String(promise)); +}); +// Listen to Ctr + C and exit +process.once('SIGINT', () => { + process.exit(130); +}); + +async function main(): Promise { + const apiKey = maybe(process.env.QDRANT_API_KEY).orThrow(); + const url = maybe(process.env.QDRANT_URL).orThrow(); + + // An instance of the client to issue requests to Open API endpoints + const client = new QdrantClient({ + url, + apiKey, + }); + const result = await client.api('service').telemetry({anonymize: true}); + + console.log(result); + + return 0; +} + +main() + .then((code) => { + if (code !== 0) { + process.exit(code); + } + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); diff --git a/packages/js-client-rest/examples/tsconfig.json b/packages/js-client-rest/examples/tsconfig.json new file mode 100644 index 0000000..561d899 --- /dev/null +++ b/packages/js-client-rest/examples/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "ts-node": { + "transpileOnly": true, + "esm": true + } +} diff --git a/packages/js-client-rest/package.json b/packages/js-client-rest/package.json new file mode 100644 index 0000000..8fdca68 --- /dev/null +++ b/packages/js-client-rest/package.json @@ -0,0 +1,86 @@ +{ + "name": "@qdrant/js-client-rest", + "version": "1.1.1", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + }, + "repository": { + "type": "git", + "url": "https://github.com/qdrant/qrant-js" + }, + "bugs": { + "url": "https://github.com/qdrant/qrant-js/issues" + }, + "homepage": "https://github.com/qdrant/qrant-js#readme", + "license": "Apache-2.0", + "type": "module", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "browser": "./dist/browser/index.js", + "types": "./dist/types/index.d.ts", + "exports": { + ".": { + "require": "./dist/cjs/index.js", + "default": "./dist/esm/index.js", + "browser": "./dist/browser/index.js", + "types": "./dist/types/index.d.ts" + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "prepublishOnly": "pnpm pre-check && pnpm tsc:build && pnpm build", + "test": "vitest run", + "test:watch": "vitest watch", + "test:integration": "vitest run --config vite.integration.config.ts", + "pre-check": "pnpm tsc:check && pnpm tsc:deadcode && pnpm lint && pnpm test", + "pre-commit": "pnpm tsc:check && pnpm tsc:deadcode && pnpm lint-staged && pnpm test", + "tsc:deadcode": "ts-prune -e -i 'src/proto|src/openapi|src/index.ts|vite.config.ts|vite.integration.config.ts'", + "tsc:check": "tsc --noEmit", + "tsc:build": "pnpm clean && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json", + "build": "rollup -c rollup.config.js", + "lint": "eslint src", + "clean": "rimraf ./dist", + "codegen:openapi-typescript": "openapi-typescript $npm_package_config_openapi_schema_remote --output src/openapi/generated_schema.ts", + "qdrant-server": "docker run -d --rm -p 6333:6333 --name qdrant-server qdrant/qdrant:v$npm_package_version" + }, + "config": { + "openapi_schema_remote": "https://raw.githubusercontent.com/qdrant/qdrant/master/docs/redoc/master/openapi.json" + }, + "lint-staged": { + "*.ts": [ + "prettier --list-different", + "eslint" + ], + "*.{md,yaml}": "prettier --list-different" + }, + "dependencies": { + "@sevinf/maybe": "0.5.0", + "openapi-typescript-fetch": "Rendez/openapi-typescript-fetch#ea89f6480e498ec022e2f2f67f85004eb54e6f54" + }, + "devDependencies": { + "@rollup/plugin-node-resolve": "15.0.2", + "@rollup/plugin-replace": "5.0.2", + "@rollup/plugin-terser": "0.4.0", + "@total-typescript/ts-reset": "0.4.2", + "@types/node": "18.15.11", + "@typescript-eslint/eslint-plugin": "5.57.0", + "@typescript-eslint/parser": "5.57.0", + "lint-staged": "13.2.1", + "openapi-typescript": "6.2.0", + "rimraf": "5.0.0", + "rollup": "3.20.2", + "ts-node": "10.9.1", + "ts-prune": "0.10.3", + "typescript": "5.0.2", + "vitest": "0.29.8" + }, + "peerDependencies": { + "typescript": ">=4.1" + } +} diff --git a/packages/js-client-rest/rollup.config.js b/packages/js-client-rest/rollup.config.js new file mode 100644 index 0000000..e7806a3 --- /dev/null +++ b/packages/js-client-rest/rollup.config.js @@ -0,0 +1,41 @@ +import terser from '@rollup/plugin-terser'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import replace from '@rollup/plugin-replace'; +import {writeFile} from 'fs/promises'; + +const createCommonJsPackage = () => ({ + name: 'cjs-package', + buildEnd: () => writeFile('dist/cjs/package.json', JSON.stringify({type: 'commonjs'}, null, 4)), +}); + +export default { + input: 'dist/esm/index.js', + output: [ + { + file: 'dist/browser/index.cjs', + format: 'cjs', + }, + { + file: 'dist/browser/index.min.cjs', + format: 'cjs', + plugins: [terser()], + }, + { + file: 'dist/browser/index.js', + format: 'es', + }, + { + file: 'dist/browser/index.min.js', + format: 'es', + plugins: [terser()], + }, + ], + plugins: [ + createCommonJsPackage(), + nodeResolve(), + replace({ + 'import.meta.vitest': 'undefined', + preventAssignment: true, + }), + ], +}; diff --git a/packages/js-client-rest/src/api-client.ts b/packages/js-client-rest/src/api-client.ts new file mode 100644 index 0000000..5b1e2f6 --- /dev/null +++ b/packages/js-client-rest/src/api-client.ts @@ -0,0 +1,57 @@ +import {paths} from './openapi/generated_schema.js'; +import {createClusterApi} from './api/cluster-api.js'; +import {createCollectionsApi} from './api/collections-api.js'; +import {createPointsApi} from './api/points-api.js'; +import {createServiceApi} from './api/service-api.js'; +import {createSnapshotsApi} from './api/snapshots-api.js'; +import {QdrantClientTimeoutError, QdrantClientUnexpectedResponseError} from './errors.js'; +import {RestArgs} from './types.js'; +import {Fetcher, Middleware} from 'openapi-typescript-fetch'; + +export type Client = ReturnType>; + +export function createApis(baseUrl: string, args: RestArgs) { + const client = createClient(baseUrl, args); + + return { + cluster: createClusterApi(client), + collections: createCollectionsApi(client), + points: createPointsApi(client), + service: createServiceApi(client), + snapshots: createSnapshotsApi(client), + } as const; +} + +export type OpenApiClient = ReturnType; + +export function createClient(baseUrl: string, {headers, timeout}: RestArgs): Client { + const use: Middleware[] = []; + if (Number.isFinite(timeout)) { + use.push(async (url, init, next) => { + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), timeout); + try { + return await next(url, {...init, signal: controller.signal}); + } catch (e) { + if (e instanceof Error && e.name === 'AbortError') { + throw new QdrantClientTimeoutError(e.message); + } + throw e; + } finally { + clearTimeout(id); + } + }); + } + use.push(async (url, init, next) => { + const response = await next(url, init); + if (response.status === 200 || response.status === 201) { + return response; + } + throw QdrantClientUnexpectedResponseError.forResponse(response); + }); + + const client = Fetcher.for(); + client.configure({baseUrl, init: {headers}, use}); + + return client; +} diff --git a/packages/js-client-rest/src/api/cluster-api.ts b/packages/js-client-rest/src/api/cluster-api.ts new file mode 100644 index 0000000..04feae7 --- /dev/null +++ b/packages/js-client-rest/src/api/cluster-api.ts @@ -0,0 +1,27 @@ +import {Client} from '../api-client.js'; + +export function createClusterApi(client: Client) { + return { + /** + * Get information about the current state and composition of the cluster + */ + clusterStatus: client.path('/cluster').method('get').create(), + + /** + * Get cluster information for a collection + */ + collectionClusterInfo: client.path('/collections/{collection_name}/cluster').method('get').create(), + + recoverCurrentPeer: client.path('/cluster/recover').method('post').create(), + + /** + * Tries to remove peer from the cluster. Will return an error if peer has shards on it. + */ + removePeer: client.path('/cluster/peer/{peer_id}').method('delete').create({force: true}), + + updateCollectionCluster: client + .path('/collections/{collection_name}/cluster') + .method('post') + .create({timeout: true}), + } as const; +} diff --git a/packages/js-client-rest/src/api/collections-api.ts b/packages/js-client-rest/src/api/collections-api.ts new file mode 100644 index 0000000..c5cbc09 --- /dev/null +++ b/packages/js-client-rest/src/api/collections-api.ts @@ -0,0 +1,100 @@ +import {Client} from '../api-client.js'; + +export function createCollectionsApi(client: Client) { + return { + /** + * Get cluster information for a collection + */ + collectionClusterInfo: client.path('/collections/{collection_name}/cluster').method('get').create(), + + /** + * Create new collection with given parameters + */ + createCollection: client.path('/collections/{collection_name}').method('put').create({timeout: true}), + + /** + * Create index for field in collection + */ + createFieldIndex: client + .path('/collections/{collection_name}/index') + .method('put') + .create({ordering: true, wait: true}), + + /** + * Create new snapshot for a collection + */ + createSnapshot: client.path('/collections/{collection_name}/snapshots').method('post').create({wait: true}), + + /** + * Drop collection and all associated data + */ + deleteCollection: client.path('/collections/{collection_name}').method('delete').create({timeout: true}), + + /** + * Delete field index for collection + */ + deleteFieldIndex: client + .path('/collections/{collection_name}/index/{field_name}') + .method('delete') + .create({ordering: true, wait: true}), + + /** + * Delete snapshot for a collection + */ + deleteSnapshots: client + .path('/collections/{collection_name}/snapshots/{snapshot_name}') + .method('delete') + .create({wait: true}), + + /** + * Get detailed information about specified existing collection + */ + getCollection: client.path('/collections/{collection_name}').method('get').create(), + + /** + * Get list of all aliases for a collection + */ + getCollectionAliases: client.path('/collections/{collection_name}/aliases').method('get').create(), + + /** + * Get list name of all existing collections + */ + getCollections: client.path('/collections').method('get').create(), + + /** + * Get list of all existing collections aliases + */ + getCollectionsAliases: client.path('/aliases').method('get').create(), + + /** + * Download specified snapshot from a collection as a file + * @todo Fetcher needs to handle Blob for file downloads + */ + getSnapshot: client.path('/collections/{collection_name}/snapshots/{snapshot_name}').method('get').create(), + + /** + * Get list of snapshots for a collection + */ + listSnapshots: client.path('/collections/{collection_name}/snapshots').method('get').create(), + + /** + * Recover local collection data from a snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created. + */ + recoverFromSnapshot: client + .path('/collections/{collection_name}/snapshots/recover') + .method('put') + .create({wait: true}), + + updateAliases: client.path('/collections/aliases').method('post').create({timeout: true}), + + /** + * Update parameters of the existing collection + */ + updateCollection: client.path('/collections/{collection_name}').method('patch').create({timeout: true}), + + updateCollectionCluster: client + .path('/collections/{collection_name}/cluster') + .method('post') + .create({timeout: true}), + } as const; +} diff --git a/packages/js-client-rest/src/api/points-api.ts b/packages/js-client-rest/src/api/points-api.ts new file mode 100644 index 0000000..d257d29 --- /dev/null +++ b/packages/js-client-rest/src/api/points-api.ts @@ -0,0 +1,108 @@ +import {Client} from '../api-client.js'; + +export function createPointsApi(client: Client) { + return { + /** + * Remove all payload for specified points + */ + clearPayload: client + .path('/collections/{collection_name}/points/payload/clear') + .method('post') + .create({ordering: true, wait: true}), + + /** + * Count points which matches given filtering condition + */ + countPoints: client.path('/collections/{collection_name}/points/count').method('post').create(), + + /** + * Delete specified key payload for points + */ + deletePayload: client + .path('/collections/{collection_name}/points/payload/delete') + .method('post') + .create({wait: true, ordering: true}), + + /** + * Delete points + */ + deletePoints: client + .path('/collections/{collection_name}/points/delete') + .method('post') + .create({wait: true, ordering: true}), + + /** + * Retrieve full information of single point by id + */ + getPoint: client.path('/collections/{collection_name}/points/{id}').method('get').create(), + + /** + * Retrieve multiple points by specified IDs + */ + getPoints: client.path('/collections/{collection_name}/points').method('post').create({consistency: true}), + + /** + * Replace full payload of points with new one + */ + overwritePayload: client + .path('/collections/{collection_name}/points/payload') + .method('put') + .create({wait: true, ordering: true}), + + /** + * Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + recommendBatchPoints: client + .path('/collections/{collection_name}/points/recommend/batch') + .method('post') + .create({consistency: true}), + + /** + * Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + recommendPoints: client + .path('/collections/{collection_name}/points/recommend') + .method('post') + .create({consistency: true}), + + /** + * Scroll request - paginate over all points which matches given filtering condition + */ + scrollPoints: client + .path('/collections/{collection_name}/points/scroll') + .method('post') + .create({consistency: true}), + + /** + * Retrieve by batch the closest points based on vector similarity and given filtering conditions + */ + searchBatchPoints: client + .path('/collections/{collection_name}/points/search/batch') + .method('post') + .create({consistency: true}), + + /** + * Retrieve closest points based on vector similarity and given filtering conditions + */ + searchPoints: client + .path('/collections/{collection_name}/points/search') + .method('post') + .create({consistency: true}), + + /** + * Set payload values for points + */ + setPayload: client + .path('/collections/{collection_name}/points/payload') + .method('post') + .create({wait: true, ordering: true}), + + /** + * Perform insert + updates on points. If point with given ID already exists - it will be overwritten. + */ + upsertPoints: client + .path('/collections/{collection_name}/points') + .method('put') + .create({wait: true, ordering: true}), + } as const; +} diff --git a/packages/js-client-rest/src/api/service-api.ts b/packages/js-client-rest/src/api/service-api.ts new file mode 100644 index 0000000..5b47e4e --- /dev/null +++ b/packages/js-client-rest/src/api/service-api.ts @@ -0,0 +1,24 @@ +import {Client} from '../api-client.js'; + +export function createServiceApi(client: Client) { + return { + /** + * Get lock options. If write is locked, all write operations and collection creation are forbidden + */ + getLocks: client.path('/locks').method('get').create(), + + /** + * Collect metrics data including app info, collections info, cluster info and statistics + */ + metrics: client.path('/metrics').method('get').create(), + + /** + * Set lock options. If write is locked, all write operations and collection creation are forbidden. Returns previous lock options + */ + postLocks: client.path('/locks').method('post').create(), + /** + * Collect telemetry data including app info, system info, collections info, cluster info, configs and statistics + */ + telemetry: client.path('/telemetry').method('get').create(), + } as const; +} diff --git a/packages/js-client-rest/src/api/snapshots-api.ts b/packages/js-client-rest/src/api/snapshots-api.ts new file mode 100644 index 0000000..9b53e39 --- /dev/null +++ b/packages/js-client-rest/src/api/snapshots-api.ts @@ -0,0 +1,58 @@ +import {Client} from '../api-client.js'; + +export function createSnapshotsApi(client: Client) { + return { + /** + * Create new snapshot of the whole storage + */ + createFullSnapshot: client.path('/snapshots').method('post').create({wait: true}), + + /** + * Create new snapshot for a collection + */ + createSnapshot: client.path('/collections/{collection_name}/snapshots').method('post').create({wait: true}), + + /** + * Delete snapshot of the whole storage + */ + deleteFullSnapshot: client.path('/snapshots/{snapshot_name}').method('delete').create({wait: true}), + + /** + * Delete snapshot for a collection + */ + deleteSnapshot: client + .path('/collections/{collection_name}/snapshots/{snapshot_name}') + .method('delete') + .create({wait: true}), + + /** + * Download specified snapshot of the whole storage as a file + * @todo Fetcher needs to handle Blob for file downloads + */ + getFullSnapshot: client.path('/snapshots/{snapshot_name}').method('get').create(), + + /** + * Download specified snapshot from a collection as a file + * @todo Fetcher needs to handle Blob for file downloads + */ + getSnapshot: client.path('/collections/{collection_name}/snapshots/{snapshot_name}').method('get').create(), + + /** + * Get list of snapshots of the whole storage + */ + listFullSnapshots: client.path('/snapshots').method('get').create(), + + /** + * Get list of snapshots for a collection + */ + listSnapshots: client.path('/collections/{collection_name}/snapshots').method('get').create(), + + /** + * Recover local collection data from a snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created. + */ + recoverFromSnapshot: client + .path('/collections/{collection_name}/snapshots/recover') + .method('put') + .create({wait: true}), + } as const; +} diff --git a/packages/js-client-rest/src/errors.ts b/packages/js-client-rest/src/errors.ts new file mode 100644 index 0000000..2951d21 --- /dev/null +++ b/packages/js-client-rest/src/errors.ts @@ -0,0 +1,33 @@ +import {ApiResponse} from 'openapi-typescript-fetch'; + +const MAX_CONTENT = 200; + +class CustomError extends Error { + constructor(message: string) { + super(message); + this.name = this.constructor.name; + Object.setPrototypeOf(this, new.target.prototype); + } +} + +export class QdrantClientUnexpectedResponseError extends CustomError { + static forResponse(response: ApiResponse) { + const statusCodeStr = `${response.status}`; + const reasonPhraseStr = !response.statusText ? '(Unrecognized Status Code)' : `(${response.statusText})`; + const statusStr = `${statusCodeStr} ${reasonPhraseStr}`.trim(); + const dataStr = response.data ? JSON.stringify(response.data, null, 2) : null; + let shortContent = ''; + if (dataStr) { + shortContent = dataStr.length <= MAX_CONTENT ? dataStr : dataStr.slice(0, -4) + ' ...'; + } + const rawContentStr = `Raw response content:\n${shortContent}`; + + return new QdrantClientUnexpectedResponseError(`Unexpected Response: ${statusStr}\n${rawContentStr}`); + } +} + +export class QdrantClientConfigError extends CustomError {} + +export class QdrantClientTimeoutError extends CustomError {} + +export class QdrantClientNotImplementedError extends CustomError {} diff --git a/packages/js-client-rest/src/index.ts b/packages/js-client-rest/src/index.ts new file mode 100644 index 0000000..4bfd5f0 --- /dev/null +++ b/packages/js-client-rest/src/index.ts @@ -0,0 +1,4 @@ +export {QdrantClient, QdrantClientParams} from './qdrant-client.js'; +export type {Schemas} from './types.js'; + +// comment diff --git a/packages/js-client-rest/src/openapi/generated_schema.ts b/packages/js-client-rest/src/openapi/generated_schema.ts new file mode 100644 index 0000000..f086915 --- /dev/null +++ b/packages/js-client-rest/src/openapi/generated_schema.ts @@ -0,0 +1,3697 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + + +/** OneOf type helpers */ +type Without = { [P in Exclude]?: never }; +type XOR = (T | U) extends object ? (Without & U) | (Without & T) : T | U; +type OneOf = T extends [infer Only] ? Only : T extends [infer A, infer B, ...infer Rest] ? OneOf<[XOR, ...Rest]> : never; + +export interface paths { + "/telemetry": { + /** + * Collect telemetry data + * @description Collect telemetry data including app info, system info, collections info, cluster info, configs and statistics + */ + get: operations["telemetry"]; + }; + "/metrics": { + /** + * Collect Prometheus metrics data + * @description Collect metrics data including app info, collections info, cluster info and statistics + */ + get: operations["metrics"]; + }; + "/locks": { + /** + * Get lock options + * @description Get lock options. If write is locked, all write operations and collection creation are forbidden + */ + get: operations["get_locks"]; + /** + * Set lock options + * @description Set lock options. If write is locked, all write operations and collection creation are forbidden. Returns previous lock options + */ + post: operations["post_locks"]; + }; + "/cluster": { + /** + * Get cluster status info + * @description Get information about the current state and composition of the cluster + */ + get: operations["cluster_status"]; + }; + "/cluster/recover": { + /** Tries to recover current peer Raft state. */ + post: operations["recover_current_peer"]; + }; + "/cluster/peer/{peer_id}": { + /** + * Remove peer from the cluster + * @description Tries to remove peer from the cluster. Will return an error if peer has shards on it. + */ + delete: operations["remove_peer"]; + }; + "/collections": { + /** + * List collections + * @description Get list name of all existing collections + */ + get: operations["get_collections"]; + }; + "/collections/{collection_name}": { + /** + * Collection info + * @description Get detailed information about specified existing collection + */ + get: operations["get_collection"]; + /** + * Create collection + * @description Create new collection with given parameters + */ + put: operations["create_collection"]; + /** + * Delete collection + * @description Drop collection and all associated data + */ + delete: operations["delete_collection"]; + /** + * Update collection parameters + * @description Update parameters of the existing collection + */ + patch: operations["update_collection"]; + }; + "/collections/aliases": { + /** Update aliases of the collections */ + post: operations["update_aliases"]; + }; + "/collections/{collection_name}/index": { + /** + * Create index for field in collection + * @description Create index for field in collection + */ + put: operations["create_field_index"]; + }; + "/collections/{collection_name}/index/{field_name}": { + /** + * Delete index for field in collection + * @description Delete field index for collection + */ + delete: operations["delete_field_index"]; + }; + "/collections/{collection_name}/cluster": { + /** + * Collection cluster info + * @description Get cluster information for a collection + */ + get: operations["collection_cluster_info"]; + /** Update collection cluster setup */ + post: operations["update_collection_cluster"]; + }; + "/collections/{collection_name}/aliases": { + /** + * List aliases for collection + * @description Get list of all aliases for a collection + */ + get: operations["get_collection_aliases"]; + }; + "/aliases": { + /** + * List collections aliases + * @description Get list of all existing collections aliases + */ + get: operations["get_collections_aliases"]; + }; + "/collections/{collection_name}/snapshots/upload": { + /** + * Recover from an uploaded snapshot + * @description Recover local collection data from an uploaded snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created. + */ + post: operations["recover_from_uploaded_snapshot"]; + }; + "/collections/{collection_name}/snapshots/recover": { + /** + * Recover from a snapshot + * @description Recover local collection data from a snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created. + */ + put: operations["recover_from_snapshot"]; + }; + "/collections/{collection_name}/snapshots": { + /** + * List collection snapshots + * @description Get list of snapshots for a collection + */ + get: operations["list_snapshots"]; + /** + * Create collection snapshot + * @description Create new snapshot for a collection + */ + post: operations["create_snapshot"]; + }; + "/collections/{collection_name}/snapshots/{snapshot_name}": { + /** + * Download collection snapshot + * @description Download specified snapshot from a collection as a file + */ + get: operations["get_snapshot"]; + /** + * Delete collection snapshot + * @description Delete snapshot for a collection + */ + delete: operations["delete_snapshot"]; + }; + "/snapshots": { + /** + * List of storage snapshots + * @description Get list of snapshots of the whole storage + */ + get: operations["list_full_snapshots"]; + /** + * Create storage snapshot + * @description Create new snapshot of the whole storage + */ + post: operations["create_full_snapshot"]; + }; + "/snapshots/{snapshot_name}": { + /** + * Download storage snapshot + * @description Download specified snapshot of the whole storage as a file + */ + get: operations["get_full_snapshot"]; + /** + * Delete storage snapshot + * @description Delete snapshot of the whole storage + */ + delete: operations["delete_full_snapshot"]; + }; + "/collections/{collection_name}/points/{id}": { + /** + * Get point + * @description Retrieve full information of single point by id + */ + get: operations["get_point"]; + }; + "/collections/{collection_name}/points": { + /** + * Upsert points + * @description Perform insert + updates on points. If point with given ID already exists - it will be overwritten. + */ + put: operations["upsert_points"]; + /** + * Get points + * @description Retrieve multiple points by specified IDs + */ + post: operations["get_points"]; + }; + "/collections/{collection_name}/points/delete": { + /** + * Delete points + * @description Delete points + */ + post: operations["delete_points"]; + }; + "/collections/{collection_name}/points/payload": { + /** + * Overwrite payload + * @description Replace full payload of points with new one + */ + put: operations["overwrite_payload"]; + /** + * Set payload + * @description Set payload values for points + */ + post: operations["set_payload"]; + }; + "/collections/{collection_name}/points/payload/delete": { + /** + * Delete payload + * @description Delete specified key payload for points + */ + post: operations["delete_payload"]; + }; + "/collections/{collection_name}/points/payload/clear": { + /** + * Clear payload + * @description Remove all payload for specified points + */ + post: operations["clear_payload"]; + }; + "/collections/{collection_name}/points/scroll": { + /** + * Scroll points + * @description Scroll request - paginate over all points which matches given filtering condition + */ + post: operations["scroll_points"]; + }; + "/collections/{collection_name}/points/search": { + /** + * Search points + * @description Retrieve closest points based on vector similarity and given filtering conditions + */ + post: operations["search_points"]; + }; + "/collections/{collection_name}/points/search/batch": { + /** + * Search batch points + * @description Retrieve by batch the closest points based on vector similarity and given filtering conditions + */ + post: operations["search_batch_points"]; + }; + "/collections/{collection_name}/points/recommend": { + /** + * Recommend points + * @description Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + post: operations["recommend_points"]; + }; + "/collections/{collection_name}/points/recommend/batch": { + /** + * Recommend batch points + * @description Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + post: operations["recommend_batch_points"]; + }; + "/collections/{collection_name}/points/count": { + /** + * Count points + * @description Count points which matches given filtering condition + */ + post: operations["count_points"]; + }; +} + +export type webhooks = Record; + +export interface components { + schemas: { + ErrorResponse: { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + status?: { + /** @description Description of the occurred error. */ + error?: string; + }; + result?: Record | null; + }; + CollectionsResponse: { + collections: (components["schemas"]["CollectionDescription"])[]; + }; + CollectionDescription: { + name: string; + }; + /** @description Current statistics and configuration of the collection */ + CollectionInfo: { + status: components["schemas"]["CollectionStatus"]; + optimizer_status: components["schemas"]["OptimizersStatus"]; + /** + * Format: uint + * @description Number of vectors in collection All vectors in collection are available for querying Calculated as `points_count x vectors_per_point` Where `vectors_per_point` is a number of named vectors in schema + */ + vectors_count: number; + /** + * Format: uint + * @description Number of indexed vectors in the collection. Indexed vectors in large segments are faster to query, as it is stored in vector index (HNSW) + */ + indexed_vectors_count: number; + /** + * Format: uint + * @description Number of points (vectors + payloads) in collection Each point could be accessed by unique id + */ + points_count: number; + /** + * Format: uint + * @description Number of segments in collection. Each segment has independent vector as payload indexes + */ + segments_count: number; + config: components["schemas"]["CollectionConfig"]; + /** @description Types of stored payload */ + payload_schema: { + [key: string]: components["schemas"]["PayloadIndexInfo"] | undefined; + }; + }; + /** + * @description Current state of the collection. `Green` - all good. `Yellow` - optimization is running, `Red` - some operations failed and was not recovered + * @enum {string} + */ + CollectionStatus: "green" | "yellow" | "red"; + /** @description Current state of the collection */ + OptimizersStatus: OneOf<["ok", { + error: string; + }]>; + CollectionConfig: { + params: components["schemas"]["CollectionParams"]; + hnsw_config: components["schemas"]["HnswConfig"]; + optimizer_config: components["schemas"]["OptimizersConfig"]; + wal_config: components["schemas"]["WalConfig"]; + /** @default null */ + quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + }; + CollectionParams: { + vectors: components["schemas"]["VectorsConfig"]; + /** + * Format: uint32 + * @description Number of shards the collection has + * @default 1 + */ + shard_number?: number; + /** + * Format: uint32 + * @description Number of replicas for each shard + * @default 1 + */ + replication_factor?: number; + /** + * Format: uint32 + * @description Defines how many replicas should apply the operation for us to consider it successful. Increasing this number will make the collection more resilient to inconsistencies, but will also make it fail if not enough replicas are available. Does not have any performance impact. + * @default 1 + */ + write_consistency_factor?: number; + /** + * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * @default false + */ + on_disk_payload?: boolean; + }; + /** + * @description Vector params separator for single and multiple vector modes Single mode: + * + * { "size": 128, "distance": "Cosine" } + * + * or multiple mode: + * + * { "default": { "size": 128, "distance": "Cosine" } } + */ + VectorsConfig: components["schemas"]["VectorParams"] | ({ + [key: string]: components["schemas"]["VectorParams"] | undefined; + }); + /** @description Params of single vector data storage */ + VectorParams: { + /** + * Format: uint64 + * @description Size of a vectors used + */ + size: number; + distance: components["schemas"]["Distance"]; + /** @description Custom params for HNSW index. If none - values from collection configuration are used. */ + hnsw_config?: components["schemas"]["HnswConfigDiff"] | (Record | null); + /** @description Custom params for quantization. If none - values from collection configuration are used. */ + quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + }; + /** + * @description Type of internal tags, build from payload Distance function types used to compare vectors + * @enum {string} + */ + Distance: "Cosine" | "Euclid" | "Dot"; + HnswConfigDiff: { + /** + * Format: uint + * @description Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. + */ + m?: number | null; + /** + * Format: uint + * @description Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build the index. + */ + ef_construct?: number | null; + /** + * Format: uint + * @description Minimal size (in KiloBytes) of vectors for additional payload-based indexing. If payload chunk is smaller than `full_scan_threshold_kb` additional indexing won't be used - in this case full-scan search should be preferred by query planner and additional indexing is not required. Note: 1Kb = 1 vector of size 256 + */ + full_scan_threshold?: number | null; + /** + * Format: uint + * @description Number of parallel threads used for background index building. If 0 - auto selection. + */ + max_indexing_threads?: number | null; + /** @description Store HNSW index on disk. If set to false, the index will be stored in RAM. Default: false */ + on_disk?: boolean | null; + /** + * Format: uint + * @description Custom M param for additional payload-aware HNSW links. If not set, default M will be used. + */ + payload_m?: number | null; + }; + QuantizationConfig: components["schemas"]["ScalarQuantization"]; + ScalarQuantization: { + scalar: components["schemas"]["ScalarQuantizationConfig"]; + }; + ScalarQuantizationConfig: { + type: components["schemas"]["ScalarType"]; + /** + * Format: float + * @description Quantile for quantization. Expected value range in [0.5, 1.0]. If not set - use the whole range of values + */ + quantile?: number | null; + /** @description If true - quantized vectors always will be stored in RAM, ignoring the config of main storage */ + always_ram?: boolean | null; + }; + /** @enum {string} */ + ScalarType: "int8"; + /** @description Config of HNSW index */ + HnswConfig: { + /** + * Format: uint + * @description Number of edges per node in the index graph. Larger the value - more accurate the search, more space required. + */ + m: number; + /** + * Format: uint + * @description Number of neighbours to consider during the index building. Larger the value - more accurate the search, more time required to build index. + */ + ef_construct: number; + /** + * Format: uint + * @description Minimal size (in KiloBytes) of vectors for additional payload-based indexing. If payload chunk is smaller than `full_scan_threshold_kb` additional indexing won't be used - in this case full-scan search should be preferred by query planner and additional indexing is not required. Note: 1Kb = 1 vector of size 256 + */ + full_scan_threshold: number; + /** + * Format: uint + * @description Number of parallel threads used for background index building. If 0 - auto selection. + * @default 0 + */ + max_indexing_threads?: number; + /** @description Store HNSW index on disk. If set to false, index will be stored in RAM. Default: false */ + on_disk?: boolean | null; + /** + * Format: uint + * @description Custom M param for hnsw graph built for payload index. If not set, default M will be used. + */ + payload_m?: number | null; + }; + OptimizersConfig: { + /** + * Format: double + * @description The minimal fraction of deleted vectors in a segment, required to perform segment optimization + */ + deleted_threshold: number; + /** + * Format: uint + * @description The minimal number of vectors in a segment, required to perform segment optimization + */ + vacuum_min_vector_number: number; + /** + * Format: uint + * @description Target amount of segments optimizer will try to keep. Real amount of segments may vary depending on multiple parameters: - Amount of stored points - Current write RPS + * + * It is recommended to select default number of segments as a factor of the number of search threads, so that each segment would be handled evenly by one of the threads. If `default_segment_number = 0`, will be automatically selected by the number of available CPUs. + */ + default_segment_number: number; + /** + * Format: uint + * @description Do not create segments larger this size (in KiloBytes). Large segments might require disproportionately long indexation times, therefore it makes sense to limit the size of segments. + * + * If indexation speed have more priority for your - make this parameter lower. If search speed is more important - make this parameter higher. Note: 1Kb = 1 vector of size 256 If not set, will be automatically selected considering the number of available CPUs. + * @default null + */ + max_segment_size?: number | null; + /** + * Format: uint + * @description Maximum size (in KiloBytes) of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmaped file. To enable memmap storage, lower the threshold Note: 1Kb = 1 vector of size 256 If not set, mmap will not be used. + * @default null + */ + memmap_threshold?: number | null; + /** + * Format: uint + * @description Maximum size (in KiloBytes) of vectors allowed for plain index. Default value based on Note: 1Kb = 1 vector of size 256 + */ + indexing_threshold: number; + /** + * Format: uint64 + * @description Minimum interval between forced flushes. + */ + flush_interval_sec: number; + /** + * Format: uint + * @description Maximum available threads for optimization workers + */ + max_optimization_threads: number; + }; + WalConfig: { + /** + * Format: uint + * @description Size of a single WAL segment in MB + */ + wal_capacity_mb: number; + /** + * Format: uint + * @description Number of WAL segments to create ahead of actually used ones + */ + wal_segments_ahead: number; + }; + /** @description Display payload field type & index information */ + PayloadIndexInfo: { + data_type: components["schemas"]["PayloadSchemaType"]; + params?: components["schemas"]["PayloadSchemaParams"] | (Record | null); + /** + * Format: uint + * @description Number of points indexed with this index + */ + points: number; + }; + /** + * @description All possible names of payload types + * @enum {string} + */ + PayloadSchemaType: "keyword" | "integer" | "float" | "geo" | "text"; + /** @description Payload type with parameters */ + PayloadSchemaParams: components["schemas"]["TextIndexParams"]; + TextIndexParams: { + type: components["schemas"]["TextIndexType"]; + tokenizer?: components["schemas"]["TokenizerType"]; + /** Format: uint */ + min_token_len?: number | null; + /** Format: uint */ + max_token_len?: number | null; + /** @description If true, lowercase all tokens. Default: true */ + lowercase?: boolean | null; + }; + /** @enum {string} */ + TextIndexType: "text"; + /** @enum {string} */ + TokenizerType: "prefix" | "whitespace" | "word"; + PointRequest: { + /** @description Look for points with ids */ + ids: (components["schemas"]["ExtendedPointId"])[]; + /** @description Select which payload to return with the response. Default: All */ + with_payload?: components["schemas"]["WithPayloadInterface"] | (Record | null); + with_vector?: components["schemas"]["WithVector"]; + }; + /** @description Type, used for specifying point ID in user interface */ + ExtendedPointId: number | string; + /** @description Options for specifying which payload to include or not */ + WithPayloadInterface: boolean | (string)[] | components["schemas"]["PayloadSelector"]; + /** @description Specifies how to treat payload selector */ + PayloadSelector: components["schemas"]["PayloadSelectorInclude"] | components["schemas"]["PayloadSelectorExclude"]; + PayloadSelectorInclude: { + /** @description Only include this payload keys */ + include: (string)[]; + }; + PayloadSelectorExclude: { + /** @description Exclude this fields from returning payload */ + exclude: (string)[]; + }; + /** @description Options for specifying which vector to include */ + WithVector: boolean | (string)[]; + /** @description Point data */ + Record: { + id: components["schemas"]["ExtendedPointId"]; + /** @description Payload - values assigned to the point */ + payload?: components["schemas"]["Payload"] | (Record | null); + /** @description Vector of the point */ + vector?: components["schemas"]["VectorStruct"] | (Record | null); + }; + Payload: { + [key: string]: unknown | undefined; + }; + /** @description Full vector data per point separator with single and multiple vector modes */ + VectorStruct: (number)[] | ({ + [key: string]: (number)[] | undefined; + }); + /** @description Search request. Holds all conditions and parameters for the search of most similar points by vector similarity given the filtering restrictions. */ + SearchRequest: { + vector: components["schemas"]["NamedVectorStruct"]; + /** @description Look only for points which satisfies this conditions */ + filter?: components["schemas"]["Filter"] | (Record | null); + /** @description Additional search params */ + params?: components["schemas"]["SearchParams"] | (Record | null); + /** + * Format: uint + * @description Max number of result to return + */ + limit: number; + /** + * Format: uint + * @description Offset of the first result to return. May be used to paginate results. Note: large offset values may cause performance issues. + * @default 0 + */ + offset?: number; + /** @description Select which payload to return with the response. Default: None */ + with_payload?: components["schemas"]["WithPayloadInterface"] | (Record | null); + /** + * @description Whether to return the point vector with the result? + * @default null + */ + with_vector?: components["schemas"]["WithVector"] | (Record | null); + /** + * Format: float + * @description Define a minimal score threshold for the result. If defined, less similar results will not be returned. Score of the returned result might be higher or smaller than the threshold depending on the Distance function used. E.g. for cosine similarity only higher scores will be returned. + */ + score_threshold?: number | null; + }; + /** + * @description Vector data separator for named and unnamed modes Unanmed mode: + * + * { "vector": [1.0, 2.0, 3.0] } + * + * or named mode: + * + * { "vector": { "vector": [1.0, 2.0, 3.0], "name": "image-embeddings" } } + */ + NamedVectorStruct: (number)[] | components["schemas"]["NamedVector"]; + /** @description Vector data with name */ + NamedVector: { + /** @description Name of vector data */ + name: string; + /** @description Vector data */ + vector: (number)[]; + }; + Filter: { + /** @description At least one of those conditions should match */ + should?: (components["schemas"]["Condition"])[] | null; + /** @description All conditions must match */ + must?: (components["schemas"]["Condition"])[] | null; + /** @description All conditions must NOT match */ + must_not?: (components["schemas"]["Condition"])[] | null; + }; + Condition: components["schemas"]["FieldCondition"] | components["schemas"]["IsEmptyCondition"] | components["schemas"]["IsNullCondition"] | components["schemas"]["HasIdCondition"] | components["schemas"]["Filter"]; + /** @description All possible payload filtering conditions */ + FieldCondition: { + /** @description Payload key */ + key: string; + /** @description Check if point has field with a given value */ + match?: components["schemas"]["Match"] | (Record | null); + /** @description Check if points value lies in a given range */ + range?: components["schemas"]["Range"] | (Record | null); + /** @description Check if points geo location lies in a given area */ + geo_bounding_box?: components["schemas"]["GeoBoundingBox"] | (Record | null); + /** @description Check if geo point is within a given radius */ + geo_radius?: components["schemas"]["GeoRadius"] | (Record | null); + /** @description Check number of values of the field */ + values_count?: components["schemas"]["ValuesCount"] | (Record | null); + }; + /** @description Match filter request */ + Match: components["schemas"]["MatchValue"] | components["schemas"]["MatchText"] | components["schemas"]["MatchAny"]; + /** @description Exact match of the given value */ + MatchValue: { + value: components["schemas"]["ValueVariants"]; + }; + ValueVariants: string | number | boolean; + /** @description Full-text match of the strings. */ + MatchText: { + text: string; + }; + /** @description Exact match on any of the given values */ + MatchAny: { + any: components["schemas"]["AnyVariants"]; + }; + AnyVariants: (string)[] | (number)[]; + /** @description Range filter request */ + Range: { + /** + * Format: double + * @description point.key < range.lt + */ + lt?: number | null; + /** + * Format: double + * @description point.key > range.gt + */ + gt?: number | null; + /** + * Format: double + * @description point.key >= range.gte + */ + gte?: number | null; + /** + * Format: double + * @description point.key <= range.lte + */ + lte?: number | null; + }; + /** + * @description Geo filter request + * + * Matches coordinates inside the rectangle, described by coordinates of lop-left and bottom-right edges + */ + GeoBoundingBox: { + top_left: components["schemas"]["GeoPoint"]; + bottom_right: components["schemas"]["GeoPoint"]; + }; + /** @description Geo point payload schema */ + GeoPoint: { + /** Format: double */ + lon: number; + /** Format: double */ + lat: number; + }; + /** + * @description Geo filter request + * + * Matches coordinates inside the circle of `radius` and center with coordinates `center` + */ + GeoRadius: { + center: components["schemas"]["GeoPoint"]; + /** + * Format: double + * @description Radius of the area in meters + */ + radius: number; + }; + /** @description Values count filter request */ + ValuesCount: { + /** + * Format: uint + * @description point.key.length() < values_count.lt + */ + lt?: number | null; + /** + * Format: uint + * @description point.key.length() > values_count.gt + */ + gt?: number | null; + /** + * Format: uint + * @description point.key.length() >= values_count.gte + */ + gte?: number | null; + /** + * Format: uint + * @description point.key.length() <= values_count.lte + */ + lte?: number | null; + }; + /** @description Select points with empty payload for a specified field */ + IsEmptyCondition: { + is_empty: components["schemas"]["PayloadField"]; + }; + /** @description Payload field */ + PayloadField: { + /** @description Payload field name */ + key: string; + }; + /** @description Select points with null payload for a specified field */ + IsNullCondition: { + is_null: components["schemas"]["PayloadField"]; + }; + /** @description ID-based filtering condition */ + HasIdCondition: { + has_id: (components["schemas"]["ExtendedPointId"])[]; + }; + /** @description Additional parameters of the search */ + SearchParams: { + /** + * Format: uint + * @description Params relevant to HNSW index /// Size of the beam in a beam-search. Larger the value - more accurate the result, more time required for search. + */ + hnsw_ef?: number | null; + /** + * @description Search without approximation. If set to true, search may run long but with exact results. + * @default false + */ + exact?: boolean; + /** + * @description Quantization params + * @default null + */ + quantization?: components["schemas"]["QuantizationSearchParams"] | (Record | null); + }; + /** @description Additional parameters of the search */ + QuantizationSearchParams: { + /** + * @description If true, quantized vectors are ignored. Default is false. + * @default false + */ + ignore?: boolean; + /** + * @description If true, use original vectors to re-score top-k results. Might require more time in case if original vectors are stored on disk. Default is false. + * @default false + */ + rescore?: boolean; + }; + /** @description Search result */ + ScoredPoint: { + id: components["schemas"]["ExtendedPointId"]; + /** + * Format: uint64 + * @description Point version + */ + version: number; + /** + * Format: float + * @description Points vector distance to the query vector + */ + score: number; + /** @description Payload - values assigned to the point */ + payload?: components["schemas"]["Payload"] | (Record | null); + /** @description Vector of the point */ + vector?: components["schemas"]["VectorStruct"] | (Record | null); + }; + UpdateResult: { + /** + * Format: uint64 + * @description Sequential number of the operation + */ + operation_id: number; + status: components["schemas"]["UpdateStatus"]; + }; + /** + * @description `Acknowledged` - Request is saved to WAL and will be process in a queue. `Completed` - Request is completed, changes are actual. + * @enum {string} + */ + UpdateStatus: "acknowledged" | "completed"; + /** + * @description Recommendation request. Provides positive and negative examples of the vectors, which are already stored in the collection. + * + * Service should look for the points which are closer to positive examples and at the same time further to negative examples. The concrete way of how to compare negative and positive distances is up to implementation in `segment` crate. + */ + RecommendRequest: { + /** @description Look for vectors closest to those */ + positive: (components["schemas"]["ExtendedPointId"])[]; + /** + * @description Try to avoid vectors like this + * @default [] + */ + negative?: (components["schemas"]["ExtendedPointId"])[]; + /** @description Look only for points which satisfies this conditions */ + filter?: components["schemas"]["Filter"] | (Record | null); + /** @description Additional search params */ + params?: components["schemas"]["SearchParams"] | (Record | null); + /** + * Format: uint + * @description Max number of result to return + */ + limit: number; + /** + * Format: uint + * @description Offset of the first result to return. May be used to paginate results. Note: large offset values may cause performance issues. + * @default 0 + */ + offset?: number; + /** @description Select which payload to return with the response. Default: None */ + with_payload?: components["schemas"]["WithPayloadInterface"] | (Record | null); + /** + * @description Whether to return the point vector with the result? + * @default null + */ + with_vector?: components["schemas"]["WithVector"] | (Record | null); + /** + * Format: float + * @description Define a minimal score threshold for the result. If defined, less similar results will not be returned. Score of the returned result might be higher or smaller than the threshold depending on the Distance function used. E.g. for cosine similarity only higher scores will be returned. + */ + score_threshold?: number | null; + /** + * @description Define which vector to use for recommendation, if not specified - try to use default vector + * @default null + */ + using?: components["schemas"]["UsingVector"] | (Record | null); + /** + * @description The location used to lookup vectors. If not specified - use current collection. Note: the other collection should have the same vector size as the current collection + * @default null + */ + lookup_from?: components["schemas"]["LookupLocation"] | (Record | null); + }; + UsingVector: string; + /** @description Defines a location to use for looking up the vector. Specifies collection and vector field name. */ + LookupLocation: { + /** @description Name of the collection used for lookup */ + collection: string; + /** + * @description Optional name of the vector field within the collection. If not provided, the default vector field will be used. + * @default null + */ + vector?: string | null; + }; + /** @description Scroll request - paginate over all points which matches given condition */ + ScrollRequest: { + /** @description Start ID to read points from. */ + offset?: components["schemas"]["ExtendedPointId"] | (Record | null); + /** + * Format: uint + * @description Page size. Default: 10 + */ + limit?: number | null; + /** @description Look only for points which satisfies this conditions. If not provided - all points. */ + filter?: components["schemas"]["Filter"] | (Record | null); + /** @description Select which payload to return with the response. Default: All */ + with_payload?: components["schemas"]["WithPayloadInterface"] | (Record | null); + with_vector?: components["schemas"]["WithVector"]; + }; + /** @description Result of the points read request */ + ScrollResult: { + /** @description List of retrieved points */ + points: (components["schemas"]["Record"])[]; + /** @description Offset which should be used to retrieve a next page result */ + next_page_offset?: components["schemas"]["ExtendedPointId"] | (Record | null); + }; + /** @description Operation for creating new collection and (optionally) specify index params */ + CreateCollection: { + vectors: components["schemas"]["VectorsConfig"]; + /** + * Format: uint32 + * @description Number of shards in collection. Default is 1 for standalone, otherwise equal to the number of nodes Minimum is 1 + * @default null + */ + shard_number?: number | null; + /** + * Format: uint32 + * @description Number of shards replicas. Default is 1 Minimum is 1 + * @default null + */ + replication_factor?: number | null; + /** + * Format: uint32 + * @description Defines how many replicas should apply the operation for us to consider it successful. Increasing this number will make the collection more resilient to inconsistencies, but will also make it fail if not enough replicas are available. Does not have any performance impact. + * @default null + */ + write_consistency_factor?: number | null; + /** + * @description If true - point's payload will not be stored in memory. It will be read from the disk every time it is requested. This setting saves RAM by (slightly) increasing the response time. Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * @default null + */ + on_disk_payload?: boolean | null; + /** @description Custom params for HNSW index. If none - values from service configuration file are used. */ + hnsw_config?: components["schemas"]["HnswConfigDiff"] | (Record | null); + /** @description Custom params for WAL. If none - values from service configuration file are used. */ + wal_config?: components["schemas"]["WalConfigDiff"] | (Record | null); + /** @description Custom params for Optimizers. If none - values from service configuration file are used. */ + optimizers_config?: components["schemas"]["OptimizersConfigDiff"] | (Record | null); + /** + * @description Specify other collection to copy data from. + * @default null + */ + init_from?: components["schemas"]["InitFrom"] | (Record | null); + /** + * @description Quantization parameters. If none - quantization is disabled. + * @default null + */ + quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + }; + WalConfigDiff: { + /** + * Format: uint + * @description Size of a single WAL segment in MB + */ + wal_capacity_mb?: number | null; + /** + * Format: uint + * @description Number of WAL segments to create ahead of actually used ones + */ + wal_segments_ahead?: number | null; + }; + OptimizersConfigDiff: { + /** + * Format: double + * @description The minimal fraction of deleted vectors in a segment, required to perform segment optimization + */ + deleted_threshold?: number | null; + /** + * Format: uint + * @description The minimal number of vectors in a segment, required to perform segment optimization + */ + vacuum_min_vector_number?: number | null; + /** + * Format: uint + * @description Target amount of segments optimizer will try to keep. Real amount of segments may vary depending on multiple parameters: - Amount of stored points - Current write RPS + * + * It is recommended to select default number of segments as a factor of the number of search threads, so that each segment would be handled evenly by one of the threads If `default_segment_number = 0`, will be automatically selected by the number of available CPUs + */ + default_segment_number?: number | null; + /** + * Format: uint + * @description Do not create segments larger this size (in KiloBytes). Large segments might require disproportionately long indexation times, therefore it makes sense to limit the size of segments. + * + * If indexation speed have more priority for your - make this parameter lower. If search speed is more important - make this parameter higher. Note: 1Kb = 1 vector of size 256 + */ + max_segment_size?: number | null; + /** + * Format: uint + * @description Maximum size (in KiloBytes) of vectors to store in-memory per segment. Segments larger than this threshold will be stored as read-only memmaped file. To enable memmap storage, lower the threshold Note: 1Kb = 1 vector of size 256 + */ + memmap_threshold?: number | null; + /** + * Format: uint + * @description Maximum size (in KiloBytes) of vectors allowed for plain index. Default value based on Note: 1Kb = 1 vector of size 256 + */ + indexing_threshold?: number | null; + /** + * Format: uint64 + * @description Minimum interval between forced flushes. + */ + flush_interval_sec?: number | null; + /** + * Format: uint + * @description Maximum available threads for optimization workers + */ + max_optimization_threads?: number | null; + }; + /** @description Operation for creating new collection and (optionally) specify index params */ + InitFrom: { + collection: string; + }; + /** @description Operation for updating parameters of the existing collection */ + UpdateCollection: { + /** @description Custom params for Optimizers. If none - values from service configuration file are used. This operation is blocking, it will only proceed ones all current optimizations are complete */ + optimizers_config?: components["schemas"]["OptimizersConfigDiff"] | (Record | null); + /** @description Collection base params. If none - values from service configuration file are used. */ + params?: components["schemas"]["CollectionParamsDiff"] | (Record | null); + }; + CollectionParamsDiff: { + /** + * Format: uint32 + * @description Number of replicas for each shard + */ + replication_factor?: number | null; + /** + * Format: uint32 + * @description Minimal number successful responses from replicas to consider operation successful + */ + write_consistency_factor?: number | null; + }; + /** @description Operation for performing changes of collection aliases. Alias changes are atomic, meaning that no collection modifications can happen between alias operations. */ + ChangeAliasesOperation: { + actions: (components["schemas"]["AliasOperations"])[]; + }; + /** @description Group of all the possible operations related to collection aliases */ + AliasOperations: components["schemas"]["CreateAliasOperation"] | components["schemas"]["DeleteAliasOperation"] | components["schemas"]["RenameAliasOperation"]; + CreateAliasOperation: { + create_alias: components["schemas"]["CreateAlias"]; + }; + /** @description Create alternative name for a collection. Collection will be available under both names for search, retrieve, */ + CreateAlias: { + collection_name: string; + alias_name: string; + }; + /** @description Delete alias if exists */ + DeleteAliasOperation: { + delete_alias: components["schemas"]["DeleteAlias"]; + }; + /** @description Delete alias if exists */ + DeleteAlias: { + alias_name: string; + }; + /** @description Change alias to a new one */ + RenameAliasOperation: { + rename_alias: components["schemas"]["RenameAlias"]; + }; + /** @description Change alias to a new one */ + RenameAlias: { + old_alias_name: string; + new_alias_name: string; + }; + CreateFieldIndex: { + field_name: string; + field_schema?: components["schemas"]["PayloadFieldSchema"] | (Record | null); + }; + PayloadFieldSchema: components["schemas"]["PayloadSchemaType"] | components["schemas"]["PayloadSchemaParams"]; + PointsSelector: components["schemas"]["PointIdsList"] | components["schemas"]["FilterSelector"]; + PointIdsList: { + points: (components["schemas"]["ExtendedPointId"])[]; + }; + FilterSelector: { + filter: components["schemas"]["Filter"]; + }; + PointInsertOperations: components["schemas"]["PointsBatch"] | components["schemas"]["PointsList"]; + BatchVectorStruct: ((number)[])[] | ({ + [key: string]: ((number)[])[] | undefined; + }); + PointStruct: { + id: components["schemas"]["ExtendedPointId"]; + vector: components["schemas"]["VectorStruct"]; + /** @description Payload values (optional) */ + payload?: components["schemas"]["Payload"] | (Record | null); + }; + Batch: { + ids: (components["schemas"]["ExtendedPointId"])[]; + vectors: components["schemas"]["BatchVectorStruct"]; + payloads?: ((components["schemas"]["Payload"] | (Record | null))[]) | null; + }; + PointsBatch: { + batch: components["schemas"]["Batch"]; + }; + PointsList: { + points: (components["schemas"]["PointStruct"])[]; + }; + SetPayload: { + payload: components["schemas"]["Payload"]; + /** @description Assigns payload to each point in this list */ + points?: (components["schemas"]["ExtendedPointId"])[] | null; + /** @description Assigns payload to each point that satisfy this filter condition */ + filter?: components["schemas"]["Filter"] | (Record | null); + }; + DeletePayload: { + /** @description List of payload keys to remove from payload */ + keys: (string)[]; + /** @description Deletes values from each point in this list */ + points?: (components["schemas"]["ExtendedPointId"])[] | null; + /** @description Deletes values from points that satisfy this filter condition */ + filter?: components["schemas"]["Filter"] | (Record | null); + }; + /** @description Information about current cluster status and structure */ + ClusterStatus: OneOf<[{ + /** @enum {string} */ + status: "disabled"; + }, { + /** @enum {string} */ + status: "enabled"; + /** + * Format: uint64 + * @description ID of this peer + */ + peer_id: number; + /** @description Peers composition of the cluster with main information */ + peers: { + [key: string]: components["schemas"]["PeerInfo"] | undefined; + }; + raft_info: components["schemas"]["RaftInfo"]; + consensus_thread_status: components["schemas"]["ConsensusThreadStatus"]; + /** @description Consequent failures of message send operations in consensus by peer address. On the first success to send to that peer - entry is removed from this hashmap. */ + message_send_failures: { + [key: string]: components["schemas"]["MessageSendErrors"] | undefined; + }; + }]>; + /** @description Information of a peer in the cluster */ + PeerInfo: { + uri: string; + }; + /** @description Summary information about the current raft state */ + RaftInfo: { + /** + * Format: uint64 + * @description Raft divides time into terms of arbitrary length, each beginning with an election. If a candidate wins the election, it remains the leader for the rest of the term. The term number increases monotonically. Each server stores the current term number which is also exchanged in every communication. + */ + term: number; + /** + * Format: uint64 + * @description The index of the latest committed (finalized) operation that this peer is aware of. + */ + commit: number; + /** + * Format: uint + * @description Number of consensus operations pending to be applied on this peer + */ + pending_operations: number; + /** + * Format: uint64 + * @description Leader of the current term + */ + leader?: number | null; + /** @description Role of this peer in the current term */ + role?: components["schemas"]["StateRole"] | (Record | null); + /** @description Is this peer a voter or a learner */ + is_voter: boolean; + }; + /** + * @description Role of the peer in the consensus + * @enum {string} + */ + StateRole: "Follower" | "Candidate" | "Leader" | "PreCandidate"; + /** @description Information about current consensus thread status */ + ConsensusThreadStatus: OneOf<[{ + /** @enum {string} */ + consensus_thread_status: "working"; + /** Format: date-time */ + last_update: string; + }, { + /** @enum {string} */ + consensus_thread_status: "stopped"; + }, { + /** @enum {string} */ + consensus_thread_status: "stopped_with_err"; + err: string; + }]>; + /** @description Message send failures for a particular peer */ + MessageSendErrors: { + /** Format: uint */ + count: number; + latest_error?: string | null; + }; + SnapshotDescription: { + name: string; + /** Format: partial-date-time */ + creation_time?: string | null; + /** Format: uint64 */ + size: number; + }; + /** @description Count Request Counts the number of points which satisfy the given filter. If filter is not provided, the count of all points in the collection will be returned. */ + CountRequest: { + /** @description Look only for points which satisfies this conditions */ + filter?: components["schemas"]["Filter"] | (Record | null); + /** + * @description If true, count exact number of points. If false, count approximate number of points faster. Approximate count might be unreliable during the indexing process. Default: true + * @default true + */ + exact?: boolean; + }; + CountResult: { + /** + * Format: uint + * @description Number of points which satisfy the conditions + */ + count: number; + }; + /** @description Current clustering distribution for the collection */ + CollectionClusterInfo: { + /** + * Format: uint64 + * @description ID of this peer + */ + peer_id: number; + /** + * Format: uint + * @description Total number of shards + */ + shard_count: number; + /** @description Local shards */ + local_shards: (components["schemas"]["LocalShardInfo"])[]; + /** @description Remote shards */ + remote_shards: (components["schemas"]["RemoteShardInfo"])[]; + /** @description Shard transfers */ + shard_transfers: (components["schemas"]["ShardTransferInfo"])[]; + }; + LocalShardInfo: { + /** + * Format: uint32 + * @description Local shard id + */ + shard_id: number; + /** + * Format: uint + * @description Number of points in the shard + */ + points_count: number; + state: components["schemas"]["ReplicaState"]; + }; + /** + * @description State of the single shard within a replica set. + * @enum {string} + */ + ReplicaState: "Active" | "Dead" | "Partial" | "Initializing" | "Listener"; + RemoteShardInfo: { + /** + * Format: uint32 + * @description Remote shard id + */ + shard_id: number; + /** + * Format: uint64 + * @description Remote peer id + */ + peer_id: number; + state: components["schemas"]["ReplicaState"]; + }; + ShardTransferInfo: { + /** Format: uint32 */ + shard_id: number; + /** Format: uint64 */ + from: number; + /** Format: uint64 */ + to: number; + /** @description If `true` transfer is a synchronization of a replicas If `false` transfer is a moving of a shard from one peer to another */ + sync: boolean; + }; + TelemetryData: { + id: string; + app: components["schemas"]["AppBuildTelemetry"]; + collections: components["schemas"]["CollectionsTelemetry"]; + cluster: components["schemas"]["ClusterTelemetry"]; + requests: components["schemas"]["RequestsTelemetry"]; + }; + AppBuildTelemetry: { + name: string; + version: string; + features?: components["schemas"]["AppFeaturesTelemetry"] | (Record | null); + system?: components["schemas"]["RunningEnvironmentTelemetry"] | (Record | null); + /** Format: date-time */ + startup: string; + }; + AppFeaturesTelemetry: { + debug: boolean; + web_feature: boolean; + service_debug_feature: boolean; + }; + RunningEnvironmentTelemetry: { + distribution?: string | null; + distribution_version?: string | null; + is_docker: boolean; + /** Format: uint */ + cores?: number | null; + /** Format: uint */ + ram_size?: number | null; + /** Format: uint */ + disk_size?: number | null; + cpu_flags: string; + }; + CollectionsTelemetry: { + /** Format: uint */ + number_of_collections: number; + collections?: (components["schemas"]["CollectionTelemetryEnum"])[] | null; + }; + CollectionTelemetryEnum: components["schemas"]["CollectionTelemetry"] | components["schemas"]["CollectionsAggregatedTelemetry"]; + CollectionTelemetry: { + id: string; + /** Format: uint64 */ + init_time_ms: number; + config: components["schemas"]["CollectionConfig"]; + shards: (components["schemas"]["ReplicaSetTelemetry"])[]; + transfers: (components["schemas"]["ShardTransferInfo"])[]; + }; + ReplicaSetTelemetry: { + /** Format: uint32 */ + id: number; + local?: components["schemas"]["LocalShardTelemetry"] | (Record | null); + remote: (components["schemas"]["RemoteShardTelemetry"])[]; + replicate_states: { + [key: string]: components["schemas"]["ReplicaState"] | undefined; + }; + }; + LocalShardTelemetry: { + variant_name?: string | null; + segments: (components["schemas"]["SegmentTelemetry"])[]; + optimizations: components["schemas"]["OptimizerTelemetry"]; + }; + SegmentTelemetry: { + info: components["schemas"]["SegmentInfo"]; + config: components["schemas"]["SegmentConfig"]; + vector_index_searches: (components["schemas"]["VectorIndexSearchesTelemetry"])[]; + payload_field_indices: (components["schemas"]["PayloadIndexTelemetry"])[]; + }; + /** @description Aggregated information about segment */ + SegmentInfo: { + segment_type: components["schemas"]["SegmentType"]; + /** Format: uint */ + num_vectors: number; + /** Format: uint */ + num_points: number; + /** Format: uint */ + num_deleted_vectors: number; + /** Format: uint */ + ram_usage_bytes: number; + /** Format: uint */ + disk_usage_bytes: number; + is_appendable: boolean; + index_schema: { + [key: string]: components["schemas"]["PayloadIndexInfo"] | undefined; + }; + }; + /** + * @description Type of segment + * @enum {string} + */ + SegmentType: "plain" | "indexed" | "special"; + SegmentConfig: { + vector_data: { + [key: string]: components["schemas"]["VectorDataConfig"] | undefined; + }; + index: components["schemas"]["Indexes"]; + storage_type: components["schemas"]["StorageType"]; + payload_storage_type?: components["schemas"]["PayloadStorageType"]; + /** + * @description Quantization parameters. If none - quantization is disabled. + * @default null + */ + quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + }; + /** @description Config of single vector data storage */ + VectorDataConfig: { + /** + * Format: uint + * @description Size of a vectors used + */ + size: number; + distance: components["schemas"]["Distance"]; + /** + * @description Vector specific HNSW config that overrides collection config + * @default null + */ + hnsw_config?: components["schemas"]["HnswConfig"] | (Record | null); + /** + * @description Vector specific quantization config that overrides collection config + * @default null + */ + quantization_config?: components["schemas"]["QuantizationConfig"] | (Record | null); + }; + /** @description Vector index configuration of the segment */ + Indexes: OneOf<[{ + /** @enum {string} */ + type: "plain"; + options: Record; + }, { + /** @enum {string} */ + type: "hnsw"; + options: components["schemas"]["HnswConfig"]; + }]>; + /** @description Type of vector storage */ + StorageType: OneOf<[{ + /** @enum {string} */ + type: "in_memory"; + }, { + /** @enum {string} */ + type: "mmap"; + }]>; + /** @description Type of payload storage */ + PayloadStorageType: OneOf<[{ + /** @enum {string} */ + type: "in_memory"; + }, { + /** @enum {string} */ + type: "on_disk"; + }]>; + VectorIndexSearchesTelemetry: { + index_name?: string | null; + unfiltered_plain: components["schemas"]["OperationDurationStatistics"]; + unfiltered_hnsw: components["schemas"]["OperationDurationStatistics"]; + filtered_plain: components["schemas"]["OperationDurationStatistics"]; + filtered_small_cardinality: components["schemas"]["OperationDurationStatistics"]; + filtered_large_cardinality: components["schemas"]["OperationDurationStatistics"]; + filtered_exact: components["schemas"]["OperationDurationStatistics"]; + unfiltered_exact: components["schemas"]["OperationDurationStatistics"]; + }; + OperationDurationStatistics: { + /** Format: uint */ + count: number; + /** Format: uint */ + fail_count?: number; + /** Format: float */ + avg_duration_micros?: number | null; + /** Format: float */ + min_duration_micros?: number | null; + /** Format: float */ + max_duration_micros?: number | null; + /** Format: date-time */ + last_responded?: string | null; + }; + PayloadIndexTelemetry: { + field_name?: string | null; + /** Format: uint */ + points_values_count: number; + /** Format: uint */ + points_count: number; + /** Format: uint */ + histogram_bucket_size?: number | null; + }; + OptimizerTelemetry: { + status: components["schemas"]["OptimizersStatus"]; + optimizations: components["schemas"]["OperationDurationStatistics"]; + }; + RemoteShardTelemetry: { + /** Format: uint32 */ + shard_id: number; + /** Format: uint64 */ + peer_id?: number | null; + searches: components["schemas"]["OperationDurationStatistics"]; + updates: components["schemas"]["OperationDurationStatistics"]; + }; + CollectionsAggregatedTelemetry: { + /** Format: uint */ + vectors: number; + optimizers_status: components["schemas"]["OptimizersStatus"]; + params: components["schemas"]["CollectionParams"]; + }; + ClusterTelemetry: { + enabled: boolean; + status?: components["schemas"]["ClusterStatusTelemetry"] | (Record | null); + config?: components["schemas"]["ClusterConfigTelemetry"] | (Record | null); + }; + ClusterStatusTelemetry: { + /** Format: uint */ + number_of_peers: number; + /** Format: uint64 */ + term: number; + /** Format: uint64 */ + commit: number; + /** Format: uint */ + pending_operations: number; + role?: components["schemas"]["StateRole"] | (Record | null); + is_voter: boolean; + /** Format: uint64 */ + peer_id?: number | null; + consensus_thread_status: components["schemas"]["ConsensusThreadStatus"]; + }; + ClusterConfigTelemetry: { + /** Format: uint64 */ + grpc_timeout_ms: number; + p2p: components["schemas"]["P2pConfigTelemetry"]; + consensus: components["schemas"]["ConsensusConfigTelemetry"]; + }; + P2pConfigTelemetry: { + /** Format: uint */ + connection_pool_size: number; + }; + ConsensusConfigTelemetry: { + /** Format: uint */ + max_message_queue_size: number; + /** Format: uint64 */ + tick_period_ms: number; + /** Format: uint64 */ + bootstrap_timeout_sec: number; + }; + RequestsTelemetry: { + rest: components["schemas"]["WebApiTelemetry"]; + grpc: components["schemas"]["GrpcTelemetry"]; + }; + WebApiTelemetry: { + responses: { + [key: string]: ({ + [key: string]: components["schemas"]["OperationDurationStatistics"] | undefined; + }) | undefined; + }; + }; + GrpcTelemetry: { + responses: { + [key: string]: components["schemas"]["OperationDurationStatistics"] | undefined; + }; + }; + ClusterOperations: components["schemas"]["MoveShardOperation"] | components["schemas"]["ReplicateShardOperation"] | components["schemas"]["AbortTransferOperation"] | components["schemas"]["DropReplicaOperation"]; + MoveShardOperation: { + move_shard: components["schemas"]["MoveShard"]; + }; + MoveShard: { + /** Format: uint32 */ + shard_id: number; + /** Format: uint64 */ + to_peer_id: number; + /** Format: uint64 */ + from_peer_id: number; + }; + ReplicateShardOperation: { + replicate_shard: components["schemas"]["MoveShard"]; + }; + AbortTransferOperation: { + abort_transfer: components["schemas"]["MoveShard"]; + }; + DropReplicaOperation: { + drop_replica: components["schemas"]["Replica"]; + }; + Replica: { + /** Format: uint32 */ + shard_id: number; + /** Format: uint64 */ + peer_id: number; + }; + SearchRequestBatch: { + searches: (components["schemas"]["SearchRequest"])[]; + }; + RecommendRequestBatch: { + searches: (components["schemas"]["RecommendRequest"])[]; + }; + LocksOption: { + error_message?: string | null; + write: boolean; + }; + SnapshotRecover: { + /** + * Format: uri + * @description Examples: - URL `http://localhost:8080/collections/my_collection/snapshots/my_snapshot` - Local path `file:///qdrant/snapshots/test_collection-2022-08-04-10-49-10.snapshot` + */ + location: string; + /** + * @description Defines which data should be used as a source of truth if there are other replicas in the cluster. If set to `Snapshot`, the snapshot will be used as a source of truth, and the current state will be overwritten. If set to `Replica`, the current state will be used as a source of truth, and after recovery if will be synchronized with the snapshot. + * @default null + */ + priority?: components["schemas"]["SnapshotPriority"] | (Record | null); + }; + /** + * @description Defines source of truth for snapshot recovery `Snapshot` means - prefer snapshot data over the current state `Replica` means - prefer existing data over the snapshot + * @enum {string} + */ + SnapshotPriority: "snapshot" | "replica"; + CollectionsAliasesResponse: { + aliases: (components["schemas"]["AliasDescription"])[]; + }; + AliasDescription: { + alias_name: string; + collection_name: string; + }; + /** + * @description Defines write ordering guarantees for collection operations + * + * * `weak` - write operations may be reordered, works faster, default + * + * * `medium` - write operations go through dynamically selected leader, may be inconsistent for a short period of time in case of leader change + * + * * `strong` - Write operations go through the permanent leader, consistent, but may be unavailable if leader is down + * @enum {string} + */ + WriteOrdering: "weak" | "medium" | "strong"; + /** + * @description Read consistency parameter + * + * Defines how many replicas should be queried to get the result + * + * * `N` - send N random request and return points, which present on all of them + * + * * `majority` - send N/2+1 random request and return points, which present on all of them + * + * * `quorum` - send requests to all nodes and return points which present on majority of them + * + * * `all` - send requests to all nodes and return points which present on all of them + * + * Default value is `Factor(1)` + */ + ReadConsistency: number | components["schemas"]["ReadConsistencyType"]; + /** + * @description * `majority` - send N/2+1 random request and return points, which present on all of them + * + * * `quorum` - send requests to all nodes and return points which present on majority of nodes + * + * * `all` - send requests to all nodes and return points which present on all nodes + * @enum {string} + */ + ReadConsistencyType: "majority" | "quorum" | "all"; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} + +export type external = Record; + +export interface operations { + + /** + * Collect telemetry data + * @description Collect telemetry data including app info, system info, collections info, cluster info, configs and statistics + */ + telemetry: { + parameters: { + query: { + /** @description If true, anonymize result */ + anonymize?: boolean; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["TelemetryData"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Collect Prometheus metrics data + * @description Collect metrics data including app info, collections info, cluster info and statistics + */ + metrics: { + parameters: { + query: { + /** @description If true, anonymize result */ + anonymize?: boolean; + }; + }; + responses: { + /** @description Metrics data in Prometheus format */ + 200: { + content: { + "text/plain": string; + }; + }; + /** @description error */ + "4XX": never; + }; + }; + /** + * Get lock options + * @description Get lock options. If write is locked, all write operations and collection creation are forbidden + */ + get_locks: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["LocksOption"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Set lock options + * @description Set lock options. If write is locked, all write operations and collection creation are forbidden. Returns previous lock options + */ + post_locks: { + /** @description Lock options and optional error message */ + requestBody?: { + content: { + "application/json": components["schemas"]["LocksOption"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["LocksOption"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Get cluster status info + * @description Get information about the current state and composition of the cluster + */ + cluster_status: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["ClusterStatus"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** Tries to recover current peer Raft state. */ + recover_current_peer: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Remove peer from the cluster + * @description Tries to remove peer from the cluster. Will return an error if peer has shards on it. + */ + remove_peer: { + parameters: { + query: { + /** @description If true - removes peer even if it has shards/replicas on it. */ + force?: boolean; + }; + path: { + /** @description Id of the peer */ + peer_id: number; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * List collections + * @description Get list name of all existing collections + */ + get_collections: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["CollectionsResponse"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Collection info + * @description Get detailed information about specified existing collection + */ + get_collection: { + parameters: { + path: { + /** @description Name of the collection to retrieve */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["CollectionInfo"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Create collection + * @description Create new collection with given parameters + */ + create_collection: { + parameters: { + query: { + /** + * @description Wait for operation commit timeout in seconds. + * If timeout is reached - request will return with service error. + */ + timeout?: number; + }; + path: { + /** @description Name of the new collection */ + collection_name: string; + }; + }; + /** @description Parameters of a new collection */ + requestBody?: { + content: { + "application/json": components["schemas"]["CreateCollection"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Delete collection + * @description Drop collection and all associated data + */ + delete_collection: { + parameters: { + query: { + /** + * @description Wait for operation commit timeout in seconds. + * If timeout is reached - request will return with service error. + */ + timeout?: number; + }; + path: { + /** @description Name of the collection to delete */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Update collection parameters + * @description Update parameters of the existing collection + */ + update_collection: { + parameters: { + query: { + /** + * @description Wait for operation commit timeout in seconds. + * If timeout is reached - request will return with service error. + */ + timeout?: number; + }; + path: { + /** @description Name of the collection to update */ + collection_name: string; + }; + }; + /** @description New parameters */ + requestBody?: { + content: { + "application/json": components["schemas"]["UpdateCollection"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** Update aliases of the collections */ + update_aliases: { + parameters: { + query: { + /** + * @description Wait for operation commit timeout in seconds. + * If timeout is reached - request will return with service error. + */ + timeout?: number; + }; + }; + /** @description Alias update operations */ + requestBody?: { + content: { + "application/json": components["schemas"]["ChangeAliasesOperation"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Create index for field in collection + * @description Create index for field in collection + */ + create_field_index: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection */ + collection_name: string; + }; + }; + /** @description Field name */ + requestBody?: { + content: { + "application/json": components["schemas"]["CreateFieldIndex"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Delete index for field in collection + * @description Delete field index for collection + */ + delete_field_index: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection */ + collection_name: string; + /** @description Name of the field where to delete the index */ + field_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Collection cluster info + * @description Get cluster information for a collection + */ + collection_cluster_info: { + parameters: { + path: { + /** @description Name of the collection to retrieve the cluster info for */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["CollectionClusterInfo"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** Update collection cluster setup */ + update_collection_cluster: { + parameters: { + query: { + /** + * @description Wait for operation commit timeout in seconds. + * If timeout is reached - request will return with service error. + */ + timeout?: number; + }; + path: { + /** @description Name of the collection on which to to apply the cluster update operation */ + collection_name: string; + }; + }; + /** @description Collection cluster update operations */ + requestBody?: { + content: { + "application/json": components["schemas"]["ClusterOperations"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * List aliases for collection + * @description Get list of all aliases for a collection + */ + get_collection_aliases: { + parameters: { + path: { + /** @description Name of the collection */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["CollectionsAliasesResponse"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * List collections aliases + * @description Get list of all existing collections aliases + */ + get_collections_aliases: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["CollectionsAliasesResponse"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Recover from an uploaded snapshot + * @description Recover local collection data from an uploaded snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created. + */ + recover_from_uploaded_snapshot: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen. If false - let changes happen in background. Default is true. */ + wait?: boolean; + /** @description Defines source of truth for snapshot recovery */ + priority?: components["schemas"]["SnapshotPriority"]; + }; + path: { + /** @description Name of the collection */ + collection_name: string; + }; + }; + /** @description Snapshot to recover from */ + requestBody?: { + content: { + "multipart/form-data": { + /** Format: binary */ + snapshot?: string; + }; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description operation is accepted */ + 202: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "accepted"; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Recover from a snapshot + * @description Recover local collection data from a snapshot. This will overwrite any data, stored on this node, for the collection. If collection does not exist - it will be created. + */ + recover_from_snapshot: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen. If false - let changes happen in background. Default is true. */ + wait?: boolean; + }; + path: { + /** @description Name of the collection */ + collection_name: string; + }; + }; + /** @description Snapshot to recover from */ + requestBody?: { + content: { + "application/json": components["schemas"]["SnapshotRecover"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description operation is accepted */ + 202: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "accepted"; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * List collection snapshots + * @description Get list of snapshots for a collection + */ + list_snapshots: { + parameters: { + path: { + /** @description Name of the collection */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: (components["schemas"]["SnapshotDescription"])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Create collection snapshot + * @description Create new snapshot for a collection + */ + create_snapshot: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen. If false - let changes happen in background. Default is true. */ + wait?: boolean; + }; + path: { + /** @description Name of the collection for which to create a snapshot */ + collection_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["SnapshotDescription"]; + }; + }; + }; + /** @description operation is accepted */ + 202: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "accepted"; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Download collection snapshot + * @description Download specified snapshot from a collection as a file + */ + get_snapshot: { + parameters: { + path: { + /** @description Name of the collection */ + collection_name: string; + /** @description Name of the snapshot to download */ + snapshot_name: string; + }; + }; + responses: { + /** @description Snapshot file */ + 200: { + content: { + "application/octet-stream": string; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Delete collection snapshot + * @description Delete snapshot for a collection + */ + delete_snapshot: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen. If false - let changes happen in background. Default is true. */ + wait?: boolean; + }; + path: { + /** @description Name of the collection for which to delete a snapshot */ + collection_name: string; + /** @description Name of the snapshot to delete */ + snapshot_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description operation is accepted */ + 202: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "accepted"; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * List of storage snapshots + * @description Get list of snapshots of the whole storage + */ + list_full_snapshots: { + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: (components["schemas"]["SnapshotDescription"])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Create storage snapshot + * @description Create new snapshot of the whole storage + */ + create_full_snapshot: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen. If false - let changes happen in background. Default is true. */ + wait?: boolean; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["SnapshotDescription"]; + }; + }; + }; + /** @description operation is accepted */ + 202: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "accepted"; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Download storage snapshot + * @description Download specified snapshot of the whole storage as a file + */ + get_full_snapshot: { + parameters: { + path: { + /** @description Name of the snapshot to download */ + snapshot_name: string; + }; + }; + responses: { + /** @description Snapshot file */ + 200: { + content: { + "application/octet-stream": string; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Delete storage snapshot + * @description Delete snapshot of the whole storage + */ + delete_full_snapshot: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen. If false - let changes happen in background. Default is true. */ + wait?: boolean; + }; + path: { + /** @description Name of the full snapshot to delete */ + snapshot_name: string; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: boolean; + }; + }; + }; + /** @description operation is accepted */ + 202: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "accepted"; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Get point + * @description Retrieve full information of single point by id + */ + get_point: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to retrieve from */ + collection_name: string; + /** @description Id of the point */ + id: components["schemas"]["ExtendedPointId"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["Record"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Upsert points + * @description Perform insert + updates on points. If point with given ID already exists - it will be overwritten. + */ + upsert_points: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection to update from */ + collection_name: string; + }; + }; + /** @description Operation to perform on points */ + requestBody?: { + content: { + "application/json": components["schemas"]["PointInsertOperations"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Get points + * @description Retrieve multiple points by specified IDs + */ + get_points: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to retrieve from */ + collection_name: string; + }; + }; + /** @description List of points to retrieve */ + requestBody?: { + content: { + "application/json": components["schemas"]["PointRequest"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: (components["schemas"]["Record"])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Delete points + * @description Delete points + */ + delete_points: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection to delete from */ + collection_name: string; + }; + }; + /** @description Operation to perform on points */ + requestBody?: { + content: { + "application/json": components["schemas"]["PointsSelector"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Overwrite payload + * @description Replace full payload of points with new one + */ + overwrite_payload: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection to set from */ + collection_name: string; + }; + }; + /** @description Payload and points selector */ + requestBody?: { + content: { + "application/json": components["schemas"]["SetPayload"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Set payload + * @description Set payload values for points + */ + set_payload: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection to set from */ + collection_name: string; + }; + }; + /** @description Set payload on points */ + requestBody?: { + content: { + "application/json": components["schemas"]["SetPayload"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Delete payload + * @description Delete specified key payload for points + */ + delete_payload: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection to delete from */ + collection_name: string; + }; + }; + /** @description delete payload on points */ + requestBody?: { + content: { + "application/json": components["schemas"]["DeletePayload"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Clear payload + * @description Remove all payload for specified points + */ + clear_payload: { + parameters: { + query: { + /** @description If true, wait for changes to actually happen */ + wait?: boolean; + /** @description define ordering guarantees for the operation */ + ordering?: components["schemas"]["WriteOrdering"]; + }; + path: { + /** @description Name of the collection to clear payload from */ + collection_name: string; + }; + }; + /** @description clear payload on points */ + requestBody?: { + content: { + "application/json": components["schemas"]["PointsSelector"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["UpdateResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Scroll points + * @description Scroll request - paginate over all points which matches given filtering condition + */ + scroll_points: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to retrieve from */ + collection_name: string; + }; + }; + /** @description Pagination and filter parameters */ + requestBody?: { + content: { + "application/json": components["schemas"]["ScrollRequest"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["ScrollResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Search points + * @description Retrieve closest points based on vector similarity and given filtering conditions + */ + search_points: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to search in */ + collection_name: string; + }; + }; + /** @description Search request with optional filtering */ + requestBody?: { + content: { + "application/json": components["schemas"]["SearchRequest"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: (components["schemas"]["ScoredPoint"])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Search batch points + * @description Retrieve by batch the closest points based on vector similarity and given filtering conditions + */ + search_batch_points: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to search in */ + collection_name: string; + }; + }; + /** @description Search batch request */ + requestBody?: { + content: { + "application/json": components["schemas"]["SearchRequestBatch"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: ((components["schemas"]["ScoredPoint"])[])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Recommend points + * @description Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + recommend_points: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to search in */ + collection_name: string; + }; + }; + /** @description Request points based on positive and negative examples. */ + requestBody?: { + content: { + "application/json": components["schemas"]["RecommendRequest"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: (components["schemas"]["ScoredPoint"])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Recommend batch points + * @description Look for the points which are closer to stored positive examples and at the same time further to negative examples. + */ + recommend_batch_points: { + parameters: { + query: { + /** @description Define read consistency guarantees for the operation */ + consistency?: components["schemas"]["ReadConsistency"]; + }; + path: { + /** @description Name of the collection to search in */ + collection_name: string; + }; + }; + /** @description Request points based on positive and negative examples. */ + requestBody?: { + content: { + "application/json": components["schemas"]["RecommendRequestBatch"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: ((components["schemas"]["ScoredPoint"])[])[]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; + /** + * Count points + * @description Count points which matches given filtering condition + */ + count_points: { + parameters: { + path: { + /** @description Name of the collection to count in */ + collection_name: string; + }; + }; + /** @description Request counts of points which matches given filtering condition */ + requestBody?: { + content: { + "application/json": components["schemas"]["CountRequest"]; + }; + }; + responses: { + /** @description successful operation */ + 200: { + content: { + "application/json": { + /** + * Format: float + * @description Time spent to process this request + */ + time?: number; + /** @enum {string} */ + status?: "ok"; + result?: components["schemas"]["CountResult"]; + }; + }; + }; + /** @description error */ + default: { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + /** @description error */ + "4XX": { + content: { + "application/json": components["schemas"]["ErrorResponse"]; + }; + }; + }; + }; +} diff --git a/packages/js-client-rest/src/qdrant-client.ts b/packages/js-client-rest/src/qdrant-client.ts new file mode 100644 index 0000000..f60d227 --- /dev/null +++ b/packages/js-client-rest/src/qdrant-client.ts @@ -0,0 +1,1163 @@ +import {maybe} from '@sevinf/maybe'; +import {OpenApiClient, createApis} from './api-client.js'; +import {QdrantClientNotImplementedError, QdrantClientConfigError} from './errors.js'; +import {RestArgs, SchemaFor} from './types.js'; + +export type QdrantClientParams = { + port?: number | null; + apiKey?: string; + https?: boolean; + prefix?: string; + url?: string; + host?: string; + timeout?: number; + headers?: Record; +}; + +export class QdrantClient { + private _https: boolean; + private _scheme: string; + private _port: number | null; + private _prefix: string; + private _host: string; + private _openApiClient: OpenApiClient; + private _restUri: string; + + constructor({url, host, apiKey, https, prefix, port = 6333, timeout = 300_000, ...args}: QdrantClientParams = {}) { + this._https = https ?? typeof apiKey === 'string'; + this._scheme = this._https ? 'https' : 'http'; + this._prefix = prefix ?? ''; + + if (this._prefix.length > 0 && !this._prefix.startsWith('/')) { + this._prefix = `/${this._prefix}`; + } + + if (url && host) { + throw new QdrantClientConfigError( + `Only one of \`url\`, \`host\` params can be set. Url is ${url}, host is ${host}`, + ); + } + if (host && (host.startsWith('http://') || host.startsWith('https://') || /:\d+$/.test(host))) { + throw new QdrantClientConfigError( + 'The `host` param is not expected to contain neither protocol (http:// or https://) nor port (:6333).\n' + + 'Try to use the `url` parameter instead.', + ); + } else if (url) { + if (!(url.startsWith('http://') || url.startsWith('https://'))) { + throw new QdrantClientConfigError( + 'The `url` param expected to contain a valid URL starting with a protocol (http:// or https://).', + ); + } + const parsedUrl = new URL(url); + this._host = parsedUrl.hostname; + this._port = parsedUrl.port ? Number(parsedUrl.port) : port; + this._scheme = parsedUrl.protocol.replace(':', ''); + + if (this._prefix.length > 0 && parsedUrl.pathname !== '/') { + throw new QdrantClientConfigError( + 'Prefix can be set either in `url` or in `prefix`.\n' + + `url is ${url}, prefix is ${parsedUrl.pathname}`, + ); + } + } else { + this._port = port; + this._host = host ?? 'localhost'; + } + + const headers = new Headers(); + + const metadata = args.headers ?? {}; + Object.keys(metadata).forEach((field) => { + if (metadata[field]) { + headers.set(field, String(metadata[field])); + } + }); + + if (typeof apiKey === 'string') { + if (this._scheme === 'http') { + console.warn('Api key is used with unsecure connection.'); + } + headers.set('api-key', apiKey); + } + + const address = this._port ? `${this._host}:${this._port}` : this._host; + this._restUri = `${this._scheme}://${address}${this._prefix}`; + const restArgs: RestArgs = {headers, timeout}; + + this._openApiClient = createApis(this._restUri, restArgs); + } + + /** + * API getter + * + * @param string Name of api + * @returns An instance of a namespaced API, generated from OpenAPI schema. + */ + api(name: T): OpenApiClient[T] { + return this._openApiClient[name]; + } + + /** + * Search for points in multiple collections + * + * @param collection_name Name of the collection + * @param {object} args - + * - searches: List of search requests + * - consistency: Read consistency of the search. Defines how many replicas should be queried before returning the result. + * Values: + * number - number of replicas to query, values should present in all queried replicas + * 'majority' - query all replicas, but return values present in the majority of replicas + * 'quorum' - query the majority of replicas, return values present in all of them + * 'all' - query all replicas, and return values present in all replicas + * @returns List of search responses + */ + async searchBatch( + collection_name: string, + { + searches, + consistency, + }: Pick, 'searches'> & {consistency?: SchemaFor<'ReadConsistency'>}, + ) { + const response = await this._openApiClient.points.searchBatchPoints({ + collection_name, + consistency, + searches, + }); + return maybe(response.data.result).orThrow('Search batch returned empty'); + } + + /** + * Search for closest vectors in collection taking into account filtering conditions + * + * @param collection_name Collection to search in + * @param {object} args - + * - vector: + * Search for vectors closest to this. + * Can be either a vector itself, or a named vector, or a tuple of vector name and vector itself + * - filter: + * - Exclude vectors which doesn't fit given conditions. + * - If `None` - search among all vectors + * - params: Additional search params + * - limit: How many results return + * - offset: + * Offset of the first result to return. + * May be used to paginate results. + * Note: large offset values may cause performance issues. + * - with_payload: + * - Specify which stored payload should be attached to the result. + * - If `True` - attach all payload + * - If `False` - do not attach any payload + * - If List of string - include only specified fields + * - If `PayloadSelector` - use explicit rules + * - with_vectors: + * - If `True` - Attach stored vector to the search result. + * - If `False` - Do not attach vector. + * - If List of string - include only specified fields + * - Default: `False` + * - score_threshold: + * Define a minimal score threshold for the result. + * If defined, less similar results will not be returned. + * Score of the returned result might be higher or smaller than the threshold depending + * on the Distance function used. + * E.g. for cosine similarity only higher scores will be returned. + * - consistency: + * Read consistency of the search. Defines how many replicas should be queried before returning the result. + * Values: + * - int - number of replicas to query, values should present in all queried replicas + * - 'majority' - query all replicas, but return values present in the majority of replicas + * - 'quorum' - query the majority of replicas, return values present in all of them + * - 'all' - query all replicas, and return values present in all replicas + * @example + * // Search with filter + * qdrant.search( + * collection_name: "test_collection", + * vector: [1.0, 0.1, 0.2, 0.7], + * filter: { + * must: [ + * { + * key: 'color', + * range: { + * color: 'red' + * } + * } + * ] + * ) + * ) + * @returns List of found close points with similarity scores. + */ + async search( + collection_name: string, + { + vector, + limit = 10, + offset = 0, + filter, + params, + with_payload = true, + with_vector = false, + score_threshold, + consistency, + }: Omit, 'limit'> & + Partial, 'limit'>> & {consistency?: SchemaFor<'ReadConsistency'>}, + ) { + const response = await this._openApiClient.points.searchPoints({ + collection_name, + consistency, + vector, + limit, + offset, + filter, + params, + with_payload, + with_vector, + score_threshold, + }); + return maybe(response.data.result).orThrow('Search returned empty'); + } + + /** + * Perform multiple recommend requests in batch mode + * @param collection_name Name of the collection + * @param {object} args + * - searches: List of recommend requests + * - consistency: + * Read consistency of the search. Defines how many replicas should be queried before returning the result. + * Values: + * - number - number of replicas to query, values should present in all queried replicas + * - 'majority' - query all replicas, but return values present in the majority of replicas + * - 'quorum' - query the majority of replicas, return values present in all of them + * - 'all' - query all replicas, and return values present in all replicas + * @returns List of recommend responses + */ + async recommend_batch( + collection_name: string, + {searches, consistency}: SchemaFor<'RecommendRequestBatch'> & {consistency?: SchemaFor<'ReadConsistency'>}, + ) { + const response = await this._openApiClient.points.recommendBatchPoints({ + collection_name, + searches, + consistency, + }); + return maybe(response.data.result).orElse([]); + } + + /** + * Recommend points: search for similar points based on already stored in Qdrant examples. + * Provide IDs of the stored points, and Qdrant will perform search based on already existing vectors. + * This functionality is especially useful for recommendation over existing collection of points. + * @param collection_name Collection to search in + * @param {object} args + * - positive: + * List of stored point IDs, which should be used as reference for similarity search. + * If there is only one ID provided - this request is equivalent to the regular search with vector of that point. + * If there are more than one IDs, Qdrant will attempt to search for similar to all of them. + * Recommendation for multiple vectors is experimental. Its behaviour may change in the future. + * - negative: + * List of stored point IDs, which should be dissimilar to the search result. + * Negative examples is an experimental functionality. Its behaviour may change in the future. + * - query_filter: + * - Exclude vectors which doesn't fit given conditions. + * - If `None` - search among all vectors + * - search_params: Additional search params + * - limit: How many results return + * - Default: `10` + * - offset: + * Offset of the first result to return. + * May be used to paginate results. + * Note: large offset values may cause performance issues. + * - Default: `0` + * - with_payload: + * - Specify which stored payload should be attached to the result. + * - If `True` - attach all payload + * - If `False` - do not attach any payload + * - If List of string - include only specified fields + * - If `PayloadSelector` - use explicit rules + * - Default: `true` + * - with_vectors: + * - If `True` - Attach stored vector to the search result. + * - If `False` - Do not attach vector. + * - If List of string - include only specified fields + * - Default: `false` + * - score_threshold: + * Define a minimal score threshold for the result. + * If defined, less similar results will not be returned. + * Score of the returned result might be higher or smaller than the threshold depending + * on the Distance function used. + * E.g. for cosine similarity only higher scores will be returned. + * - using: + * Name of the vectors to use for recommendations. + * If `None` - use default vectors. + * - lookup_from: + * Defines a location (collection and vector field name), used to lookup vectors for recommendations. + * If `None` - use current collection will be used. + * - consistency: + * Read consistency of the search. Defines how many replicas should be queried before returning the result. + * Values: + * - int - number of replicas to query, values should present in all queried replicas + * - 'majority' - query all replicas, but return values present in the majority of replicas + * - 'quorum' - query the majority of replicas, return values present in all of them + * - 'all' - query all replicas, and return values present in all replicas + * @returns List of recommended points with similarity scores. + */ + async recommend( + collection_name: string, + { + positive, + negative, + filter, + params, + limit = 10, + offset = 0, + with_payload = true, + with_vector = false, + score_threshold, + using, + lookup_from, + consistency, + }: Omit, 'limit'> & + Partial, 'limit'>> & {consistency?: SchemaFor<'ReadConsistency'>}, + ) { + const response = await this._openApiClient.points.recommendPoints({ + collection_name, + limit, + positive, + negative, + filter, + params, + offset, + with_payload, + with_vector, + score_threshold, + using, + lookup_from, + consistency, + }); + return maybe(response.data.result).orThrow('Recommend points API returned empty'); + } + + /** + * Scroll over all (matching) points in the collection. + * @param collection_name Name of the collection + * @param {object} args + * - scroll_filter: If provided - only returns points matching filtering conditions + * - limit: How many points to return + * - offset: If provided - skip points with ids less than given `offset` + * - with_payload: + * - Specify which stored payload should be attached to the result. + * - If `True` - attach all payload + * - If `False` - do not attach any payload + * - If List of string - include only specified fields + * - If `PayloadSelector` - use explicit rules + * - Default: `true` + * with_vectors: + * - If `True` - Attach stored vector to the search result. + * - If `False` - Do not attach vector. + * - If List of string - include only specified fields + * - Default: `false` + * consistency: + * Read consistency of the search. Defines how many replicas should be queried before returning the result. + * Values: + * - int - number of replicas to query, values should present in all queried replicas + * - 'majority' - query all replicas, but return values present in the majority of replicas + * - 'quorum' - query the majority of replicas, return values present in all of them + * - 'all' - query all replicas, and return values present in all replicas + * @returns + * A pair of (List of points) and (optional offset for the next scroll request). + * If next page offset is `None` - there is no more points in the collection to scroll. + */ + async scroll( + collection_name: string, + { + filter, + consistency, + limit = 10, + with_payload = true, + with_vector = false, + }: SchemaFor<'ScrollRequest'> & {consistency?: SchemaFor<'ReadConsistency'>} = {}, + ) { + const response = await this._openApiClient.points.scrollPoints({ + collection_name, + limit, + filter, + with_payload, + with_vector, + consistency, + }); + return maybe(response.data.result).orThrow('Scroll points API returned empty'); + } + + /** + * Count points in the collection. + * Count points in the collection matching the given filter. + * @param collection_name + * @param {object} args + * - count_filter: filtering conditions + * - exact: + * If `True` - provide the exact count of points matching the filter. + * If `False` - provide the approximate count of points matching the filter. Works faster. + * Default: `true` + * @returns Amount of points in the collection matching the filter. + */ + async count(collection_name: string, {filter, exact = true}: SchemaFor<'CountRequest'> = {}) { + const response = await this._openApiClient.points.countPoints({ + collection_name, + filter, + exact, + }); + return maybe(response.data.result).orThrow('Count points returned empty'); + } + + /** + * Update or insert a new point into the collection. + * @param collection_name + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - Default: `true` + * - ordering: Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * - points: Batch or list of points to insert + * @returns Operation result + */ + async upsert( + collection_name: string, + { + wait = true, + ordering, + ...points_or_batch + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'PointInsertOperations'>, + ) { + const response = await this._openApiClient.points.upsertPoints({ + collection_name, + wait, + ordering, + ...points_or_batch, + }); + return maybe(response.data.result).orThrow('Upsert returned empty'); + } + + /** + * Retrieve stored points by IDs + * @param collection_name + * @param {object} args + * - ids: list of IDs to lookup + * - with_payload: + * - Specify which stored payload should be attached to the result. + * - If `True` - attach all payload + * - If `False` - do not attach any payload + * - If List of string - include only specified fields + * - If `PayloadSelector` - use explicit rules + * - Default: `true` + * - with_vectors: + * - If `True` - Attach stored vector to the search result. + * - If `False` - Do not attach vector. + * - If List of string - Attach only specified vectors. + * - Default: `false` + * - consistency: + * Read consistency of the search. Defines how many replicas should be queried before returning the result. + * Values: + * - number - number of replicas to query, values should present in all queried replicas + * - 'majority' - query all replicas, but return values present in the majority of replicas + * - 'quorum' - query the majority of replicas, return values present in all of them + * - 'all' - query all replicas, and return values present in all replicas + * @returns List of points + */ + async retrieve( + collection_name: string, + { + ids, + with_payload = true, + with_vector, + consistency, + }: SchemaFor<'PointRequest'> & {consistency?: SchemaFor<'ReadConsistency'>}, + ) { + const response = await this._openApiClient.points.getPoints({ + collection_name, + ids, + with_payload, + with_vector, + consistency, + }); + return maybe(response.data.result).orThrow('Retrieve API returned empty'); + } + + /** + * Deletes selected points from collection + * @param collection_name Name of the collection + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * - points_selector: List of affected points, filter or points selector. + * Example: + * - `points: [ + * 1, 2, 3, "cd3b53f0-11a7-449f-bc50-d06310e7ed90" + * ]` + * - `filter: { + * must: [ + * { + * key: 'rand_number', + * range: { + * gte: 0.7 + * } + * } + * ] + * }` + * @returns Operation result + */ + async delete( + collection_name: string, + { + wait, + ordering, + ...points_selector + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'PointsSelector'>, + ) { + const response = await this._openApiClient.points.deletePoints({ + collection_name, + wait, + ordering, + ...points_selector, + }); + return maybe(response.data.result).orThrow('Delete points returned empty'); + } + + /** + * Overwrites payload of the specified points + * After this operation is applied, only the specified payload will be present in the point. + * The existing payload, even if the key is not specified in the payload, will be deleted. + * @param collection_name Name of the collection + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * - payload: Key-value pairs of payload to assign + * - points|filter: List of affected points, filter or points selector. + * Example: + * - `points: [ + * 1, 2, 3, "cd3b53f0-11a7-449f-bc50-d06310e7ed90" + * ]` + * - `filter: { + * must: [ + * { + * key: 'rand_number', + * range: { + * gte: 0.7 + * } + * } + * ] + * }` + * @returns Operation result + */ + async setPayload( + collection_name: string, + { + payload, + points, + filter, + ordering, + wait = true, + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'SetPayload'>, + ) { + const response = await this._openApiClient.points.setPayload({ + collection_name, + payload, + points, + filter, + wait, + ordering, + }); + return maybe(response.data.result).orThrow('Set payload returned empty'); + } + + /** + * Overwrites payload of the specified points + * After this operation is applied, only the specified payload will be present in the point. + * The existing payload, even if the key is not specified in the payload, will be deleted. + * @param collection_name Name of the collection + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * - payload: Key-value pairs of payload to assign + * - points|filter: List of affected points, filter or points selector. + * Example: + * - `points: [ + * 1, 2, 3, "cd3b53f0-11a7-449f-bc50-d06310e7ed90" + * ]` + * - `filter: { + * must: [ + * { + * key: 'rand_number', + * range: { + * gte: 0.7 + * } + * } + * ] + * }` + * @returns Operation result + */ + async overwritePayload( + collection_name: string, + { + ordering, + payload, + points, + filter, + wait = true, + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'SetPayload'>, + ) { + const response = await this._openApiClient.points.overwritePayload({ + collection_name, + payload, + points, + filter, + wait, + ordering, + }); + return maybe(response.data.result).orThrow('Overwrite payload returned empty'); + } + + /** + * Remove values from point's payload + * @param collection_name Name of the collection + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * - keys: List of payload keys to remove. + * - points|filter: List of affected points, filter or points selector. + * Example: + * - `points: [ + * 1, 2, 3, "cd3b53f0-11a7-449f-bc50-d06310e7ed90" + * ]` + * - `filter: { + * must: [ + * { + * key: 'rand_number', + * range: { + * gte: 0.7 + * } + * } + * ] + * }` + * @returns Operation result + */ + async deletePayload( + collection_name: string, + { + ordering, + keys, + points, + filter, + wait = true, + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'PointsSelector'> & + SchemaFor<'DeletePayload'>, + ) { + const response = await this._openApiClient.points.deletePayload({ + collection_name, + keys, + points, + filter, + wait, + ordering, + }); + return maybe(response.data.result).orThrow('Delete payload returned empty'); + } + + /** + * Delete all payload for selected points + * @param collection_name Name of the collection + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * - points_selector: List of affected points, filter or points selector. + * Example: + * - `points: [ + * 1, 2, 3, "cd3b53f0-11a7-449f-bc50-d06310e7ed90" + * ]` + * - `filter: { + * must: [ + * { + * key: 'rand_number', + * range: { + * gte: 0.7 + * } + * } + * ] + * }` + * @returns Operation result + */ + async clearPayload( + collection_name: string, + { + ordering, + wait = true, + ...points_selector + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'PointsSelector'>, + ) { + const response = await this._openApiClient.points.clearPayload({ + collection_name, + wait, + ordering, + ...points_selector, + }); + return maybe(response.data.result).orThrow('Clear payload returned empty'); + } + + /** + * Operation for performing changes of collection aliases. + * Alias changes are atomic, meaning that no collection modifications can happen between alias operations. + * @param {object} args + * - actions: List of operations to perform + * - timeout: Wait for operation commit timeout in seconds. If timeout is reached, request will return with service error. + * @returns Operation result + */ + async updateCollectionAliases({actions, timeout}: {timeout?: number} & SchemaFor<'ChangeAliasesOperation'>) { + const response = await this._openApiClient.collections.updateAliases({actions, timeout}); + return maybe(response.data.result).orThrow('Update aliases returned empty'); + } + + /** + * Get collection aliases + * @param collection_name Name of the collection + * @returns Collection aliases + */ + async getCollectionAliases(collection_name: string) { + const response = await this._openApiClient.collections.getCollectionAliases({collection_name}); + return maybe(response.data.result).orThrow('Get collection aliases returned empty'); + } + + /** + * Get all aliases + * @returns All aliases of all collections + */ + async getAliases() { + const response = await this._openApiClient.collections.getCollectionsAliases({}); + return maybe(response.data.result).orThrow('Get aliases returned empty'); + } + + /** + * Get list name of all existing collections + * @returns List of the collections + */ + async getCollections() { + const response = await this._openApiClient.collections.getCollections({}); + return maybe(response.data.result).orThrow('Get collections returned empty'); + } + + /** + * Get detailed information about specified existing collection + * + * @param collection_name Name of the collection + * @returns Detailed information about the collection + */ + async getCollection(collection_name: string) { + const response = await this._openApiClient.collections.getCollection({collection_name}); + return maybe(response.data.result).orThrow('Get collection returned empty'); + } + + /** + * Update parameters of the collection + * + * @param collection_name Name of the collection + * @param {object} args + * - optimizer_config: Override for optimizer configuration + * - collection_params: Override for collection parameters + * - timeout: Wait for operation commit timeout in seconds. If timeout is reached, request will return with service error. + * @returns Operation result + */ + async updateCollection(collection_name: string, args?: SchemaFor<'UpdateCollection'> & {timeout?: number}) { + const response = await this._openApiClient.collections.updateCollection({ + collection_name, + ...args, + }); + return maybe(response.data.result).orThrow('Update collection returned empty'); + } + + /** + * Removes collection and all it's data + * @param collection_name Name of the collection to delete + * @param {object} args + * - timeout: + * Wait for operation commit timeout in seconds. + * If timeout is reached, request will return with service error. + * @returns Operation result + */ + async deleteCollection(collection_name: string, args?: {timeout?: number}) { + const response = await this._openApiClient.collections.deleteCollection({collection_name, ...args}); + return maybe(response.data.result).orThrow('Delete collection returned empty'); + } + + /** + * Create empty collection with given parameters + * @returns Operation result + * @param collection_name Name of the collection to recreate + * @param {object} args + * - vectors_config: + * Configuration of the vector storage. Vector params contains size and distance for the vector storage. + * If dict is passed, service will create a vector storage for each key in the dict. + * If single VectorParams is passed, service will create a single anonymous vector storage. + * - shard_number: Number of shards in collection. Default is 1, minimum is 1. + * - replication_factor: + * Replication factor for collection. Default is 1, minimum is 1. + * Defines how many copies of each shard will be created. + * Have effect only in distributed mode. + * - write_consistency_factor: + * Write consistency factor for collection. Default is 1, minimum is 1. + * Defines how many replicas should apply the operation for us to consider it successful. + * Increasing this number will make the collection more resilient to inconsistencies, but will + * also make it fail if not enough replicas are available. + * Does not have any performance impact. + * Have effect only in distributed mode. + * - on_disk_payload: + * If true - point`s payload will not be stored in memory. + * It will be read from the disk every time it is requested. + * This setting saves RAM by (slightly) increasing the response time. + * Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * - hnsw_config: Params for HNSW index + * - optimizers_config: Params for optimizer + * - wal_config: Params for Write-Ahead-Log + * - quantization_config: Params for quantization, if None - quantization will be disabled + * - init_from: Use data stored in another collection to initialize this collection + * - timeout: + * Wait for operation commit timeout in seconds. + * If timeout is reached, request will return with service error. + */ + async createCollection( + collection_name: string, + { + timeout, + vectors, + hnsw_config, + init_from, + on_disk_payload, + optimizers_config, + quantization_config, + replication_factor, + shard_number, + wal_config, + write_consistency_factor, + }: {timeout?: number} & SchemaFor<'CreateCollection'>, + ) { + const response = await this._openApiClient.collections.createCollection({ + collection_name, + timeout, + vectors, + hnsw_config, + init_from, + on_disk_payload, + optimizers_config, + quantization_config, + replication_factor, + shard_number, + wal_config, + write_consistency_factor, + }); + + return maybe(response.data.result).orThrow('Create collection returned empty'); + } + + /** + * Delete and create empty collection with given parameters + * @returns Operation result + * @param collection_name Name of the collection to recreate + * @param {object} args + * - vectors_config: + * Configuration of the vector storage. Vector params contains size and distance for the vector storage. + * If dict is passed, service will create a vector storage for each key in the dict. + * If single VectorParams is passed, service will create a single anonymous vector storage. + * - shard_number: Number of shards in collection. Default is 1, minimum is 1. + * - replication_factor: + * Replication factor for collection. Default is 1, minimum is 1. + * Defines how many copies of each shard will be created. + * Have effect only in distributed mode. + * - write_consistency_factor: + * Write consistency factor for collection. Default is 1, minimum is 1. + * Defines how many replicas should apply the operation for us to consider it successful. + * Increasing this number will make the collection more resilient to inconsistencies, but will + * also make it fail if not enough replicas are available. + * Does not have any performance impact. + * Have effect only in distributed mode. + * - on_disk_payload: + * If true - point`s payload will not be stored in memory. + * It will be read from the disk every time it is requested. + * This setting saves RAM by (slightly) increasing the response time. + * Note: those payload values that are involved in filtering and are indexed - remain in RAM. + * - hnsw_config: Params for HNSW index + * - optimizers_config: Params for optimizer + * - wal_config: Params for Write-Ahead-Log + * - quantization_config: Params for quantization, if None - quantization will be disabled + * - init_from: Use data stored in another collection to initialize this collection + * - timeout: + * Wait for operation commit timeout in seconds. + * If timeout is reached, request will return with service error. + */ + async recreateCollection( + collection_name: string, + { + timeout, + vectors, + hnsw_config, + init_from, + on_disk_payload, + optimizers_config, + quantization_config, + replication_factor, + shard_number, + wal_config, + write_consistency_factor, + }: {timeout?: number} & SchemaFor<'CreateCollection'>, + ) { + maybe( + await this._openApiClient.collections.deleteCollection({ + collection_name, + timeout, + }), + ) + .get('ok') + .orThrow('Delete collection returned failed'); + + const response = await this._openApiClient.collections.createCollection({ + collection_name, + timeout, + vectors, + hnsw_config, + init_from, + on_disk_payload, + optimizers_config, + quantization_config, + replication_factor, + shard_number, + wal_config, + write_consistency_factor, + }); + + return maybe(response).orThrow('Create collection returned empty'); + } + + async uploadRecords() { + return Promise.reject(new QdrantClientNotImplementedError('uploadRecords()')); + } + + /** + * Upload vectors and payload to the collection. + * This method will perform automatic batching of the data. + * If you need to perform a single update, use `upsert` method. + * Note: use `upload_records` method if you want to upload multiple vectors with single payload. + * @param collection_name Name of the collection to upload to + */ + async uploadCollection() { + return Promise.reject(new QdrantClientNotImplementedError('uploadCollection()')); + } + + /** + * Creates index for a given payload field. + * Indexed fields allow to perform filtered search operations faster. + * @param collection_name Name of the collection + * @param field_name Name of the payload field + * @param {object} args + * - field_name: Name of the payload field. + * - field_schema: Type of data to index. + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: + * Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * @returns Operation Result + */ + async createPayloadIndex( + collection_name: string, + { + wait, + ordering, + field_name, + field_schema, + }: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} & SchemaFor<'CreateFieldIndex'>, + ) { + const response = await this._openApiClient.collections.createFieldIndex({ + collection_name, + field_name, + field_schema, + wait, + ordering, + }); + return maybe(response.data.result).orThrow('Create field index returned empty'); + } + + /** + * Removes index for a given payload field. + * @param collection_name Name of the collection + * @param field_name Name of the payload field + * @param {object} args + * - wait: Await for the results to be processed. + * - If `true`, result will be returned only when all changes are applied + * - If `false`, result will be returned immediately after the confirmation of receiving. + * - ordering: + * Define strategy for ordering of the points. Possible values: + * - 'weak' - write operations may be reordered, works faster, default + * - 'medium' - write operations go through dynamically selected leader, + * may be inconsistent for a short period of time in case of leader change + * - 'strong' - Write operations go through the permanent leader, + * consistent, but may be unavailable if leader is down + * @returns Operation Result + */ + async deletePayloadIndex( + collection_name: string, + field_name: string, + {wait = true, ordering}: {wait?: boolean; ordering?: SchemaFor<'WriteOrdering'>} = {}, + ) { + const response = await this._openApiClient.collections.deleteFieldIndex({ + collection_name, + field_name, + wait, + ordering, + }); + return maybe(response.data.result).orThrow('Delete field index returned empty'); + } + + /** + * List all snapshots for a given collection + * @param collection_name Name of the collection + * @returns List of snapshots + */ + async listSnapshots(collection_name: string) { + const response = await this._openApiClient.snapshots.listSnapshots({collection_name}); + return maybe(response.data.result).orThrow('List snapshots API returned empty'); + } + + /** + * Create snapshot for a given collection + * @param collection_name Name of the collection + * @returns Snapshot description + */ + async createSnapshot(collection_name: string, args?: {wait?: boolean}) { + const response = await this._openApiClient.snapshots.createSnapshot({collection_name, ...args}); + return maybe(response.data.result).orNull(); + } + + /** + * Delete snapshot for a given collection + * @param collection_name Name of the collection + * @param snapshot_name Snapshot id + * @returns True if snapshot was deleted + */ + async deleteSnapshot(collection_name: string, snapshot_name: string, args?: {wait?: boolean}) { + const response = await this._openApiClient.snapshots.deleteSnapshot({collection_name, snapshot_name, ...args}); + return maybe(response.data.result).orThrow('Delete snapshot API returned empty'); + } + + /** + * List all snapshots for a whole storage + * @returns List of snapshots + */ + async listFullSnapshots() { + const response = await this._openApiClient.snapshots.listFullSnapshots({}); + return maybe(response.data.result).orThrow('List full snapshots API returned empty'); + } + + /** + * Create snapshot for a whole storage + * @returns Snapshot description + */ + async createFullSnapshot(args?: {wait?: boolean}) { + const response = await this._openApiClient.snapshots.createFullSnapshot({...args}); + return maybe(response.data.result).orThrow('Create full snapshot API returned empty'); + } + + /** + * Delete snapshot for a whole storage + * @param snapshot_name Snapshot name + * @returns True if the snapshot was deleted + */ + async deleteFullSnapshot(snapshot_name: string, args?: {wait?: boolean}) { + const response = await this._openApiClient.snapshots.deleteFullSnapshot({snapshot_name, ...args}); + return maybe(response.data.result).orThrow('Delete full snapshot API returned empty'); + } + + /** + * Recover collection from snapshot + * @param collection_name Name of the collection + * @param {object} args + * - location: + * URL of the snapshot. + * Example: + * - URL `http://localhost:8080/collections/my_collection/snapshots/my_snapshot` + * - Local path `file:///qdrant/snapshots/test_collection-2022-08-04-10-49-10.snapshot` + * - priority: + * Defines source of truth for snapshot recovery + * - `snapshot` means - prefer snapshot data over the current state + * - `replica` means - prefer existing data over the snapshot + * Default: `replica` + * @returns True if the snapshot was recovered + */ + async recoverSnapshot(collection_name: string, {location, priority}: SchemaFor<'SnapshotRecover'>) { + const response = await this._openApiClient.snapshots.recoverFromSnapshot({collection_name, location, priority}); + return maybe(response.data.result).orThrow('Recover from snapshot API returned empty'); + } + + /** + * Lock storage for writing + */ + async lockStorage(reason: string) { + const response = await this._openApiClient.service.postLocks({write: true, error_message: reason}); + return maybe(response.data.result).orThrow('Lock storage returned empty'); + } + + /** + * Unlock storage for writing. + */ + async unlockStorage() { + const response = await this._openApiClient.service.postLocks({write: false}); + return maybe(response.data.result).orThrow('Post locks returned empty'); + } + + /** + * Get current locks state. + */ + async getLocks() { + const response = await this._openApiClient.service.getLocks({}); + return maybe(response.data.result).orThrow('Get locks returned empty'); + } +} diff --git a/packages/js-client-rest/src/types.ts b/packages/js-client-rest/src/types.ts new file mode 100644 index 0000000..c67b75a --- /dev/null +++ b/packages/js-client-rest/src/types.ts @@ -0,0 +1,18 @@ +import {components, operations} from './openapi/generated_schema.js'; + +export interface RestArgs { + headers: Headers; + timeout: number; +} + +export type SchemaFor = T[K]; + +// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars +type OperationResponses< + K extends keyof T, + U extends keyof T[K] = any, + T extends operations = operations, +> = 'responses' extends U ? T[K]['responses'] : never; + +// Definitions (in OpenAPI 2.0) or Schemas (in OpenAPI 3.0) – Data models that describe your API inputs and outputs. +export type Schemas = components['schemas']; diff --git a/packages/js-client-rest/tests/integration-tests.sh b/packages/js-client-rest/tests/integration-tests.sh new file mode 100755 index 0000000..286dd37 --- /dev/null +++ b/packages/js-client-rest/tests/integration-tests.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -ex + +function stop_docker() +{ + echo "stopping qdrant_test" + docker stop qdrant_test +} + +QDRANT_LATEST="v1.1.1" +QDRANT_VERSION=${QDRANT_VERSION:-"$QDRANT_LATEST"} + +QDRANT_HOST='localhost:6333' + +docker run -d --rm \ + -p 6333:6333 \ + -e QDRANT__SERVICE__GRPC_PORT="6334" \ + --name qdrant_test qdrant/qdrant:${QDRANT_VERSION} + +trap stop_docker SIGINT +trap stop_docker ERR + +until $(curl --output /dev/null --silent --get --fail http://$QDRANT_HOST/collections); do + printf 'waiting for server to start...' + sleep 5 +done + +pnpm test:integration + +echo "Ok, that is enough" + +stop_docker diff --git a/packages/js-client-rest/tests/integration/qdrant-client.test.ts b/packages/js-client-rest/tests/integration/qdrant-client.test.ts new file mode 100644 index 0000000..959d7ca --- /dev/null +++ b/packages/js-client-rest/tests/integration/qdrant-client.test.ts @@ -0,0 +1,178 @@ +import {test, describe, expect} from 'vitest'; +import {QdrantClient} from '../../src/qdrant-client.js'; + +describe('QdrantClient', () => { + const DIM = 100; + const client = new QdrantClient(); + const collectionName = 'test_collection'; + + test('cleanup if collection exists', async () => { + expect(await client.deleteCollection(collectionName)).toBeTypeOf('boolean'); + }); + + test('create collection', async () => { + expect( + await client.createCollection(collectionName, { + vectors: {size: 4, distance: 'Dot'}, + optimizers_config: {default_segment_number: 2}, + replication_factor: 2, + }), + ).toBe(true); + }); + + test('create indexes', async () => { + let result = await client.createPayloadIndex(collectionName, {field_name: 'city', field_schema: 'keyword'}); + expect(result).toMatchObject({ + operation_id: expect.any(Number) as number, + status: 'acknowledged', + }); + + result = await client.createPayloadIndex(collectionName, {field_name: 'count', field_schema: 'integer'}); + expect(result).toMatchObject({ + operation_id: expect.any(Number) as number, + status: 'acknowledged', + }); + + result = await client.createPayloadIndex(collectionName, { + field_name: 'coords', + field_schema: 'geo', + wait: true, + }); + expect(result).toMatchObject({operation_id: expect.any(Number) as number, status: 'completed'}); + }); + + test('get collection', async () => { + await expect(client.getCollection(collectionName)).resolves.toBeDefined(); + }); + + test('insert points', async () => { + const result = await client.upsert(collectionName, { + wait: true, + points: [ + { + id: 1, + vector: [0.05, 0.61, 0.76, 0.74], + payload: { + city: 'Berlin', + country: 'Germany', + count: 1000000, + square: 12.5, + coords: {lat: 1.0, lon: 2.0}, + }, + }, + {id: 2, vector: [0.19, 0.81, 0.75, 0.11], payload: {city: ['Berlin', 'London']}}, + {id: 3, vector: [0.36, 0.55, 0.47, 0.94], payload: {city: ['Berlin', 'Moscow']}}, + {id: 4, vector: [0.18, 0.01, 0.85, 0.8], payload: {city: ['London', 'Moscow']}}, + {id: '98a9a4b1-4ef2-46fb-8315-a97d874fe1d7', vector: [0.24, 0.18, 0.22, 0.44], payload: {count: [0]}}, + {id: 'f0e09527-b096-42a8-94e9-ea94d342b925', vector: [0.35, 0.08, 0.11, 0.44]}, + ], + }); + expect(result).toMatchObject({operation_id: expect.any(Number) as number, status: 'completed'}); + }); + + test('retrieve point', async () => { + const result = await client.api('points').getPoint({collection_name: collectionName, id: 2}); + expect(result.data.result).toBeDefined(); + }); + + test('retrieve points', async () => { + const result = await client.retrieve(collectionName, {ids: [1, 2]}); + expect(result).toHaveLength(2); + }); + + test('retrieve all points', async () => { + const result = await client.getCollection(collectionName); + expect(result, 'check failed - 6 points expected').toMatchObject>({ + vectors_count: 6, + }); + }); + + test('search points', async () => { + const result = await client.search(collectionName, { + vector: [0.2, 0.1, 0.9, 0.7], + limit: 3, + }); + expect(result).toHaveLength(3); + }); + + test('search points filter', async () => { + const result = await client.search(collectionName, { + filter: { + should: [ + { + key: 'city', + match: { + value: 'London', + }, + }, + ], + }, + vector: [0.2, 0.1, 0.9, 0.7], + limit: 3, + }); + expect(result).toHaveLength(2); + }); + + test('search points batch', async () => { + const result = await client.searchBatch(collectionName, { + searches: [ + { + vector: [0.2, 0.1, 0.9, 0.7], + limit: 3, + with_payload: true, + }, + { + vector: [0.2, 0.1, 0.9, 0.7], + limit: 3, + with_payload: true, + }, + ], + }); + expect(result).toHaveLength(2); + }); + + test('locks', async () => { + expect(await client.recreateCollection(collectionName, {vectors: {size: DIM, distance: 'Dot'}})).toBeDefined(); + + const reason = 'testing reason'; + expect(await client.lockStorage(reason)).toBeDefined(); + + // Try creating a single point when the lock is in place + try { + await expect( + client.upsert(collectionName, { + points: [ + { + id: 123, + payload: {test: 'value'}, + vector: Array.from({length: DIM}, () => Math.random()), + }, + ], + wait: true, + }), + 'Should not be able to insert a point when storage is locked', + ).rejects.toThrow(); + } catch (err) { + expect(String(err), 'Should error due to lock (testing reason) in place').toBe('testing reason'); + } + + const result = await client.getLocks(); + expect(result).toMatchObject({write: true, error_message: reason}); + + await client.unlockStorage(); + + // should be fine now + expect( + await client.upsert(collectionName, { + points: [ + { + id: 123, + payload: {test: 'value'}, + vector: Array.from({length: DIM}, () => Math.random()), + }, + ], + wait: true, + }), + ).toBeDefined(); + }); +}); diff --git a/packages/js-client-rest/tests/unit/api-client.test.ts b/packages/js-client-rest/tests/unit/api-client.test.ts new file mode 100644 index 0000000..95ba11f --- /dev/null +++ b/packages/js-client-rest/tests/unit/api-client.test.ts @@ -0,0 +1,61 @@ +import {createClient} from '../../src/api-client.js'; +import {QdrantClientTimeoutError, QdrantClientUnexpectedResponseError} from '../../src/errors.js'; +import {vi, describe, test, expect, beforeEach, afterEach} from 'vitest'; + +describe('apiClient', () => { + const headers = new Headers(); + headers.set('content-type', 'application/json'); + const createFetchResponse = (status: number) => ({ + headers, + ok: true, + status, + json: () => new Promise((resolve) => resolve({})), + }); + let originalFetch: typeof global.fetch; + + beforeEach(() => { + originalFetch = global.fetch; + }); + + afterEach(() => { + global.fetch = originalFetch; + }); + + test('status 200', async () => { + global.fetch = vi.fn().mockResolvedValue(createFetchResponse(200)); + + const client = createClient('http://my-domain.com', { + timeout: Infinity, + headers, + }); + const telemetry = client.path('/telemetry').method('get').create(); + + await expect(telemetry({})).resolves.toBeDefined(); + }); + + test('status 400', async () => { + global.fetch = vi.fn().mockResolvedValue(createFetchResponse(400)); + + const client = createClient('http://my-domain.com', { + timeout: Infinity, + headers, + }); + const telemetry = client.path('/telemetry').method('get').create(); + + await expect(telemetry({})).rejects.toThrowError(QdrantClientUnexpectedResponseError); + }); + + test('signal abort: timeout', async () => { + const err = new Error(); + err.name = 'AbortError'; + global.fetch = vi.fn().mockRejectedValue(err); + + const client = createClient('http://my-domain.com', { + timeout: 0, + headers, + }); + const telemetry = client.path('/telemetry').method('get').create(); + + await expect(telemetry({})).rejects.toThrowError(QdrantClientTimeoutError); + }); +}); diff --git a/packages/js-client-rest/tests/unit/qdrant-client.test.ts b/packages/js-client-rest/tests/unit/qdrant-client.test.ts new file mode 100644 index 0000000..71248d1 --- /dev/null +++ b/packages/js-client-rest/tests/unit/qdrant-client.test.ts @@ -0,0 +1,53 @@ +import {test, expect} from 'vitest'; +import {QdrantClient} from '../../src/qdrant-client.js'; +import {QdrantClientConfigError} from '../../src/errors.js'; + +test('QdrantClient()', () => { + let client = new QdrantClient(); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://localhost:6333'); + + client = new QdrantClient({https: true}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('https://localhost:6333'); + + client = new QdrantClient({https: true, port: 7333}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('https://localhost:7333'); + + expect(() => new QdrantClient({host: 'localhost:6333'})).toThrow(QdrantClientConfigError); + + client = new QdrantClient({host: 'hidden_port_addr.com', prefix: 'custom'}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://hidden_port_addr.com:6333/custom'); + + client = new QdrantClient({host: 'hidden_port_addr.com', port: null}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://hidden_port_addr.com'); + + client = new QdrantClient({host: 'hidden_port_addr.com', port: null, prefix: 'custom'}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://hidden_port_addr.com/custom'); + + client = new QdrantClient({url: 'http://hidden_port_addr.com', port: null}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://hidden_port_addr.com'); + + client = new QdrantClient({url: 'http://localhost:6333', port: 7333}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://localhost:6333'); + + client = new QdrantClient({url: 'http://localhost:6333', prefix: 'custom'}); + // @ts-expect-error ts(2341) + expect(client._restUri).toBe('http://localhost:6333/custom'); + + expect(() => new QdrantClient({url: 'my-domain.com'})).toThrow(QdrantClientConfigError); + + expect(() => new QdrantClient({url: 'my-domain.com:80'})).toThrow(QdrantClientConfigError); + + expect(() => new QdrantClient({url: 'http://localhost:6333', host: 'localhost'})).toThrow(QdrantClientConfigError); + + expect(() => new QdrantClient({url: 'http://localhost:6333/origin', prefix: 'custom'})).toThrow( + QdrantClientConfigError, + ); +}); diff --git a/packages/js-client-rest/tsconfig.cjs.json b/packages/js-client-rest/tsconfig.cjs.json new file mode 100644 index 0000000..6bfdd40 --- /dev/null +++ b/packages/js-client-rest/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "./dist/cjs" + }, + "include": ["src"] +} diff --git a/packages/js-client-rest/tsconfig.esm.json b/packages/js-client-rest/tsconfig.esm.json new file mode 100644 index 0000000..e20f937 --- /dev/null +++ b/packages/js-client-rest/tsconfig.esm.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"] +} diff --git a/packages/js-client-rest/tsconfig.json b/packages/js-client-rest/tsconfig.json new file mode 100644 index 0000000..737566d --- /dev/null +++ b/packages/js-client-rest/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "declaration": true, + "declarationDir": "./dist/types", + "outDir": "./dist/esm", + "types": ["node", "vitest/importMeta", "@total-typescript/ts-reset"] + }, + "include": ["src", "tests", "examples", "vite.config.ts", "vite.integration.config.ts", "rollup.config.js"] +} diff --git a/packages/js-client-rest/vite.config.ts b/packages/js-client-rest/vite.config.ts new file mode 100644 index 0000000..3f2544a --- /dev/null +++ b/packages/js-client-rest/vite.config.ts @@ -0,0 +1,9 @@ +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: { + name: 'unit', + root: 'tests/unit', + testTimeout: 1000, + }, +}); diff --git a/packages/js-client-rest/vite.integration.config.ts b/packages/js-client-rest/vite.integration.config.ts new file mode 100644 index 0000000..c18223f --- /dev/null +++ b/packages/js-client-rest/vite.integration.config.ts @@ -0,0 +1,8 @@ +import {defineConfig} from 'vitest/config'; + +export default defineConfig({ + test: { + name: 'integration', + root: 'tests/integration', + }, +}); diff --git a/packages/qdrant-js/README.md b/packages/qdrant-js/README.md new file mode 100644 index 0000000..e94d4fb --- /dev/null +++ b/packages/qdrant-js/README.md @@ -0,0 +1,8 @@ +# Qdrant-JS: JavaScript Qdrant SDK + +This package represents the JS SDK for the [Qdrant](https://github.com/qdrant/qdrant) vector search engine. + +The next packages are re-exported from it: + +- [JS Client REST](../packages/js-client-rest) +- [JS Client gRPC](../packages/js-client-grpc) (coming soon) diff --git a/packages/qdrant-js/package.json b/packages/qdrant-js/package.json new file mode 100644 index 0000000..18a7f52 --- /dev/null +++ b/packages/qdrant-js/package.json @@ -0,0 +1,56 @@ +{ + "name": "@qdrant/qdrant-js", + "version": "1.1.1", + "engines": { + "node": ">=18.0.0", + "pnpm": ">=8" + }, + "repository": { + "type": "git", + "url": "https://github.com/qdrant/qrant-js" + }, + "bugs": { + "url": "https://github.com/qdrant/qrant-js/issues" + }, + "homepage": "https://github.com/qdrant/qrant-js#readme", + "license": "Apache-2.0", + "type": "module", + "module": "./dist/esm/index.js", + "browser": "./dist/browser/index.js", + "types": "./dist/types/index.d.ts", + "exports": { + ".": { + "require": "./dist/cjs/index.js", + "default": "./dist/esm/index.js", + "browser": "./dist/browser/index.js", + "types": "./dist/types/index.d.ts" + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "prepublishOnly": "pnpm tsc:build && pnpm build", + "pre-commit": "pnpm tsc:check", + "tsc:check": "tsc --noEmit", + "tsc:build": "pnpm clean && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json", + "build": "rollup -c rollup.config.js", + "clean": "rimraf ./dist" + }, + "dependencies": { + "@qdrant/js-client-rest": "workspace:1.1.1" + }, + "devDependencies": { + "@rollup/plugin-node-resolve": "15.0.2", + "@rollup/plugin-terser": "0.4.0", + "rimraf": "5.0.0", + "rollup": "3.20.2", + "typescript": "5.0.4" + }, + "peerDependencies": { + "typescript": ">=4.1" + } +} diff --git a/packages/qdrant-js/rollup.config.js b/packages/qdrant-js/rollup.config.js new file mode 100644 index 0000000..d014d23 --- /dev/null +++ b/packages/qdrant-js/rollup.config.js @@ -0,0 +1,33 @@ +import terser from '@rollup/plugin-terser'; +import nodeResolve from '@rollup/plugin-node-resolve'; +import {writeFile} from 'fs/promises'; + +const createCommonJsPackage = () => ({ + name: 'cjs-package', + buildEnd: () => writeFile('dist/cjs/package.json', JSON.stringify({type: 'commonjs'}, null, 4)), +}); + +export default { + input: 'dist/esm/index.js', + output: [ + { + file: 'dist/browser/index.cjs', + format: 'cjs', + }, + { + file: 'dist/browser/index.min.cjs', + format: 'cjs', + plugins: [terser()], + }, + { + file: 'dist/browser/index.js', + format: 'es', + }, + { + file: 'dist/browser/index.min.js', + format: 'es', + plugins: [terser()], + }, + ], + plugins: [createCommonJsPackage(), nodeResolve()], +}; diff --git a/packages/qdrant-js/src/index.ts b/packages/qdrant-js/src/index.ts new file mode 100644 index 0000000..4e94793 --- /dev/null +++ b/packages/qdrant-js/src/index.ts @@ -0,0 +1 @@ +export * from '@qdrant/js-client-rest'; diff --git a/packages/qdrant-js/tsconfig.cjs.json b/packages/qdrant-js/tsconfig.cjs.json new file mode 100644 index 0000000..6bfdd40 --- /dev/null +++ b/packages/qdrant-js/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "./dist/cjs" + }, + "include": ["src"] +} diff --git a/packages/qdrant-js/tsconfig.esm.json b/packages/qdrant-js/tsconfig.esm.json new file mode 100644 index 0000000..e20f937 --- /dev/null +++ b/packages/qdrant-js/tsconfig.esm.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"] +} diff --git a/packages/qdrant-js/tsconfig.json b/packages/qdrant-js/tsconfig.json new file mode 100644 index 0000000..d8065eb --- /dev/null +++ b/packages/qdrant-js/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "declaration": true, + "declarationDir": "./dist/types", + "outDir": "./dist/esm" + }, + "include": ["src", "rollup.config.js"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..7abfe1e --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4135 @@ +lockfileVersion: '6.0' + +importers: + + .: + devDependencies: + '@changesets/cli': + specifier: 2.26.1 + version: 2.26.1 + husky: + specifier: 8.0.3 + version: 8.0.3 + is-ci: + specifier: 3.0.1 + version: 3.0.1 + prettier: + specifier: 2.8.7 + version: 2.8.7 + typescript: + specifier: 5.0.4 + version: 5.0.4 + + packages/js-client-grpc: + dependencies: + '@bufbuild/connect': + specifier: 0.8.4 + version: 0.8.4(@bufbuild/protobuf@1.2.0) + '@bufbuild/connect-node': + specifier: 0.8.4 + version: 0.8.4(@bufbuild/protobuf@1.2.0) + '@bufbuild/protobuf': + specifier: 1.2.0 + version: 1.2.0 + '@sevinf/maybe': + specifier: 0.5.0 + version: 0.5.0 + devDependencies: + '@bufbuild/buf': + specifier: 1.15.0-1 + version: 1.15.0-1 + '@bufbuild/protoc-gen-connect-es': + specifier: 0.8.4 + version: 0.8.4(@bufbuild/connect@0.8.4)(@bufbuild/protoc-gen-es@1.2.0) + '@bufbuild/protoc-gen-es': + specifier: 1.2.0 + version: 1.2.0(@bufbuild/protobuf@1.2.0) + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.11)(typescript@5.0.4) + typescript: + specifier: 5.0.4 + version: 5.0.4 + + packages/js-client-rest: + dependencies: + '@sevinf/maybe': + specifier: 0.5.0 + version: 0.5.0 + openapi-typescript-fetch: + specifier: Rendez/openapi-typescript-fetch#ea89f6480e498ec022e2f2f67f85004eb54e6f54 + version: github.com/Rendez/openapi-typescript-fetch/ea89f6480e498ec022e2f2f67f85004eb54e6f54 + devDependencies: + '@rollup/plugin-node-resolve': + specifier: 15.0.2 + version: 15.0.2(rollup@3.20.2) + '@rollup/plugin-replace': + specifier: 5.0.2 + version: 5.0.2(rollup@3.20.2) + '@rollup/plugin-terser': + specifier: 0.4.0 + version: 0.4.0(rollup@3.20.2) + '@total-typescript/ts-reset': + specifier: 0.4.2 + version: 0.4.2 + '@types/node': + specifier: 18.15.11 + version: 18.15.11 + '@typescript-eslint/eslint-plugin': + specifier: 5.57.0 + version: 5.57.0(@typescript-eslint/parser@5.57.0)(eslint@8.37.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: 5.57.0 + version: 5.57.0(eslint@8.37.0)(typescript@5.0.2) + lint-staged: + specifier: 13.2.1 + version: 13.2.1 + openapi-typescript: + specifier: 6.2.0 + version: 6.2.0 + rimraf: + specifier: 5.0.0 + version: 5.0.0 + rollup: + specifier: 3.20.2 + version: 3.20.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.11)(typescript@5.0.2) + ts-prune: + specifier: 0.10.3 + version: 0.10.3 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vitest: + specifier: 0.29.8 + version: 0.29.8 + + packages/qdrant-js: + dependencies: + '@qdrant/js-client-rest': + specifier: workspace:1.1.1 + version: link:../js-client-rest + devDependencies: + '@rollup/plugin-node-resolve': + specifier: 15.0.2 + version: 15.0.2(rollup@3.20.2) + '@rollup/plugin-terser': + specifier: 0.4.0 + version: 0.4.0(rollup@3.20.2) + rimraf: + specifier: 5.0.0 + version: 5.0.0 + rollup: + specifier: 3.20.2 + version: 3.20.2 + typescript: + specifier: 5.0.4 + version: 5.0.4 + +packages: + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/runtime@7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@bufbuild/buf-darwin-arm64@1.15.0-1: + resolution: {integrity: sha512-KV3rvScwjMCcj0DSkmx6Ejk8YF7LtnqA3jSokeYbGaLLfSvPXu4q9d0I2pq+jaYIA8RfbMerAqzR8MccdY4Vqw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@bufbuild/buf-darwin-x64@1.15.0-1: + resolution: {integrity: sha512-hSEK9TIGmTA58PhUsvcuhF9LcmZ3mZedPgWT8cAeGZYcNJd1mkUEzsWsqnYYGZRe1QvOPZW1BsPIayWFBrlBMQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@bufbuild/buf-linux-aarch64@1.15.0-1: + resolution: {integrity: sha512-Ppa5mNy3z5cmTPo18Sc5xUIPfRBpa/Bc9VyqtUqwMJGtTQ1fC+JJ9LFUL8UxXcvdVRcErxXNyd6oGEZzOoLFFQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@bufbuild/buf-linux-x64@1.15.0-1: + resolution: {integrity: sha512-6QtcPOf6D3cXGAhMIhCkOlveLc19nXFCteUktuK73Ls8XDOLuhef4cEfb/Gh7RQCq6IyfFyzoEzb0cWybXnBbQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@bufbuild/buf-win32-arm64@1.15.0-1: + resolution: {integrity: sha512-h356aHM1BvHKjxrs9GjeuDxljqJDNtv8NhzssR3kD4ZkRjZYpMhc8YzpnodY3W520W9/6Q7k7CuVd2vhib1Fyg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@bufbuild/buf-win32-x64@1.15.0-1: + resolution: {integrity: sha512-dc1dBFDTNF/3ulr7rejsX/lBb2eqAPZtHI3w6YUQaXTkhmQtNOe45QkaOYnj4UFj6sBVI53WeAisNf3Wg+SUFQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@bufbuild/buf@1.15.0-1: + resolution: {integrity: sha512-j+mkNd9kM+2b9JacmZNBxTkbOXtLUltzv0inWBYRqd4dJ+EwAR/CDfK6OXvia94aJsKWy8YKSgLu19VlTYSh1Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@bufbuild/buf-darwin-arm64': 1.15.0-1 + '@bufbuild/buf-darwin-x64': 1.15.0-1 + '@bufbuild/buf-linux-aarch64': 1.15.0-1 + '@bufbuild/buf-linux-x64': 1.15.0-1 + '@bufbuild/buf-win32-arm64': 1.15.0-1 + '@bufbuild/buf-win32-x64': 1.15.0-1 + dev: true + + /@bufbuild/connect-node@0.8.4(@bufbuild/protobuf@1.2.0): + resolution: {integrity: sha512-i2C5Q/BiVA29Uj9msn7hiFvlzPp0jiU+P+MBfZVf3vg2PmklnAoA9UETt3MNjpOHd54fvJkAK964koc7iVyCKA==} + engines: {node: '>=16.0.0'} + requiresBuild: true + peerDependencies: + '@bufbuild/protobuf': ^1.0.0 + dependencies: + '@bufbuild/connect': 0.8.4(@bufbuild/protobuf@1.2.0) + '@bufbuild/protobuf': 1.2.0 + headers-polyfill: 3.1.2 + dev: false + + /@bufbuild/connect@0.8.4(@bufbuild/protobuf@1.2.0): + resolution: {integrity: sha512-99FwsvhEDTUJAXLJEyqdKhAle/MuFrRtkRBdRFLH2oNdI5Tv0Qaa7oMcQXKPFPQDfRdJEZe+dt8scmRVN55njA==} + peerDependencies: + '@bufbuild/protobuf': ^1.0.0 + dependencies: + '@bufbuild/protobuf': 1.2.0 + + /@bufbuild/protobuf@1.2.0: + resolution: {integrity: sha512-MBVuQMOBHxgGnZ9XCUIi8WOy5O/T4ma3TduCRhRvndv3UDbG9cHgd8h6nOYSGyBYPEvXf1z9nTwhp8mVIDbq2g==} + + /@bufbuild/protoc-gen-connect-es@0.8.4(@bufbuild/connect@0.8.4)(@bufbuild/protoc-gen-es@1.2.0): + resolution: {integrity: sha512-BtHrR1ixU+vAWmyh4/T/JT13n2tTb6NJbxn7+aUdr7OjeCcT+wTceTu6W/s96rMITMkdAKm/h8JyO5b32LfhDg==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + '@bufbuild/connect': 0.8.4 + '@bufbuild/protoc-gen-es': ^1.0.0 + peerDependenciesMeta: + '@bufbuild/connect': + optional: true + '@bufbuild/protoc-gen-es': + optional: true + dependencies: + '@bufbuild/connect': 0.8.4(@bufbuild/protobuf@1.2.0) + '@bufbuild/protobuf': 1.2.0 + '@bufbuild/protoc-gen-es': 1.2.0(@bufbuild/protobuf@1.2.0) + '@bufbuild/protoplugin': 1.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@bufbuild/protoc-gen-es@1.2.0(@bufbuild/protobuf@1.2.0): + resolution: {integrity: sha512-rdg2+Co4H+cImZ81EEzHLEi9bmzmMnS/bsf7XLHKtWYskj1PZVIalfquQejcSV6eWbdmVGKa29JwI5zEkSmkCQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + '@bufbuild/protobuf': 1.2.0 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + dependencies: + '@bufbuild/protobuf': 1.2.0 + '@bufbuild/protoplugin': 1.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@bufbuild/protoplugin@1.2.0: + resolution: {integrity: sha512-TX0mEk+LdIbpK2xr5RqeUswR8jGZs6uCX6Cq8azADj8hhiUr7Xty8agEOU/zR+J71D4dV5SnyEPYyw0nGJ6dGQ==} + dependencies: + '@bufbuild/protobuf': 1.2.0 + '@typescript/vfs': 1.4.0 + typescript: 4.5.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@changesets/apply-release-plan@6.1.3: + resolution: {integrity: sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/config': 2.3.0 + '@changesets/get-version-range-type': 0.3.2 + '@changesets/git': 2.0.0 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.7 + resolve-from: 5.0.0 + semver: 5.7.1 + dev: true + + /@changesets/assemble-release-plan@5.2.3: + resolution: {integrity: sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.5 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + semver: 5.7.1 + dev: true + + /@changesets/changelog-git@0.1.14: + resolution: {integrity: sha512-+vRfnKtXVWsDDxGctOfzJsPhaCdXRYoe+KyWYoq5X/GqoISREiat0l3L8B0a453B2B4dfHGcZaGyowHbp9BSaA==} + dependencies: + '@changesets/types': 5.2.1 + dev: true + + /@changesets/cli@2.26.1: + resolution: {integrity: sha512-XnTa+b51vt057fyAudvDKGB0Sh72xutQZNAdXkCqPBKO2zvs2yYZx5hFZj1u9cbtpwM6Sxtcr02/FQJfZOzemQ==} + hasBin: true + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/apply-release-plan': 6.1.3 + '@changesets/assemble-release-plan': 5.2.3 + '@changesets/changelog-git': 0.1.14 + '@changesets/config': 2.3.0 + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.5 + '@changesets/get-release-plan': 3.0.16 + '@changesets/git': 2.0.0 + '@changesets/logger': 0.0.5 + '@changesets/pre': 1.0.14 + '@changesets/read': 0.5.9 + '@changesets/types': 5.2.1 + '@changesets/write': 0.2.3 + '@manypkg/get-packages': 1.1.3 + '@types/is-ci': 3.0.0 + '@types/semver': 6.2.3 + ansi-colors: 4.1.3 + chalk: 2.4.2 + enquirer: 2.3.6 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + is-ci: 3.0.1 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.0.3 + resolve-from: 5.0.0 + semver: 5.7.1 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.2.1 + dev: true + + /@changesets/config@2.3.0: + resolution: {integrity: sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ==} + dependencies: + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.5 + '@changesets/logger': 0.0.5 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + dev: true + + /@changesets/errors@0.1.4: + resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + dependencies: + extendable-error: 0.1.7 + dev: true + + /@changesets/get-dependents-graph@1.3.5: + resolution: {integrity: sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA==} + dependencies: + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 5.7.1 + dev: true + + /@changesets/get-release-plan@3.0.16: + resolution: {integrity: sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/assemble-release-plan': 5.2.3 + '@changesets/config': 2.3.0 + '@changesets/pre': 1.0.14 + '@changesets/read': 0.5.9 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + dev: true + + /@changesets/get-version-range-type@0.3.2: + resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} + dev: true + + /@changesets/git@2.0.0: + resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/errors': 0.1.4 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + dev: true + + /@changesets/logger@0.0.5: + resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + dependencies: + chalk: 2.4.2 + dev: true + + /@changesets/parse@0.3.16: + resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} + dependencies: + '@changesets/types': 5.2.1 + js-yaml: 3.14.1 + dev: true + + /@changesets/pre@1.0.14: + resolution: {integrity: sha512-dTsHmxQWEQekHYHbg+M1mDVYFvegDh9j/kySNuDKdylwfMEevTeDouR7IfHNyVodxZXu17sXoJuf2D0vi55FHQ==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/errors': 0.1.4 + '@changesets/types': 5.2.1 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + dev: true + + /@changesets/read@0.5.9: + resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/git': 2.0.0 + '@changesets/logger': 0.0.5 + '@changesets/parse': 0.3.16 + '@changesets/types': 5.2.1 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 + dev: true + + /@changesets/types@4.1.0: + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + dev: true + + /@changesets/types@5.2.1: + resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} + dev: true + + /@changesets/write@0.2.3: + resolution: {integrity: sha512-Dbamr7AIMvslKnNYsLFafaVORx4H0pvCA2MHqgtNCySMe1blImEyAEOzDmcgKAkgz4+uwoLz7demIrX+JBr/Xw==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/types': 5.2.1 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.7 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@esbuild/android-arm64@0.17.14: + resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.14: + resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.14: + resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.14: + resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.14: + resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.14: + resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.14: + resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.14: + resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.14: + resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.14: + resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.14: + resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.14: + resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.14: + resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.14: + resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.14: + resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.14: + resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.14: + resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.14: + resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.14: + resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.14: + resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.14: + resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.37.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.37.0 + eslint-visitor-keys: 3.4.0 + dev: true + + /@eslint-community/regexpp@4.5.0: + resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.0.2: + resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.37.0: + resolution: {integrity: sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@manypkg/find-root@1.1.0: + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + dependencies: + '@babel/runtime': 7.21.0 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true + + /@manypkg/get-packages@1.1.3: + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + dependencies: + '@babel/runtime': 7.21.0 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@rollup/plugin-node-resolve@15.0.2(rollup@3.20.2): + resolution: {integrity: sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.1 + rollup: 3.20.2 + dev: true + + /@rollup/plugin-replace@5.0.2(rollup@3.20.2): + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@3.20.2) + magic-string: 0.27.0 + rollup: 3.20.2 + dev: true + + /@rollup/plugin-terser@0.4.0(rollup@3.20.2): + resolution: {integrity: sha512-Ipcf3LPNerey1q9ZMjiaWHlNPEHNU/B5/uh9zXLltfEQ1lVSLLeZSgAtTPWGyw8Ip1guOeq+mDtdOlEj/wNxQw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.20.2 + serialize-javascript: 6.0.1 + smob: 0.0.6 + terser: 5.16.8 + dev: true + + /@rollup/pluginutils@5.0.2(rollup@3.20.2): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.20.2 + dev: true + + /@sevinf/maybe@0.5.0: + resolution: {integrity: sha512-ARhyoYDnY1LES3vYI0fiG6e9esWfTNcXcO6+MPJJXcnyMV3bim4lnFt45VXouV7y82F4x3YH8nOQ6VztuvUiWg==} + dev: false + + /@total-typescript/ts-reset@0.4.2: + resolution: {integrity: sha512-vqd7ZUDSrXFVT1n8b2kc3LnklncDQFPvR58yUS1kEP23/nHPAO9l1lMjUfnPrXYYk4Hj54rrLKMW5ipwk7k09A==} + dev: true + + /@ts-morph/common@0.12.3: + resolution: {integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==} + dependencies: + fast-glob: 3.2.12 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/estree@1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true + + /@types/is-ci@3.0.0: + resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} + dependencies: + ci-info: 3.8.0 + dev: true + + /@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node@12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + + /@types/node@18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + + /@types/resolve@1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /@types/semver@6.2.3: + resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==} + dev: true + + /@types/semver@7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@typescript-eslint/eslint-plugin@5.57.0(@typescript-eslint/parser@5.57.0)(eslint@8.37.0)(typescript@5.0.2): + resolution: {integrity: sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.5.0 + '@typescript-eslint/parser': 5.57.0(eslint@8.37.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.57.0 + '@typescript-eslint/type-utils': 5.57.0(eslint@8.37.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.57.0(eslint@8.37.0)(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.37.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.3.8 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.57.0(eslint@8.37.0)(typescript@5.0.2): + resolution: {integrity: sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.57.0 + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/typescript-estree': 5.57.0(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.37.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.57.0: + resolution: {integrity: sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/visitor-keys': 5.57.0 + dev: true + + /@typescript-eslint/type-utils@5.57.0(eslint@8.37.0)(typescript@5.0.2): + resolution: {integrity: sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.57.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.57.0(eslint@8.37.0)(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.37.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.57.0: + resolution: {integrity: sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.57.0(typescript@5.0.2): + resolution: {integrity: sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/visitor-keys': 5.57.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.57.0(eslint@8.37.0)(typescript@5.0.2): + resolution: {integrity: sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.37.0) + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.57.0 + '@typescript-eslint/types': 5.57.0 + '@typescript-eslint/typescript-estree': 5.57.0(typescript@5.0.2) + eslint: 8.37.0 + eslint-scope: 5.1.1 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.57.0: + resolution: {integrity: sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.57.0 + eslint-visitor-keys: 3.4.0 + dev: true + + /@typescript/vfs@1.4.0: + resolution: {integrity: sha512-Pood7yv5YWMIX+yCHo176OnF8WUlKGImFG7XlsuH14Zb1YN5+dYD3uUtS7lqZtsH7tAveNUi2NzdpQCN0yRbaw==} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /breakword@1.0.5: + resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + dependencies: + wcwidth: 1.0.1 + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /code-block-writer@11.0.3: + resolution: {integrity: sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /commander@10.0.0: + resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + dev: true + + /csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: true + + /csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: true + + /csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild@0.17.14: + resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.14 + '@esbuild/android-arm64': 0.17.14 + '@esbuild/android-x64': 0.17.14 + '@esbuild/darwin-arm64': 0.17.14 + '@esbuild/darwin-x64': 0.17.14 + '@esbuild/freebsd-arm64': 0.17.14 + '@esbuild/freebsd-x64': 0.17.14 + '@esbuild/linux-arm': 0.17.14 + '@esbuild/linux-arm64': 0.17.14 + '@esbuild/linux-ia32': 0.17.14 + '@esbuild/linux-loong64': 0.17.14 + '@esbuild/linux-mips64el': 0.17.14 + '@esbuild/linux-ppc64': 0.17.14 + '@esbuild/linux-riscv64': 0.17.14 + '@esbuild/linux-s390x': 0.17.14 + '@esbuild/linux-x64': 0.17.14 + '@esbuild/netbsd-x64': 0.17.14 + '@esbuild/openbsd-x64': 0.17.14 + '@esbuild/sunos-x64': 0.17.14 + '@esbuild/win32-arm64': 0.17.14 + '@esbuild/win32-ia32': 0.17.14 + '@esbuild/win32-x64': 0.17.14 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.0: + resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.37.0: + resolution: {integrity: sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.37.0) + '@eslint-community/regexpp': 4.5.0 + '@eslint/eslintrc': 2.0.2 + '@eslint/js': 8.37.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.5.1: + resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.0 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + dev: true + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.0.0: + resolution: {integrity: sha512-zmp9ZDC6NpDNLujV2W2n+3lH+BafIVZ4/ct+Yj3BMZTH/+bgm/eVjHzeFLwxJrrIGgjjS2eiQLlpurHsNlEAtQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + fs.realpath: 1.0.0 + minimatch: 9.0.0 + minipass: 5.0.0 + path-scurry: 1.6.4 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /headers-polyfill@3.1.2: + resolution: {integrity: sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA==} + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-sdsl@4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@13.2.1: + resolution: {integrity: sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + chalk: 5.2.0 + cli-truncate: 3.1.0 + commander: 10.0.0 + debug: 4.3.4 + execa: 7.1.1 + lilconfig: 2.1.0 + listr2: 5.0.8 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.1 + yaml: 2.2.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2@5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.19 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lru-cache@9.0.2: + resolution: {integrity: sha512-7zYMKApzQ9qQE13xQUzbXVY3p2C5lh+9V+bs8M9fRf1TF59id+8jkljRWtIPfBfNP4yQAol5cqh/e8clxatdXw==} + engines: {node: 14 || >=16.14} + dev: true + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.0: + resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /mixme@0.5.9: + resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} + engines: {node: '>= 8.0.0'} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /openapi-typescript@6.2.0: + resolution: {integrity: sha512-d1HF70HCUnU+g9hgX5X3MJ+BMgwX16fzwD6mkyfNqdxXuOTOSkm+O+aaFqLNX13aFbCylz4m2WiVe4viAShxiQ==} + hasBin: true + dependencies: + ansi-colors: 4.1.3 + fast-glob: 3.2.12 + js-yaml: 4.1.0 + supports-color: 9.3.1 + undici: 5.21.0 + yargs-parser: 21.1.1 + dev: true + + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + dev: true + + /p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.6.4: + resolution: {integrity: sha512-Qp/9IHkdNiXJ3/Kon++At2nVpnhRiPq/aSvQN+H3U1WZbvNRK0RIQK/o4HMqPoXjpuGJUEWpHSs6Mnjxqh3TQg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 9.0.2 + minipass: 5.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /preferred-pm@3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@5.0.0: + resolution: {integrity: sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.0.0 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + dependencies: + tslib: 2.5.0 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + array.prototype.flat: 1.3.1 + breakword: 1.0.5 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + dev: true + + /smob@0.0.6: + resolution: {integrity: sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + dependencies: + mixme: 0.5.9 + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: true + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@9.3.1: + resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} + engines: {node: '>=12'} + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /terser@5.16.8: + resolution: {integrity: sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + dev: true + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /true-myth@4.1.1: + resolution: {integrity: sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==} + engines: {node: 10.* || >= 12.*} + dev: true + + /ts-morph@13.0.3: + resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==} + dependencies: + '@ts-morph/common': 0.12.3 + code-block-writer: 11.0.3 + dev: true + + /ts-node@10.9.1(@types/node@18.15.11)(typescript@5.0.2): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.15.11 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@types/node@18.15.11)(typescript@5.0.4): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.15.11 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-prune@0.10.3: + resolution: {integrity: sha512-iS47YTbdIcvN8Nh/1BFyziyUqmjXz7GVzWu02RaZXqb+e/3Qe1B7IQ4860krOeCGUeJmterAlaM2FRH0Ue0hjw==} + hasBin: true + dependencies: + commander: 6.2.1 + cosmiconfig: 7.1.0 + json5: 2.2.3 + lodash: 4.17.21 + true-myth: 4.1.1 + ts-morph: 13.0.3 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + + /tsutils@3.21.0(typescript@5.0.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tty-table@4.2.1: + resolution: {integrity: sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.7.1 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typescript@4.5.2: + resolution: {integrity: sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici@5.21.0: + resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==} + engines: {node: '>=12.18'} + dependencies: + busboy: 1.6.0 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vite-node@0.29.8(@types/node@18.15.11): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.11) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.2.1(@types/node@18.15.11): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.14 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.11 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.2.1(@types/node@18.15.11) + vite-node: 0.29.8(@types/node@18.15.11) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module@2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + dev: true + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml@2.2.1: + resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + + github.com/Rendez/openapi-typescript-fetch/ea89f6480e498ec022e2f2f67f85004eb54e6f54: + resolution: {tarball: https://codeload.github.com/Rendez/openapi-typescript-fetch/tar.gz/ea89f6480e498ec022e2f2f67f85004eb54e6f54} + name: openapi-typescript-fetch + version: 1.1.3 + engines: {node: '>= 12.0.0', npm: '>= 6.0.0'} + prepare: true + requiresBuild: true + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..dee51e9 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" diff --git a/prepare.cjs b/prepare.cjs new file mode 100644 index 0000000..2c42373 --- /dev/null +++ b/prepare.cjs @@ -0,0 +1,5 @@ +const isCi = require('is-ci'); + +if (!isCi) { + require('husky').install(); +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..c8ddc1e --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2021", + "module": "esnext", + "lib": ["ES2021", "dom"], + "skipLibCheck": true, + "esModuleInterop": true, + "moduleResolution": "nodenext", + "strict": true + } +}