From f9f1b7f42f1ec0db11a153f3c957f22aaf52a095 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Tue, 8 Oct 2024 00:06:26 +0100 Subject: [PATCH] feat(community): add libsql vectorstore (#6904) Co-authored-by: jacoblee93 --- .../docs/integrations/vectorstores/libsql.mdx | 164 ++++++++++++++ libs/langchain-community/.gitignore | 4 + libs/langchain-community/langchain.config.js | 2 + libs/langchain-community/package.json | 18 ++ .../src/load/import_constants.ts | 1 + .../src/vectorstores/libsql.ts | 209 ++++++++++++++++++ yarn.lock | 176 ++++++++++++++- 7 files changed, 566 insertions(+), 8 deletions(-) create mode 100644 docs/core_docs/docs/integrations/vectorstores/libsql.mdx create mode 100644 libs/langchain-community/src/vectorstores/libsql.ts diff --git a/docs/core_docs/docs/integrations/vectorstores/libsql.mdx b/docs/core_docs/docs/integrations/vectorstores/libsql.mdx new file mode 100644 index 000000000000..0d138c184220 --- /dev/null +++ b/docs/core_docs/docs/integrations/vectorstores/libsql.mdx @@ -0,0 +1,164 @@ +# libSQL + +[Turso](https://turso.tech) is a SQLite-compatible database built on [libSQL](https://docs.turso.tech/libsql), the Open Contribution fork of SQLite. Vector Similiarity Search is built into Turso and libSQL as a native datatype, enabling you to store and query vectors directly in the database. + +LangChain.js supports using a local libSQL, or remote Turso database as a vector store, and provides a simple API to interact with it. + +This guide provides a quick overview for getting started with libSQL vector stores. For detailed documentation of all libSQL features and configurations head to the API reference. + +## Overview + +## Integration details + +| Class | Package | JS support | Package latest | +| ------------------- | ---------------------- | ---------- | ----------------------------------------------------------------- | +| `LibSQLVectorStore` | `@langchain/community` | ✅ | ![npm version](https://img.shields.io/npm/v/@langchain/community) | + +## Setup + +To use libSQL vector stores, you'll need to create a Turso account or set up a local SQLite database, and install the `@langchain/community` integration package. + +This guide will also use OpenAI embeddings, which require you to install the `@langchain/openai` integration package. You can also use other supported embeddings models if you wish. + +You can use local SQLite when working with the libSQL vector store, or use a hosted Turso Database. + +import IntegrationInstallTooltip from "@mdx_components/integration_install_tooltip.mdx"; + + + +```bash npm2yarn +npm install @libsql/client @langchain/openai @langchain/community +``` + +Now it's time to create a database. You can create one locally, or use a hosted Turso database. + +### Local libSQL + +Create a new local SQLite file and connect to the shell: + +```bash +sqlite3 file.db +``` + +### Hosted Turso + +Visit [sqlite.new](https://sqlite.new) to create a new database, give it a name, and create a database auth token. + +Make sure to copy the database auth token, and the database URL, it should look something like: + +```text +libsql://[database-name]-[your-username].turso.io +``` + +### Setup the table and index + +Execute the following SQL command to create a new table or add the embedding column to an existing table. + +Make sure to mopdify the following parts of the SQL: + +- `TABLE_NAME` is the name of the table you want to create. +- `content` is used to store the `Document.pageContent` values. +- `metadata` is used to store the `Document.metadata` object. +- `EMBEDDING_COLUMN` is used to store the vector values, use the dimensions size used by the model you plan to use (1536 for OpenAI). + +```sql +CREATE TABLE IF NOT EXISTS TABLE_NAME ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + content TEXT, + metadata TEXT, + EMBEDDING_COLUMN F32_BLOB(1536) -- 1536-dimensional f32 vector for OpenAI +); +``` + +Now create an index on the `EMBEDDING_COLUMN` column: + +```sql +CREATE INDEX IF NOT EXISTS idx_TABLE_NAME_EMBEDDING_COLUMN ON TABLE_NAME(libsql_vector_idx(EMBEDDING_COLUMN)); +``` + +Make sure to replace the `TABLE_NAME` and `EMBEDDING_COLUMN` with the values you used in the previous step. + +## Instantiation + +To initialize a new `LibSQL` vector store, you need to provide the database URL and Auth Token when working remotely, or by passing the filename for a local SQLite. + +```typescript +import { LibSQLVectorStore } from "@langchain/community/vectorstores/libsql"; +import { OpenAIEmbeddings } from "@langchain/openai"; +import { createClient } from "@libsql/client"; + +const embeddings = new OpenAIEmbeddings({ + model: "text-embedding-3-small", +}); + +const libsqlClient = createClient({ + url: "libsql://[database-name]-[your-username].turso.io", + authToken: "...", +}); + +// Local instantiation +// const libsqlClient = createClient({ +// url: "file:./dev.db", +// }); + +const vectorStore = new LibSQLVectorStore(embeddings, { + db: libsqlClient, + tableName: "TABLE_NAME", + embeddingColumn: "EMBEDDING_COLUMN", + dimensions: 1536, +}); +``` + +## Manage vector store + +### Add items to vector store + +```typescript +import type { Document } from "@langchain/core/documents"; + +const documents: Document[] = [ + { pageContent: "Hello", metadata: { topic: "greeting" } }, + { pageContent: "Bye bye", metadata: { topic: "greeting" } }, +]; + +await vectorStore.addDocuments(documents); +``` + +### Delete items from vector store + +```typescript +await vectorStore.deleteDocuments({ ids: [1, 2] }); +``` + +## Query vector store + +Once you have inserted the documents, you can query the vector store. + +### Query directly + +Performing a simple similarity search can be done as follows: + +```typescript +const resultOne = await vectorStore.similaritySearch("hola", 1); + +for (const doc of similaritySearchResults) { + console.log(`${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`); +} +``` + +For similarity search with scores: + +```typescript +const similaritySearchWithScoreResults = + await vectorStore.similaritySearchWithScore("hola", 1); + +for (const [doc, score] of similaritySearchWithScoreResults) { + console.log( + `${score.toFixed(3)} ${doc.pageContent} [${JSON.stringify(doc.metadata)}` + ); +} +``` + +## API reference + +For detailed documentation of all `LibSQLVectorStore` features and configurations head to the API reference. diff --git a/libs/langchain-community/.gitignore b/libs/langchain-community/.gitignore index 0168b6a3643a..676b316638e8 100644 --- a/libs/langchain-community/.gitignore +++ b/libs/langchain-community/.gitignore @@ -370,6 +370,10 @@ vectorstores/lancedb.cjs vectorstores/lancedb.js vectorstores/lancedb.d.ts vectorstores/lancedb.d.cts +vectorstores/libsql.cjs +vectorstores/libsql.js +vectorstores/libsql.d.ts +vectorstores/libsql.d.cts vectorstores/milvus.cjs vectorstores/milvus.js vectorstores/milvus.d.ts diff --git a/libs/langchain-community/langchain.config.js b/libs/langchain-community/langchain.config.js index 61cdcbc7ab65..78118b4d1d5e 100644 --- a/libs/langchain-community/langchain.config.js +++ b/libs/langchain-community/langchain.config.js @@ -129,6 +129,7 @@ export const config = { "vectorstores/hnswlib": "vectorstores/hnswlib", "vectorstores/hanavector": "vectorstores/hanavector", "vectorstores/lancedb": "vectorstores/lancedb", + "vectorstores/libsql": "vectorstores/libsql", "vectorstores/milvus": "vectorstores/milvus", "vectorstores/momento_vector_index": "vectorstores/momento_vector_index", "vectorstores/mongodb_atlas": "vectorstores/mongodb_atlas", @@ -375,6 +376,7 @@ export const config = { "vectorstores/hnswlib", "vectorstores/hanavector", "vectorstores/lancedb", + "vectorstores/libsql", "vectorstores/milvus", "vectorstores/momento_vector_index", "vectorstores/mongodb_atlas", diff --git a/libs/langchain-community/package.json b/libs/langchain-community/package.json index 652677c8f19a..1a7d9f9e6d4b 100644 --- a/libs/langchain-community/package.json +++ b/libs/langchain-community/package.json @@ -82,6 +82,7 @@ "@langchain/scripts": ">=0.1.0 <0.2.0", "@langchain/standard-tests": "0.0.0", "@layerup/layerup-security": "^1.5.12", + "@libsql/client": "^0.14.0", "@mendable/firecrawl-js": "^0.0.36", "@mlc-ai/web-llm": ">=0.2.62 <0.3.0", "@mozilla/readability": "^0.4.4", @@ -244,6 +245,7 @@ "@huggingface/inference": "^2.6.4", "@langchain/core": ">=0.2.21 <0.4.0", "@layerup/layerup-security": "^1.5.12", + "@libsql/client": "^0.14.0", "@mendable/firecrawl-js": "^0.0.13", "@mlc-ai/web-llm": "*", "@mozilla/readability": "*", @@ -421,6 +423,9 @@ "@layerup/layerup-security": { "optional": true }, + "@libsql/client": { + "optional": true + }, "@mendable/firecrawl-js": { "optional": true }, @@ -1536,6 +1541,15 @@ "import": "./vectorstores/lancedb.js", "require": "./vectorstores/lancedb.cjs" }, + "./vectorstores/libsql": { + "types": { + "import": "./vectorstores/libsql.d.ts", + "require": "./vectorstores/libsql.d.cts", + "default": "./vectorstores/libsql.d.ts" + }, + "import": "./vectorstores/libsql.js", + "require": "./vectorstores/libsql.cjs" + }, "./vectorstores/milvus": { "types": { "import": "./vectorstores/milvus.d.ts", @@ -3388,6 +3402,10 @@ "vectorstores/lancedb.js", "vectorstores/lancedb.d.ts", "vectorstores/lancedb.d.cts", + "vectorstores/libsql.cjs", + "vectorstores/libsql.js", + "vectorstores/libsql.d.ts", + "vectorstores/libsql.d.cts", "vectorstores/milvus.cjs", "vectorstores/milvus.js", "vectorstores/milvus.d.ts", diff --git a/libs/langchain-community/src/load/import_constants.ts b/libs/langchain-community/src/load/import_constants.ts index 3044b499e239..963f64864a04 100644 --- a/libs/langchain-community/src/load/import_constants.ts +++ b/libs/langchain-community/src/load/import_constants.ts @@ -53,6 +53,7 @@ export const optionalImportEntrypoints: string[] = [ "langchain_community/vectorstores/hnswlib", "langchain_community/vectorstores/hanavector", "langchain_community/vectorstores/lancedb", + "langchain_community/vectorstores/libsql", "langchain_community/vectorstores/milvus", "langchain_community/vectorstores/momento_vector_index", "langchain_community/vectorstores/mongodb_atlas", diff --git a/libs/langchain-community/src/vectorstores/libsql.ts b/libs/langchain-community/src/vectorstores/libsql.ts new file mode 100644 index 000000000000..3740c62d99db --- /dev/null +++ b/libs/langchain-community/src/vectorstores/libsql.ts @@ -0,0 +1,209 @@ +import type { Client } from "@libsql/client"; +import { VectorStore } from "@langchain/core/vectorstores"; +import type { EmbeddingsInterface } from "@langchain/core/embeddings"; +import { Document } from "@langchain/core/documents"; + +/** + * Interface for LibSQLVectorStore configuration options. + */ +export interface LibSQLVectorStoreArgs { + db: Client; + /** Name of the table to store vectors. Defaults to "vectors". */ + table?: string; + /** Name of the column to store embeddings. Defaults to "embedding". */ + column?: string; + // TODO: Support adding additional columns to the table for metadata. +} + +/** + * A vector store using LibSQL/Turso for storage and retrieval. + */ +export class LibSQLVectorStore extends VectorStore { + declare FilterType: (doc: Document) => boolean; + + private db; + + private readonly table: string; + + private readonly column: string; + + /** + * Returns the type of vector store. + * @returns {string} The string "libsql". + */ + _vectorstoreType(): string { + return "libsql"; + } + + /** + * Initializes a new instance of the LibSQLVectorStore. + * @param {EmbeddingsInterface} embeddings - The embeddings interface to use. + * @param {Client} db - The LibSQL client instance. + * @param {LibSQLVectorStoreArgs} options - Configuration options for the vector store. + */ + constructor(embeddings: EmbeddingsInterface, options: LibSQLVectorStoreArgs) { + super(embeddings, options); + + this.db = options.db; + this.table = options.table || "vectors"; + this.column = options.column || "embedding"; + } + + /** + * Adds documents to the vector store. + * @param {Document[]} documents - The documents to add. + * @returns {Promise} The IDs of the added documents. + */ + async addDocuments(documents: Document[]): Promise { + const texts = documents.map(({ pageContent }) => pageContent); + const embeddings = await this.embeddings.embedDocuments(texts); + + return this.addVectors(embeddings, documents); + } + + /** + * Adds vectors to the vector store. + * @param {number[][]} vectors - The vectors to add. + * @param {Document[]} documents - The documents associated with the vectors. + * @returns {Promise} The IDs of the added vectors. + */ + async addVectors( + vectors: number[][], + documents: Document[] + ): Promise { + const rows = vectors.map((embedding, idx) => ({ + content: documents[idx].pageContent, + embedding: `[${embedding.join(",")}]`, + metadata: JSON.stringify(documents[idx].metadata), + })); + + const batchSize = 100; + const ids: string[] = []; + + for (let i = 0; i < rows.length; i += batchSize) { + const chunk = rows.slice(i, i + batchSize); + const insertQueries = chunk.map( + (row) => + `INSERT INTO ${this.table} (content, metadata, ${this.column}) VALUES (${row.content}, ${row.metadata}, vector(${row.embedding})) RETURNING id` + ); + + const results = await this.db.batch(insertQueries); + + for (const result of results) { + if ( + result && + result.rows && + result.rows.length > 0 && + result.rows[0].id != null + ) { + ids.push(result.rows[0].id.toString()); + } + } + } + + return ids; + } + + /** + * Performs a similarity search using a vector query and returns documents with their scores. + * @param {number[]} query - The query vector. + * @param {number} k - The number of results to return. + * @returns {Promise<[Document, number][]>} An array of tuples containing the similar documents and their scores. + */ + async similaritySearchVectorWithScore( + query: number[], + k: number + // filter is currently unused + // filter?: this["FilterType"] + ): Promise<[Document, number][]> { + // Potential SQL injection risk if query vector is not properly sanitized. + if (!query.every((num) => typeof num === "number" && !Number.isNaN(num))) { + throw new Error("Invalid query vector: all elements must be numbers"); + } + + const queryVector = `[${query.join(",")}]`; + + const sql = ` + SELECT content, metadata, vector_distance_cos(${this.column}, vector(${queryVector})) AS distance + FROM vector_top_k('${this.table}_idx', vector(${queryVector}), ${k}) + JOIN ${this.table} ON ${this.table}.rowid = id + `; + + const results = await this.db.execute(sql); + + return results.rows.map((row: any) => { + const metadata = JSON.parse(row.metadata); + + const doc = new Document({ + metadata, + pageContent: row.content, + }); + + return [doc, row.distance]; + }); + } + + /** + * Deletes vectors from the store. + * @param {Object} params - Delete parameters. + * @param {string[] | number[]} [params.ids] - The ids of the vectors to delete. + * @returns {Promise} + */ + async delete(params: { ids?: string[] | number[] }): Promise { + if (!params.ids) { + await this.db.execute(`DELETE FROM ${this.table}`); + return; + } + + const idsToDelete = params.ids.join(", "); + + await this.db.execute({ + sql: `DELETE FROM ${this.table} WHERE id IN (?)`, + args: [idsToDelete], + }); + } + + /** + * Creates a new LibSQLVectorStore instance from texts. + * @param {string[]} texts - The texts to add to the store. + * @param {object[] | object} metadatas - The metadata for the texts. + * @param {EmbeddingsInterface} embeddings - The embeddings interface to use. + * @param {Client} dbClient - The LibSQL client instance. + * @param {LibSQLVectorStoreArgs} [options] - Configuration options for the vector store. + * @returns {Promise} A new LibSQLVectorStore instance. + */ + static async fromTexts( + texts: string[], + metadatas: object[] | object, + embeddings: EmbeddingsInterface, + options: LibSQLVectorStoreArgs + ): Promise { + const docs = texts.map((text, i) => { + const metadata = Array.isArray(metadatas) ? metadatas[i] : metadatas; + + return new Document({ pageContent: text, metadata }); + }); + + return LibSQLVectorStore.fromDocuments(docs, embeddings, options); + } + + /** + * Creates a new LibSQLVectorStore instance from documents. + * @param {Document[]} docs - The documents to add to the store. + * @param {EmbeddingsInterface} embeddings - The embeddings interface to use. + * @param {Client} dbClient - The LibSQL client instance. + * @param {LibSQLVectorStoreArgs} [options] - Configuration options for the vector store. + * @returns {Promise} A new LibSQLVectorStore instance. + */ + static async fromDocuments( + docs: Document[], + embeddings: EmbeddingsInterface, + options: LibSQLVectorStoreArgs + ): Promise { + const instance = new this(embeddings, options); + + await instance.addDocuments(docs); + + return instance; + } +} diff --git a/yarn.lock b/yarn.lock index 30f3d3bbe23b..85aa0402dea6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11469,6 +11469,7 @@ __metadata: "@langchain/scripts": ">=0.1.0 <0.2.0" "@langchain/standard-tests": 0.0.0 "@layerup/layerup-security": ^1.5.12 + "@libsql/client": ^0.14.0 "@mendable/firecrawl-js": ^0.0.36 "@mlc-ai/web-llm": ">=0.2.62 <0.3.0" "@mozilla/readability": ^0.4.4 @@ -11639,6 +11640,7 @@ __metadata: "@huggingface/inference": ^2.6.4 "@langchain/core": ">=0.2.21 <0.4.0" "@layerup/layerup-security": ^1.5.12 + "@libsql/client": ^0.14.0 "@mendable/firecrawl-js": ^0.0.13 "@mlc-ai/web-llm": "*" "@mozilla/readability": "*" @@ -11787,6 +11789,8 @@ __metadata: optional: true "@layerup/layerup-security": optional: true + "@libsql/client": + optional: true "@mendable/firecrawl-js": optional: true "@mlc-ai/web-llm": @@ -12869,6 +12873,106 @@ __metadata: languageName: node linkType: hard +"@libsql/client@npm:^0.14.0": + version: 0.14.0 + resolution: "@libsql/client@npm:0.14.0" + dependencies: + "@libsql/core": ^0.14.0 + "@libsql/hrana-client": ^0.7.0 + js-base64: ^3.7.5 + libsql: ^0.4.4 + promise-limit: ^2.7.0 + checksum: 7eeaf95d76da8870544c27fcf1206c377a0fc3df72b174393a1fb17fc92ca568d9a42d24d65e771ca77edc5108e853a7ac18540ad0242da759f2ec1191103d99 + languageName: node + linkType: hard + +"@libsql/core@npm:^0.14.0": + version: 0.14.0 + resolution: "@libsql/core@npm:0.14.0" + dependencies: + js-base64: ^3.7.5 + checksum: dae12491a277e03c3729de069bee9af9689f0c178b0fd1ef342f03aab94e4ccba8801e11d0393e0e3a77596e34f101b69b7f07f16f6b34a09eca698e340bed36 + languageName: node + linkType: hard + +"@libsql/darwin-arm64@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/darwin-arm64@npm:0.4.6" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@libsql/darwin-x64@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/darwin-x64@npm:0.4.6" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@libsql/hrana-client@npm:^0.7.0": + version: 0.7.0 + resolution: "@libsql/hrana-client@npm:0.7.0" + dependencies: + "@libsql/isomorphic-fetch": ^0.3.1 + "@libsql/isomorphic-ws": ^0.1.5 + js-base64: ^3.7.5 + node-fetch: ^3.3.2 + checksum: 0d36931ca3a01144dc14294d1d9666ee64724c6ab4889890ff0bc45564369503f6abccbc448518485af107bd69f49d35878059c46d98dacb34db4757b52c406a + languageName: node + linkType: hard + +"@libsql/isomorphic-fetch@npm:^0.3.1": + version: 0.3.1 + resolution: "@libsql/isomorphic-fetch@npm:0.3.1" + checksum: 9f131cae3b14c39712f1140e21b2ab1ccc81b5f6ad2aa90d739dc8df0602109a5c4c0ea820dcd39632ace7a4b247bc31e2a5e79cd6efaf5f1777650aac9ac694 + languageName: node + linkType: hard + +"@libsql/isomorphic-ws@npm:^0.1.5": + version: 0.1.5 + resolution: "@libsql/isomorphic-ws@npm:0.1.5" + dependencies: + "@types/ws": ^8.5.4 + ws: ^8.13.0 + checksum: 8255a0f4cae8ea66c94d6ab02ca57ddc7d6472c43700fd089e615e2df56028bf3723f694c91fbd76db403772f43f49cf2545e29e7ac18f77aa482fcfed71c940 + languageName: node + linkType: hard + +"@libsql/linux-arm64-gnu@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/linux-arm64-gnu@npm:0.4.6" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@libsql/linux-arm64-musl@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/linux-arm64-musl@npm:0.4.6" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@libsql/linux-x64-gnu@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/linux-x64-gnu@npm:0.4.6" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@libsql/linux-x64-musl@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/linux-x64-musl@npm:0.4.6" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@libsql/win32-x64-msvc@npm:0.4.6": + version: 0.4.6 + resolution: "@libsql/win32-x64-msvc@npm:0.4.6" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@mapbox/node-pre-gyp@npm:^1.0.0": version: 1.0.10 resolution: "@mapbox/node-pre-gyp@npm:1.0.10" @@ -13057,6 +13161,13 @@ __metadata: languageName: node linkType: hard +"@neon-rs/load@npm:^0.0.4": + version: 0.0.4 + resolution: "@neon-rs/load@npm:0.0.4" + checksum: ceed42a681980f4c96152857f6846434e3a89e25cac14228604a55e7992e96af01f30629026a498341984b405a2687099e56256a9eded9fee5393facca1ef762 + languageName: node + linkType: hard + "@neon-rs/load@npm:^0.0.74": version: 0.0.74 resolution: "@neon-rs/load@npm:0.0.74" @@ -19565,6 +19676,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^8.5.4": + version: 8.5.12 + resolution: "@types/ws@npm:8.5.12" + dependencies: + "@types/node": "*" + checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.5": version: 8.5.7 resolution: "@types/ws@npm:8.5.7" @@ -24982,6 +25102,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:2.0.2, detect-libc@npm:^2.0.2": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d + languageName: node + linkType: hard + "detect-libc@npm:^2.0.0": version: 2.0.1 resolution: "detect-libc@npm:2.0.1" @@ -24989,13 +25116,6 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.2": - version: 2.0.2 - resolution: "detect-libc@npm:2.0.2" - checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d - languageName: node - linkType: hard - "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -32086,7 +32206,7 @@ __metadata: languageName: node linkType: hard -"js-base64@npm:3.7.7": +"js-base64@npm:3.7.7, js-base64@npm:^3.7.5": version: 3.7.7 resolution: "js-base64@npm:3.7.7" checksum: d1b02971db9dc0fd35baecfaf6ba499731fb44fe3373e7e1d6681fbd3ba665f29e8d9d17910254ef8104e2cb8b44117fe4202d3dc54c7cafe9ba300fe5433358 @@ -32819,6 +32939,39 @@ __metadata: languageName: node linkType: hard +"libsql@npm:^0.4.4": + version: 0.4.6 + resolution: "libsql@npm:0.4.6" + dependencies: + "@libsql/darwin-arm64": 0.4.6 + "@libsql/darwin-x64": 0.4.6 + "@libsql/linux-arm64-gnu": 0.4.6 + "@libsql/linux-arm64-musl": 0.4.6 + "@libsql/linux-x64-gnu": 0.4.6 + "@libsql/linux-x64-musl": 0.4.6 + "@libsql/win32-x64-msvc": 0.4.6 + "@neon-rs/load": ^0.0.4 + detect-libc: 2.0.2 + dependenciesMeta: + "@libsql/darwin-arm64": + optional: true + "@libsql/darwin-x64": + optional: true + "@libsql/linux-arm64-gnu": + optional: true + "@libsql/linux-arm64-musl": + optional: true + "@libsql/linux-x64-gnu": + optional: true + "@libsql/linux-x64-musl": + optional: true + "@libsql/win32-x64-msvc": + optional: true + checksum: 0c2e864172d43bbf9555eeb1e5aba41e1fe86cb3eb05f99a8ed1b92afc702ec84193fb207163d7e3b291a65d86735f45a86138c03b919fcf0edca054cd0ea1b3 + conditions: (os=darwin | os=linux | os=win32) & (cpu=x64 | cpu=arm64 | cpu=wasm32) + languageName: node + linkType: hard + "lie@npm:~3.3.0": version: 3.3.0 resolution: "lie@npm:3.3.0" @@ -37166,6 +37319,13 @@ __metadata: languageName: node linkType: hard +"promise-limit@npm:^2.7.0": + version: 2.7.0 + resolution: "promise-limit@npm:2.7.0" + checksum: 3e20a46d752ab41c921feceb668b3a6d000438573e71342d42bf63373fdbafbf4b6a3f88ef5ff902a2a37be28152dc74e618e863134fd4c08c196448f4a6d28f + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1"