diff --git a/libs/sdk-js/.gitignore b/libs/sdk-js/.gitignore deleted file mode 100644 index 8bb855c55..000000000 --- a/libs/sdk-js/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -index.cjs -index.js -index.d.ts -index.d.cts -client.cjs -client.js -client.d.ts -client.d.cts -react.cjs -react.js -react.d.ts -react.d.cts -node_modules -dist -.yarn -docs diff --git a/libs/sdk-js/.prettierrc b/libs/sdk-js/.prettierrc deleted file mode 100644 index 0967ef424..000000000 --- a/libs/sdk-js/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/libs/sdk-js/LICENSE b/libs/sdk-js/LICENSE deleted file mode 100644 index fc0602fee..000000000 --- a/libs/sdk-js/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 LangChain, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/libs/sdk-js/README.md b/libs/sdk-js/README.md deleted file mode 100644 index fb47ef3cb..000000000 --- a/libs/sdk-js/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# LangGraph JS/TS SDK - -This repository contains the JS/TS SDK for interacting with the LangGraph REST API. - -## Quick Start - -To get started with the JS/TS SDK, [install the package](https://www.npmjs.com/package/@langchain/langgraph-sdk) - -```bash -yarn add @langchain/langgraph-sdk -``` - -You will need a running LangGraph API server. If you're running a server locally using `langgraph-cli`, SDK will automatically point at `http://localhost:8123`, otherwise -you would need to specify the server URL when creating a client. - -```js -import { Client } from "@langchain/langgraph-sdk"; - -const client = new Client(); - -// List all assistants -const assistants = await client.assistants.search({ - metadata: null, - offset: 0, - limit: 10, -}); - -// We auto-create an assistant for each graph you register in config. -const agent = assistants[0]; - -// Start a new thread -const thread = await client.threads.create(); - -// Start a streaming run -const messages = [{ role: "human", content: "what's the weather in la" }]; - -const streamResponse = client.runs.stream( - thread["thread_id"], - agent["assistant_id"], - { - input: { messages }, - } -); - -for await (const chunk of streamResponse) { - console.log(chunk); -} -``` - -## Documentation - -To generate documentation, run the following commands: - -1. Generate docs. - - yarn typedoc - -1. Consolidate doc files into one markdown file. - - npx concat-md --decrease-title-levels --ignore=js_ts_sdk_ref.md --start-title-level-at 2 docs > docs/js_ts_sdk_ref.md - -1. Copy `js_ts_sdk_ref.md` to MkDocs directory. - - cp docs/js_ts_sdk_ref.md ../../docs/docs/cloud/reference/sdk/js_ts_sdk_ref.md diff --git a/libs/sdk-js/jest.config.js b/libs/sdk-js/jest.config.js deleted file mode 100644 index 10218cfab..000000000 --- a/libs/sdk-js/jest.config.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @type {import('jest').Config} */ -export default { - preset: 'ts-jest', - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, -}; diff --git a/libs/sdk-js/langchain.config.js b/libs/sdk-js/langchain.config.js deleted file mode 100644 index b74696d7b..000000000 --- a/libs/sdk-js/langchain.config.js +++ /dev/null @@ -1,20 +0,0 @@ -import { resolve, dirname } from "node:path"; -import { fileURLToPath } from "node:url"; - -/** - * @param {string} relativePath - * @returns {string} - */ -function abs(relativePath) { - return resolve(dirname(fileURLToPath(import.meta.url)), relativePath); -} - -export const config = { - internals: [/react/], - entrypoints: { index: "index", client: "client", react: "react/index" }, - tsConfigPath: resolve("./tsconfig.json"), - cjsSource: "./dist-cjs", - cjsDestination: "./dist", - additionalGitignorePaths: ["docs"], - abs, -}; diff --git a/libs/sdk-js/package.json b/libs/sdk-js/package.json deleted file mode 100644 index 6b3f3733a..000000000 --- a/libs/sdk-js/package.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "name": "@langchain/langgraph-sdk", - "version": "0.0.45", - "description": "Client library for interacting with the LangGraph API", - "type": "module", - "packageManager": "yarn@1.22.19", - "scripts": { - "clean": "rm -rf dist/ dist-cjs/", - "build": "yarn clean && yarn lc_build --create-entrypoints --pre --tree-shaking", - "prepublish": "yarn run build", - "format": "prettier --write src", - "lint": "prettier --check src && tsc --noEmit", - "test": "NODE_OPTIONS=--experimental-vm-modules jest --testPathIgnorePatterns=\\.int\\.test.ts", - "typedoc": "typedoc && typedoc src/react/index.ts --out docs/react --options typedoc.react.json" - }, - "main": "index.js", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.15", - "p-queue": "^6.6.2", - "p-retry": "4", - "uuid": "^9.0.0" - }, - "devDependencies": { - "@jest/globals": "^29.7.0", - "@langchain/core": "^0.3.31", - "@langchain/scripts": "^0.1.4", - "@tsconfig/recommended": "^1.0.2", - "@types/jest": "^29.5.12", - "@types/node": "^20.12.12", - "@types/uuid": "^9.0.1", - "@types/react": "18.3.2", - "concat-md": "^0.5.1", - "jest": "^29.7.0", - "prettier": "^3.2.5", - "ts-jest": "^29.1.2", - "typedoc": "^0.27.7", - "typedoc-plugin-markdown": "^4.4.2", - "typescript": "^5.4.5", - "react": "^18.3.1" - }, - "peerDependencies": { - "react": "^18 || ^19", - "@langchain/core": ">=0.2.31 <0.4.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "@langchain/core": { - "optional": true - } - }, - "exports": { - ".": { - "types": { - "import": "./index.d.ts", - "require": "./index.d.cts", - "default": "./index.d.ts" - }, - "import": "./index.js", - "require": "./index.cjs" - }, - "./client": { - "types": { - "import": "./client.d.ts", - "require": "./client.d.cts", - "default": "./client.d.ts" - }, - "import": "./client.js", - "require": "./client.cjs" - }, - "./react": { - "types": { - "import": "./react.d.ts", - "require": "./react.d.cts", - "default": "./react.d.ts" - }, - "import": "./react.js", - "require": "./react.cjs" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist/", - "index.cjs", - "index.js", - "index.d.ts", - "index.d.cts", - "client.cjs", - "client.js", - "client.d.ts", - "client.d.cts", - "react.cjs", - "react.js", - "react.d.ts", - "react.d.cts" - ] -} diff --git a/libs/sdk-js/src/client.ts b/libs/sdk-js/src/client.ts deleted file mode 100644 index 930c419b5..000000000 --- a/libs/sdk-js/src/client.ts +++ /dev/null @@ -1,1281 +0,0 @@ -import { - Assistant, - AssistantGraph, - CancelAction, - Config, - DefaultValues, - GraphSchema, - Metadata, - Run, - RunStatus, - Thread, - ThreadState, - Cron, - AssistantVersion, - Subgraphs, - Checkpoint, - SearchItemsResponse, - ListNamespaceResponse, - Item, - ThreadStatus, - CronCreateResponse, - CronCreateForThreadResponse, -} from "./schema.js"; -import { AsyncCaller, AsyncCallerParams } from "./utils/async_caller.js"; -import { IterableReadableStream } from "./utils/stream.js"; -import type { - RunsCreatePayload, - RunsStreamPayload, - RunsWaitPayload, - StreamEvent, - CronsCreatePayload, - OnConflictBehavior, -} from "./types.js"; -import { mergeSignals } from "./utils/signals.js"; -import { getEnvironmentVariable } from "./utils/env.js"; -import { _getFetchImplementation } from "./singletons/fetch.js"; -import type { TypedAsyncGenerator, StreamMode } from "./types.stream.js"; -import { BytesLineDecoder, SSEDecoder } from "./utils/sse.js"; -/** - * Get the API key from the environment. - * Precedence: - * 1. explicit argument - * 2. LANGGRAPH_API_KEY - * 3. LANGSMITH_API_KEY - * 4. LANGCHAIN_API_KEY - * - * @param apiKey - Optional API key provided as an argument - * @returns The API key if found, otherwise undefined - */ -export function getApiKey(apiKey?: string): string | undefined { - if (apiKey) { - return apiKey; - } - - const prefixes = ["LANGGRAPH", "LANGSMITH", "LANGCHAIN"]; - - for (const prefix of prefixes) { - const envKey = getEnvironmentVariable(`${prefix}_API_KEY`); - if (envKey) { - // Remove surrounding quotes - return envKey.trim().replace(/^["']|["']$/g, ""); - } - } - - return undefined; -} - -export interface ClientConfig { - apiUrl?: string; - apiKey?: string; - callerOptions?: AsyncCallerParams; - timeoutMs?: number; - defaultHeaders?: Record; -} - -class BaseClient { - protected asyncCaller: AsyncCaller; - - protected timeoutMs: number | undefined; - - protected apiUrl: string; - - protected defaultHeaders: Record; - - constructor(config?: ClientConfig) { - this.asyncCaller = new AsyncCaller({ - maxRetries: 4, - maxConcurrency: 4, - ...config?.callerOptions, - }); - - this.timeoutMs = config?.timeoutMs; - - // default limit being capped by Chrome - // https://github.com/nodejs/undici/issues/1373 - // Regex to remove trailing slash, if present - this.apiUrl = config?.apiUrl?.replace(/\/$/, "") || "http://localhost:8123"; - this.defaultHeaders = config?.defaultHeaders || {}; - const apiKey = getApiKey(config?.apiKey); - if (apiKey) { - this.defaultHeaders["X-Api-Key"] = apiKey; - } - } - - protected prepareFetchOptions( - path: string, - options?: RequestInit & { - json?: unknown; - params?: Record; - timeoutMs?: number | null; - }, - ): [url: URL, init: RequestInit] { - const mutatedOptions = { - ...options, - headers: { ...this.defaultHeaders, ...options?.headers }, - }; - - if (mutatedOptions.json) { - mutatedOptions.body = JSON.stringify(mutatedOptions.json); - mutatedOptions.headers = { - ...mutatedOptions.headers, - "Content-Type": "application/json", - }; - delete mutatedOptions.json; - } - - let timeoutSignal: AbortSignal | null = null; - if (typeof options?.timeoutMs !== "undefined") { - if (options.timeoutMs != null) { - timeoutSignal = AbortSignal.timeout(options.timeoutMs); - } - } else if (this.timeoutMs != null) { - timeoutSignal = AbortSignal.timeout(this.timeoutMs); - } - - mutatedOptions.signal = mergeSignals(timeoutSignal, mutatedOptions.signal); - const targetUrl = new URL(`${this.apiUrl}${path}`); - - if (mutatedOptions.params) { - for (const [key, value] of Object.entries(mutatedOptions.params)) { - if (value == null) continue; - - let strValue = - typeof value === "string" || typeof value === "number" - ? value.toString() - : JSON.stringify(value); - - targetUrl.searchParams.append(key, strValue); - } - delete mutatedOptions.params; - } - - return [targetUrl, mutatedOptions]; - } - - protected async fetch( - path: string, - options?: RequestInit & { - json?: unknown; - params?: Record; - timeoutMs?: number | null; - signal?: AbortSignal; - }, - ): Promise { - const response = await this.asyncCaller.fetch( - ...this.prepareFetchOptions(path, options), - ); - if (response.status === 202 || response.status === 204) { - return undefined as T; - } - return response.json() as T; - } -} - -export class CronsClient extends BaseClient { - /** - * - * @param threadId The ID of the thread. - * @param assistantId Assistant ID to use for this cron job. - * @param payload Payload for creating a cron job. - * @returns The created background run. - */ - async createForThread( - threadId: string, - assistantId: string, - payload?: CronsCreatePayload, - ): Promise { - const json: Record = { - schedule: payload?.schedule, - input: payload?.input, - config: payload?.config, - metadata: payload?.metadata, - assistant_id: assistantId, - interrupt_before: payload?.interruptBefore, - interrupt_after: payload?.interruptAfter, - webhook: payload?.webhook, - multitask_strategy: payload?.multitaskStrategy, - if_not_exists: payload?.ifNotExists, - }; - return this.fetch( - `/threads/${threadId}/runs/crons`, - { - method: "POST", - json, - }, - ); - } - - /** - * - * @param assistantId Assistant ID to use for this cron job. - * @param payload Payload for creating a cron job. - * @returns - */ - async create( - assistantId: string, - payload?: CronsCreatePayload, - ): Promise { - const json: Record = { - schedule: payload?.schedule, - input: payload?.input, - config: payload?.config, - metadata: payload?.metadata, - assistant_id: assistantId, - interrupt_before: payload?.interruptBefore, - interrupt_after: payload?.interruptAfter, - webhook: payload?.webhook, - multitask_strategy: payload?.multitaskStrategy, - if_not_exists: payload?.ifNotExists, - }; - return this.fetch(`/runs/crons`, { - method: "POST", - json, - }); - } - - /** - * - * @param cronId Cron ID of Cron job to delete. - */ - async delete(cronId: string): Promise { - await this.fetch(`/runs/crons/${cronId}`, { - method: "DELETE", - }); - } - - /** - * - * @param query Query options. - * @returns List of crons. - */ - async search(query?: { - assistantId?: string; - threadId?: string; - limit?: number; - offset?: number; - }): Promise { - return this.fetch("/runs/crons/search", { - method: "POST", - json: { - assistant_id: query?.assistantId ?? undefined, - thread_id: query?.threadId ?? undefined, - limit: query?.limit ?? 10, - offset: query?.offset ?? 0, - }, - }); - } -} - -export class AssistantsClient extends BaseClient { - /** - * Get an assistant by ID. - * - * @param assistantId The ID of the assistant. - * @returns Assistant - */ - async get(assistantId: string): Promise { - return this.fetch(`/assistants/${assistantId}`); - } - - /** - * Get the JSON representation of the graph assigned to a runnable - * @param assistantId The ID of the assistant. - * @param options.xray Whether to include subgraphs in the serialized graph representation. If an integer value is provided, only subgraphs with a depth less than or equal to the value will be included. - * @returns Serialized graph - */ - async getGraph( - assistantId: string, - options?: { xray?: boolean | number }, - ): Promise { - return this.fetch(`/assistants/${assistantId}/graph`, { - params: { xray: options?.xray }, - }); - } - - /** - * Get the state and config schema of the graph assigned to a runnable - * @param assistantId The ID of the assistant. - * @returns Graph schema - */ - async getSchemas(assistantId: string): Promise { - return this.fetch(`/assistants/${assistantId}/schemas`); - } - - /** - * Get the schemas of an assistant by ID. - * - * @param assistantId The ID of the assistant to get the schema of. - * @param options Additional options for getting subgraphs, such as namespace or recursion extraction. - * @returns The subgraphs of the assistant. - */ - async getSubgraphs( - assistantId: string, - options?: { - namespace?: string; - recurse?: boolean; - }, - ): Promise { - if (options?.namespace) { - return this.fetch( - `/assistants/${assistantId}/subgraphs/${options.namespace}`, - { params: { recurse: options?.recurse } }, - ); - } - return this.fetch(`/assistants/${assistantId}/subgraphs`, { - params: { recurse: options?.recurse }, - }); - } - - /** - * Create a new assistant. - * @param payload Payload for creating an assistant. - * @returns The created assistant. - */ - async create(payload: { - graphId: string; - config?: Config; - metadata?: Metadata; - assistantId?: string; - ifExists?: OnConflictBehavior; - name?: string; - }): Promise { - return this.fetch("/assistants", { - method: "POST", - json: { - graph_id: payload.graphId, - config: payload.config, - metadata: payload.metadata, - assistant_id: payload.assistantId, - if_exists: payload.ifExists, - name: payload.name, - }, - }); - } - - /** - * Update an assistant. - * @param assistantId ID of the assistant. - * @param payload Payload for updating the assistant. - * @returns The updated assistant. - */ - async update( - assistantId: string, - payload: { - graphId?: string; - config?: Config; - metadata?: Metadata; - name?: string; - }, - ): Promise { - return this.fetch(`/assistants/${assistantId}`, { - method: "PATCH", - json: { - graph_id: payload.graphId, - config: payload.config, - metadata: payload.metadata, - name: payload.name, - }, - }); - } - - /** - * Delete an assistant. - * - * @param assistantId ID of the assistant. - */ - async delete(assistantId: string): Promise { - return this.fetch(`/assistants/${assistantId}`, { - method: "DELETE", - }); - } - - /** - * List assistants. - * @param query Query options. - * @returns List of assistants. - */ - async search(query?: { - graphId?: string; - metadata?: Metadata; - limit?: number; - offset?: number; - }): Promise { - return this.fetch("/assistants/search", { - method: "POST", - json: { - graph_id: query?.graphId ?? undefined, - metadata: query?.metadata ?? undefined, - limit: query?.limit ?? 10, - offset: query?.offset ?? 0, - }, - }); - } - - /** - * List all versions of an assistant. - * - * @param assistantId ID of the assistant. - * @returns List of assistant versions. - */ - async getVersions( - assistantId: string, - payload?: { - metadata?: Metadata; - limit?: number; - offset?: number; - }, - ): Promise { - return this.fetch( - `/assistants/${assistantId}/versions`, - { - method: "POST", - json: { - metadata: payload?.metadata ?? undefined, - limit: payload?.limit ?? 10, - offset: payload?.offset ?? 0, - }, - }, - ); - } - - /** - * Change the version of an assistant. - * - * @param assistantId ID of the assistant. - * @param version The version to change to. - * @returns The updated assistant. - */ - async setLatest(assistantId: string, version: number): Promise { - return this.fetch(`/assistants/${assistantId}/latest`, { - method: "POST", - json: { version }, - }); - } -} - -export class ThreadsClient< - TStateType = DefaultValues, - TUpdateType = TStateType, -> extends BaseClient { - /** - * Get a thread by ID. - * - * @param threadId ID of the thread. - * @returns The thread. - */ - async get( - threadId: string, - ): Promise> { - return this.fetch>(`/threads/${threadId}`); - } - - /** - * Create a new thread. - * - * @param payload Payload for creating a thread. - * @returns The created thread. - */ - async create(payload?: { - /** - * Metadata for the thread. - */ - metadata?: Metadata; - threadId?: string; - ifExists?: OnConflictBehavior; - }): Promise> { - return this.fetch>(`/threads`, { - method: "POST", - json: { - metadata: payload?.metadata, - thread_id: payload?.threadId, - if_exists: payload?.ifExists, - }, - }); - } - - /** - * Copy an existing thread - * @param threadId ID of the thread to be copied - * @returns Newly copied thread - */ - async copy(threadId: string): Promise> { - return this.fetch>(`/threads/${threadId}/copy`, { - method: "POST", - }); - } - - /** - * Update a thread. - * - * @param threadId ID of the thread. - * @param payload Payload for updating the thread. - * @returns The updated thread. - */ - async update( - threadId: string, - payload?: { - /** - * Metadata for the thread. - */ - metadata?: Metadata; - }, - ): Promise { - return this.fetch(`/threads/${threadId}`, { - method: "PATCH", - json: { metadata: payload?.metadata }, - }); - } - - /** - * Delete a thread. - * - * @param threadId ID of the thread. - */ - async delete(threadId: string): Promise { - return this.fetch(`/threads/${threadId}`, { - method: "DELETE", - }); - } - - /** - * List threads - * - * @param query Query options - * @returns List of threads - */ - async search(query?: { - /** - * Metadata to filter threads by. - */ - metadata?: Metadata; - /** - * Maximum number of threads to return. - * Defaults to 10 - */ - limit?: number; - /** - * Offset to start from. - */ - offset?: number; - /** - * Thread status to filter on. - * Must be one of 'idle', 'busy', 'interrupted' or 'error'. - */ - status?: ThreadStatus; - }): Promise[]> { - return this.fetch[]>("/threads/search", { - method: "POST", - json: { - metadata: query?.metadata ?? undefined, - limit: query?.limit ?? 10, - offset: query?.offset ?? 0, - status: query?.status, - }, - }); - } - - /** - * Get state for a thread. - * - * @param threadId ID of the thread. - * @returns Thread state. - */ - async getState( - threadId: string, - checkpoint?: Checkpoint | string, - options?: { subgraphs?: boolean }, - ): Promise> { - if (checkpoint != null) { - if (typeof checkpoint !== "string") { - return this.fetch>( - `/threads/${threadId}/state/checkpoint`, - { - method: "POST", - json: { checkpoint, subgraphs: options?.subgraphs }, - }, - ); - } - - // deprecated - return this.fetch>( - `/threads/${threadId}/state/${checkpoint}`, - { params: { subgraphs: options?.subgraphs } }, - ); - } - - return this.fetch>(`/threads/${threadId}/state`, { - params: { subgraphs: options?.subgraphs }, - }); - } - - /** - * Add state to a thread. - * - * @param threadId The ID of the thread. - * @returns - */ - async updateState( - threadId: string, - options: { - values: ValuesType; - checkpoint?: Checkpoint; - checkpointId?: string; - asNode?: string; - }, - ): Promise> { - return this.fetch>( - `/threads/${threadId}/state`, - { - method: "POST", - json: { - values: options.values, - checkpoint_id: options.checkpointId, - checkpoint: options.checkpoint, - as_node: options?.asNode, - }, - }, - ); - } - - /** - * Patch the metadata of a thread. - * - * @param threadIdOrConfig Thread ID or config to patch the state of. - * @param metadata Metadata to patch the state with. - */ - async patchState( - threadIdOrConfig: string | Config, - metadata: Metadata, - ): Promise { - let threadId: string; - - if (typeof threadIdOrConfig !== "string") { - if (typeof threadIdOrConfig.configurable?.thread_id !== "string") { - throw new Error( - "Thread ID is required when updating state with a config.", - ); - } - threadId = threadIdOrConfig.configurable.thread_id; - } else { - threadId = threadIdOrConfig; - } - - return this.fetch(`/threads/${threadId}/state`, { - method: "PATCH", - json: { metadata: metadata }, - }); - } - - /** - * Get all past states for a thread. - * - * @param threadId ID of the thread. - * @param options Additional options. - * @returns List of thread states. - */ - async getHistory( - threadId: string, - options?: { - limit?: number; - before?: Config; - checkpoint?: Partial>; - metadata?: Metadata; - }, - ): Promise[]> { - return this.fetch[]>( - `/threads/${threadId}/history`, - { - method: "POST", - json: { - limit: options?.limit ?? 10, - before: options?.before, - metadata: options?.metadata, - checkpoint: options?.checkpoint, - }, - }, - ); - } -} - -export class RunsClient< - TStateType = DefaultValues, - TUpdateType = TStateType, - TCustomEventType = unknown, -> extends BaseClient { - stream< - TStreamMode extends StreamMode | StreamMode[] = StreamMode, - TSubgraphs extends boolean = false, - >( - threadId: null, - assistantId: string, - payload?: Omit< - RunsStreamPayload, - "multitaskStrategy" | "onCompletion" - >, - ): TypedAsyncGenerator< - TStreamMode, - TSubgraphs, - TStateType, - TUpdateType, - TCustomEventType - >; - - stream< - TStreamMode extends StreamMode | StreamMode[] = StreamMode, - TSubgraphs extends boolean = false, - >( - threadId: string, - assistantId: string, - payload?: RunsStreamPayload, - ): TypedAsyncGenerator< - TStreamMode, - TSubgraphs, - TStateType, - TUpdateType, - TCustomEventType - >; - - /** - * Create a run and stream the results. - * - * @param threadId The ID of the thread. - * @param assistantId Assistant ID to use for this run. - * @param payload Payload for creating a run. - */ - async *stream< - TStreamMode extends StreamMode | StreamMode[] = StreamMode, - TSubgraphs extends boolean = false, - >( - threadId: string | null, - assistantId: string, - payload?: RunsStreamPayload, - ): TypedAsyncGenerator< - TStreamMode, - TSubgraphs, - TStateType, - TUpdateType, - TCustomEventType - > { - const json: Record = { - input: payload?.input, - command: payload?.command, - config: payload?.config, - metadata: payload?.metadata, - stream_mode: payload?.streamMode, - stream_subgraphs: payload?.streamSubgraphs, - feedback_keys: payload?.feedbackKeys, - assistant_id: assistantId, - interrupt_before: payload?.interruptBefore, - interrupt_after: payload?.interruptAfter, - checkpoint: payload?.checkpoint, - checkpoint_id: payload?.checkpointId, - webhook: payload?.webhook, - multitask_strategy: payload?.multitaskStrategy, - on_completion: payload?.onCompletion, - on_disconnect: payload?.onDisconnect, - after_seconds: payload?.afterSeconds, - if_not_exists: payload?.ifNotExists, - }; - - const endpoint = - threadId == null ? `/runs/stream` : `/threads/${threadId}/runs/stream`; - const response = await this.asyncCaller.fetch( - ...this.prepareFetchOptions(endpoint, { - method: "POST", - json, - timeoutMs: null, - signal: payload?.signal, - }), - ); - - const stream: ReadableStream<{ event: any; data: any }> = ( - response.body || new ReadableStream({ start: (ctrl) => ctrl.close() }) - ) - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - yield* IterableReadableStream.fromReadableStream(stream); - } - - /** - * Create a run. - * - * @param threadId The ID of the thread. - * @param assistantId Assistant ID to use for this run. - * @param payload Payload for creating a run. - * @returns The created run. - */ - async create( - threadId: string, - assistantId: string, - payload?: RunsCreatePayload, - ): Promise { - const json: Record = { - input: payload?.input, - command: payload?.command, - config: payload?.config, - metadata: payload?.metadata, - stream_mode: payload?.streamMode, - stream_subgraphs: payload?.streamSubgraphs, - assistant_id: assistantId, - interrupt_before: payload?.interruptBefore, - interrupt_after: payload?.interruptAfter, - webhook: payload?.webhook, - checkpoint: payload?.checkpoint, - checkpoint_id: payload?.checkpointId, - multitask_strategy: payload?.multitaskStrategy, - after_seconds: payload?.afterSeconds, - if_not_exists: payload?.ifNotExists, - }; - return this.fetch(`/threads/${threadId}/runs`, { - method: "POST", - json, - signal: payload?.signal, - }); - } - - /** - * Create a batch of stateless background runs. - * - * @param payloads An array of payloads for creating runs. - * @returns An array of created runs. - */ - async createBatch( - payloads: (RunsCreatePayload & { assistantId: string })[], - ): Promise { - const filteredPayloads = payloads - .map((payload) => ({ ...payload, assistant_id: payload.assistantId })) - .map((payload) => { - return Object.fromEntries( - Object.entries(payload).filter(([_, v]) => v !== undefined), - ); - }); - - return this.fetch("/runs/batch", { - method: "POST", - json: filteredPayloads, - }); - } - - async wait( - threadId: null, - assistantId: string, - payload?: Omit, - ): Promise; - - async wait( - threadId: string, - assistantId: string, - payload?: RunsWaitPayload, - ): Promise; - - /** - * Create a run and wait for it to complete. - * - * @param threadId The ID of the thread. - * @param assistantId Assistant ID to use for this run. - * @param payload Payload for creating a run. - * @returns The last values chunk of the thread. - */ - async wait( - threadId: string | null, - assistantId: string, - payload?: RunsWaitPayload, - ): Promise { - const json: Record = { - input: payload?.input, - command: payload?.command, - config: payload?.config, - metadata: payload?.metadata, - assistant_id: assistantId, - interrupt_before: payload?.interruptBefore, - interrupt_after: payload?.interruptAfter, - checkpoint: payload?.checkpoint, - checkpoint_id: payload?.checkpointId, - webhook: payload?.webhook, - multitask_strategy: payload?.multitaskStrategy, - on_completion: payload?.onCompletion, - on_disconnect: payload?.onDisconnect, - after_seconds: payload?.afterSeconds, - if_not_exists: payload?.ifNotExists, - }; - const endpoint = - threadId == null ? `/runs/wait` : `/threads/${threadId}/runs/wait`; - const response = await this.fetch(endpoint, { - method: "POST", - json, - timeoutMs: null, - signal: payload?.signal, - }); - const raiseError = - payload?.raiseError !== undefined ? payload.raiseError : true; - if ( - raiseError && - "__error__" in response && - typeof response.__error__ === "object" && - response.__error__ && - "error" in response.__error__ && - "message" in response.__error__ - ) { - throw new Error( - `${response.__error__?.error}: ${response.__error__?.message}`, - ); - } - return response; - } - - /** - * List all runs for a thread. - * - * @param threadId The ID of the thread. - * @param options Filtering and pagination options. - * @returns List of runs. - */ - async list( - threadId: string, - options?: { - /** - * Maximum number of runs to return. - * Defaults to 10 - */ - limit?: number; - - /** - * Offset to start from. - * Defaults to 0. - */ - offset?: number; - - /** - * Status of the run to filter by. - */ - status?: RunStatus; - }, - ): Promise { - return this.fetch(`/threads/${threadId}/runs`, { - params: { - limit: options?.limit ?? 10, - offset: options?.offset ?? 0, - status: options?.status ?? undefined, - }, - }); - } - - /** - * Get a run by ID. - * - * @param threadId The ID of the thread. - * @param runId The ID of the run. - * @returns The run. - */ - async get(threadId: string, runId: string): Promise { - return this.fetch(`/threads/${threadId}/runs/${runId}`); - } - - /** - * Cancel a run. - * - * @param threadId The ID of the thread. - * @param runId The ID of the run. - * @param wait Whether to block when canceling - * @param action Action to take when cancelling the run. Possible values are `interrupt` or `rollback`. Default is `interrupt`. - * @returns - */ - async cancel( - threadId: string, - runId: string, - wait: boolean = false, - action: CancelAction = "interrupt", - ): Promise { - return this.fetch(`/threads/${threadId}/runs/${runId}/cancel`, { - method: "POST", - params: { - wait: wait ? "1" : "0", - action: action, - }, - }); - } - - /** - * Block until a run is done. - * - * @param threadId The ID of the thread. - * @param runId The ID of the run. - * @returns - */ - async join( - threadId: string, - runId: string, - options?: { signal?: AbortSignal }, - ): Promise { - return this.fetch(`/threads/${threadId}/runs/${runId}/join`, { - timeoutMs: null, - signal: options?.signal, - }); - } - - /** - * Stream output from a run in real-time, until the run is done. - * Output is not buffered, so any output produced before this call will - * not be received here. - * - * @param threadId The ID of the thread. - * @param runId The ID of the run. - * @returns An async generator yielding stream parts. - */ - async *joinStream( - threadId: string, - runId: string, - options?: - | { signal?: AbortSignal; cancelOnDisconnect?: boolean } - | AbortSignal, - ): AsyncGenerator<{ event: StreamEvent; data: any }> { - const opts = - typeof options === "object" && - options != null && - options instanceof AbortSignal - ? { signal: options } - : options; - - const response = await this.asyncCaller.fetch( - ...this.prepareFetchOptions(`/threads/${threadId}/runs/${runId}/stream`, { - method: "GET", - timeoutMs: null, - signal: opts?.signal, - params: { cancel_on_disconnect: opts?.cancelOnDisconnect ? "1" : "0" }, - }), - ); - - const stream: ReadableStream<{ event: string; data: any }> = ( - response.body || new ReadableStream({ start: (ctrl) => ctrl.close() }) - ) - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - yield* IterableReadableStream.fromReadableStream(stream); - } - - /** - * Delete a run. - * - * @param threadId The ID of the thread. - * @param runId The ID of the run. - * @returns - */ - async delete(threadId: string, runId: string): Promise { - return this.fetch(`/threads/${threadId}/runs/${runId}`, { - method: "DELETE", - }); - } -} - -interface APIItem { - namespace: string[]; - key: string; - value: Record; - created_at: string; - updated_at: string; -} -interface APISearchItemsResponse { - items: APIItem[]; -} - -export class StoreClient extends BaseClient { - /** - * Store or update an item. - * - * @param namespace A list of strings representing the namespace path. - * @param key The unique identifier for the item within the namespace. - * @param value A dictionary containing the item's data. - * @returns Promise - */ - async putItem( - namespace: string[], - key: string, - value: Record, - ): Promise { - namespace.forEach((label) => { - if (label.includes(".")) { - throw new Error( - `Invalid namespace label '${label}'. Namespace labels cannot contain periods ('.')`, - ); - } - }); - - const payload = { - namespace, - key, - value, - }; - - return this.fetch("/store/items", { - method: "PUT", - json: payload, - }); - } - - /** - * Retrieve a single item. - * - * @param namespace A list of strings representing the namespace path. - * @param key The unique identifier for the item. - * @returns Promise - */ - async getItem(namespace: string[], key: string): Promise { - namespace.forEach((label) => { - if (label.includes(".")) { - throw new Error( - `Invalid namespace label '${label}'. Namespace labels cannot contain periods ('.')`, - ); - } - }); - - const response = await this.fetch("/store/items", { - params: { namespace: namespace.join("."), key }, - }); - - return response - ? { - ...response, - createdAt: response.created_at, - updatedAt: response.updated_at, - } - : null; - } - - /** - * Delete an item. - * - * @param namespace A list of strings representing the namespace path. - * @param key The unique identifier for the item. - * @returns Promise - */ - async deleteItem(namespace: string[], key: string): Promise { - namespace.forEach((label) => { - if (label.includes(".")) { - throw new Error( - `Invalid namespace label '${label}'. Namespace labels cannot contain periods ('.')`, - ); - } - }); - - return this.fetch("/store/items", { - method: "DELETE", - json: { namespace, key }, - }); - } - - /** - * Search for items within a namespace prefix. - * - * @param namespacePrefix List of strings representing the namespace prefix. - * @param options.filter Optional dictionary of key-value pairs to filter results. - * @param options.limit Maximum number of items to return (default is 10). - * @param options.offset Number of items to skip before returning results (default is 0). - * @param options.query Optional search query. - * @returns Promise - */ - async searchItems( - namespacePrefix: string[], - options?: { - filter?: Record; - limit?: number; - offset?: number; - query?: string; - }, - ): Promise { - const payload = { - namespace_prefix: namespacePrefix, - filter: options?.filter, - limit: options?.limit ?? 10, - offset: options?.offset ?? 0, - query: options?.query, - }; - - const response = await this.fetch( - "/store/items/search", - { - method: "POST", - json: payload, - }, - ); - return { - items: response.items.map((item) => ({ - ...item, - createdAt: item.created_at, - updatedAt: item.updated_at, - })), - }; - } - - /** - * List namespaces with optional match conditions. - * - * @param options.prefix Optional list of strings representing the prefix to filter namespaces. - * @param options.suffix Optional list of strings representing the suffix to filter namespaces. - * @param options.maxDepth Optional integer specifying the maximum depth of namespaces to return. - * @param options.limit Maximum number of namespaces to return (default is 100). - * @param options.offset Number of namespaces to skip before returning results (default is 0). - * @returns Promise - */ - async listNamespaces(options?: { - prefix?: string[]; - suffix?: string[]; - maxDepth?: number; - limit?: number; - offset?: number; - }): Promise { - const payload = { - prefix: options?.prefix, - suffix: options?.suffix, - max_depth: options?.maxDepth, - limit: options?.limit ?? 100, - offset: options?.offset ?? 0, - }; - - return this.fetch("/store/namespaces", { - method: "POST", - json: payload, - }); - } -} - -export class Client< - TStateType = DefaultValues, - TUpdateType = TStateType, - TCustomEventType = unknown, -> { - /** - * The client for interacting with assistants. - */ - public assistants: AssistantsClient; - - /** - * The client for interacting with threads. - */ - public threads: ThreadsClient; - - /** - * The client for interacting with runs. - */ - public runs: RunsClient; - - /** - * The client for interacting with cron runs. - */ - public crons: CronsClient; - - /** - * The client for interacting with the KV store. - */ - public store: StoreClient; - - constructor(config?: ClientConfig) { - this.assistants = new AssistantsClient(config); - this.threads = new ThreadsClient(config); - this.runs = new RunsClient(config); - this.crons = new CronsClient(config); - this.store = new StoreClient(config); - } -} diff --git a/libs/sdk-js/src/index.ts b/libs/sdk-js/src/index.ts deleted file mode 100644 index 0626144cd..000000000 --- a/libs/sdk-js/src/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -export { Client } from "./client.js"; - -export type { - Assistant, - AssistantVersion, - AssistantGraph, - Config, - DefaultValues, - GraphSchema, - Metadata, - Run, - Thread, - ThreadTask, - ThreadState, - ThreadStatus, - Cron, - Checkpoint, - Interrupt, - ListNamespaceResponse, - Item, - SearchItem, - SearchItemsResponse, - CronCreateResponse, - CronCreateForThreadResponse, -} from "./schema.js"; -export { overrideFetchImplementation } from "./singletons/fetch.js"; - -export type { OnConflictBehavior, Command } from "./types.js"; -export type { StreamMode } from "./types.stream.js"; -export type { - ValuesStreamEvent, - MessagesTupleStreamEvent, - MetadataStreamEvent, - UpdatesStreamEvent, - CustomStreamEvent, - MessagesStreamEvent, - DebugStreamEvent, - EventsStreamEvent, - ErrorStreamEvent, - FeedbackStreamEvent, -} from "./types.stream.js"; -export type { - Message, - HumanMessage, - AIMessage, - ToolMessage, - SystemMessage, - FunctionMessage, - RemoveMessage, -} from "./types.messages.js"; diff --git a/libs/sdk-js/src/react/debug.tsx b/libs/sdk-js/src/react/debug.tsx deleted file mode 100644 index b5fc462fc..000000000 --- a/libs/sdk-js/src/react/debug.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { ThreadState } from "../schema.js"; - -interface Node { - type: "node"; - value: ThreadState; - path: string[]; -} - -interface Fork { - type: "fork"; - items: Array>; -} - -interface Sequence { - type: "sequence"; - items: Array | Fork>; -} - -interface ValidFork { - type: "fork"; - items: Array>; -} - -interface ValidSequence { - type: "sequence"; - items: [Node, ...(Node | ValidFork)[]]; -} - -// forks -export type CheckpointBranchPath = string[]; - -export type MessageBranch = { - current: CheckpointBranchPath; - options: CheckpointBranchPath[]; -}; - -export function DebugSegmentsView(props: { - sequence: ValidSequence; -}) { - const concatContent = (value: ThreadState) => { - let content; - try { - content = value.values?.messages?.at(-1)?.content ?? ""; - } catch { - content = JSON.stringify(value.values); - } - - content = content.replace(/(\n|\r\n)/g, ""); - if (content.length <= 23) return content; - return `${content.slice(0, 10)}...${content.slice(-10)}`; - }; - - return ( -
- {props.sequence.items.map((item, index) => { - if (item.type === "fork") { - return ( -
- {item.items.map((fork, idx) => { - const [first] = fork.items; - return ( -
- - Fork{" "} - - ...{first.path.at(-1)?.slice(-4)} - - -
- -
-
- ); - })} -
- ); - } - - if (item.type === "node") { - return ( -
-
-                ({item.value.metadata?.step}) ...
-                {item.value.checkpoint.checkpoint_id?.slice(-4)} (
-                {item.value.metadata?.source}): {concatContent(item.value)}
-              
- -
- ); - } - - return null; - })} -
- ); -} diff --git a/libs/sdk-js/src/react/index.ts b/libs/sdk-js/src/react/index.ts deleted file mode 100644 index 97a58f3d1..000000000 --- a/libs/sdk-js/src/react/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { useStream, type MessageMetadata } from "./stream.js"; diff --git a/libs/sdk-js/src/react/stream.tsx b/libs/sdk-js/src/react/stream.tsx deleted file mode 100644 index 72c25bbe4..000000000 --- a/libs/sdk-js/src/react/stream.tsx +++ /dev/null @@ -1,925 +0,0 @@ -/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */ -"use client"; - -import { Client, type ClientConfig } from "../client.js"; -import type { - Command, - DisconnectMode, - MultitaskStrategy, - OnCompletionBehavior, -} from "../types.js"; -import type { Message } from "../types.messages.js"; -import type { - Checkpoint, - Config, - Interrupt, - Metadata, - ThreadState, -} from "../schema.js"; -import type { - CustomStreamEvent, - DebugStreamEvent, - ErrorStreamEvent, - EventsStreamEvent, - FeedbackStreamEvent, - MessagesStreamEvent, - MessagesTupleStreamEvent, - MetadataStreamEvent, - StreamMode, - UpdatesStreamEvent, - ValuesStreamEvent, -} from "../types.stream.js"; - -import { - type MutableRefObject, - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from "react"; -import { - type BaseMessageChunk, - type BaseMessage, - coerceMessageLikeToMessage, - convertToChunk, - isBaseMessageChunk, -} from "@langchain/core/messages"; - -class StreamError extends Error { - constructor(data: { error?: string; name?: string; message: string }) { - super(data.message); - this.name = data.name ?? data.error ?? "StreamError"; - } - - static isStructuredError(error: unknown): error is { - error?: string; - name?: string; - message: string; - } { - return typeof error === "object" && error != null && "message" in error; - } -} - -function tryConvertToChunk(message: BaseMessage): BaseMessageChunk | null { - try { - return convertToChunk(message); - } catch { - return null; - } -} - -class MessageTupleManager { - chunks: Record< - string, - { chunk?: BaseMessageChunk | BaseMessage; index?: number } - > = {}; - - constructor() { - this.chunks = {}; - } - - add(serialized: Message): string | null { - // TODO: this is sometimes sent from the API - // figure out how to prevent this or move this to LC.js - if (serialized.type.endsWith("MessageChunk")) { - serialized.type = serialized.type - .slice(0, -"MessageChunk".length) - .toLowerCase() as Message["type"]; - } - - const message = coerceMessageLikeToMessage(serialized); - const chunk = tryConvertToChunk(message); - - const id = (chunk ?? message).id; - if (!id) { - console.warn( - "No message ID found for chunk, ignoring in state", - serialized, - ); - return null; - } - - this.chunks[id] ??= {}; - if (chunk) { - const prev = this.chunks[id].chunk; - this.chunks[id].chunk = - (isBaseMessageChunk(prev) ? prev : null)?.concat(chunk) ?? chunk; - } else { - this.chunks[id].chunk = message; - } - - return id; - } - - clear() { - this.chunks = {}; - } - - get(id: string, defaultIndex: number) { - if (this.chunks[id] == null) return null; - this.chunks[id].index ??= defaultIndex; - - return this.chunks[id]; - } -} - -const toMessageDict = (chunk: BaseMessage): Message => { - const { type, data } = chunk.toDict(); - return { ...data, type } as Message; -}; - -function unique(array: T[]) { - return [...new Set(array)] as T[]; -} - -function findLastIndex(array: T[], predicate: (item: T) => boolean) { - for (let i = array.length - 1; i >= 0; i--) { - if (predicate(array[i])) return i; - } - return -1; -} - -interface Node { - type: "node"; - value: ThreadState; - path: string[]; -} - -interface Fork { - type: "fork"; - items: Array>; -} - -interface Sequence { - type: "sequence"; - items: Array | Fork>; -} - -interface ValidFork { - type: "fork"; - items: Array>; -} - -interface ValidSequence { - type: "sequence"; - items: [Node, ...(Node | ValidFork)[]]; -} - -export type MessageMetadata> = { - /** - * The ID of the message used. - */ - messageId: string; - - /** - * The first thread state the message was seen in. - */ - firstSeenState: ThreadState | undefined; - - /** - * The branch of the message. - */ - branch: string | undefined; - - /** - * The list of branches this message is part of. - * This is useful for displaying branching controls. - */ - branchOptions: string[] | undefined; -}; - -function getBranchSequence>( - history: ThreadState[], -) { - const childrenMap: Record[]> = {}; - - // First pass - collect nodes for each checkpoint - history.forEach((state) => { - const checkpointId = state.parent_checkpoint?.checkpoint_id ?? "$"; - childrenMap[checkpointId] ??= []; - childrenMap[checkpointId].push(state); - }); - - // Second pass - create a tree of sequences - type Task = { id: string; sequence: Sequence; path: string[] }; - const rootSequence: Sequence = { type: "sequence", items: [] }; - const queue: Task[] = [{ id: "$", sequence: rootSequence, path: [] }]; - - const paths: string[][] = []; - - const visited = new Set(); - while (queue.length > 0) { - const task = queue.shift()!; - if (visited.has(task.id)) continue; - visited.add(task.id); - - const children = childrenMap[task.id]; - if (children == null || children.length === 0) continue; - - // If we've encountered a fork (2+ children), push the fork - // to the sequence and add a new sequence for each child - let fork: Fork | undefined; - if (children.length > 1) { - fork = { type: "fork", items: [] }; - task.sequence.items.push(fork); - } - - for (const value of children) { - const id = value.checkpoint.checkpoint_id!; - - let sequence = task.sequence; - let path = task.path; - if (fork != null) { - sequence = { type: "sequence", items: [] }; - fork.items.unshift(sequence); - - path = path.slice(); - path.push(id); - paths.push(path); - } - - sequence.items.push({ type: "node", value, path }); - queue.push({ id, sequence, path }); - } - } - - return { rootSequence, paths }; -} - -const PATH_SEP = ">"; -const ROOT_ID = "$"; - -// Get flat view -function getBranchView>( - sequence: Sequence, - paths: string[][], - branch: string, -) { - const path = branch.split(PATH_SEP); - const pathMap: Record = {}; - - for (const path of paths) { - const parent = path.at(-2) ?? ROOT_ID; - pathMap[parent] ??= []; - pathMap[parent].unshift(path); - } - - const history: ThreadState[] = []; - const branchByCheckpoint: Record< - string, - { branch: string | undefined; branchOptions: string[] | undefined } - > = {}; - - const forkStack = path.slice(); - const queue: (Node | Fork)[] = [...sequence.items]; - - while (queue.length > 0) { - const item = queue.shift()!; - - if (item.type === "node") { - history.push(item.value); - branchByCheckpoint[item.value.checkpoint.checkpoint_id!] = { - branch: item.path.join(PATH_SEP), - branchOptions: (item.path.length > 0 - ? pathMap[item.path.at(-2) ?? ROOT_ID] ?? [] - : [] - ).map((p) => p.join(PATH_SEP)), - }; - } - if (item.type === "fork") { - const forkId = forkStack.shift(); - const index = - forkId != null - ? item.items.findIndex((value) => { - const firstItem = value.items.at(0); - if (!firstItem || firstItem.type !== "node") return false; - return firstItem.value.checkpoint.checkpoint_id === forkId; - }) - : -1; - - const nextItems = item.items.at(index)?.items ?? []; - queue.push(...nextItems); - } - } - - return { history, branchByCheckpoint }; -} - -function fetchHistory>( - client: Client, - threadId: string, -) { - return client.threads.getHistory(threadId, { limit: 1000 }); -} - -function useThreadHistory>( - threadId: string | undefined | null, - client: Client, - clearCallbackRef: MutableRefObject<(() => void) | undefined>, - submittingRef: MutableRefObject, -) { - const [history, setHistory] = useState[]>([]); - - const fetcher = useCallback( - ( - threadId: string | undefined | null, - ): Promise[]> => { - if (threadId != null) { - return fetchHistory(client, threadId).then((history) => { - setHistory(history); - return history; - }); - } - - setHistory([]); - clearCallbackRef.current?.(); - return Promise.resolve([]); - }, - [], - ); - - useEffect(() => { - if (submittingRef.current) return; - fetcher(threadId); - }, [fetcher, submittingRef, threadId]); - - return { - data: history, - mutate: (mutateId?: string) => fetcher(mutateId ?? threadId), - }; -} - -const useControllableThreadId = (options?: { - threadId?: string | null; - onThreadId?: (threadId: string) => void; -}): [string | null, (threadId: string) => void] => { - const [localThreadId, _setLocalThreadId] = useState( - options?.threadId ?? null, - ); - - const onThreadIdRef = useRef(options?.onThreadId); - onThreadIdRef.current = options?.onThreadId; - - const onThreadId = useCallback((threadId: string) => { - _setLocalThreadId(threadId); - onThreadIdRef.current?.(threadId); - }, []); - - if (typeof options?.threadId === "undefined") { - return [localThreadId, onThreadId]; - } - - return [options.threadId, onThreadId]; -}; - -type BagTemplate = { - ConfigurableType?: Record; - InterruptType?: unknown; - CustomEventType?: unknown; - UpdateType?: unknown; -}; - -type GetUpdateType< - Bag extends BagTemplate, - StateType extends Record, -> = Bag extends { UpdateType: unknown } - ? Bag["UpdateType"] - : Partial; - -type GetConfigurableType = Bag extends { - ConfigurableType: Record; -} - ? Bag["ConfigurableType"] - : Record; - -type GetInterruptType = Bag extends { - InterruptType: unknown; -} - ? Bag["InterruptType"] - : unknown; - -type GetCustomEventType = Bag extends { - CustomEventType: unknown; -} - ? Bag["CustomEventType"] - : unknown; - -interface UseStreamOptions< - StateType extends Record = Record, - Bag extends BagTemplate = BagTemplate, -> { - /** - * The ID of the assistant to use. - */ - assistantId: string; - - /** - * The URL of the API to use. - */ - apiUrl: ClientConfig["apiUrl"]; - - /** - * The API key to use. - */ - apiKey?: ClientConfig["apiKey"]; - - /** - * Specify the key within the state that contains messages. - * Defaults to "messages". - * - * @default "messages" - */ - messagesKey?: string; - - /** - * Callback that is called when an error occurs. - */ - onError?: (error: unknown) => void; - - /** - * Callback that is called when the stream is finished. - */ - onFinish?: (state: ThreadState) => void; - - /** - * Callback that is called when an update event is received. - */ - onUpdateEvent?: ( - data: UpdatesStreamEvent>["data"], - ) => void; - - /** - * Callback that is called when a custom event is received. - */ - onCustomEvent?: ( - data: CustomStreamEvent>["data"], - ) => void; - - /** - * Callback that is called when a metadata event is received. - */ - onMetadataEvent?: (data: MetadataStreamEvent["data"]) => void; - - /** - * The ID of the thread to fetch history and current values from. - */ - threadId?: string | null; - - /** - * Callback that is called when the thread ID is updated (ie when a new thread is created). - */ - onThreadId?: (threadId: string) => void; -} - -interface UseStream< - StateType extends Record = Record, - Bag extends BagTemplate = BagTemplate, -> { - /** - * The current values of the thread. - */ - values: StateType; - - /** - * Last seen error from the thread or during streaming. - */ - error: unknown; - - /** - * Whether the stream is currently running. - */ - isLoading: boolean; - - /** - * Stops the stream. - */ - stop: () => void; - - /** - * Create and stream a run to the thread. - */ - submit: ( - values: GetUpdateType | null | undefined, - options?: SubmitOptions>, - ) => void; - - /** - * The current branch of the thread. - */ - branch: string; - - /** - * Set the branch of the thread. - */ - setBranch: (branch: string) => void; - - /** - * Flattened history of thread states of a thread. - */ - history: ThreadState[]; - - /** - * Tree of all branches for the thread. - * @experimental - */ - experimental_branchTree: Sequence; - - /** - * Get the interrupt value for the stream if interrupted. - */ - interrupt: Interrupt> | undefined; - - /** - * Messages inferred from the thread. - * Will automatically update with incoming message chunks. - */ - messages: Message[]; - - /** - * Get the metadata for a message, such as first thread state the message - * was seen in and branch information. - - * @param message - The message to get the metadata for. - * @param index - The index of the message in the thread. - * @returns The metadata for the message. - */ - getMessagesMetadata: ( - message: Message, - index?: number, - ) => MessageMetadata | undefined; -} - -type ConfigWithConfigurable> = - Config & { configurable?: ConfigurableType }; - -interface SubmitOptions< - StateType extends Record = Record, - ConfigurableType extends Record = Record, -> { - config?: ConfigWithConfigurable; - checkpoint?: Omit | null; - command?: Command; - interruptBefore?: "*" | string[]; - interruptAfter?: "*" | string[]; - metadata?: Metadata; - multitaskStrategy?: MultitaskStrategy; - onCompletion?: OnCompletionBehavior; - onDisconnect?: DisconnectMode; - feedbackKeys?: string[]; - streamMode?: Array; - optimisticValues?: - | Partial - | ((prev: StateType) => Partial); -} - -export function useStream< - StateType extends Record = Record, - Bag extends { - ConfigurableType?: Record; - InterruptType?: unknown; - CustomEventType?: unknown; - UpdateType?: unknown; - } = BagTemplate, ->(options: UseStreamOptions): UseStream { - type UpdateType = GetUpdateType; - type CustomType = GetCustomEventType; - type InterruptType = GetInterruptType; - type ConfigurableType = GetConfigurableType; - - type EventStreamEvent = - | ValuesStreamEvent - | UpdatesStreamEvent - | CustomStreamEvent - | DebugStreamEvent - | MessagesStreamEvent - | MessagesTupleStreamEvent - | EventsStreamEvent - | MetadataStreamEvent - | ErrorStreamEvent - | FeedbackStreamEvent; - - let { assistantId, messagesKey, onError, onFinish } = options; - messagesKey ??= "messages"; - - const client = useMemo( - () => new Client({ apiUrl: options.apiUrl, apiKey: options.apiKey }), - [options.apiKey, options.apiUrl], - ); - const [threadId, onThreadId] = useControllableThreadId(options); - - const [branch, setBranch] = useState(""); - const [isLoading, setIsLoading] = useState(false); - - const [streamError, setStreamError] = useState(undefined); - const [streamValues, setStreamValues] = useState(null); - - const messageManagerRef = useRef(new MessageTupleManager()); - const submittingRef = useRef(false); - const abortRef = useRef(null); - - const trackStreamModeRef = useRef< - Array<"values" | "updates" | "events" | "custom" | "messages-tuple"> - >([]); - - const trackStreamMode = useCallback( - (mode: Exclude) => { - if (!trackStreamModeRef.current.includes(mode)) - trackStreamModeRef.current.push(mode); - }, - [], - ); - - const hasUpdateListener = options.onUpdateEvent != null; - const hasCustomListener = options.onCustomEvent != null; - - const callbackStreamMode = useMemo(() => { - const modes: Exclude[] = []; - if (hasUpdateListener) modes.push("updates"); - if (hasCustomListener) modes.push("custom"); - return modes; - }, [hasUpdateListener, hasCustomListener]); - - const clearCallbackRef = useRef<() => void>(null!); - clearCallbackRef.current = () => { - setStreamError(undefined); - setStreamValues(null); - }; - - // TODO: this should be done on the server to avoid pagination - // TODO: should we permit adapter? SWR / React Query? - const history = useThreadHistory( - threadId, - client, - clearCallbackRef, - submittingRef, - ); - - const getMessages = useMemo(() => { - return (value: StateType) => - Array.isArray(value[messagesKey]) - ? (value[messagesKey] as Message[]) - : []; - }, [messagesKey]); - - const { rootSequence, paths } = getBranchSequence(history.data); - const { history: flatHistory, branchByCheckpoint } = getBranchView( - rootSequence, - paths, - branch, - ); - - const threadHead: ThreadState | undefined = flatHistory.at(-1); - const historyValues = threadHead?.values ?? ({} as StateType); - const historyError = (() => { - const error = threadHead?.tasks?.at(-1)?.error; - if (error == null) return undefined; - try { - const parsed = JSON.parse(error) as unknown; - if (StreamError.isStructuredError(parsed)) { - return new StreamError(parsed); - } - - return parsed; - } catch { - // do nothing - } - return error; - })(); - - const messageMetadata = (() => { - const alreadyShown = new Set(); - return getMessages(historyValues).map( - (message, idx): MessageMetadata => { - const messageId = message.id ?? idx; - const firstSeenIdx = findLastIndex(history.data, (state) => - getMessages(state.values) - .map((m, idx) => m.id ?? idx) - .includes(messageId), - ); - - const firstSeen = history.data[firstSeenIdx] as - | ThreadState - | undefined; - - let branch = firstSeen - ? branchByCheckpoint[firstSeen.checkpoint.checkpoint_id!] - : undefined; - - if (!branch?.branch?.length) branch = undefined; - - // serialize branches - const optionsShown = branch?.branchOptions?.flat(2).join(","); - if (optionsShown) { - if (alreadyShown.has(optionsShown)) branch = undefined; - alreadyShown.add(optionsShown); - } - - return { - messageId: messageId.toString(), - firstSeenState: firstSeen, - - branch: branch?.branch, - branchOptions: branch?.branchOptions, - }; - }, - ); - })(); - - const stop = useCallback(() => { - if (abortRef.current != null) abortRef.current.abort(); - abortRef.current = null; - }, []); - - const submit = async ( - values: UpdateType | null | undefined, - submitOptions?: SubmitOptions, - ) => { - try { - setIsLoading(true); - setStreamError(undefined); - - submittingRef.current = true; - abortRef.current = new AbortController(); - - let usableThreadId = threadId; - if (!usableThreadId) { - const thread = await client.threads.create(); - onThreadId(thread.thread_id); - usableThreadId = thread.thread_id; - } - - const streamMode = unique([ - ...(submitOptions?.streamMode ?? []), - ...trackStreamModeRef.current, - ...callbackStreamMode, - ]); - - const checkpoint = - submitOptions?.checkpoint ?? threadHead?.checkpoint ?? undefined; - // @ts-expect-error - if (checkpoint != null) delete checkpoint.thread_id; - - const run = (await client.runs.stream(usableThreadId, assistantId, { - input: values as Record, - config: submitOptions?.config, - command: submitOptions?.command, - - interruptBefore: submitOptions?.interruptBefore, - interruptAfter: submitOptions?.interruptAfter, - metadata: submitOptions?.metadata, - multitaskStrategy: submitOptions?.multitaskStrategy, - onCompletion: submitOptions?.onCompletion, - onDisconnect: submitOptions?.onDisconnect ?? "cancel", - - signal: abortRef.current.signal, - - checkpoint, - streamMode, - })) as AsyncGenerator; - - // Unbranch things - const newPath = submitOptions?.checkpoint?.checkpoint_id - ? branchByCheckpoint[submitOptions?.checkpoint?.checkpoint_id]?.branch - : undefined; - - if (newPath != null) setBranch(newPath ?? ""); - - // Assumption: we're setting the initial value - // Used for instant feedback - setStreamValues(() => { - const values = { ...historyValues }; - - if (submitOptions?.optimisticValues != null) { - return { - ...values, - ...(typeof submitOptions.optimisticValues === "function" - ? submitOptions.optimisticValues(values) - : submitOptions.optimisticValues), - }; - } - - return values; - }); - - let streamError: StreamError | undefined; - for await (const { event, data } of run) { - if (event === "error") { - streamError = new StreamError(data); - break; - } - - if (event === "updates") options.onUpdateEvent?.(data); - if (event === "custom") options.onCustomEvent?.(data); - if (event === "metadata") options.onMetadataEvent?.(data); - - if (event === "values") setStreamValues(data); - if (event === "messages") { - const [serialized] = data; - - const messageId = messageManagerRef.current.add(serialized); - if (!messageId) { - console.warn( - "Failed to add message to manager, no message ID found", - ); - continue; - } - - setStreamValues((streamValues) => { - const values = { ...historyValues, ...streamValues }; - - // Assumption: we're concatenating the message - const messages = getMessages(values).slice(); - const { chunk, index } = - messageManagerRef.current.get(messageId, messages.length) ?? {}; - - if (!chunk || index == null) return values; - messages[index] = toMessageDict(chunk); - - return { ...values, [messagesKey!]: messages }; - }); - } - } - - // TODO: stream created checkpoints to avoid an unnecessary network request - const result = await history.mutate(usableThreadId); - setStreamValues(null); - - if (streamError != null) throw streamError; - - const lastHead = result.at(0); - if (lastHead) onFinish?.(lastHead); - } catch (error) { - if ( - !( - error instanceof Error && - (error.name === "AbortError" || error.name === "TimeoutError") - ) - ) { - console.error(error); - setStreamError(error); - onError?.(error); - } - } finally { - setIsLoading(false); - - // Assumption: messages are already handled, we can clear the manager - messageManagerRef.current.clear(); - submittingRef.current = false; - abortRef.current = null; - } - }; - - const error = streamError ?? historyError; - const values = streamValues ?? historyValues; - - return { - get values() { - trackStreamMode("values"); - return values; - }, - - error, - isLoading, - - stop, - submit, - - branch, - setBranch, - - history: flatHistory, - experimental_branchTree: rootSequence, - - get interrupt() { - // Don't show the interrupt if the stream is loading - if (isLoading) return undefined; - - const interrupts = threadHead?.tasks?.at(-1)?.interrupts; - if (interrupts == null || interrupts.length === 0) { - // check if there's a next task present - const next = threadHead?.next ?? []; - if (!next.length || error != null) return undefined; - return { when: "breakpoint" }; - } - - // Return only the current interrupt - return interrupts.at(-1) as Interrupt | undefined; - }, - - get messages() { - trackStreamMode("messages-tuple"); - return getMessages(values); - }, - - getMessagesMetadata( - message: Message, - index?: number, - ): MessageMetadata | undefined { - trackStreamMode("messages-tuple"); - return messageMetadata?.find( - (m) => m.messageId === (message.id ?? index), - ); - }, - }; -} diff --git a/libs/sdk-js/src/schema.ts b/libs/sdk-js/src/schema.ts deleted file mode 100644 index 84596c82c..000000000 --- a/libs/sdk-js/src/schema.ts +++ /dev/null @@ -1,300 +0,0 @@ -import type { JSONSchema7 } from "json-schema"; - -type Optional = T | null | undefined; - -export type RunStatus = - | "pending" - | "running" - | "error" - | "success" - | "timeout" - | "interrupted"; - -export type ThreadStatus = "idle" | "busy" | "interrupted" | "error"; - -type MultitaskStrategy = "reject" | "interrupt" | "rollback" | "enqueue"; - -export type CancelAction = "interrupt" | "rollback"; - -export type Config = { - /** - * Tags for this call and any sub-calls (eg. a Chain calling an LLM). - * You can use these to filter calls. - */ - tags?: string[]; - - /** - * Maximum number of times a call can recurse. - * If not provided, defaults to 25. - */ - recursion_limit?: number; - - /** - * Runtime values for attributes previously made configurable on this Runnable. - */ - configurable?: { - /** - * ID of the thread - */ - thread_id?: Optional; - - /** - * Timestamp of the state checkpoint - */ - checkpoint_id?: Optional; - - [key: string]: unknown; - }; -}; - -export interface GraphSchema { - /** - * The ID of the graph. - */ - graph_id: string; - - /** - * The schema for the input state. - * Missing if unable to generate JSON schema from graph. - */ - input_schema?: JSONSchema7; - - /** - * The schema for the output state. - * Missing if unable to generate JSON schema from graph. - */ - output_schema?: JSONSchema7; - - /** - * The schema for the graph state. - * Missing if unable to generate JSON schema from graph. - */ - state_schema?: JSONSchema7; - - /** - * The schema for the graph config. - * Missing if unable to generate JSON schema from graph. - */ - config_schema?: JSONSchema7; -} - -export type Subgraphs = Record; - -export type Metadata = Optional<{ - source?: "input" | "loop" | "update" | (string & {}); - - step?: number; - - writes?: Record | null; - - parents?: Record; - - [key: string]: unknown; -}>; - -export interface AssistantBase { - /** The ID of the assistant. */ - assistant_id: string; - - /** The ID of the graph. */ - graph_id: string; - - /** The assistant config. */ - config: Config; - - /** The time the assistant was created. */ - created_at: string; - - /** The assistant metadata. */ - metadata: Metadata; - - /** The version of the assistant. */ - version: number; -} - -export interface AssistantVersion extends AssistantBase {} - -export interface Assistant extends AssistantBase { - /** The last time the assistant was updated. */ - updated_at: string; - - /** The name of the assistant */ - name: string; -} - -export interface AssistantGraph { - nodes: Array<{ - id: string | number; - name?: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data?: Record | string; - metadata?: unknown; - }>; - edges: Array<{ - source: string; - target: string; - data?: string; - conditional?: boolean; - }>; -} - -/** - * An interrupt thrown inside a thread. - */ -export interface Interrupt { - value?: TValue; - when: "during" | (string & {}); - resumable?: boolean; - ns?: string[]; -} - -export interface Thread { - /** The ID of the thread. */ - thread_id: string; - - /** The time the thread was created. */ - created_at: string; - - /** The last time the thread was updated. */ - updated_at: string; - - /** The thread metadata. */ - metadata: Metadata; - - /** The status of the thread */ - status: ThreadStatus; - - /** The current state of the thread. */ - values: ValuesType; - - /** Interrupts which were thrown in this thread */ - interrupts: Record>; -} - -export interface Cron { - /** The ID of the cron */ - cron_id: string; - - /** The ID of the thread */ - thread_id: Optional; - - /** The end date to stop running the cron. */ - end_time: Optional; - - /** The schedule to run, cron format. */ - schedule: string; - - /** The time the cron was created. */ - created_at: string; - - /** The last time the cron was updated. */ - updated_at: string; - - /** The run payload to use for creating new run. */ - payload: Record; -} - -export type DefaultValues = Record[] | Record; - -export interface ThreadState { - /** The state values */ - values: ValuesType; - - /** The next nodes to execute. If empty, the thread is done until new input is received */ - next: string[]; - - /** Checkpoint of the thread state */ - checkpoint: Checkpoint; - - /** Metadata for this state */ - metadata: Metadata; - - /** Time of state creation */ - created_at: Optional; - - /** The parent checkpoint. If missing, this is the root checkpoint */ - parent_checkpoint: Optional; - - /** Tasks to execute in this step. If already attempted, may contain an error */ - tasks: Array; -} - -export interface ThreadTask { - id: string; - name: string; - result?: unknown; - error: Optional; - interrupts: Array; - checkpoint: Optional; - state: Optional; -} - -export interface Run { - /** The ID of the run */ - run_id: string; - - /** The ID of the thread */ - thread_id: string; - - /** The assistant that wwas used for this run */ - assistant_id: string; - - /** The time the run was created */ - created_at: string; - - /** The last time the run was updated */ - updated_at: string; - - /** The status of the run. */ - status: RunStatus; - - /** Run metadata */ - metadata: Metadata; - - /** Strategy to handle concurrent runs on the same thread */ - multitask_strategy: Optional; -} - -export type Checkpoint = { - thread_id: string; - checkpoint_ns: string; - checkpoint_id: Optional; - checkpoint_map: Optional>; -}; - -export interface ListNamespaceResponse { - namespaces: string[][]; -} -export interface Item { - namespace: string[]; - key: string; - value: Record; - createdAt: string; - updatedAt: string; -} - -export interface SearchItem extends Item { - score?: number; -} -export interface SearchItemsResponse { - items: SearchItem[]; -} - -export interface CronCreateResponse { - cron_id: string; - assistant_id: string; - thread_id: string | undefined; - user_id: string; - payload: Record; - schedule: string; - next_run_date: string; - end_time: string | undefined; - created_at: string; - updated_at: string; - metadata: Metadata; -} - -export interface CronCreateForThreadResponse - extends Omit { - thread_id: string; -} diff --git a/libs/sdk-js/src/singletons/fetch.ts b/libs/sdk-js/src/singletons/fetch.ts deleted file mode 100644 index 8ed71b000..000000000 --- a/libs/sdk-js/src/singletons/fetch.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Wrap the default fetch call due to issues with illegal invocations -// in some environments: -// https://stackoverflow.com/questions/69876859/why-does-bind-fix-failed-to-execute-fetch-on-window-illegal-invocation-err -// @ts-expect-error Broad typing to support a range of fetch implementations -const DEFAULT_FETCH_IMPLEMENTATION = (...args: any[]) => fetch(...args); - -const LANGSMITH_FETCH_IMPLEMENTATION_KEY = Symbol.for( - "lg:fetch_implementation", -); - -/** - * Overrides the fetch implementation used for LangSmith calls. - * You should use this if you need to use an implementation of fetch - * other than the default global (e.g. for dealing with proxies). - * @param fetch The new fetch function to use. - */ -export const overrideFetchImplementation = (fetch: (...args: any[]) => any) => { - (globalThis as any)[LANGSMITH_FETCH_IMPLEMENTATION_KEY] = fetch; -}; - -/** - * @internal - */ -export const _getFetchImplementation: () => (...args: any[]) => any = () => { - return ( - (globalThis as any)[LANGSMITH_FETCH_IMPLEMENTATION_KEY] ?? - DEFAULT_FETCH_IMPLEMENTATION - ); -}; diff --git a/libs/sdk-js/src/tests/fetch.test.ts b/libs/sdk-js/src/tests/fetch.test.ts deleted file mode 100644 index 9d30ae093..000000000 --- a/libs/sdk-js/src/tests/fetch.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable no-process-env */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { jest } from "@jest/globals"; -import { Client } from "../client.js"; -import { overrideFetchImplementation } from "../singletons/fetch.js"; - -describe.each([[""], ["mocked"]])("Client uses %s fetch", (description) => { - let globalFetchMock: jest.Mock; - let overriddenFetch: jest.Mock; - let expectedFetchMock: jest.Mock; - let unexpectedFetchMock: jest.Mock; - - beforeEach(() => { - globalFetchMock = jest.fn(() => - Promise.resolve({ - ok: true, - json: () => - Promise.resolve({ - batch_ingest_config: { - use_multipart_endpoint: true, - }, - }), - text: () => Promise.resolve(""), - }), - ); - overriddenFetch = jest.fn(() => - Promise.resolve({ - ok: true, - json: () => - Promise.resolve({ - batch_ingest_config: { - use_multipart_endpoint: true, - }, - }), - text: () => Promise.resolve(""), - }), - ); - expectedFetchMock = - description === "mocked" ? overriddenFetch : globalFetchMock; - unexpectedFetchMock = - description === "mocked" ? globalFetchMock : overriddenFetch; - - if (description === "mocked") { - overrideFetchImplementation(overriddenFetch); - } else { - overrideFetchImplementation(globalFetchMock); - } - // Mock global fetch - (globalThis as any).fetch = globalFetchMock; - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - describe("createRuns", () => { - it("should create an example with the given input and generation", async () => { - const client = new Client({ apiKey: "test-api-key" }); - - const thread = await client.threads.create(); - expect(expectedFetchMock).toHaveBeenCalledTimes(1); - expect(unexpectedFetchMock).not.toHaveBeenCalled(); - - jest.clearAllMocks(); // Clear all mocks before the next operation - - // Then clear & run the function - await client.runs.create(thread.thread_id, "somegraph", { - input: { foo: "bar" }, - }); - expect(expectedFetchMock).toHaveBeenCalledTimes(1); - expect(unexpectedFetchMock).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/libs/sdk-js/src/tests/sse.test.ts b/libs/sdk-js/src/tests/sse.test.ts deleted file mode 100644 index b4f7ca7d8..000000000 --- a/libs/sdk-js/src/tests/sse.test.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { Readable } from "node:stream"; -import { IterableReadableStream } from "../utils/stream.js"; -import { BytesLineDecoder, SSEDecoder } from "../utils/sse.js"; - -const gather = async (stream: ReadableStream): Promise => { - const results: T[] = []; - const iterator = IterableReadableStream.fromReadableStream(stream); - for await (const chunk of iterator) results.push(chunk); - return results; -}; - -const textEncoder = new TextEncoder(); -const textDecoder = new TextDecoder(); - -describe("BytesLineDecoder", () => { - const createStream = (chunks: Uint8Array[]) => { - return Readable.toWeb(Readable.from(chunks)) as ReadableStream; - }; - - test("handles single line with newline", async () => { - const input = createStream([textEncoder.encode("hello\n")]); - const decoded = input.pipeThrough(new BytesLineDecoder()); - const results = await gather(decoded); - - expect(results.length).toBe(1); - expect(textDecoder.decode(results[0])).toBe("hello"); - }); - - test("handles multiple lines", async () => { - const input = createStream([textEncoder.encode("line1\nline2\nline3\n")]); - const decoded = input.pipeThrough(new BytesLineDecoder()); - const results = await gather(decoded); - - expect(results.length).toBe(3); - expect(textDecoder.decode(results[0])).toBe("line1"); - expect(textDecoder.decode(results[1])).toBe("line2"); - expect(textDecoder.decode(results[2])).toBe("line3"); - }); - - test("handles split chunks", async () => { - const input = createStream([ - textEncoder.encode("li"), - textEncoder.encode("ne1\nli"), - textEncoder.encode("ne2\n"), - ]); - const decoded = input.pipeThrough(new BytesLineDecoder()); - const results = await gather(decoded); - - expect(results.length).toBe(2); - expect(textDecoder.decode(results[0])).toBe("line1"); - expect(textDecoder.decode(results[1])).toBe("line2"); - }); - - test("handles CR LF line endings", async () => { - const input = createStream([textEncoder.encode("line1\r\nline2\r\n")]); - const decoded = input.pipeThrough(new BytesLineDecoder()); - const results = await gather(decoded); - - expect(results.length).toBe(2); - expect(textDecoder.decode(results[0])).toBe("line1"); - expect(textDecoder.decode(results[1])).toBe("line2"); - }); - - test("handles split CR LF", async () => { - const input = createStream([ - textEncoder.encode("line1\r"), - textEncoder.encode("\nline2\r\n"), - ]); - const decoded = input.pipeThrough(new BytesLineDecoder()); - const results = await gather(decoded); - - expect(results.length).toBe(2); - expect(textDecoder.decode(results[0])).toBe("line1"); - expect(textDecoder.decode(results[1])).toBe("line2"); - }); - - test("handles stale line", async () => { - const input = createStream([textEncoder.encode("hello")]); - const decoded = input.pipeThrough(new BytesLineDecoder()); - const results = await gather(decoded); - - expect(results.length).toBe(1); - expect(textDecoder.decode(results[0])).toBe("hello"); - }); -}); - -describe("SSEDecoder", () => { - const createStream = (lines: string[]) => { - return Readable.toWeb( - Readable.from(lines.map((line) => textEncoder.encode(line))), - ) as ReadableStream; - }; - - test("decodes simple event", async () => { - const input = createStream([ - "event: test\n", - 'data: {"message": "hello"}\n', - "\n", - ]); - const decoded = input - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - const results = await gather(decoded); - expect(results.length).toBe(1); - expect(results[0]).toEqual({ - event: "test", - data: { message: "hello" }, - }); - }); - - test("ignores comments", async () => { - const input = createStream([ - ": this is a comment\n", - "event: test\n", - 'data: {"message": "hello"}\n', - ]); - const decoded = input - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - const results = await gather(decoded); - expect(results.length).toBe(1); - expect(results[0]).toEqual({ - event: "test", - data: { message: "hello" }, - }); - }); - - test("handles multiple events", async () => { - const input = createStream([ - "event: test1\n", - 'data: {"message": "hello"}\n', - "\n", - "event: test2\n", - 'data: {"message": "world"}\n', - "\n", - ]); - const decoded = input - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - const results = await gather(decoded); - expect(results.length).toBe(2); - expect(results[0]).toEqual({ - event: "test1", - data: { message: "hello" }, - }); - expect(results[1]).toEqual({ - event: "test2", - data: { message: "world" }, - }); - }); - - test("end event without data", async () => { - const input = createStream(["event: test\n"]); - const decoded = input - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - const results = await gather(decoded); - expect(results.length).toBe(1); - expect(results[0]).toEqual({ - event: "test", - data: null, - }); - }); - - test("end event without newline", async () => { - const input = createStream(["event: end"]); - const decoded = input - .pipeThrough(new BytesLineDecoder()) - .pipeThrough(new SSEDecoder()); - - const results = await gather(decoded); - expect(results.length).toBe(1); - expect(results[0]).toEqual({ - event: "end", - data: null, - }); - }); -}); diff --git a/libs/sdk-js/src/types.messages.ts b/libs/sdk-js/src/types.messages.ts deleted file mode 100644 index a2eb34a9a..000000000 --- a/libs/sdk-js/src/types.messages.ts +++ /dev/null @@ -1,99 +0,0 @@ -type ImageDetail = "auto" | "low" | "high"; -type MessageContentImageUrl = { - type: "image_url"; - image_url: string | { url: string; detail?: ImageDetail | undefined }; -}; - -type MessageContentText = { type: "text"; text: string }; -type MessageContentComplex = MessageContentText | MessageContentImageUrl; -type MessageContent = string | MessageContentComplex[]; - -/** - * Model-specific additional kwargs, which is passed back to the underlying LLM. - */ -type MessageAdditionalKwargs = Record; - -export type HumanMessage = { - type: "human"; - id?: string | undefined; - content: MessageContent; -}; - -export type AIMessage = { - type: "ai"; - id?: string | undefined; - content: MessageContent; - tool_calls?: - | { - name: string; - args: { [x: string]: { [x: string]: any } }; - id?: string | undefined; - type?: "tool_call" | undefined; - }[] - | undefined; - invalid_tool_calls?: - | { - name?: string | undefined; - args?: string | undefined; - id?: string | undefined; - error?: string | undefined; - type?: "invalid_tool_call" | undefined; - }[] - | undefined; - usage_metadata?: - | { - input_tokens: number; - output_tokens: number; - total_tokens: number; - input_token_details?: - | { - audio?: number | undefined; - cache_read?: number | undefined; - cache_creation?: number | undefined; - } - | undefined; - output_token_details?: - | { audio?: number | undefined; reasoning?: number | undefined } - | undefined; - } - | undefined; - additional_kwargs?: MessageAdditionalKwargs | undefined; - response_metadata?: Record | undefined; -}; - -export type ToolMessage = { - type: "tool"; - name?: string | undefined; - id?: string | undefined; - content: MessageContent; - status?: "error" | "success" | undefined; - tool_call_id: string; - additional_kwargs?: MessageAdditionalKwargs | undefined; - response_metadata?: Record | undefined; -}; - -export type SystemMessage = { - type: "system"; - id?: string | undefined; - content: MessageContent; -}; - -export type FunctionMessage = { - type: "function"; - id?: string | undefined; - content: MessageContent; -}; - -export type RemoveMessage = { - type: "remove"; - id: string; - content: MessageContent; -}; - -export type Message = - | HumanMessage - | AIMessage - | ToolMessage - | SystemMessage - | FunctionMessage - | RemoveMessage; diff --git a/libs/sdk-js/src/types.stream.ts b/libs/sdk-js/src/types.stream.ts deleted file mode 100644 index 441745aec..000000000 --- a/libs/sdk-js/src/types.stream.ts +++ /dev/null @@ -1,204 +0,0 @@ -import type { Message } from "./types.messages.js"; - -/** - * Stream modes - * - "values": Stream only the state values. - * - "messages": Stream complete messages. - * - "messages-tuple": Stream (message chunk, metadata) tuples. - * - "updates": Stream updates to the state. - * - "events": Stream events occurring during execution. - * - "debug": Stream detailed debug information. - * - "custom": Stream custom events. - */ -export type StreamMode = - | "values" - | "messages" - | "updates" - | "events" - | "debug" - | "custom" - | "messages-tuple"; - -type MessageTupleMetadata = { - tags: string[]; - [key: string]: unknown; -}; - -type AsSubgraph = { - event: TEvent["event"] | `${TEvent["event"]}|${string}`; - data: TEvent["data"]; -}; - -/** - * Stream event with values after completion of each step. - */ -export type ValuesStreamEvent = { event: "values"; data: StateType }; - -/** @internal */ -export type SubgraphValuesStreamEvent = AsSubgraph< - ValuesStreamEvent ->; - -/** - * Stream event with message chunks coming from LLM invocations inside nodes. - */ -export type MessagesTupleStreamEvent = { - event: "messages"; - // TODO: add types for message and config, which do not depend on LangChain - // while making sure it's easy to keep them in sync. - data: [message: Message, config: MessageTupleMetadata]; -}; - -/** @internal */ -export type SubgraphMessagesTupleStreamEvent = - AsSubgraph; - -/** - * Metadata stream event with information about the run and thread - */ -export type MetadataStreamEvent = { - event: "metadata"; - data: { run_id: string; thread_id: string }; -}; - -/** - * Stream event with error information. - */ -export type ErrorStreamEvent = { - event: "error"; - data: { error: string; message: string }; -}; - -/** @internal */ -export type SubgraphErrorStreamEvent = AsSubgraph; - -/** - * Stream event with updates to the state after each step. - * The streamed outputs include the name of the node that - * produced the update as well as the update. - */ -export type UpdatesStreamEvent = { - event: "updates"; - data: { [node: string]: UpdateType }; -}; - -/** @internal */ -export type SubgraphUpdatesStreamEvent = AsSubgraph< - UpdatesStreamEvent ->; - -/** - * Streaming custom data from inside the nodes. - */ -export type CustomStreamEvent = { event: "custom"; data: T }; - -/** @internal */ -export type SubgraphCustomStreamEvent = AsSubgraph>; - -type MessagesMetadataStreamEvent = { - event: "messages/metadata"; - data: { [messageId: string]: { metadata: unknown } }; -}; -type MessagesCompleteStreamEvent = { - event: "messages/complete"; - data: Message[]; -}; -type MessagesPartialStreamEvent = { - event: "messages/partial"; - data: Message[]; -}; - -/** - * Message stream event specific to LangGraph Server. - * @deprecated Use `streamMode: "messages-tuple"` instead. - */ -export type MessagesStreamEvent = - | MessagesMetadataStreamEvent - | MessagesCompleteStreamEvent - | MessagesPartialStreamEvent; - -/** @internal */ -export type SubgraphMessagesStreamEvent = - | AsSubgraph - | AsSubgraph - | AsSubgraph; - -/** - * Stream event with detailed debug information. - */ -export type DebugStreamEvent = { event: "debug"; data: unknown }; - -/** @internal */ -export type SubgraphDebugStreamEvent = AsSubgraph; - -/** - * Stream event with events occurring during execution. - */ -export type EventsStreamEvent = { event: "events"; data: unknown }; - -/** @internal */ -export type SubgraphEventsStreamEvent = AsSubgraph; - -/** - * Stream event with a feedback key to signed URL map. Set `feedbackKeys` in - * the `RunsStreamPayload` to receive this event. - */ -export type FeedbackStreamEvent = { - event: "feedback"; - data: { [feedbackKey: string]: string }; -}; - -type GetStreamModeMap< - TStreamMode extends StreamMode | StreamMode[], - TStateType = unknown, - TUpdateType = TStateType, - TCustomType = unknown, -> = - | { - values: ValuesStreamEvent; - updates: UpdatesStreamEvent; - custom: CustomStreamEvent; - debug: DebugStreamEvent; - messages: MessagesStreamEvent; - "messages-tuple": MessagesTupleStreamEvent; - events: EventsStreamEvent; - }[TStreamMode extends StreamMode[] ? TStreamMode[number] : TStreamMode] - | ErrorStreamEvent - | MetadataStreamEvent - | FeedbackStreamEvent; - -type GetSubgraphsStreamModeMap< - TStreamMode extends StreamMode | StreamMode[], - TStateType = unknown, - TUpdateType = TStateType, - TCustomType = unknown, -> = - | { - values: SubgraphValuesStreamEvent; - updates: SubgraphUpdatesStreamEvent; - custom: SubgraphCustomStreamEvent; - debug: SubgraphDebugStreamEvent; - messages: SubgraphMessagesStreamEvent; - "messages-tuple": SubgraphMessagesTupleStreamEvent; - events: SubgraphEventsStreamEvent; - }[TStreamMode extends StreamMode[] ? TStreamMode[number] : TStreamMode] - | SubgraphErrorStreamEvent - | MetadataStreamEvent - | FeedbackStreamEvent; - -export type TypedAsyncGenerator< - TStreamMode extends StreamMode | StreamMode[] = [], - TSubgraphs extends boolean = false, - TStateType = unknown, - TUpdateType = TStateType, - TCustomType = unknown, -> = AsyncGenerator< - TSubgraphs extends true - ? GetSubgraphsStreamModeMap< - TStreamMode, - TStateType, - TUpdateType, - TCustomType - > - : GetStreamModeMap ->; diff --git a/libs/sdk-js/src/types.ts b/libs/sdk-js/src/types.ts deleted file mode 100644 index 6945e9eba..000000000 --- a/libs/sdk-js/src/types.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { Checkpoint, Config, Metadata } from "./schema.js"; -import { StreamMode } from "./types.stream.js"; - -export type MultitaskStrategy = "reject" | "interrupt" | "rollback" | "enqueue"; -export type OnConflictBehavior = "raise" | "do_nothing"; -export type OnCompletionBehavior = "complete" | "continue"; -export type DisconnectMode = "cancel" | "continue"; -export type StreamEvent = - | "events" - | "metadata" - | "debug" - | "updates" - | "values" - | "messages/partial" - | "messages/metadata" - | "messages/complete" - | "messages" - | (string & {}); - -export interface Send { - node: string; - input: Record | null; -} - -export interface Command { - /** - * An object to update the thread state with. - */ - update?: Record | [string, unknown][] | null; - - /** - * The value to return from an `interrupt` function call. - */ - resume?: unknown; - - /** - * Determine the next node to navigate to. Can be one of the following: - * - Name(s) of the node names to navigate to next. - * - `Send` command(s) to execute node(s) with provided input. - */ - goto?: Send | Send[] | string | string[]; -} - -interface RunsInvokePayload { - /** - * Input to the run. Pass `null` to resume from the current state of the thread. - */ - input?: Record | null; - - /** - * Metadata for the run. - */ - metadata?: Metadata; - - /** - * Additional configuration for the run. - */ - config?: Config; - - /** - * Checkpoint ID for when creating a new run. - */ - checkpointId?: string; - - /** - * Checkpoint for when creating a new run. - */ - checkpoint?: Omit; - - /** - * Interrupt execution before entering these nodes. - */ - interruptBefore?: "*" | string[]; - - /** - * Interrupt execution after leaving these nodes. - */ - interruptAfter?: "*" | string[]; - - /** - * Strategy to handle concurrent runs on the same thread. Only relevant if - * there is a pending/inflight run on the same thread. One of: - * - "reject": Reject the new run. - * - "interrupt": Interrupt the current run, keeping steps completed until now, - and start a new one. - * - "rollback": Cancel and delete the existing run, rolling back the thread to - the state before it had started, then start the new run. - * - "enqueue": Queue up the new run to start after the current run finishes. - */ - multitaskStrategy?: MultitaskStrategy; - - /** - * Abort controller signal to cancel the run. - */ - signal?: AbortController["signal"]; - - /** - * Behavior to handle run completion. Only relevant if - * there is a pending/inflight run on the same thread. One of: - * - "complete": Complete the run. - * - "continue": Continue the run. - */ - onCompletion?: OnCompletionBehavior; - - /** - * Webhook to call when the run is complete. - */ - webhook?: string; - - /** - * Behavior to handle disconnection. Only relevant if - * there is a pending/inflight run on the same thread. One of: - * - "cancel": Cancel the run. - * - "continue": Continue the run. - */ - onDisconnect?: DisconnectMode; - - /** - * The number of seconds to wait before starting the run. - * Use to schedule future runs. - */ - afterSeconds?: number; - - /** - * Behavior if the specified run doesn't exist. Defaults to "reject". - */ - ifNotExists?: "create" | "reject"; - - /** - * One or more commands to invoke the graph with. - */ - command?: Command; -} - -export interface RunsStreamPayload< - TStreamMode extends StreamMode | StreamMode[] = [], - TSubgraphs extends boolean = false, -> extends RunsInvokePayload { - /** - * One of `"values"`, `"messages"`, `"messages-tuple"`, `"updates"`, `"events"`, `"debug"`, `"custom"`. - */ - streamMode?: TStreamMode; - - /** - * Stream output from subgraphs. By default, streams only the top graph. - */ - streamSubgraphs?: TSubgraphs; - - /** - * Pass one or more feedbackKeys if you want to request short-lived signed URLs - * for submitting feedback to LangSmith with this key for this run. - */ - feedbackKeys?: string[]; -} - -export interface RunsCreatePayload extends RunsInvokePayload { - /** - * One of `"values"`, `"messages"`, `"messages-tuple"`, `"updates"`, `"events"`, `"debug"`, `"custom"`. - */ - streamMode?: StreamMode | Array; - - /** - * Stream output from subgraphs. By default, streams only the top graph. - */ - streamSubgraphs?: boolean; -} - -export interface CronsCreatePayload extends RunsCreatePayload { - /** - * Schedule for running the Cron Job - */ - schedule: string; -} - -export interface RunsWaitPayload extends RunsStreamPayload { - /** - * Raise errors returned by the run. Default is `true`. - */ - raiseError?: boolean; -} diff --git a/libs/sdk-js/src/utils/async_caller.ts b/libs/sdk-js/src/utils/async_caller.ts deleted file mode 100644 index 72beefb54..000000000 --- a/libs/sdk-js/src/utils/async_caller.ts +++ /dev/null @@ -1,220 +0,0 @@ -import pRetry from "p-retry"; -import PQueueMod from "p-queue"; -import { _getFetchImplementation } from "../singletons/fetch.js"; - -const STATUS_NO_RETRY = [ - 400, // Bad Request - 401, // Unauthorized - 402, // Payment required - 403, // Forbidden - 404, // Not Found - 405, // Method Not Allowed - 406, // Not Acceptable - 407, // Proxy Authentication Required - 408, // Request Timeout - 422, // Unprocessable Entity -]; -const STATUS_IGNORE = [ - 409, // Conflict -]; - -type ResponseCallback = (response?: Response) => Promise; - -export interface AsyncCallerParams { - /** - * The maximum number of concurrent calls that can be made. - * Defaults to `Infinity`, which means no limit. - */ - maxConcurrency?: number; - /** - * The maximum number of retries that can be made for a single call, - * with an exponential backoff between each attempt. Defaults to 6. - */ - maxRetries?: number; - - onFailedResponseHook?: ResponseCallback; - - /** - * Specify a custom fetch implementation. - * - * By default we expect the `fetch` is available in the global scope. - */ - fetch?: typeof fetch | ((...args: any[]) => any); -} - -export interface AsyncCallerCallOptions { - signal?: AbortSignal; -} - -/** - * Do not rely on globalThis.Response, rather just - * do duck typing - */ -function isResponse(x: unknown): x is Response { - if (x == null || typeof x !== "object") return false; - return "status" in x && "statusText" in x && "text" in x; -} - -/** - * Utility error to properly handle failed requests - */ -class HTTPError extends Error { - status: number; - text: string; - - response?: Response; - - constructor(status: number, message: string, response?: Response) { - super(`HTTP ${status}: ${message}`); - this.status = status; - this.text = message; - this.response = response; - } - - static async fromResponse( - response: Response, - options?: { includeResponse?: boolean }, - ): Promise { - try { - return new HTTPError( - response.status, - await response.text(), - options?.includeResponse ? response : undefined, - ); - } catch { - return new HTTPError( - response.status, - response.statusText, - options?.includeResponse ? response : undefined, - ); - } - } -} - -/** - * A class that can be used to make async calls with concurrency and retry logic. - * - * This is useful for making calls to any kind of "expensive" external resource, - * be it because it's rate-limited, subject to network issues, etc. - * - * Concurrent calls are limited by the `maxConcurrency` parameter, which defaults - * to `Infinity`. This means that by default, all calls will be made in parallel. - * - * Retries are limited by the `maxRetries` parameter, which defaults to 5. This - * means that by default, each call will be retried up to 5 times, with an - * exponential backoff between each attempt. - */ -export class AsyncCaller { - protected maxConcurrency: AsyncCallerParams["maxConcurrency"]; - - protected maxRetries: AsyncCallerParams["maxRetries"]; - - private queue: (typeof import("p-queue"))["default"]["prototype"]; - - private onFailedResponseHook?: ResponseCallback; - - private customFetch?: typeof fetch; - - constructor(params: AsyncCallerParams) { - this.maxConcurrency = params.maxConcurrency ?? Infinity; - this.maxRetries = params.maxRetries ?? 4; - - if ("default" in PQueueMod) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.queue = new (PQueueMod.default as any)({ - concurrency: this.maxConcurrency, - }); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - this.queue = new (PQueueMod as any)({ concurrency: this.maxConcurrency }); - } - this.onFailedResponseHook = params?.onFailedResponseHook; - this.customFetch = params.fetch; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - call Promise>( - callable: T, - ...args: Parameters - ): Promise>> { - const onFailedResponseHook = this.onFailedResponseHook; - return this.queue.add( - () => - pRetry( - () => - callable(...(args as Parameters)).catch(async (error) => { - // eslint-disable-next-line no-instanceof/no-instanceof - if (error instanceof Error) { - throw error; - } else if (isResponse(error)) { - throw await HTTPError.fromResponse(error, { - includeResponse: !!onFailedResponseHook, - }); - } else { - throw new Error(error); - } - }), - { - async onFailedAttempt(error) { - if ( - error.message.startsWith("Cancel") || - error.message.startsWith("TimeoutError") || - error.message.startsWith("AbortError") - ) { - throw error; - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if ((error as any)?.code === "ECONNABORTED") { - throw error; - } - - if (error instanceof HTTPError) { - if (STATUS_NO_RETRY.includes(error.status)) { - throw error; - } else if (STATUS_IGNORE.includes(error.status)) { - return; - } - if (onFailedResponseHook && error.response) { - await onFailedResponseHook(error.response); - } - } - }, - // If needed we can change some of the defaults here, - // but they're quite sensible. - retries: this.maxRetries, - randomize: true, - }, - ), - { throwOnTimeout: true }, - ); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - callWithOptions Promise>( - options: AsyncCallerCallOptions, - callable: T, - ...args: Parameters - ): Promise>> { - // Note this doesn't cancel the underlying request, - // when available prefer to use the signal option of the underlying call - if (options.signal) { - return Promise.race([ - this.call(callable, ...args), - new Promise((_, reject) => { - options.signal?.addEventListener("abort", () => { - reject(new Error("AbortError")); - }); - }), - ]); - } - return this.call(callable, ...args); - } - - fetch(...args: Parameters): ReturnType { - const fetchFn = - this.customFetch ?? (_getFetchImplementation() as typeof fetch); - return this.call(() => - fetchFn(...args).then((res) => (res.ok ? res : Promise.reject(res))), - ); - } -} diff --git a/libs/sdk-js/src/utils/env.ts b/libs/sdk-js/src/utils/env.ts deleted file mode 100644 index 738c14fd5..000000000 --- a/libs/sdk-js/src/utils/env.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function getEnvironmentVariable(name: string): string | undefined { - // Certain setups (Deno, frontend) will throw an error if you try to access environment variables - try { - return typeof process !== "undefined" - ? // eslint-disable-next-line no-process-env - process.env?.[name] - : undefined; - } catch (e) { - return undefined; - } -} diff --git a/libs/sdk-js/src/utils/signals.ts b/libs/sdk-js/src/utils/signals.ts deleted file mode 100644 index 915753325..000000000 --- a/libs/sdk-js/src/utils/signals.ts +++ /dev/null @@ -1,22 +0,0 @@ -export function mergeSignals(...signals: (AbortSignal | null | undefined)[]) { - const nonZeroSignals = signals.filter( - (signal): signal is AbortSignal => signal != null, - ); - - if (nonZeroSignals.length === 0) return undefined; - if (nonZeroSignals.length === 1) return nonZeroSignals[0]; - - const controller = new AbortController(); - for (const signal of signals) { - if (signal?.aborted) { - controller.abort(signal.reason); - return controller.signal; - } - - signal?.addEventListener("abort", () => controller.abort(signal.reason), { - once: true, - }); - } - - return controller.signal; -} diff --git a/libs/sdk-js/src/utils/sse.ts b/libs/sdk-js/src/utils/sse.ts deleted file mode 100644 index c3c525113..000000000 --- a/libs/sdk-js/src/utils/sse.ts +++ /dev/null @@ -1,176 +0,0 @@ -const CR = "\r".charCodeAt(0); -const LF = "\n".charCodeAt(0); -const NULL = "\0".charCodeAt(0); -const COLON = ":".charCodeAt(0); -const SPACE = " ".charCodeAt(0); - -const TRAILING_NEWLINE = [CR, LF]; - -export class BytesLineDecoder extends TransformStream { - constructor() { - let buffer: Uint8Array[] = []; - let trailingCr = false; - - super({ - start() { - buffer = []; - trailingCr = false; - }, - - transform(chunk, controller) { - // See https://docs.python.org/3/glossary.html#term-universal-newlines - let text = chunk; - - // Handle trailing CR from previous chunk - if (trailingCr) { - text = joinArrays([[CR], text]); - trailingCr = false; - } - - // Check for trailing CR in current chunk - if (text.length > 0 && text.at(-1) === CR) { - trailingCr = true; - text = text.subarray(0, -1); - } - - if (!text.length) return; - const trailingNewline = TRAILING_NEWLINE.includes(text.at(-1)!); - - const lastIdx = text.length - 1; - const { lines } = text.reduce<{ lines: Uint8Array[]; from: number }>( - (acc, cur, idx) => { - if (acc.from > idx) return acc; - - if (cur === CR || cur === LF) { - acc.lines.push(text.subarray(acc.from, idx)); - if (cur === CR && text[idx + 1] === LF) { - acc.from = idx + 2; - } else { - acc.from = idx + 1; - } - } - - if (idx === lastIdx && acc.from <= lastIdx) { - acc.lines.push(text.subarray(acc.from)); - } - - return acc; - }, - { lines: [], from: 0 }, - ); - - if (lines.length === 1 && !trailingNewline) { - buffer.push(lines[0]); - return; - } - - if (buffer.length) { - // Include existing buffer in first line - buffer.push(lines[0]); - lines[0] = joinArrays(buffer); - buffer = []; - } - - if (!trailingNewline) { - // If the last segment is not newline terminated, - // buffer it for the next chunk - if (lines.length) buffer = [lines.pop()!]; - } - - // Enqueue complete lines - for (const line of lines) { - controller.enqueue(line); - } - }, - - flush(controller) { - if (buffer.length) { - controller.enqueue(joinArrays(buffer)); - } - }, - }); - } -} - -interface StreamPart { - event: string; - data: unknown; -} - -export class SSEDecoder extends TransformStream { - constructor() { - let event = ""; - let data: Uint8Array[] = []; - let lastEventId = ""; - let retry: number | null = null; - - const decoder = new TextDecoder(); - - super({ - transform(chunk, controller) { - // Handle empty line case - if (!chunk.length) { - if (!event && !data.length && !lastEventId && retry == null) return; - - const sse = { - event, - data: data.length ? decodeArraysToJson(decoder, data) : null, - }; - - // NOTE: as per the SSE spec, do not reset lastEventId - event = ""; - data = []; - retry = null; - - controller.enqueue(sse); - return; - } - - // Ignore comments - if (chunk[0] === COLON) return; - - const sepIdx = chunk.indexOf(COLON); - if (sepIdx === -1) return; - - const fieldName = decoder.decode(chunk.subarray(0, sepIdx)); - let value = chunk.subarray(sepIdx + 1); - if (value[0] === SPACE) value = value.subarray(1); - - if (fieldName === "event") { - event = decoder.decode(value); - } else if (fieldName === "data") { - data.push(value); - } else if (fieldName === "id") { - if (value.indexOf(NULL) === -1) lastEventId = decoder.decode(value); - } else if (fieldName === "retry") { - const retryNum = Number.parseInt(decoder.decode(value)); - if (!Number.isNaN(retryNum)) retry = retryNum; - } - }, - - flush(controller) { - if (event) { - controller.enqueue({ - event, - data: data.length ? decodeArraysToJson(decoder, data) : null, - }); - } - }, - }); - } -} - -function joinArrays(data: ArrayLike[]) { - const totalLength = data.reduce((acc, curr) => acc + curr.length, 0); - let merged = new Uint8Array(totalLength); - let offset = 0; - for (const c of data) { - merged.set(c, offset); - offset += c.length; - } - return merged; -} - -function decodeArraysToJson(decoder: TextDecoder, data: ArrayLike[]) { - return JSON.parse(decoder.decode(joinArrays(data))); -} diff --git a/libs/sdk-js/src/utils/stream.ts b/libs/sdk-js/src/utils/stream.ts deleted file mode 100644 index 510204992..000000000 --- a/libs/sdk-js/src/utils/stream.ts +++ /dev/null @@ -1,115 +0,0 @@ -// in this case don't quite match. -type IterableReadableStreamInterface = ReadableStream & AsyncIterable; - -/* - * Support async iterator syntax for ReadableStreams in all environments. - * Source: https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490 - */ -export class IterableReadableStream - extends ReadableStream - implements IterableReadableStreamInterface -{ - public reader: ReadableStreamDefaultReader; - - ensureReader() { - if (!this.reader) { - this.reader = this.getReader(); - } - } - - async next(): Promise> { - this.ensureReader(); - try { - const result = await this.reader.read(); - if (result.done) { - this.reader.releaseLock(); // release lock when stream becomes closed - return { - done: true, - value: undefined, - }; - } else { - return { - done: false, - value: result.value, - }; - } - } catch (e) { - this.reader.releaseLock(); // release lock when stream becomes errored - throw e; - } - } - - async return(): Promise> { - this.ensureReader(); - // If wrapped in a Node stream, cancel is already called. - if (this.locked) { - const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet - this.reader.releaseLock(); // release lock first - await cancelPromise; // now await it - } - return { done: true, value: undefined }; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async throw(e: any): Promise> { - this.ensureReader(); - if (this.locked) { - const cancelPromise = this.reader.cancel(); // cancel first, but don't await yet - this.reader.releaseLock(); // release lock first - await cancelPromise; // now await it - } - throw e; - } - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore Not present in Node 18 types, required in latest Node 22 - async [Symbol.asyncDispose]() { - await this.return(); - } - - [Symbol.asyncIterator]() { - return this; - } - - static fromReadableStream(stream: ReadableStream) { - // From https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams#reading_the_stream - const reader = stream.getReader(); - return new IterableReadableStream({ - start(controller) { - return pump(); - function pump(): Promise { - return reader.read().then(({ done, value }) => { - // When no more data needs to be consumed, close the stream - if (done) { - controller.close(); - return; - } - // Enqueue the next data chunk into our target stream - controller.enqueue(value); - return pump(); - }); - } - }, - cancel() { - reader.releaseLock(); - }, - }); - } - - static fromAsyncGenerator(generator: AsyncGenerator) { - return new IterableReadableStream({ - async pull(controller) { - const { value, done } = await generator.next(); - // When no more data needs to be consumed, close the stream - if (done) { - controller.close(); - } - // Fix: `else if (value)` will hang the streaming when nullish value (e.g. empty string) is pulled - controller.enqueue(value); - }, - async cancel(reason) { - await generator.return(reason); - }, - }); - } -} diff --git a/libs/sdk-js/tsconfig.cjs.json b/libs/sdk-js/tsconfig.cjs.json deleted file mode 100644 index 6f1705b8b..000000000 --- a/libs/sdk-js/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "CommonJS", - "moduleResolution": "Node", - "declaration": false - }, - "exclude": ["node_modules", "dist", "**/tests"] -} diff --git a/libs/sdk-js/tsconfig.json b/libs/sdk-js/tsconfig.json deleted file mode 100644 index 9c6561a09..000000000 --- a/libs/sdk-js/tsconfig.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "extends": "@tsconfig/recommended", - "compilerOptions": { - "target": "ES2021", - "lib": [ - "ES2021", - "ES2022.Object", - "DOM" - ], - "module": "NodeNext", - "moduleResolution": "nodenext", - "esModuleInterop": true, - "declaration": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "useDefineForClassFields": true, - "strictPropertyInitialization": false, - "allowJs": true, - "strict": true, - "jsx": "react-jsx", - "outDir": "dist" - }, - "include": [ - "src/**/*" - ], - "exclude": [ - "node_modules", - "dist", - "coverage" - ], - "includeVersion": true, - "typedocOptions": { - "entryPoints": [ - "src/client.ts" - ], - "readme": "none", - "out": "docs", - "plugin": [ - "typedoc-plugin-markdown" - ], - "excludePrivate": true, - "excludeProtected": true, - "excludeExternals": false - } -} diff --git a/libs/sdk-js/typedoc.react.json b/libs/sdk-js/typedoc.react.json deleted file mode 100644 index 6359dac1b..000000000 --- a/libs/sdk-js/typedoc.react.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "pageTitleTemplates": { - "index": "{projectName}/react" - } -} diff --git a/libs/sdk-js/yarn.lock b/libs/sdk-js/yarn.lock deleted file mode 100644 index 635f0c5f3..000000000 --- a/libs/sdk-js/yarn.lock +++ /dev/null @@ -1,4547 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.0.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== - dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" - integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.0" - "@babel/generator" "^7.26.0" - "@babel/helper-compilation-targets" "^7.25.9" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.0" - "@babel/parser" "^7.26.0" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.26.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.25.9": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" - integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== - dependencies: - "@babel/compat-data" "^7.26.5" - "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" - integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== - dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.0" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" - integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== - dependencies: - "@babel/types" "^7.26.5" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.25.9": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" - integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.5" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.5" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" - integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cfworker/json-schema@^4.0.2": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" - integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== - -"@gerrit0/mini-shiki@^1.24.0": - version "1.27.2" - resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz#cf2a9fcb08a6581c78fc94821f0c854ec4b9f899" - integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== - dependencies: - "@shikijs/engine-oniguruma" "^1.27.2" - "@shikijs/types" "^1.27.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@langchain/core@^0.3.31": - version "0.3.39" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.39.tgz#81002e0cacacb7c1011264d6612f923816a3965f" - integrity sha512-muXs4asy1A7qDtcdznxqyBfxf4N6qxofY/S0c95vbsWa0r9YAE2PttHIjcuxSy1q2jUiTkpCcgFEjNJRQRVhEw== - dependencies: - "@cfworker/json-schema" "^4.0.2" - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith ">=0.2.8 <0.4.0" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^10.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/scripts@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@langchain/scripts/-/scripts-0.1.4.tgz#8c5d03d627686f20b9522213c12e2b329e73e381" - integrity sha512-O+mv2aqUIm3XWxYBrwFWMeTI3aHWeFR8OYjGFXKc1MGV/3LLao3PciyQvKUg1SL7FemHJ1ltDx74rKuEv8xxPA== - dependencies: - "@octokit/rest" "^21.0.2" - "@rollup/wasm-node" "^4.19.0" - axios "^1.6.7" - commander "^11.1.0" - glob "^10.3.10" - lodash "^4.17.21" - readline "^1.3.0" - rimraf "^5.0.1" - rollup "^4.5.2" - ts-morph "^21.0.1" - typescript "^5.4.5" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@octokit/auth-token@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-5.1.1.tgz#3bbfe905111332a17f72d80bd0b51a3e2fa2cf07" - integrity sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA== - -"@octokit/core@^6.1.2": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-6.1.2.tgz#20442d0a97c411612da206411e356014d1d1bd17" - integrity sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg== - dependencies: - "@octokit/auth-token" "^5.0.0" - "@octokit/graphql" "^8.0.0" - "@octokit/request" "^9.0.0" - "@octokit/request-error" "^6.0.1" - "@octokit/types" "^13.0.0" - before-after-hook "^3.0.2" - universal-user-agent "^7.0.0" - -"@octokit/endpoint@^10.0.0": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-10.1.1.tgz#1a9694e7aef6aa9d854dc78dd062945945869bcc" - integrity sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q== - dependencies: - "@octokit/types" "^13.0.0" - universal-user-agent "^7.0.2" - -"@octokit/graphql@^8.0.0": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-8.1.1.tgz#3cacab5f2e55d91c733e3bf481d3a3f8a5f639c4" - integrity sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg== - dependencies: - "@octokit/request" "^9.0.0" - "@octokit/types" "^13.0.0" - universal-user-agent "^7.0.0" - -"@octokit/openapi-types@^22.2.0": - version "22.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" - integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== - -"@octokit/plugin-paginate-rest@^11.0.0": - version "11.3.5" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz#a1929b3ba3dc7b63bc73bb6d3c7a3faf2a9c7649" - integrity sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ== - dependencies: - "@octokit/types" "^13.6.0" - -"@octokit/plugin-request-log@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz#ccb75d9705de769b2aa82bcd105cc96eb0c00f69" - integrity sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw== - -"@octokit/plugin-rest-endpoint-methods@^13.0.0": - version "13.2.6" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz#b9d343dbe88a6cb70cc7fa16faa98f0a29ffe654" - integrity sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw== - dependencies: - "@octokit/types" "^13.6.1" - -"@octokit/request-error@^6.0.1": - version "6.1.5" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.5.tgz#907099e341c4e6179db623a0328d678024f54653" - integrity sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ== - dependencies: - "@octokit/types" "^13.0.0" - -"@octokit/request@^9.0.0": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-9.1.3.tgz#42b693bc06238f43af3c037ebfd35621c6457838" - integrity sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA== - dependencies: - "@octokit/endpoint" "^10.0.0" - "@octokit/request-error" "^6.0.1" - "@octokit/types" "^13.1.0" - universal-user-agent "^7.0.2" - -"@octokit/rest@^21.0.2": - version "21.0.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-21.0.2.tgz#9b767dbc1098daea8310fd8b76bf7a97215d5972" - integrity sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ== - dependencies: - "@octokit/core" "^6.1.2" - "@octokit/plugin-paginate-rest" "^11.0.0" - "@octokit/plugin-request-log" "^5.3.1" - "@octokit/plugin-rest-endpoint-methods" "^13.0.0" - -"@octokit/types@^13.0.0", "@octokit/types@^13.1.0", "@octokit/types@^13.6.0", "@octokit/types@^13.6.1": - version "13.6.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.1.tgz#432fc6c0aaae54318e5b2d3e15c22ac97fc9b15f" - integrity sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g== - dependencies: - "@octokit/openapi-types" "^22.2.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@rollup/rollup-android-arm-eabi@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz#c460b54c50d42f27f8254c435a4f3b3e01910bc8" - integrity sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw== - -"@rollup/rollup-android-arm64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz#96e01f3a04675d8d5973ab8d3fd6bc3be21fa5e1" - integrity sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA== - -"@rollup/rollup-darwin-arm64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz#9b2ec23b17b47cbb2f771b81f86ede3ac6730bce" - integrity sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ== - -"@rollup/rollup-darwin-x64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz#f30e4ee6929e048190cf10e0daa8e8ae035b6e46" - integrity sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg== - -"@rollup/rollup-freebsd-arm64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz#c54b2373ec5bcf71f08c4519c7ae80a0b6c8e03b" - integrity sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw== - -"@rollup/rollup-freebsd-x64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz#3bc53aa29d5a34c28ba8e00def76aa612368458e" - integrity sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g== - -"@rollup/rollup-linux-arm-gnueabihf@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz#c85aedd1710c9e267ee86b6d1ce355ecf7d9e8d9" - integrity sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA== - -"@rollup/rollup-linux-arm-musleabihf@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz#e77313408bf13995aecde281aec0cceb08747e42" - integrity sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw== - -"@rollup/rollup-linux-arm64-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz#633f632397b3662108cfaa1abca2a80b85f51102" - integrity sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg== - -"@rollup/rollup-linux-arm64-musl@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz#63edd72b29c4cced93e16113a68e1be9fef88907" - integrity sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz#a9418a4173df80848c0d47df0426a0bf183c4e75" - integrity sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA== - -"@rollup/rollup-linux-riscv64-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz#bc9c195db036a27e5e3339b02f51526b4ce1e988" - integrity sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw== - -"@rollup/rollup-linux-s390x-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz#1651fdf8144ae89326c01da5d52c60be63e71a82" - integrity sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ== - -"@rollup/rollup-linux-x64-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz#e473de5e4acb95fcf930a35cbb7d3e8080e57a6f" - integrity sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA== - -"@rollup/rollup-linux-x64-musl@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz#0af12dd2578c29af4037f0c834b4321429dd5b01" - integrity sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q== - -"@rollup/rollup-win32-arm64-msvc@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz#e48e78cdd45313b977c1390f4bfde7ab79be8871" - integrity sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA== - -"@rollup/rollup-win32-ia32-msvc@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz#a3fc8536d243fe161c796acb93eba43c250f311c" - integrity sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg== - -"@rollup/rollup-win32-x64-msvc@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz#e2a9d1fd56524103a6cc8a54404d9d3ebc73c454" - integrity sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg== - -"@rollup/wasm-node@^4.19.0": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/wasm-node/-/wasm-node-4.24.4.tgz#11d78f5cc85b04e81468f245c2dc0885d06d663d" - integrity sha512-WKJUdPcM8YAYujafY95+2EapqU3F/nwfBkXh9AfkBvWBwFhsvNJABA86Br6graRH2vRE4FBsiqjFvFWOtEO6wg== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - fsevents "~2.3.2" - -"@shikijs/engine-oniguruma@^1.27.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz#d879717ced61d44e78feab16f701f6edd75434f1" - integrity sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA== - dependencies: - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@shikijs/types@1.29.2", "@shikijs/types@^1.27.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.2.tgz#a93fdb410d1af8360c67bf5fc1d1a68d58e21c4f" - integrity sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw== - dependencies: - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" - integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@textlint/ast-node-types@^12.6.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/ast-node-types/-/ast-node-types-12.6.1.tgz#35ecefe74e701d7f632c083d4fda89cab1b89012" - integrity sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA== - -"@textlint/markdown-to-ast@^12.1.1": - version "12.6.1" - resolved "https://registry.yarnpkg.com/@textlint/markdown-to-ast/-/markdown-to-ast-12.6.1.tgz#fcccb5733b3e76cd0db78a323763ab101f2d803b" - integrity sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ== - dependencies: - "@textlint/ast-node-types" "^12.6.1" - debug "^4.3.4" - mdast-util-gfm-autolink-literal "^0.1.3" - remark-footnotes "^3.0.0" - remark-frontmatter "^3.0.0" - remark-gfm "^1.0.0" - remark-parse "^9.0.0" - traverse "^0.6.7" - unified "^9.2.2" - -"@ts-morph/common@~0.22.0": - version "0.22.0" - resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.22.0.tgz#8951d451622a26472fbc3a227d6c3a90e687a683" - integrity sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw== - dependencies: - fast-glob "^3.3.2" - minimatch "^9.0.3" - mkdirp "^3.0.1" - path-browserify "^1.0.1" - -"@tsconfig/recommended@^1.0.2": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@tsconfig/recommended/-/recommended-1.0.6.tgz#217b78f9601215939d566a79d202a760ae185114" - integrity sha512-0IKu9GHYF1NGTJiYgfWwqnOQSlnE9V9R7YohHNNf0/fj/SyOZWzdd06JFr0fLpg1Mqw0kGbYg8w5xdkSqLKM9g== - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.12": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== - dependencies: - "@types/unist" "^2" - -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - -"@types/node@*": - version "22.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.5.tgz#95af89a3fb74a2bb41ef9927f206e6472026e48b" - integrity sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ== - dependencies: - undici-types "~6.20.0" - -"@types/node@^20.12.12": - version "20.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" - integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== - dependencies: - undici-types "~5.26.4" - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/prop-types@*": - version "15.7.14" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" - integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== - -"@types/react@18.3.2": - version "18.3.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" - integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/unist@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" - integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== - -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@types/uuid@^9.0.1": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -anchor-markdown-header@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/anchor-markdown-header/-/anchor-markdown-header-0.6.0.tgz#908f2031281766f44ac350380ca0de77ab7065b8" - integrity sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA== - dependencies: - emoji-regex "~10.1.0" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^1.6.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -before-after-hook@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-3.0.2.tgz#d5665a5fa8b62294a5aa0a499f933f4a1016195d" - integrity sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== - dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@6, camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001688: - version "1.0.30001692" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz#4585729d95e6b95be5b439da6ab55250cd125bf9" - integrity sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -code-block-writer@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770" - integrity sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-md@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/concat-md/-/concat-md-0.5.1.tgz#03c72343a5d81306aa5ae1040d6368ffbc444781" - integrity sha512-iZr6yxlwPQ5IZup2mvqgm+JI0jnu5yGkND2ra5DinBtcevDQPQiAGpf4RXOnor1UpKBUydqegDLfPY8b+FfI+Q== - dependencies: - doctoc "^2.2.1" - front-matter "^4.0.2" - globby "^11.1.0" - lodash.startcase "^4.4.0" - meow "^9.0.0" - transform-markdown-links "^2.0.0" - -console-table-printer@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" - integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== - dependencies: - simple-wcswidth "^1.0.1" - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -cross-spawn@^7.0.0: - version "7.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82" - integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^7.0.3: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^4.0.0, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@1.2.0, decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctoc@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/doctoc/-/doctoc-2.2.1.tgz#83f6a6bf4df97defbe027c9a82d13091a138ffe2" - integrity sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ== - dependencies: - "@textlint/markdown-to-ast" "^12.1.1" - anchor-markdown-header "^0.6.0" - htmlparser2 "^7.2.0" - minimist "^1.2.6" - underscore "^1.13.2" - update-section "^0.3.3" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.2.0, domhandler@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ejs@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.73: - version "1.5.80" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz#ca7a8361d7305f0ec9e203ce4e633cbb8a8ef1b1" - integrity sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emoji-regex@~10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.1.0.tgz#d50e383743c0f7a5945c47087295afc112e3cf66" - integrity sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-glob@^3.2.9, fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" - integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -front-matter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" - integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== - dependencies: - js-yaml "^3.13.1" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^10.3.10, glob@^10.3.7: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -htmlparser2@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" - integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.2" - domutils "^2.8.0" - entities "^3.0.1" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.5.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -js-tiktoken@^1.0.12: - version "1.0.18" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.18.tgz#aaf68dda155bc693e6f0a572b9a359d569cb53df" - integrity sha512-hFYx4xYf6URgcttcGvGuOBJhTxPYZ2R5eIesqCaNRJmYH8sNmsfTeWg4yu//7u1VD/qIUkgKJTpGom9oHXmB4g== - dependencies: - base64-js "^1.5.1" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -"langsmith@>=0.2.8 <0.4.0": - version "0.3.7" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.7.tgz#c29362f78ea2872252a60a680d6adb8b67e18b74" - integrity sha512-wakN1hxGkm1JR2PpAV7fiT7oC99LKcgxiuUrYGZWPbuj7Y8EPF19F7VNr4B+hA219bfaeWTa4Lxy2YrtPSKnQA== - dependencies: - "@types/uuid" "^10.0.0" - chalk "^4.1.2" - console-table-printer "^2.12.1" - p-queue "^6.6.2" - p-retry "4" - semver "^7.6.3" - uuid "^10.0.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.startcase@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" - integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -markdown-it@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" - integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -mdast-util-footnote@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz#4b226caeab4613a3362c144c94af0fdd6f7e0ef0" - integrity sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w== - dependencies: - mdast-util-to-markdown "^0.6.0" - micromark "~2.11.0" - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-frontmatter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-0.2.0.tgz#8bd5cd55e236c03e204a036f7372ebe9e6748240" - integrity sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ== - dependencies: - micromark-extension-frontmatter "^0.2.0" - -mdast-util-gfm-autolink-literal@^0.1.0, mdast-util-gfm-autolink-literal@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-gfm-table@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" - integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== - dependencies: - markdown-table "^2.0.0" - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm-task-list-item@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" - integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== - dependencies: - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" - integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== - dependencies: - mdast-util-gfm-autolink-literal "^0.1.0" - mdast-util-gfm-strikethrough "^0.2.0" - mdast-util-gfm-table "^0.1.0" - mdast-util-gfm-task-list-item "^0.1.0" - mdast-util-to-markdown "^0.6.1" - -mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromark-extension-footnote@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz#129b74ef4920ce96719b2c06102ee7abb2b88a20" - integrity sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-frontmatter@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-0.2.2.tgz#61b8e92e9213e1d3c13f5a59e7862f5ca98dfa53" - integrity sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A== - dependencies: - fault "^1.0.0" - -micromark-extension-gfm-autolink-literal@~0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-table@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" - integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-tagfilter@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" - integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== - -micromark-extension-gfm-task-list-item@~0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" - integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" - integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== - dependencies: - micromark "~2.11.0" - micromark-extension-gfm-autolink-literal "~0.5.0" - micromark-extension-gfm-strikethrough "~0.6.5" - micromark-extension-gfm-table "~0.4.0" - micromark-extension-gfm-tagfilter "~0.3.0" - micromark-extension-gfm-task-list-item "~0.3.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.3, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" - integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mustache@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-retry@4: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readline@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" - integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -remark-footnotes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-3.0.0.tgz#5756b56f8464fa7ed80dbba0c966136305d8cb8d" - integrity sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg== - dependencies: - mdast-util-footnote "^0.1.0" - micromark-extension-footnote "^0.3.0" - -remark-frontmatter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-3.0.0.tgz#ca5d996361765c859bd944505f377d6b186a6ec6" - integrity sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA== - dependencies: - mdast-util-frontmatter "^0.2.0" - micromark-extension-frontmatter "^0.2.0" - -remark-gfm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" - integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== - dependencies: - mdast-util-gfm "^0.1.0" - micromark-extension-gfm "^0.3.0" - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== - dependencies: - mdast-util-from-markdown "^0.8.0" - -repeat-string@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.10.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.20.0: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^5.0.1: - version "5.0.10" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" - integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== - dependencies: - glob "^10.3.7" - -rollup@^4.5.2: - version "4.24.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.4.tgz#fdc76918de02213c95447c9ffff5e35dddb1d058" - integrity sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.24.4" - "@rollup/rollup-android-arm64" "4.24.4" - "@rollup/rollup-darwin-arm64" "4.24.4" - "@rollup/rollup-darwin-x64" "4.24.4" - "@rollup/rollup-freebsd-arm64" "4.24.4" - "@rollup/rollup-freebsd-x64" "4.24.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.24.4" - "@rollup/rollup-linux-arm-musleabihf" "4.24.4" - "@rollup/rollup-linux-arm64-gnu" "4.24.4" - "@rollup/rollup-linux-arm64-musl" "4.24.4" - "@rollup/rollup-linux-powerpc64le-gnu" "4.24.4" - "@rollup/rollup-linux-riscv64-gnu" "4.24.4" - "@rollup/rollup-linux-s390x-gnu" "4.24.4" - "@rollup/rollup-linux-x64-gnu" "4.24.4" - "@rollup/rollup-linux-x64-musl" "4.24.4" - "@rollup/rollup-win32-arm64-msvc" "4.24.4" - "@rollup/rollup-win32-ia32-msvc" "4.24.4" - "@rollup/rollup-win32-x64-msvc" "4.24.4" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-wcswidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" - integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.18" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" - integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -transform-markdown-links@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/transform-markdown-links/-/transform-markdown-links-2.1.0.tgz#de2178d96ef0e020226ebd967dcc5873df039792" - integrity sha512-7HWQwQ9US+tJSMMzi1aP+KA3QwfjDs8sB4H5GBMRHFNBMQVdgoF6VfIFy2nJR/UHRTkYoGFwWh2pe+QIwSvfOA== - -traverse@^0.6.7: - version "0.6.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.9.tgz#76cfdbacf06382d460b76f8b735a44a6209d8b81" - integrity sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg== - dependencies: - gopd "^1.0.1" - typedarray.prototype.slice "^1.0.3" - which-typed-array "^1.1.15" - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -ts-jest@^29.1.2: - version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" - integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== - dependencies: - bs-logger "^0.2.6" - ejs "^3.1.10" - fast-json-stable-stringify "^2.1.0" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.6.3" - yargs-parser "^21.1.1" - -ts-morph@^21.0.1: - version "21.0.1" - resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-21.0.1.tgz#712302a0f6e9dbf1aa8d9cf33a4386c4b18c2006" - integrity sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg== - dependencies: - "@ts-morph/common" "~0.22.0" - code-block-writer "^12.0.0" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typedarray.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz#bce2f685d3279f543239e4d595e0d021731d2d1a" - integrity sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - typed-array-buffer "^1.0.2" - typed-array-byte-offset "^1.0.2" - -typedoc-plugin-markdown@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.4.2.tgz#fc31779595aa9bf00e66709f3894e048345bf7ed" - integrity sha512-kJVkU2Wd+AXQpyL6DlYXXRrfNrHrEIUgiABWH8Z+2Lz5Sq6an4dQ/hfvP75bbokjNDUskOdFlEEm/0fSVyC7eg== - -typedoc@^0.27.7: - version "0.27.7" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.7.tgz#09047ffb5c845f45765de26c68b77260867fe967" - integrity sha512-K/JaUPX18+61W3VXek1cWC5gwmuLvYTOXJzBvD9W7jFvbPnefRnCHQCEPw7MSNrP/Hj7JJrhZtDDLKdcYm6ucg== - dependencies: - "@gerrit0/mini-shiki" "^1.24.0" - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - yaml "^2.6.1" - -typescript@^5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - 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" - -underscore@^1.13.2: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.2.tgz#52e7d0e9b3dc4df06cc33cb2b9fd79041a54827e" - integrity sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q== - -update-browserslist-db@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" - integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -update-section@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/update-section/-/update-section-0.3.3.tgz#458f17820d37820dc60e20b86d94391b00123158" - integrity sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw== - -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" - integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - 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.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod-to-json-schema@^3.22.3: - version "3.24.1" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz#f08c6725091aadabffa820ba8d50c7ab527f227a" - integrity sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w== - -zod@^3.22.4: - version "3.24.1" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.1.tgz#27445c912738c8ad1e9de1bea0359fa44d9d35ee" - integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/libs/sdk-py/LICENSE b/libs/sdk-py/LICENSE deleted file mode 100644 index fc0602fee..000000000 --- a/libs/sdk-py/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 LangChain, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/libs/sdk-py/Makefile b/libs/sdk-py/Makefile deleted file mode 100644 index 2db86e92a..000000000 --- a/libs/sdk-py/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -.PHONY: lint format - -test: - echo "No tests to run" - -###################### -# LINTING AND FORMATTING -###################### - -# Define a variable for Python and notebook files. -PYTHON_FILES=. -MYPY_CACHE=.mypy_cache -lint format: PYTHON_FILES=. -lint_diff format_diff: PYTHON_FILES=$(shell git diff --name-only --relative --diff-filter=d main . | grep -E '\.py$$|\.ipynb$$') - -lint lint_diff: - poetry run ruff check . - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff - [ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I $(PYTHON_FILES) - [ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) || poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) - -format format_diff: - poetry run ruff check --select I --fix $(PYTHON_FILES) - poetry run ruff format $(PYTHON_FILES) diff --git a/libs/sdk-py/README.md b/libs/sdk-py/README.md deleted file mode 100644 index 9cea00442..000000000 --- a/libs/sdk-py/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# LangGraph Python SDK - -This repository contains the Python SDK for interacting with the LangGraph Cloud REST API. - -## Quick Start - -To get started with the Python SDK, [install the package](https://pypi.org/project/langgraph-sdk/) - -```bash -pip install -U langgraph-sdk -``` - -You will need a running LangGraph API server. If you're running a server locally using `langgraph-cli`, SDK will automatically point at `http://localhost:8123`, otherwise -you would need to specify the server URL when creating a client. - -```python -from langgraph_sdk import get_client - -# If you're using a remote server, initialize the client with `get_client(url=REMOTE_URL)` -client = get_client() - -# List all assistants -assistants = await client.assistants.search() - -# We auto-create an assistant for each graph you register in config. -agent = assistants[0] - -# Start a new thread -thread = await client.threads.create() - -# Start a streaming run -input = {"messages": [{"role": "human", "content": "what's the weather in la"}]} -async for chunk in client.runs.stream(thread['thread_id'], agent['assistant_id'], input=input): - print(chunk) -``` diff --git a/libs/sdk-py/langgraph_sdk/__init__.py b/libs/sdk-py/langgraph_sdk/__init__.py deleted file mode 100644 index 4d9920430..000000000 --- a/libs/sdk-py/langgraph_sdk/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from langgraph_sdk.auth import Auth -from langgraph_sdk.client import get_client, get_sync_client - -try: - from importlib import metadata - - __version__ = metadata.version(__package__) -except metadata.PackageNotFoundError: - __version__ = "unknown" - -__all__ = ["Auth", "get_client", "get_sync_client"] diff --git a/libs/sdk-py/langgraph_sdk/auth/__init__.py b/libs/sdk-py/langgraph_sdk/auth/__init__.py deleted file mode 100644 index e0dff9c49..000000000 --- a/libs/sdk-py/langgraph_sdk/auth/__init__.py +++ /dev/null @@ -1,727 +0,0 @@ -from __future__ import annotations - -import inspect -import typing -from collections.abc import Callable, Sequence - -from langgraph_sdk.auth import exceptions, types - -TH = typing.TypeVar("TH", bound=types.Handler) -AH = typing.TypeVar("AH", bound=types.Authenticator) - - -class Auth: - """Add custom authentication and authorization management to your LangGraph application. - - The Auth class provides a unified system for handling authentication and - authorization in LangGraph applications. It supports custom user authentication - protocols and fine-grained authorization rules for different resources and - actions. - - To use, create a separate python file and add the path to the file to your - LangGraph API configuration file (`langgraph.json`). Within that file, create - an instance of the Auth class and register authentication and authorization - handlers as needed. - - Example `langgraph.json` file: - - ```json - { - "dependencies": ["."], - "graphs": { - "agent": "./my_agent/agent.py:graph" - }, - "env": ".env", - "auth": { - "path": "./auth.py:my_auth" - } - ``` - - Then the LangGraph server will load your auth file and run it server-side whenever a request comes in. - - ???+ example "Basic Usage" - ```python - from langgraph_sdk import Auth - - my_auth = Auth() - - async def verify_token(token: str) -> str: - # Verify token and return user_id - # This would typically be a call to your auth server - return "user_id" - - @auth.authenticate - async def authenticate(authorization: str) -> str: - # Verify token and return user_id - result = await verify_token(authorization) - if result != "user_id": - raise Auth.exceptions.HTTPException( - status_code=401, detail="Unauthorized" - ) - return result - - # Global fallback handler - @auth.on - async def authorize_default(params: Auth.on.value): - return False # Reject all requests (default behavior) - - @auth.on.threads.create - async def authorize_thread_create(params: Auth.on.threads.create.value): - # Allow the allowed user to create a thread - assert params.get("metadata", {}).get("owner") == "allowed_user" - - @auth.on.store - async def authorize_store(ctx: Auth.types.AuthContext, value: Auth.types.on): - assert ctx.user.identity in value["namespace"], "Not authorized" - ``` - - ???+ note "Request Processing Flow" - 1. Authentication (your `@auth.authenticate` handler) is performed first on **every request** - 2. For authorization, the most specific matching handler is called: - * If a handler exists for the exact resource and action, it is used (e.g., `@auth.on.threads.create`) - * Otherwise, if a handler exists for the resource with any action, it is used (e.g., `@auth.on.threads`) - * Finally, if no specific handlers match, the global handler is used (e.g., `@auth.on`) - * If no global handler is set, the request is accepted - - This allows you to set default behavior with a global handler while - overriding specific routes as needed. - """ - - __slots__ = ( - "on", - "_handlers", - "_global_handlers", - "_authenticate_handler", - "_handler_cache", - ) - types = types - """Reference to auth type definitions. - - Provides access to all type definitions used in the auth system, - like ThreadsCreate, AssistantsRead, etc.""" - - exceptions = exceptions - """Reference to auth exception definitions. - - Provides access to all exception definitions used in the auth system, - like HTTPException, etc. - """ - - def __init__(self) -> None: - self.on = _On(self) - """Entry point for authorization handlers that control access to specific resources. - - The on class provides a flexible way to define authorization rules for different - resources and actions in your application. It supports three main usage patterns: - - 1. Global handlers that run for all resources and actions - 2. Resource-specific handlers that run for all actions on a resource - 3. Resource and action specific handlers for fine-grained control - - Each handler must be an async function that accepts two parameters: - - ctx (AuthContext): Contains request context and authenticated user info - - value: The data being authorized (type varies by endpoint) - - The handler should return one of: - - - None or True: Accept the request - - False: Reject with 403 error - - FilterType: Apply filtering rules to the response - - ???+ example "Examples" - Global handler for all requests: - ```python - @auth.on - async def reject_unhandled_requests(ctx: AuthContext, value: Any) -> None: - print(f"Request to {ctx.path} by {ctx.user.identity}") - return False - ``` - - Resource-specific handler. This would take precedence over the global handler - for all actions on the `threads` resource: - ```python - @auth.on.threads - async def check_thread_access(ctx: AuthContext, value: Any) -> bool: - # Allow access only to threads created by the user - return value.get("created_by") == ctx.user.identity - ``` - - Resource and action specific handler: - ```python - @auth.on.threads.delete - async def prevent_thread_deletion(ctx: AuthContext, value: Any) -> bool: - # Only admins can delete threads - return "admin" in ctx.user.permissions - ``` - - Multiple resources or actions: - ```python - @auth.on(resources=["threads", "runs"], actions=["create", "update"]) - async def rate_limit_writes(ctx: AuthContext, value: Any) -> bool: - # Implement rate limiting for write operations - return await check_rate_limit(ctx.user.identity) - ``` - - Auth for the `store` resource is a bit different since its structure is developer defined. - You typically want to enforce user creds in the namespace. Y - ```python - @auth.on.store - async def check_store_access(ctx: AuthContext, value: Auth.types.on) -> bool: - # Assuming you structure your store like (store.aput((user_id, application_context), key, value)) - assert value["namespace"][0] == ctx.user.identity - ``` - """ - # These are accessed by the API. Changes to their names or types is - # will be considered a breaking change. - self._handlers: dict[tuple[str, str], list[types.Handler]] = {} - self._global_handlers: list[types.Handler] = [] - self._authenticate_handler: typing.Optional[types.Authenticator] = None - self._handler_cache: dict[tuple[str, str], types.Handler] = {} - - def authenticate(self, fn: AH) -> AH: - """Register an authentication handler function. - - The authentication handler is responsible for verifying credentials - and returning user scopes. It can accept any of the following parameters - by name: - - - request (Request): The raw ASGI request object - - body (dict): The parsed request body - - path (str): The request path, e.g., "/threads/abcd-1234-abcd-1234/runs/abcd-1234-abcd-1234/stream" - - method (str): The HTTP method, e.g., "GET" - - path_params (dict[str, str]): URL path parameters, e.g., {"thread_id": "abcd-1234-abcd-1234", "run_id": "abcd-1234-abcd-1234"} - - query_params (dict[str, str]): URL query parameters, e.g., {"stream": "true"} - - headers (dict[bytes, bytes]): Request headers - - authorization (str | None): The Authorization header value (e.g., "Bearer ") - - Args: - fn (Callable): The authentication handler function to register. - Must return a representation of the user. This could be a: - - string (the user id) - - dict containing {"identity": str, "permissions": list[str]} - - or an object with identity and permissions properties - Permissions can be optionally used by your handlers downstream. - - Returns: - The registered handler function. - - Raises: - ValueError: If an authentication handler is already registered. - - ???+ example "Examples" - Basic token authentication: - ```python - @auth.authenticate - async def authenticate(authorization: str) -> str: - user_id = verify_token(authorization) - return user_id - ``` - - Accept the full request context: - ```python - @auth.authenticate - async def authenticate( - method: str, - path: str, - headers: dict[str, bytes] - ) -> str: - user = await verify_request(method, path, headers) - return user - ``` - - Return user name and permissions: - ```python - @auth.authenticate - async def authenticate( - method: str, - path: str, - headers: dict[str, bytes] - ) -> Auth.types.MinimalUserDict: - permissions, user = await verify_request(method, path, headers) - # Permissions could be things like ["runs:read", "runs:write", "threads:read", "threads:write"] - return { - "identity": user["id"], - "permissions": permissions, - "display_name": user["name"], - } - ``` - """ - if self._authenticate_handler is not None: - raise ValueError( - "Authentication handler already set as {self._authenticate_handler}." - ) - self._authenticate_handler = fn - return fn - - -## Helper types & utilities - -V = typing.TypeVar("V", contravariant=True) - - -class _ActionHandler(typing.Protocol[V]): - async def __call__( - self, *, ctx: types.AuthContext, value: V - ) -> types.HandlerResult: ... - - -T = typing.TypeVar("T", covariant=True) - - -class _ResourceActionOn(typing.Generic[T]): - def __init__( - self, - auth: Auth, - resource: typing.Literal["threads", "crons", "assistants"], - action: typing.Literal[ - "create", "read", "update", "delete", "search", "create_run" - ], - value: type[T], - ) -> None: - self.auth = auth - self.resource = resource - self.action = action - self.value = value - - def __call__(self, fn: _ActionHandler[T]) -> _ActionHandler[T]: - _validate_handler(fn) - _register_handler(self.auth, self.resource, self.action, fn) - return fn - - -VCreate = typing.TypeVar("VCreate", covariant=True) -VUpdate = typing.TypeVar("VUpdate", covariant=True) -VRead = typing.TypeVar("VRead", covariant=True) -VDelete = typing.TypeVar("VDelete", covariant=True) -VSearch = typing.TypeVar("VSearch", covariant=True) - - -class _ResourceOn(typing.Generic[VCreate, VRead, VUpdate, VDelete, VSearch]): - """ - Generic base class for resource-specific handlers. - """ - - value: type[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]] - - Create: type[VCreate] - Read: type[VRead] - Update: type[VUpdate] - Delete: type[VDelete] - Search: type[VSearch] - - def __init__( - self, - auth: Auth, - resource: typing.Literal["threads", "crons", "assistants"], - ) -> None: - self.auth = auth - self.resource = resource - self.create: _ResourceActionOn[VCreate] = _ResourceActionOn( - auth, resource, "create", self.Create - ) - self.read: _ResourceActionOn[VRead] = _ResourceActionOn( - auth, resource, "read", self.Read - ) - self.update: _ResourceActionOn[VUpdate] = _ResourceActionOn( - auth, resource, "update", self.Update - ) - self.delete: _ResourceActionOn[VDelete] = _ResourceActionOn( - auth, resource, "delete", self.Delete - ) - self.search: _ResourceActionOn[VSearch] = _ResourceActionOn( - auth, resource, "search", self.Search - ) - - @typing.overload - def __call__( - self, - fn: typing.Union[ - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - _ActionHandler[dict[str, typing.Any]], - ], - ) -> _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]]: ... - - @typing.overload - def __call__( - self, - *, - resources: typing.Union[str, Sequence[str]], - actions: typing.Optional[typing.Union[str, Sequence[str]]] = None, - ) -> Callable[ - [_ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]]], - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - ]: ... - - def __call__( - self, - fn: typing.Union[ - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - _ActionHandler[dict[str, typing.Any]], - None, - ] = None, - *, - resources: typing.Union[str, Sequence[str], None] = None, - actions: typing.Optional[typing.Union[str, Sequence[str]]] = None, - ) -> typing.Union[ - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - Callable[ - [_ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]]], - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - ], - ]: - if fn is not None: - _validate_handler(fn) - return typing.cast( - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - _register_handler(self.auth, self.resource, "*", fn), - ) - - def decorator( - handler: _ActionHandler[ - typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch] - ], - ) -> _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]]: - _validate_handler(handler) - return typing.cast( - _ActionHandler[typing.Union[VCreate, VUpdate, VRead, VDelete, VSearch]], - _register_handler(self.auth, self.resource, "*", handler), - ) - - return decorator - - -class _AssistantsOn( - _ResourceOn[ - types.AssistantsCreate, - types.AssistantsRead, - types.AssistantsUpdate, - types.AssistantsDelete, - types.AssistantsSearch, - ] -): - value = typing.Union[ - types.AssistantsCreate, - types.AssistantsRead, - types.AssistantsUpdate, - types.AssistantsDelete, - types.AssistantsSearch, - ] - Create = types.AssistantsCreate - Read = types.AssistantsRead - Update = types.AssistantsUpdate - Delete = types.AssistantsDelete - Search = types.AssistantsSearch - - -class _ThreadsOn( - _ResourceOn[ - types.ThreadsCreate, - types.ThreadsRead, - types.ThreadsUpdate, - types.ThreadsDelete, - types.ThreadsSearch, - ] -): - value = typing.Union[ - type[types.ThreadsCreate], - type[types.ThreadsRead], - type[types.ThreadsUpdate], - type[types.ThreadsDelete], - type[types.ThreadsSearch], - type[types.RunsCreate], - ] - Create = types.ThreadsCreate - Read = types.ThreadsRead - Update = types.ThreadsUpdate - Delete = types.ThreadsDelete - Search = types.ThreadsSearch - CreateRun = types.RunsCreate - - def __init__( - self, - auth: Auth, - resource: typing.Literal["threads", "crons", "assistants"], - ) -> None: - super().__init__(auth, resource) - self.create_run: _ResourceActionOn[types.RunsCreate] = _ResourceActionOn( - auth, resource, "create_run", self.CreateRun - ) - - -class _CronsOn( - _ResourceOn[ - types.CronsCreate, - types.CronsRead, - types.CronsUpdate, - types.CronsDelete, - types.CronsSearch, - ] -): - value = type[ - typing.Union[ - types.CronsCreate, - types.CronsRead, - types.CronsUpdate, - types.CronsDelete, - types.CronsSearch, - ] - ] - - Create = types.CronsCreate - Read = types.CronsRead - Update = types.CronsUpdate - Delete = types.CronsDelete - Search = types.CronsSearch - - -class _StoreOn: - def __init__(self, auth: Auth) -> None: - self._auth = auth - - @typing.overload - def __call__( - self, - *, - actions: typing.Optional[ - typing.Union[ - typing.Literal["put", "get", "search", "list_namespaces", "delete"], - Sequence[ - typing.Literal["put", "get", "search", "list_namespaces", "delete"] - ], - ] - ] = None, - ) -> Callable[[AHO], AHO]: ... - - @typing.overload - def __call__(self, fn: AHO) -> AHO: ... - - def __call__( - self, - fn: typing.Optional[AHO] = None, - *, - actions: typing.Optional[ - typing.Union[ - typing.Literal["put", "get", "search", "list_namespaces", "delete"], - Sequence[ - typing.Literal["put", "get", "search", "list_namespaces", "delete"] - ], - ] - ] = None, - ) -> typing.Union[AHO, Callable[[AHO], AHO]]: - """Register a handler for specific resources and actions. - - Can be used as a decorator or with explicit resource/action parameters: - - @auth.on.store - async def handler(): ... # Handle all store ops - - @auth.on.store(actions=("put", "get", "search", "delete")) - async def handler(): ... # Handle specific store ops - - @auth.on.store.put - async def handler(): ... # Handle store.put ops - """ - if fn is not None: - # Used as a plain decorator - _register_handler(self._auth, "store", None, fn) - return fn - - # Used with parameters, return a decorator - def decorator( - handler: AHO, - ) -> AHO: - if isinstance(actions, str): - action_list = [actions] - else: - action_list = list(actions) if actions is not None else ["*"] - for action in action_list: - _register_handler(self._auth, "store", action, handler) - return handler - - return decorator - - -AHO = typing.TypeVar("AHO", bound=_ActionHandler[dict[str, typing.Any]]) - - -class _On: - """Entry point for authorization handlers that control access to specific resources. - - The _On class provides a flexible way to define authorization rules for different resources - and actions in your application. It supports three main usage patterns: - - 1. Global handlers that run for all resources and actions - 2. Resource-specific handlers that run for all actions on a resource - 3. Resource and action specific handlers for fine-grained control - - Each handler must be an async function that accepts two parameters: - - ctx (AuthContext): Contains request context and authenticated user info - - value: The data being authorized (type varies by endpoint) - - The handler should return one of: - - None or True: Accept the request - - False: Reject with 403 error - - FilterType: Apply filtering rules to the response - - ???+ example "Examples" - - Global handler for all requests: - ```python - @auth.on - async def log_all_requests(ctx: AuthContext, value: Any) -> None: - print(f"Request to {ctx.path} by {ctx.user.identity}") - return True - ``` - - Resource-specific handler: - ```python - @auth.on.threads - async def check_thread_access(ctx: AuthContext, value: Any) -> bool: - # Allow access only to threads created by the user - return value.get("created_by") == ctx.user.identity - ``` - - Resource and action specific handler: - ```python - @auth.on.threads.delete - async def prevent_thread_deletion(ctx: AuthContext, value: Any) -> bool: - # Only admins can delete threads - return "admin" in ctx.user.permissions - ``` - - Multiple resources or actions: - ```python - @auth.on(resources=["threads", "runs"], actions=["create", "update"]) - async def rate_limit_writes(ctx: AuthContext, value: Any) -> bool: - # Implement rate limiting for write operations - return await check_rate_limit(ctx.user.identity) - ``` - """ - - __slots__ = ( - "_auth", - "assistants", - "threads", - "runs", - "crons", - "store", - "value", - ) - - def __init__(self, auth: Auth) -> None: - self._auth = auth - self.assistants = _AssistantsOn(auth, "assistants") - self.threads = _ThreadsOn(auth, "threads") - self.crons = _CronsOn(auth, "crons") - self.store = _StoreOn(auth) - self.value = dict[str, typing.Any] - - @typing.overload - def __call__( - self, - *, - resources: typing.Union[str, Sequence[str]], - actions: typing.Optional[typing.Union[str, Sequence[str]]] = None, - ) -> Callable[[AHO], AHO]: ... - - @typing.overload - def __call__(self, fn: AHO) -> AHO: ... - - def __call__( - self, - fn: typing.Optional[AHO] = None, - *, - resources: typing.Union[str, Sequence[str], None] = None, - actions: typing.Optional[typing.Union[str, Sequence[str]]] = None, - ) -> typing.Union[AHO, Callable[[AHO], AHO]]: - """Register a handler for specific resources and actions. - - Can be used as a decorator or with explicit resource/action parameters: - - @auth.on - async def handler(): ... # Global handler - - @auth.on(resources="threads") - async def handler(): ... # types.Handler for all thread actions - - @auth.on(resources="threads", actions="create") - async def handler(): ... # types.Handler for thread creation - """ - if fn is not None: - # Used as a plain decorator - _register_handler(self._auth, None, None, fn) - return fn - - # Used with parameters, return a decorator - def decorator( - handler: AHO, - ) -> AHO: - if isinstance(resources, str): - resource_list = [resources] - else: - resource_list = list(resources) if resources is not None else ["*"] - - if isinstance(actions, str): - action_list = [actions] - else: - action_list = list(actions) if actions is not None else ["*"] - for resource in resource_list: - for action in action_list: - _register_handler(self._auth, resource, action, handler) - return handler - - return decorator - - -def _register_handler( - auth: Auth, - resource: typing.Optional[str], - action: typing.Optional[str], - fn: types.Handler, -) -> types.Handler: - _validate_handler(fn) - resource = resource or "*" - action = action or "*" - if resource == "*" and action == "*": - if auth._global_handlers: - raise ValueError("Global handler already set.") - auth._global_handlers.append(fn) - else: - r = resource if resource is not None else "*" - a = action if action is not None else "*" - if (r, a) in auth._handlers: - raise ValueError(f"types.Handler already set for {r}, {a}.") - auth._handlers[(r, a)] = [fn] - return fn - - -def _validate_handler(fn: Callable[..., typing.Any]) -> None: - """Validates that an auth handler function meets the required signature. - - Auth handlers must: - 1. Be async functions - 2. Accept a ctx parameter of type AuthContext - 3. Accept a value parameter for the data being authorized - """ - if not inspect.iscoroutinefunction(fn): - raise ValueError( - f"Auth handler '{fn.__name__}' must be an async function. " - "Add 'async' before 'def' to make it asynchronous and ensure" - " any IO operations are non-blocking." - ) - - sig = inspect.signature(fn) - if "ctx" not in sig.parameters: - raise ValueError( - f"Auth handler '{fn.__name__}' must have a 'ctx: AuthContext' parameter. " - "Update the function signature to include this required parameter." - ) - if "value" not in sig.parameters: - raise ValueError( - f"Auth handler '{fn.__name__}' must have a 'value' parameter. " - " The value contains the mutable data being sent to the endpoint." - "Update the function signature to include this required parameter." - ) - - -__all__ = ["Auth", "types", "exceptions"] diff --git a/libs/sdk-py/langgraph_sdk/auth/exceptions.py b/libs/sdk-py/langgraph_sdk/auth/exceptions.py deleted file mode 100644 index cd3019259..000000000 --- a/libs/sdk-py/langgraph_sdk/auth/exceptions.py +++ /dev/null @@ -1,58 +0,0 @@ -"""Exceptions used in the auth system.""" - -import http -import typing - - -class HTTPException(Exception): - """HTTP exception that you can raise to return a specific HTTP error response. - - Since this is defined in the auth module, we default to a 401 status code. - - Args: - status_code (int, optional): HTTP status code for the error. Defaults to 401 "Unauthorized". - detail (str | None, optional): Detailed error message. If None, uses a default - message based on the status code. - headers (typing.Mapping[str, str] | None, optional): Additional HTTP headers to - include in the error response. - - Example: - Default: - ```python - raise HTTPException() - # HTTPException(status_code=401, detail='Unauthorized') - ``` - - Add headers: - ```python - raise HTTPException(headers={"X-Custom-Header": "Custom Value"}) - # HTTPException(status_code=401, detail='Unauthorized', headers={"WWW-Authenticate": "Bearer"}) - ``` - - Custom error: - ```python - raise HTTPException(status_code=404, detail="Not found") - ``` - """ - - def __init__( - self, - status_code: int = 401, - detail: typing.Optional[str] = None, - headers: typing.Optional[typing.Mapping[str, str]] = None, - ) -> None: - if detail is None: - detail = http.HTTPStatus(status_code).phrase - self.status_code = status_code - self.detail = detail - self.headers = headers - - def __str__(self) -> str: - return f"{self.status_code}: {self.detail}" - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - return f"{class_name}(status_code={self.status_code!r}, detail={self.detail!r})" - - -__all__ = ["HTTPException"] diff --git a/libs/sdk-py/langgraph_sdk/auth/types.py b/libs/sdk-py/langgraph_sdk/auth/types.py deleted file mode 100644 index 4fccc800d..000000000 --- a/libs/sdk-py/langgraph_sdk/auth/types.py +++ /dev/null @@ -1,1050 +0,0 @@ -"""Authentication and authorization types for LangGraph. - -This module defines the core types used for authentication, authorization, and -request handling in LangGraph. It includes user protocols, authentication contexts, -and typed dictionaries for various API operations. - -Note: - All typing.TypedDict classes use total=False to make all fields typing.Optional by default. -""" - -import functools -import sys -import typing -from collections.abc import Awaitable, Callable, Sequence -from dataclasses import dataclass -from datetime import datetime -from uuid import UUID - -import typing_extensions - -RunStatus = typing.Literal["pending", "error", "success", "timeout", "interrupted"] -"""Status of a run execution. - -Values: - - pending: Run is queued or in progress - - error: Run failed with an error - - success: Run completed successfully - - timeout: Run exceeded time limit - - interrupted: Run was manually interrupted -""" - -MultitaskStrategy = typing.Literal["reject", "rollback", "interrupt", "enqueue"] -"""Strategy for handling multiple concurrent tasks. - -Values: - - reject: Reject new tasks while one is in progress - - rollback: Cancel current task and start new one - - interrupt: Interrupt current task and start new one - - enqueue: Queue new tasks to run after current one -""" - -OnConflictBehavior = typing.Literal["raise", "do_nothing"] -"""Behavior when encountering conflicts. - -Values: - - raise: Raise an exception on conflict - - do_nothing: Silently ignore conflicts -""" - -IfNotExists = typing.Literal["create", "reject"] -"""Behavior when an entity doesn't exist. - -Values: - - create: Create the entity - - reject: Reject the operation -""" - -FilterType = typing.Union[ - typing.Dict[ - str, typing.Union[str, typing.Dict[typing.Literal["$eq", "$contains"], str]] - ], - typing.Dict[str, str], -] -"""Response type for authorization handlers. - -Supports exact matches and operators: - - Exact match shorthand: {"field": "value"} - - Exact match: {"field": {"$eq": "value"}} - - Contains: {"field": {"$contains": "value"}} - -???+ example "Examples" - Simple exact match filter for the resource owner: - ```python - filter = {"owner": "user-abcd123"} - ``` - - Explicit version of the exact match filter: - ```python - filter = {"owner": {"$eq": "user-abcd123"}} - ``` - - Containment: - ```python - filter = {"participants": {"$contains": "user-abcd123"}} - ``` - - Combining filters (treated as a logical `AND`): - ```python - filter = {"owner": "user-abcd123", "participants": {"$contains": "user-efgh456"}} - ``` -""" - -ThreadStatus = typing.Literal["idle", "busy", "interrupted", "error"] -"""Status of a thread. - -Values: - - idle: Thread is available for work - - busy: Thread is currently processing - - interrupted: Thread was interrupted - - error: Thread encountered an error -""" - -MetadataInput = typing.Dict[str, typing.Any] -"""Type for arbitrary metadata attached to entities. - -Allows storing custom key-value pairs with any entity. -Keys must be strings, values can be any JSON-serializable type. - -???+ example "Examples" - ```python - metadata = { - "created_by": "user123", - "priority": 1, - "tags": ["important", "urgent"] - } - ``` -""" - -HandlerResult = typing.Union[None, bool, FilterType] -"""The result of a handler can be: - * None | True: accept the request. - * False: reject the request with a 403 error - * FilterType: filter to apply -""" - -Handler = Callable[..., Awaitable[HandlerResult]] - -T = typing.TypeVar("T") - - -def _slotify(fn: T) -> T: - if sys.version_info >= (3, 10): # noqa: UP036 - return functools.partial(fn, slots=True) # type: ignore - return fn - - -dataclass = _slotify(dataclass) - - -@typing.runtime_checkable -class MinimalUser(typing.Protocol): - """User objects must at least expose the identity property.""" - - @property - def identity(self) -> str: - """The unique identifier for the user. - - This could be a username, email, or any other unique identifier used - to distinguish between different users in the system. - """ - ... - - -class MinimalUserDict(typing.TypedDict, total=False): - """The dictionary representation of a user.""" - - identity: typing_extensions.Required[str] - """The required unique identifier for the user.""" - display_name: str - """The typing.Optional display name for the user.""" - is_authenticated: bool - """Whether the user is authenticated. Defaults to True.""" - permissions: Sequence[str] - """A list of permissions associated with the user. - - You can use these in your `@auth.on` authorization logic to determine - access permissions to different resources. - """ - - -@typing.runtime_checkable -class BaseUser(typing.Protocol): - """The base ASGI user protocol""" - - @property - def is_authenticated(self) -> bool: - """Whether the user is authenticated.""" - ... - - @property - def display_name(self) -> str: - """The display name of the user.""" - ... - - @property - def identity(self) -> str: - """The unique identifier for the user.""" - ... - - @property - def permissions(self) -> Sequence[str]: - """The permissions associated with the user.""" - ... - - -class StudioUser: - """A user object that's populated from authenticated requests from the LangGraph studio. - - Note: Studio auth can be disabled in your `langgraph.json` config. - - ```json - { - "auth": { - "disable_studio_auth": true - } - } - ``` - - You can use `isinstance` checks in your authorization handlers (`@auth.on`) to control access specifically - for developers accessing the instance from the LangGraph Studio UI. - - ???+ example "Examples" - ```python - @auth.on - async def allow_developers(ctx: Auth.types.AuthContext, value: Any) -> None: - if isinstance(ctx.user, Auth.types.StudioUser): - return None - ... - return False - ``` - """ - - __slots__ = ("username", "_is_authenticated", "_permissions") - - def __init__(self, username: str, is_authenticated: bool = False) -> None: - self.username = username - self._is_authenticated = is_authenticated - self._permissions = ["authenticated"] if is_authenticated else [] - - @property - def is_authenticated(self) -> bool: - return self._is_authenticated - - @property - def display_name(self) -> str: - return self.username - - @property - def identity(self) -> str: - return self.username - - @property - def permissions(self) -> Sequence[str]: - return self._permissions - - -Authenticator = Callable[ - ..., - Awaitable[ - typing.Union[ - MinimalUser, str, BaseUser, MinimalUserDict, typing.Mapping[str, typing.Any] - ], - ], -] -"""Type for authentication functions. - -An authenticator can return either: -1. A string (user_id) -2. A dict containing {"identity": str, "permissions": list[str]} -3. An object with identity and permissions properties - -Permissions can be used downstream by your authorization logic to determine -access permissions to different resources. - -The authenticate decorator will automatically inject any of the following parameters -by name if they are included in your function signature: - -Parameters: - request (Request): The raw ASGI request object - body (dict): The parsed request body - path (str): The request path - method (str): The HTTP method (GET, POST, etc.) - path_params (dict[str, str] | None): URL path parameters - query_params (dict[str, str] | None): URL query parameters - headers (dict[str, bytes] | None): Request headers - authorization (str | None): The Authorization header value (e.g. "Bearer ") - -???+ example "Examples" - Basic authentication with token: - ```python - from langgraph_sdk import Auth - - auth = Auth() - - @auth.authenticate - async def authenticate1(authorization: str) -> Auth.types.MinimalUserDict: - return await get_user(authorization) - ``` - - Authentication with multiple parameters: - ``` - @auth.authenticate - async def authenticate2( - method: str, - path: str, - headers: dict[str, bytes] - ) -> Auth.types.MinimalUserDict: - # Custom auth logic using method, path and headers - user = verify_request(method, path, headers) - return user - ``` - - Accepting the raw ASGI request: - ```python - MY_SECRET = "my-secret-key" - @auth.authenticate - async def get_current_user(request: Request) -> Auth.types.MinimalUserDict: - try: - token = (request.headers.get("authorization") or "").split(" ", 1)[1] - payload = jwt.decode(token, MY_SECRET, algorithms=["HS256"]) - except (IndexError, InvalidTokenError): - raise HTTPException( - status_code=401, - detail="Invalid token", - headers={"WWW-Authenticate": "Bearer"}, - ) - - async with httpx.AsyncClient() as client: - response = await client.get( - f"https://api.myauth-provider.com/auth/v1/user", - headers={"Authorization": f"Bearer {MY_SECRET}"} - ) - if response.status_code != 200: - raise HTTPException(status_code=401, detail="User not found") - - user_data = response.json() - return { - "identity": user_data["id"], - "display_name": user_data.get("name"), - "permissions": user_data.get("permissions", []), - "is_authenticated": True, - } - ``` -""" - - -@dataclass -class BaseAuthContext: - """Base class for authentication context. - - Provides the fundamental authentication information needed for - authorization decisions. - """ - - permissions: Sequence[str] - """The permissions granted to the authenticated user.""" - - user: BaseUser - """The authenticated user.""" - - -@typing.final -@dataclass -class AuthContext(BaseAuthContext): - """Complete authentication context with resource and action information. - - Extends BaseAuthContext with specific resource and action being accessed, - allowing for fine-grained access control decisions. - """ - - resource: typing.Literal["runs", "threads", "crons", "assistants", "store"] - """The resource being accessed.""" - - action: typing.Literal[ - "create", - "read", - "update", - "delete", - "search", - "create_run", - "put", - "get", - "list_namespaces", - ] - """The action being performed on the resource. - - Most resources support the following actions: - - create: Create a new resource - - read: Read information about a resource - - update: Update an existing resource - - delete: Delete a resource - - search: Search for resources - - The store supports the following actions: - - put: Add or update a document in the store - - get: Get a document from the store - - list_namespaces: List the namespaces in the store - """ - - -class ThreadsCreate(typing.TypedDict, total=False): - """Parameters for creating a new thread. - - ???+ example "Examples" - ```python - create_params = { - "thread_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "metadata": {"owner": "user123"}, - "if_exists": "do_nothing" - } - ``` - """ - - thread_id: UUID - """Unique identifier for the thread.""" - - metadata: MetadataInput - """typing.Optional metadata to attach to the thread.""" - - if_exists: OnConflictBehavior - """Behavior when a thread with the same ID already exists.""" - - -class ThreadsRead(typing.TypedDict, total=False): - """Parameters for reading thread state or run information. - - This type is used in three contexts: - 1. Reading thread, thread version, or thread state information: Only thread_id is provided - 2. Reading run information: Both thread_id and run_id are provided - """ - - thread_id: UUID - """Unique identifier for the thread.""" - - run_id: typing.Optional[UUID] - """Run ID to filter by. Only used when reading run information within a thread.""" - - -class ThreadsUpdate(typing.TypedDict, total=False): - """Parameters for updating a thread or run. - - Called for updates to a thread, thread version, or run - cancellation. - """ - - thread_id: UUID - """Unique identifier for the thread.""" - - metadata: MetadataInput - """typing.Optional metadata to update.""" - - action: typing.Optional[typing.Literal["interrupt", "rollback"]] - """typing.Optional action to perform on the thread.""" - - -class ThreadsDelete(typing.TypedDict, total=False): - """Parameters for deleting a thread. - - Called for deletes to a thread, thread version, or run - """ - - thread_id: UUID - """Unique identifier for the thread.""" - - run_id: typing.Optional[UUID] - """typing.Optional run ID to filter by.""" - - -class ThreadsSearch(typing.TypedDict, total=False): - """Parameters for searching threads. - - Called for searches to threads or runs. - """ - - metadata: MetadataInput - """typing.Optional metadata to filter by.""" - - values: MetadataInput - """typing.Optional values to filter by.""" - - status: typing.Optional[ThreadStatus] - """typing.Optional status to filter by.""" - - limit: int - """Maximum number of results to return.""" - - offset: int - """Offset for pagination.""" - - thread_id: typing.Optional[UUID] - """typing.Optional thread ID to filter by.""" - - -class RunsCreate(typing.TypedDict, total=False): - """Payload for creating a run. - - ???+ example "Examples" - ```python - create_params = { - "assistant_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "thread_id": UUID("123e4567-e89b-12d3-a456-426614174001"), - "run_id": UUID("123e4567-e89b-12d3-a456-426614174002"), - "status": "pending", - "metadata": {"owner": "user123"}, - "prevent_insert_if_inflight": True, - "multitask_strategy": "reject", - "if_not_exists": "create", - "after_seconds": 10, - "kwargs": {"key": "value"}, - "action": "interrupt" - } - ``` - """ - - assistant_id: typing.Optional[UUID] - """typing.Optional assistant ID to use for this run.""" - - thread_id: typing.Optional[UUID] - """typing.Optional thread ID to use for this run.""" - - run_id: typing.Optional[UUID] - """typing.Optional run ID to use for this run.""" - - status: typing.Optional[RunStatus] - """typing.Optional status for this run.""" - - metadata: MetadataInput - """typing.Optional metadata for the run.""" - - prevent_insert_if_inflight: bool - """Prevent inserting a new run if one is already in flight.""" - - multitask_strategy: MultitaskStrategy - """Multitask strategy for this run.""" - - if_not_exists: IfNotExists - """IfNotExists for this run.""" - - after_seconds: int - """Number of seconds to wait before creating the run.""" - - kwargs: typing.Dict[str, typing.Any] - """Keyword arguments to pass to the run.""" - - action: typing.Optional[typing.Literal["interrupt", "rollback"]] - """Action to take if updating an existing run.""" - - -class AssistantsCreate(typing.TypedDict, total=False): - """Payload for creating an assistant. - - ???+ example "Examples" - ```python - create_params = { - "assistant_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "graph_id": "graph123", - "config": {"key": "value"}, - "metadata": {"owner": "user123"}, - "if_exists": "do_nothing", - "name": "Assistant 1" - } - ``` - """ - - assistant_id: UUID - """Unique identifier for the assistant.""" - - graph_id: str - """Graph ID to use for this assistant.""" - - config: typing.Optional[typing.Union[typing.Dict[str, typing.Any], typing.Any]] - """typing.Optional configuration for the assistant.""" - - metadata: MetadataInput - """typing.Optional metadata to attach to the assistant.""" - - if_exists: OnConflictBehavior - """Behavior when an assistant with the same ID already exists.""" - - name: str - """Name of the assistant.""" - - -class AssistantsRead(typing.TypedDict, total=False): - """Payload for reading an assistant. - - ???+ example "Examples" - ```python - read_params = { - "assistant_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "metadata": {"owner": "user123"} - } - ``` - """ - - assistant_id: UUID - """Unique identifier for the assistant.""" - - metadata: MetadataInput - """typing.Optional metadata to filter by.""" - - -class AssistantsUpdate(typing.TypedDict, total=False): - """Payload for updating an assistant. - - ???+ example "Examples" - ```python - update_params = { - "assistant_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "graph_id": "graph123", - "config": {"key": "value"}, - "metadata": {"owner": "user123"}, - "name": "Assistant 1", - "version": 1 - } - ``` - """ - - assistant_id: UUID - """Unique identifier for the assistant.""" - - graph_id: typing.Optional[str] - """typing.Optional graph ID to update.""" - - config: typing.Optional[typing.Union[typing.Dict[str, typing.Any], typing.Any]] - """typing.Optional configuration to update.""" - - metadata: MetadataInput - """typing.Optional metadata to update.""" - - name: typing.Optional[str] - """typing.Optional name to update.""" - - version: typing.Optional[int] - """typing.Optional version to update.""" - - -class AssistantsDelete(typing.TypedDict): - """Payload for deleting an assistant. - - ???+ example "Examples" - ```python - delete_params = { - "assistant_id": UUID("123e4567-e89b-12d3-a456-426614174000") - } - ``` - """ - - assistant_id: UUID - """Unique identifier for the assistant.""" - - -class AssistantsSearch(typing.TypedDict): - """Payload for searching assistants. - - ???+ example "Examples" - ```python - search_params = { - "graph_id": "graph123", - "metadata": {"owner": "user123"}, - "limit": 10, - "offset": 0 - } - ``` - """ - - graph_id: typing.Optional[str] - """typing.Optional graph ID to filter by.""" - - metadata: MetadataInput - """typing.Optional metadata to filter by.""" - - limit: int - """Maximum number of results to return.""" - - offset: int - """Offset for pagination.""" - - -class CronsCreate(typing.TypedDict, total=False): - """Payload for creating a cron job. - - ???+ example "Examples" - ```python - create_params = { - "payload": {"key": "value"}, - "schedule": "0 0 * * *", - "cron_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "thread_id": UUID("123e4567-e89b-12d3-a456-426614174001"), - "user_id": "user123", - "end_time": datetime(2024, 3, 16, 10, 0, 0) - } - ``` - """ - - payload: typing.Dict[str, typing.Any] - """Payload for the cron job.""" - - schedule: str - """Schedule for the cron job.""" - - cron_id: typing.Optional[UUID] - """typing.Optional unique identifier for the cron job.""" - - thread_id: typing.Optional[UUID] - """typing.Optional thread ID to use for this cron job.""" - - user_id: typing.Optional[str] - """typing.Optional user ID to use for this cron job.""" - - end_time: typing.Optional[datetime] - """typing.Optional end time for the cron job.""" - - -class CronsDelete(typing.TypedDict): - """Payload for deleting a cron job. - - ???+ example "Examples" - ```python - delete_params = { - "cron_id": UUID("123e4567-e89b-12d3-a456-426614174000") - } - ``` - """ - - cron_id: UUID - """Unique identifier for the cron job.""" - - -class CronsRead(typing.TypedDict): - """Payload for reading a cron job. - - ???+ example "Examples" - ```python - read_params = { - "cron_id": UUID("123e4567-e89b-12d3-a456-426614174000") - } - ``` - """ - - cron_id: UUID - """Unique identifier for the cron job.""" - - -class CronsUpdate(typing.TypedDict, total=False): - """Payload for updating a cron job. - - ???+ example "Examples" - ```python - update_params = { - "cron_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "payload": {"key": "value"}, - "schedule": "0 0 * * *" - } - ``` - """ - - cron_id: UUID - """Unique identifier for the cron job.""" - - payload: typing.Optional[typing.Dict[str, typing.Any]] - """typing.Optional payload to update.""" - - schedule: typing.Optional[str] - """typing.Optional schedule to update.""" - - -class CronsSearch(typing.TypedDict, total=False): - """Payload for searching cron jobs. - - ???+ example "Examples" - ```python - search_params = { - "assistant_id": UUID("123e4567-e89b-12d3-a456-426614174000"), - "thread_id": UUID("123e4567-e89b-12d3-a456-426614174001"), - "limit": 10, - "offset": 0 - } - ``` - """ - - assistant_id: typing.Optional[UUID] - """typing.Optional assistant ID to filter by.""" - - thread_id: typing.Optional[UUID] - """typing.Optional thread ID to filter by.""" - - limit: int - """Maximum number of results to return.""" - - offset: int - """Offset for pagination.""" - - -class StoreGet(typing.TypedDict): - """Operation to retrieve a specific item by its namespace and key.""" - - namespace: tuple[str, ...] - """Hierarchical path that uniquely identifies the item's location.""" - - key: str - """Unique identifier for the item within its specific namespace.""" - - -class StoreSearch(typing.TypedDict): - """Operation to search for items within a specified namespace hierarchy.""" - - namespace: tuple[str, ...] - """Prefix filter for defining the search scope.""" - - filter: typing.Optional[dict[str, typing.Any]] - """Key-value pairs for filtering results based on exact matches or comparison operators.""" - - limit: int - """Maximum number of items to return in the search results.""" - - offset: int - """Number of matching items to skip for pagination.""" - - query: typing.Optional[str] - """Naturalj language search query for semantic search capabilities.""" - - -class StoreListNamespaces(typing.TypedDict): - """Operation to list and filter namespaces in the store.""" - - namespace: typing.Optional[tuple[str, ...]] - """Prefix filter namespaces.""" - - suffix: typing.Optional[tuple[str, ...]] - """Optional conditions for filtering namespaces.""" - - max_depth: typing.Optional[int] - """Maximum depth of namespace hierarchy to return. - - Note: - Namespaces deeper than this level will be truncated. - """ - - limit: int - """Maximum number of namespaces to return.""" - - offset: int - """Number of namespaces to skip for pagination.""" - - -class StorePut(typing.TypedDict): - """Operation to store, update, or delete an item in the store.""" - - namespace: tuple[str, ...] - """Hierarchical path that identifies the location of the item.""" - - key: str - """Unique identifier for the item within its namespace.""" - - value: typing.Optional[dict[str, typing.Any]] - """The data to store, or None to mark the item for deletion.""" - - index: typing.Optional[typing.Union[typing.Literal[False], list[str]]] - """Optional index configuration for full-text search.""" - - -class StoreDelete(typing.TypedDict): - """Operation to delete an item from the store.""" - - namespace: tuple[str, ...] - """Hierarchical path that uniquely identifies the item's location.""" - - key: str - """Unique identifier for the item within its specific namespace.""" - - -class on: - """Namespace for type definitions of different API operations. - - This class organizes type definitions for create, read, update, delete, - and search operations across different resources (threads, assistants, crons). - - ???+ note "Usage" - ```python - from langgraph_sdk import Auth - - auth = Auth() - - @auth.on - def handle_all(params: Auth.on.value): - raise Exception("Not authorized") - - @auth.on.threads.create - def handle_thread_create(params: Auth.on.threads.create.value): - # Handle thread creation - pass - - @auth.on.assistants.search - def handle_assistant_search(params: Auth.on.assistants.search.value): - # Handle assistant search - pass - ``` - """ - - value = typing.Dict[str, typing.Any] - - class threads: - """Types for thread-related operations.""" - - value = typing.Union[ - ThreadsCreate, ThreadsRead, ThreadsUpdate, ThreadsDelete, ThreadsSearch - ] - - class create: - """Type for thread creation parameters.""" - - value = ThreadsCreate - - class create_run: - """Type for creating or streaming a run.""" - - value = RunsCreate - - class read: - """Type for thread read parameters.""" - - value = ThreadsRead - - class update: - """Type for thread update parameters.""" - - value = ThreadsUpdate - - class delete: - """Type for thread deletion parameters.""" - - value = ThreadsDelete - - class search: - """Type for thread search parameters.""" - - value = ThreadsSearch - - class assistants: - """Types for assistant-related operations.""" - - value = typing.Union[ - AssistantsCreate, - AssistantsRead, - AssistantsUpdate, - AssistantsDelete, - AssistantsSearch, - ] - - class create: - """Type for assistant creation parameters.""" - - value = AssistantsCreate - - class read: - """Type for assistant read parameters.""" - - value = AssistantsRead - - class update: - """Type for assistant update parameters.""" - - value = AssistantsUpdate - - class delete: - """Type for assistant deletion parameters.""" - - value = AssistantsDelete - - class search: - """Type for assistant search parameters.""" - - value = AssistantsSearch - - class crons: - """Types for cron-related operations.""" - - value = typing.Union[ - CronsCreate, CronsRead, CronsUpdate, CronsDelete, CronsSearch - ] - - class create: - """Type for cron creation parameters.""" - - value = CronsCreate - - class read: - """Type for cron read parameters.""" - - value = CronsRead - - class update: - """Type for cron update parameters.""" - - value = CronsUpdate - - class delete: - """Type for cron deletion parameters.""" - - value = CronsDelete - - class search: - """Type for cron search parameters.""" - - value = CronsSearch - - class store: - """Types for store-related operations.""" - - value = typing.Union[ - StoreGet, StoreSearch, StoreListNamespaces, StorePut, StoreDelete - ] - - class put: - """Type for store put parameters.""" - - value = StorePut - - class get: - """Type for store get parameters.""" - - value = StoreGet - - class search: - """Type for store search parameters.""" - - value = StoreSearch - - class delete: - """Type for store delete parameters.""" - - value = StoreDelete - - class list_namespaces: - """Type for store list namespaces parameters.""" - - value = StoreListNamespaces - - -__all__ = [ - "on", - "MetadataInput", - "RunsCreate", - "ThreadsCreate", - "ThreadsRead", - "ThreadsUpdate", - "ThreadsDelete", - "ThreadsSearch", - "AssistantsCreate", - "AssistantsRead", - "AssistantsUpdate", - "AssistantsDelete", - "AssistantsSearch", - "StoreGet", - "StoreSearch", - "StoreListNamespaces", - "StorePut", - "StoreDelete", -] diff --git a/libs/sdk-py/langgraph_sdk/client.py b/libs/sdk-py/langgraph_sdk/client.py deleted file mode 100644 index 27c3f6f94..000000000 --- a/libs/sdk-py/langgraph_sdk/client.py +++ /dev/null @@ -1,4461 +0,0 @@ -"""The LangGraph client implementations connect to the LangGraph API. - -This module provides both asynchronous (LangGraphClient) and synchronous (SyncLanggraphClient) -clients to interacting with the LangGraph API's core resources such as -Assistants, Threads, Runs, and Cron jobs, as well as its persistent -document Store. -""" - -from __future__ import annotations - -import asyncio -import logging -import os -import sys -from typing import ( - Any, - AsyncIterator, - Dict, - Iterator, - List, - Literal, - Optional, - Sequence, - Union, - overload, -) - -import httpx -import orjson -from httpx._types import QueryParamTypes - -import langgraph_sdk -from langgraph_sdk.schema import ( - All, - Assistant, - AssistantVersion, - CancelAction, - Checkpoint, - Command, - Config, - Cron, - DisconnectMode, - GraphSchema, - IfNotExists, - Item, - Json, - ListNamespaceResponse, - MultitaskStrategy, - OnCompletionBehavior, - OnConflictBehavior, - Run, - RunCreate, - RunStatus, - SearchItemsResponse, - StreamMode, - StreamPart, - Subgraphs, - Thread, - ThreadState, - ThreadStatus, - ThreadUpdateStateResponse, -) -from langgraph_sdk.sse import SSEDecoder, aiter_lines_raw, iter_lines_raw - -logger = logging.getLogger(__name__) - - -RESERVED_HEADERS = ("x-api-key",) - - -def _get_api_key(api_key: Optional[str] = None) -> Optional[str]: - """Get the API key from the environment. - Precedence: - 1. explicit argument - 2. LANGGRAPH_API_KEY - 3. LANGSMITH_API_KEY - 4. LANGCHAIN_API_KEY - """ - if api_key: - return api_key - for prefix in ["LANGGRAPH", "LANGSMITH", "LANGCHAIN"]: - if env := os.getenv(f"{prefix}_API_KEY"): - return env.strip().strip('"').strip("'") - return None # type: ignore - - -def get_headers( - api_key: Optional[str], custom_headers: Optional[dict[str, str]] -) -> dict[str, str]: - """Combine api_key and custom user-provided headers.""" - custom_headers = custom_headers or {} - for header in RESERVED_HEADERS: - if header in custom_headers: - raise ValueError(f"Cannot set reserved header '{header}'") - - headers = { - "User-Agent": f"langgraph-sdk-py/{langgraph_sdk.__version__}", - **custom_headers, - } - api_key = _get_api_key(api_key) - if api_key: - headers["x-api-key"] = api_key - - return headers - - -def orjson_default(obj: Any) -> Any: - if hasattr(obj, "model_dump") and callable(obj.model_dump): - return obj.model_dump() - elif hasattr(obj, "dict") and callable(obj.dict): - return obj.dict() - elif isinstance(obj, (set, frozenset)): - return list(obj) - else: - raise TypeError(f"Object of type {type(obj)} is not JSON serializable") - - -def get_client( - *, - url: Optional[str] = None, - api_key: Optional[str] = None, - headers: Optional[dict[str, str]] = None, -) -> LangGraphClient: - """Get a LangGraphClient instance. - - Args: - url: The URL of the LangGraph API. - api_key: The API key. If not provided, it will be read from the environment. - Precedence: - 1. explicit argument - 2. LANGGRAPH_API_KEY - 3. LANGSMITH_API_KEY - 4. LANGCHAIN_API_KEY - headers: Optional custom headers - - Returns: - LangGraphClient: The top-level client for accessing AssistantsClient, - ThreadsClient, RunsClient, and CronClient. - - Example: - - from langgraph_sdk import get_client - - # get top-level LangGraphClient - client = get_client(url="http://localhost:8123") - - # example usage: client..() - assistants = await client.assistants.get(assistant_id="some_uuid") - """ - - transport: Optional[httpx.AsyncBaseTransport] = None - if url is None: - if os.environ.get("__LANGGRAPH_DEFER_LOOPBACK_TRANSPORT") == "true": - transport = httpx.ASGITransport(app=None, root_path="/noauth") - _registered_transports.append(transport) - url = "http://api" - else: - try: - from langgraph_api.server import app # type: ignore - - url = "http://api" - transport = httpx.ASGITransport(app, root_path="/noauth") - except Exception: - url = "http://localhost:8123" - - if transport is None: - transport = httpx.AsyncHTTPTransport(retries=5) - - client = httpx.AsyncClient( - base_url=url, - transport=transport, - timeout=httpx.Timeout(connect=5, read=300, write=300, pool=5), - headers=get_headers(api_key, headers), - ) - return LangGraphClient(client) - - -class LangGraphClient: - """Top-level client for LangGraph API. - - Attributes: - assistants: Manages versioned configuration for your graphs. - threads: Handles (potentially) multi-turn interactions, such as conversational threads. - runs: Controls individual invocations of the graph. - crons: Manages scheduled operations. - store: Interfaces with persistent, shared data storage. - """ - - def __init__(self, client: httpx.AsyncClient) -> None: - self.http = HttpClient(client) - self.assistants = AssistantsClient(self.http) - self.threads = ThreadsClient(self.http) - self.runs = RunsClient(self.http) - self.crons = CronClient(self.http) - self.store = StoreClient(self.http) - - -class HttpClient: - """Handle async requests to the LangGraph API. - - Adds additional error messaging & content handling above the - provided httpx client. - - Attributes: - client (httpx.AsyncClient): Underlying HTTPX async client. - """ - - def __init__(self, client: httpx.AsyncClient) -> None: - self.client = client - - async def get(self, path: str, *, params: Optional[QueryParamTypes] = None) -> Any: - """Send a GET request.""" - r = await self.client.get(path, params=params) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = (await r.aread()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return await adecode_json(r) - - async def post(self, path: str, *, json: Optional[dict]) -> Any: - """Send a POST request.""" - if json is not None: - headers, content = await aencode_json(json) - else: - headers, content = {}, b"" - r = await self.client.post(path, headers=headers, content=content) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = (await r.aread()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return await adecode_json(r) - - async def put(self, path: str, *, json: dict) -> Any: - """Send a PUT request.""" - headers, content = await aencode_json(json) - r = await self.client.put(path, headers=headers, content=content) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = (await r.aread()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return await adecode_json(r) - - async def patch(self, path: str, *, json: dict) -> Any: - """Send a PATCH request.""" - headers, content = await aencode_json(json) - r = await self.client.patch(path, headers=headers, content=content) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = (await r.aread()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return await adecode_json(r) - - async def delete(self, path: str, *, json: Optional[Any] = None) -> None: - """Send a DELETE request.""" - r = await self.client.request("DELETE", path, json=json) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = (await r.aread()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - - async def stream( - self, - path: str, - method: str, - *, - json: Optional[dict] = None, - params: Optional[QueryParamTypes] = None, - ) -> AsyncIterator[StreamPart]: - """Stream results using SSE.""" - headers, content = await aencode_json(json) - headers["Accept"] = "text/event-stream" - headers["Cache-Control"] = "no-store" - - async with self.client.stream( - method, path, headers=headers, content=content, params=params - ) as res: - # check status - try: - res.raise_for_status() - except httpx.HTTPStatusError as e: - body = (await res.aread()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - # check content type - content_type = res.headers.get("content-type", "").partition(";")[0] - if "text/event-stream" not in content_type: - raise httpx.TransportError( - "Expected response header Content-Type to contain 'text/event-stream', " - f"got {content_type!r}" - ) - # parse SSE - decoder = SSEDecoder() - async for line in aiter_lines_raw(res): - sse = decoder.decode(line=line.rstrip(b"\n")) - if sse is not None: - yield sse - - -async def aencode_json(json: Any) -> tuple[dict[str, str], bytes]: - if json is None: - return {}, None - body = await asyncio.get_running_loop().run_in_executor( - None, - orjson.dumps, - json, - orjson_default, - orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_NON_STR_KEYS, - ) - content_length = str(len(body)) - content_type = "application/json" - headers = {"Content-Length": content_length, "Content-Type": content_type} - return headers, body - - -async def adecode_json(r: httpx.Response) -> Any: - body = await r.aread() - return ( - await asyncio.get_running_loop().run_in_executor(None, orjson.loads, body) - if body - else None - ) - - -class AssistantsClient: - """Client for managing assistants in LangGraph. - - This class provides methods to interact with assistants, - which are versioned configurations of your graph. - - Example: - - client = get_client() - assistant = await client.assistants.get("assistant_id_123") - """ - - def __init__(self, http: HttpClient) -> None: - self.http = http - - async def get(self, assistant_id: str) -> Assistant: - """Get an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get. - - Returns: - Assistant: Assistant Object. - - Example Usage: - - assistant = await client.assistants.get( - assistant_id="my_assistant_id" - ) - print(assistant) - - ---------------------------------------------------- - - { - 'assistant_id': 'my_assistant_id', - 'graph_id': 'agent', - 'created_at': '2024-06-25T17:10:33.109781+00:00', - 'updated_at': '2024-06-25T17:10:33.109781+00:00', - 'config': {}, - 'metadata': {'created_by': 'system'} - } - - """ # noqa: E501 - return await self.http.get(f"/assistants/{assistant_id}") - - async def get_graph( - self, assistant_id: str, *, xray: Union[int, bool] = False - ) -> dict[str, list[dict[str, Any]]]: - """Get the graph of an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get the graph of. - xray: Include graph representation of subgraphs. If an integer value is provided, only subgraphs with a depth less than or equal to the value will be included. - - Returns: - Graph: The graph information for the assistant in JSON format. - - Example Usage: - - graph_info = await client.assistants.get_graph( - assistant_id="my_assistant_id" - ) - print(graph_info) - - -------------------------------------------------------------------------------------------------------------------------- - - { - 'nodes': - [ - {'id': '__start__', 'type': 'schema', 'data': '__start__'}, - {'id': '__end__', 'type': 'schema', 'data': '__end__'}, - {'id': 'agent','type': 'runnable','data': {'id': ['langgraph', 'utils', 'RunnableCallable'],'name': 'agent'}}, - ], - 'edges': - [ - {'source': '__start__', 'target': 'agent'}, - {'source': 'agent','target': '__end__'} - ] - } - - - """ # noqa: E501 - return await self.http.get( - f"/assistants/{assistant_id}/graph", params={"xray": xray} - ) - - async def get_schemas(self, assistant_id: str) -> GraphSchema: - """Get the schemas of an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get the schema of. - - Returns: - GraphSchema: The graph schema for the assistant. - - Example Usage: - - schema = await client.assistants.get_schemas( - assistant_id="my_assistant_id" - ) - print(schema) - - ---------------------------------------------------------------------------------------------------------------------------- - - { - 'graph_id': 'agent', - 'state_schema': - { - 'title': 'LangGraphInput', - '$ref': '#/definitions/AgentState', - 'definitions': - { - 'BaseMessage': - { - 'title': 'BaseMessage', - 'description': 'Base abstract Message class. Messages are the inputs and outputs of ChatModels.', - 'type': 'object', - 'properties': - { - 'content': - { - 'title': 'Content', - 'anyOf': [ - {'type': 'string'}, - {'type': 'array','items': {'anyOf': [{'type': 'string'}, {'type': 'object'}]}} - ] - }, - 'additional_kwargs': - { - 'title': 'Additional Kwargs', - 'type': 'object' - }, - 'response_metadata': - { - 'title': 'Response Metadata', - 'type': 'object' - }, - 'type': - { - 'title': 'Type', - 'type': 'string' - }, - 'name': - { - 'title': 'Name', - 'type': 'string' - }, - 'id': - { - 'title': 'Id', - 'type': 'string' - } - }, - 'required': ['content', 'type'] - }, - 'AgentState': - { - 'title': 'AgentState', - 'type': 'object', - 'properties': - { - 'messages': - { - 'title': 'Messages', - 'type': 'array', - 'items': {'$ref': '#/definitions/BaseMessage'} - } - }, - 'required': ['messages'] - } - } - }, - 'config_schema': - { - 'title': 'Configurable', - 'type': 'object', - 'properties': - { - 'model_name': - { - 'title': 'Model Name', - 'enum': ['anthropic', 'openai'], - 'type': 'string' - } - } - } - } - - """ # noqa: E501 - return await self.http.get(f"/assistants/{assistant_id}/schemas") - - async def get_subgraphs( - self, assistant_id: str, namespace: Optional[str] = None, recurse: bool = False - ) -> Subgraphs: - """Get the schemas of an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get the schema of. - - Returns: - Subgraphs: The graph schema for the assistant. - - """ # noqa: E501 - if namespace is not None: - return await self.http.get( - f"/assistants/{assistant_id}/subgraphs/{namespace}", - params={"recurse": recurse}, - ) - else: - return await self.http.get( - f"/assistants/{assistant_id}/subgraphs", - params={"recurse": recurse}, - ) - - async def create( - self, - graph_id: Optional[str], - config: Optional[Config] = None, - *, - metadata: Json = None, - assistant_id: Optional[str] = None, - if_exists: Optional[OnConflictBehavior] = None, - name: Optional[str] = None, - ) -> Assistant: - """Create a new assistant. - - Useful when graph is configurable and you want to create different assistants based on different configurations. - - Args: - graph_id: The ID of the graph the assistant should use. The graph ID is normally set in your langgraph.json configuration. - config: Configuration to use for the graph. - metadata: Metadata to add to assistant. - assistant_id: Assistant ID to use, will default to a random UUID if not provided. - if_exists: How to handle duplicate creation. Defaults to 'raise' under the hood. - Must be either 'raise' (raise error if duplicate), or 'do_nothing' (return existing assistant). - name: The name of the assistant. Defaults to 'Untitled' under the hood. - - Returns: - Assistant: The created assistant. - - Example Usage: - - assistant = await client.assistants.create( - graph_id="agent", - config={"configurable": {"model_name": "openai"}}, - metadata={"number":1}, - assistant_id="my-assistant-id", - if_exists="do_nothing", - name="my_name" - ) - """ # noqa: E501 - payload: Dict[str, Any] = { - "graph_id": graph_id, - } - if config: - payload["config"] = config - if metadata: - payload["metadata"] = metadata - if assistant_id: - payload["assistant_id"] = assistant_id - if if_exists: - payload["if_exists"] = if_exists - if name: - payload["name"] = name - return await self.http.post("/assistants", json=payload) - - async def update( - self, - assistant_id: str, - *, - graph_id: Optional[str] = None, - config: Optional[Config] = None, - metadata: Json = None, - name: Optional[str] = None, - ) -> Assistant: - """Update an assistant. - - Use this to point to a different graph, update the configuration, or change the metadata of an assistant. - - Args: - assistant_id: Assistant to update. - graph_id: The ID of the graph the assistant should use. - The graph ID is normally set in your langgraph.json configuration. If None, assistant will keep pointing to same graph. - config: Configuration to use for the graph. - metadata: Metadata to merge with existing assistant metadata. - name: The new name for the assistant. - - Returns: - Assistant: The updated assistant. - - Example Usage: - - assistant = await client.assistants.update( - assistant_id='e280dad7-8618-443f-87f1-8e41841c180f', - graph_id="other-graph", - config={"configurable": {"model_name": "anthropic"}}, - metadata={"number":2} - ) - - """ # noqa: E501 - payload: Dict[str, Any] = {} - if graph_id: - payload["graph_id"] = graph_id - if config: - payload["config"] = config - if metadata: - payload["metadata"] = metadata - if name: - payload["name"] = name - return await self.http.patch( - f"/assistants/{assistant_id}", - json=payload, - ) - - async def delete( - self, - assistant_id: str, - ) -> None: - """Delete an assistant. - - Args: - assistant_id: The assistant ID to delete. - - Returns: - None - - Example Usage: - - await client.assistants.delete( - assistant_id="my_assistant_id" - ) - - """ # noqa: E501 - await self.http.delete(f"/assistants/{assistant_id}") - - async def search( - self, - *, - metadata: Json = None, - graph_id: Optional[str] = None, - limit: int = 10, - offset: int = 0, - ) -> list[Assistant]: - """Search for assistants. - - Args: - metadata: Metadata to filter by. Exact match filter for each KV pair. - graph_id: The ID of the graph to filter by. - The graph ID is normally set in your langgraph.json configuration. - limit: The maximum number of results to return. - offset: The number of results to skip. - - Returns: - list[Assistant]: A list of assistants. - - Example Usage: - - assistants = await client.assistants.search( - metadata = {"name":"my_name"}, - graph_id="my_graph_id", - limit=5, - offset=5 - ) - """ - payload: Dict[str, Any] = { - "limit": limit, - "offset": offset, - } - if metadata: - payload["metadata"] = metadata - if graph_id: - payload["graph_id"] = graph_id - return await self.http.post( - "/assistants/search", - json=payload, - ) - - async def get_versions( - self, - assistant_id: str, - metadata: Json = None, - limit: int = 10, - offset: int = 0, - ) -> list[AssistantVersion]: - """List all versions of an assistant. - - Args: - assistant_id: The assistant ID to get versions for. - metadata: Metadata to filter versions by. Exact match filter for each KV pair. - limit: The maximum number of versions to return. - offset: The number of versions to skip. - - Returns: - list[Assistant]: A list of assistants. - - Example Usage: - - assistant_versions = await client.assistants.get_versions( - assistant_id="my_assistant_id" - ) - - """ # noqa: E501 - - payload: Dict[str, Any] = { - "limit": limit, - "offset": offset, - } - if metadata: - payload["metadata"] = metadata - return await self.http.post( - f"/assistants/{assistant_id}/versions", json=payload - ) - - async def set_latest(self, assistant_id: str, version: int) -> Assistant: - """Change the version of an assistant. - - Args: - assistant_id: The assistant ID to delete. - version: The version to change to. - - Returns: - Assistant: Assistant Object. - - Example Usage: - - new_version_assistant = await client.assistants.set_latest( - assistant_id="my_assistant_id", - version=3 - ) - - """ # noqa: E501 - - payload: Dict[str, Any] = {"version": version} - - return await self.http.post(f"/assistants/{assistant_id}/latest", json=payload) - - -class ThreadsClient: - """Client for managing threads in LangGraph. - - A thread maintains the state of a graph across multiple interactions/invocations (aka runs). - It accumulates and persists the graph's state, allowing for continuity between separate - invocations of the graph. - - Example: - - client = get_client() - new_thread = await client.threads.create(metadata={"user_id": "123"}) - """ - - def __init__(self, http: HttpClient) -> None: - self.http = http - - async def get(self, thread_id: str) -> Thread: - """Get a thread by ID. - - Args: - thread_id: The ID of the thread to get. - - Returns: - Thread: Thread object. - - Example Usage: - - thread = await client.threads.get( - thread_id="my_thread_id" - ) - print(thread) - - ----------------------------------------------------- - - { - 'thread_id': 'my_thread_id', - 'created_at': '2024-07-18T18:35:15.540834+00:00', - 'updated_at': '2024-07-18T18:35:15.540834+00:00', - 'metadata': {'graph_id': 'agent'} - } - - """ # noqa: E501 - - return await self.http.get(f"/threads/{thread_id}") - - async def create( - self, - *, - metadata: Json = None, - thread_id: Optional[str] = None, - if_exists: Optional[OnConflictBehavior] = None, - ) -> Thread: - """Create a new thread. - - Args: - metadata: Metadata to add to thread. - thread_id: ID of thread. - If None, ID will be a randomly generated UUID. - if_exists: How to handle duplicate creation. Defaults to 'raise' under the hood. - Must be either 'raise' (raise error if duplicate), or 'do_nothing' (return existing thread). - - Returns: - Thread: The created thread. - - Example Usage: - - thread = await client.threads.create( - metadata={"number":1}, - thread_id="my-thread-id", - if_exists="raise" - ) - """ # noqa: E501 - payload: Dict[str, Any] = {} - if thread_id: - payload["thread_id"] = thread_id - if metadata: - payload["metadata"] = metadata - if if_exists: - payload["if_exists"] = if_exists - return await self.http.post("/threads", json=payload) - - async def update(self, thread_id: str, *, metadata: dict[str, Any]) -> Thread: - """Update a thread. - - Args: - thread_id: ID of thread to update. - metadata: Metadata to merge with existing thread metadata. - - Returns: - Thread: The created thread. - - Example Usage: - - thread = await client.threads.update( - thread_id="my-thread-id", - metadata={"number":1}, - ) - """ # noqa: E501 - return await self.http.patch( - f"/threads/{thread_id}", json={"metadata": metadata} - ) - - async def delete(self, thread_id: str) -> None: - """Delete a thread. - - Args: - thread_id: The ID of the thread to delete. - - Returns: - None - - Example Usage: - - await client.threads.delete( - thread_id="my_thread_id" - ) - - """ # noqa: E501 - await self.http.delete(f"/threads/{thread_id}") - - async def search( - self, - *, - metadata: Json = None, - values: Json = None, - status: Optional[ThreadStatus] = None, - limit: int = 10, - offset: int = 0, - ) -> list[Thread]: - """Search for threads. - - Args: - metadata: Thread metadata to filter on. - values: State values to filter on. - status: Thread status to filter on. - Must be one of 'idle', 'busy', 'interrupted' or 'error'. - limit: Limit on number of threads to return. - offset: Offset in threads table to start search from. - - Returns: - list[Thread]: List of the threads matching the search parameters. - - Example Usage: - - threads = await client.threads.search( - metadata={"number":1}, - status="interrupted", - limit=15, - offset=5 - ) - - """ # noqa: E501 - payload: Dict[str, Any] = { - "limit": limit, - "offset": offset, - } - if metadata: - payload["metadata"] = metadata - if values: - payload["values"] = values - if status: - payload["status"] = status - return await self.http.post( - "/threads/search", - json=payload, - ) - - async def copy(self, thread_id: str) -> None: - """Copy a thread. - - Args: - thread_id: The ID of the thread to copy. - - Returns: - None - - Example Usage: - - await client.threads.copy( - thread_id="my_thread_id" - ) - - """ # noqa: E501 - return await self.http.post(f"/threads/{thread_id}/copy", json=None) - - async def get_state( - self, - thread_id: str, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, # deprecated - *, - subgraphs: bool = False, - ) -> ThreadState: - """Get the state of a thread. - - Args: - thread_id: The ID of the thread to get the state of. - checkpoint: The checkpoint to get the state of. - subgraphs: Include subgraphs states. - - Returns: - ThreadState: the thread of the state. - - Example Usage: - - thread_state = await client.threads.get_state( - thread_id="my_thread_id", - checkpoint_id="my_checkpoint_id" - ) - print(thread_state) - - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - { - 'values': { - 'messages': [ - { - 'content': 'how are you?', - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'human', - 'name': None, - 'id': 'fe0a5778-cfe9-42ee-b807-0adaa1873c10', - 'example': False - }, - { - 'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'ai', - 'name': None, - 'id': 'run-159b782c-b679-4830-83c6-cef87798fe8b', - 'example': False, - 'tool_calls': [], - 'invalid_tool_calls': [], - 'usage_metadata': None - } - ] - }, - 'next': [], - 'checkpoint': - { - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'checkpoint_ns': '', - 'checkpoint_id': '1ef4a9b8-e6fb-67b1-8001-abd5184439d1' - } - 'metadata': - { - 'step': 1, - 'run_id': '1ef4a9b8-d7da-679a-a45a-872054341df2', - 'source': 'loop', - 'writes': - { - 'agent': - { - 'messages': [ - { - 'id': 'run-159b782c-b679-4830-83c6-cef87798fe8b', - 'name': None, - 'type': 'ai', - 'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", - 'example': False, - 'tool_calls': [], - 'usage_metadata': None, - 'additional_kwargs': {}, - 'response_metadata': {}, - 'invalid_tool_calls': [] - } - ] - } - }, - 'user_id': None, - 'graph_id': 'agent', - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'created_by': 'system', - 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca'}, - 'created_at': '2024-07-25T15:35:44.184703+00:00', - 'parent_config': - { - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'checkpoint_ns': '', - 'checkpoint_id': '1ef4a9b8-d80d-6fa7-8000-9300467fad0f' - } - } - - """ # noqa: E501 - if checkpoint: - return await self.http.post( - f"/threads/{thread_id}/state/checkpoint", - json={"checkpoint": checkpoint, "subgraphs": subgraphs}, - ) - elif checkpoint_id: - return await self.http.get( - f"/threads/{thread_id}/state/{checkpoint_id}", - params={"subgraphs": subgraphs}, - ) - else: - return await self.http.get( - f"/threads/{thread_id}/state", - params={"subgraphs": subgraphs}, - ) - - async def update_state( - self, - thread_id: str, - values: Optional[Union[dict, Sequence[dict]]], - *, - as_node: Optional[str] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, # deprecated - ) -> ThreadUpdateStateResponse: - """Update the state of a thread. - - Args: - thread_id: The ID of the thread to update. - values: The values to update the state with. - as_node: Update the state as if this node had just executed. - checkpoint: The checkpoint to update the state of. - - Returns: - ThreadUpdateStateResponse: Response after updating a thread's state. - - Example Usage: - - response = await client.threads.update_state( - thread_id="my_thread_id", - values={"messages":[{"role": "user", "content": "hello!"}]}, - as_node="my_node", - ) - print(response) - - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - { - 'checkpoint': { - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'checkpoint_ns': '', - 'checkpoint_id': '1ef4a9b8-e6fb-67b1-8001-abd5184439d1', - 'checkpoint_map': {} - } - } - - """ # noqa: E501 - payload: Dict[str, Any] = { - "values": values, - } - if checkpoint_id: - payload["checkpoint_id"] = checkpoint_id - if checkpoint: - payload["checkpoint"] = checkpoint - if as_node: - payload["as_node"] = as_node - return await self.http.post(f"/threads/{thread_id}/state", json=payload) - - async def get_history( - self, - thread_id: str, - *, - limit: int = 10, - before: Optional[str | Checkpoint] = None, - metadata: Optional[dict] = None, - checkpoint: Optional[Checkpoint] = None, - ) -> list[ThreadState]: - """Get the state history of a thread. - - Args: - thread_id: The ID of the thread to get the state history for. - checkpoint: Return states for this subgraph. If empty defaults to root. - limit: The maximum number of states to return. - before: Return states before this checkpoint. - metadata: Filter states by metadata key-value pairs. - - Returns: - list[ThreadState]: the state history of the thread. - - Example Usage: - - thread_state = await client.threads.get_history( - thread_id="my_thread_id", - limit=5, - ) - - """ # noqa: E501 - payload: Dict[str, Any] = { - "limit": limit, - } - if before: - payload["before"] = before - if metadata: - payload["metadata"] = metadata - if checkpoint: - payload["checkpoint"] = checkpoint - return await self.http.post(f"/threads/{thread_id}/history", json=payload) - - -class RunsClient: - """Client for managing runs in LangGraph. - - A run is a single assistant invocation with optional input, config, and metadata. - This client manages runs, which can be stateful (on threads) or stateless. - - Example: - - client = get_client() - run = await client.runs.create(assistant_id="asst_123", thread_id="thread_456", input={"query": "Hello"}) - """ - - def __init__(self, http: HttpClient) -> None: - self.http = http - - @overload - def stream( - self, - thread_id: str, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - feedback_keys: Optional[Sequence[str]] = None, - on_disconnect: Optional[DisconnectMode] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> AsyncIterator[StreamPart]: ... - - @overload - def stream( - self, - thread_id: None, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - feedback_keys: Optional[Sequence[str]] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - webhook: Optional[str] = None, - after_seconds: Optional[int] = None, - ) -> AsyncIterator[StreamPart]: ... - - def stream( - self, - thread_id: Optional[str], - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - feedback_keys: Optional[Sequence[str]] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> AsyncIterator[StreamPart]: - """Create a run and stream the results. - - Args: - thread_id: the thread ID to assign to the thread. - If None will create a stateless run. - assistant_id: The assistant ID or graph name to stream from. - If using graph name, will default to first assistant created from that graph. - input: The input to the graph. - command: A command to execute. Cannot be combined with input. - stream_mode: The stream mode(s) to use. - stream_subgraphs: Whether to stream output from subgraphs. - metadata: Metadata to assign to the run. - config: The configuration for the assistant. - checkpoint: The checkpoint to resume from. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - feedback_keys: Feedback keys to assign to run. - on_disconnect: The disconnect mode to use. - Must be one of 'cancel' or 'continue'. - on_completion: Whether to delete or keep the thread created for a stateless run. - Must be one of 'delete' or 'keep'. - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - if_not_exists: How to handle missing thread. Defaults to 'reject'. - Must be either 'reject' (raise error if missing), or 'create' (create new thread). - after_seconds: The number of seconds to wait before starting the run. - Use to schedule future runs. - - Returns: - AsyncIterator[StreamPart]: Asynchronous iterator of stream results. - - Example Usage: - - async for chunk in client.runs.stream( - thread_id=None, - assistant_id="agent", - input={"messages": [{"role": "user", "content": "how are you?"}]}, - stream_mode=["values","debug"], - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "anthropic"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - feedback_keys=["my_feedback_key_1","my_feedback_key_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ): - print(chunk) - - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - - StreamPart(event='metadata', data={'run_id': '1ef4a9b8-d7da-679a-a45a-872054341df2'}) - StreamPart(event='values', data={'messages': [{'content': 'how are you?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'fe0a5778-cfe9-42ee-b807-0adaa1873c10', 'example': False}]}) - StreamPart(event='values', data={'messages': [{'content': 'how are you?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'fe0a5778-cfe9-42ee-b807-0adaa1873c10', 'example': False}, {'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run-159b782c-b679-4830-83c6-cef87798fe8b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}) - StreamPart(event='end', data=None) - - """ # noqa: E501 - payload = { - "input": input, - "command": ( - {k: v for k, v in command.items() if v is not None} if command else None - ), - "config": config, - "metadata": metadata, - "stream_mode": stream_mode, - "stream_subgraphs": stream_subgraphs, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "feedback_keys": feedback_keys, - "webhook": webhook, - "checkpoint": checkpoint, - "checkpoint_id": checkpoint_id, - "multitask_strategy": multitask_strategy, - "if_not_exists": if_not_exists, - "on_disconnect": on_disconnect, - "on_completion": on_completion, - "after_seconds": after_seconds, - } - endpoint = ( - f"/threads/{thread_id}/runs/stream" - if thread_id is not None - else "/runs/stream" - ) - return self.http.stream( - endpoint, "POST", json={k: v for k, v in payload.items() if v is not None} - ) - - @overload - async def create( - self, - thread_id: None, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Run: ... - - @overload - async def create( - self, - thread_id: str, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Run: ... - - async def create( - self, - thread_id: Optional[str], - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - on_completion: Optional[OnCompletionBehavior] = None, - after_seconds: Optional[int] = None, - ) -> Run: - """Create a background run. - - Args: - thread_id: the thread ID to assign to the thread. - If None will create a stateless run. - assistant_id: The assistant ID or graph name to stream from. - If using graph name, will default to first assistant created from that graph. - input: The input to the graph. - command: A command to execute. Cannot be combined with input. - stream_mode: The stream mode(s) to use. - stream_subgraphs: Whether to stream output from subgraphs. - metadata: Metadata to assign to the run. - config: The configuration for the assistant. - checkpoint: The checkpoint to resume from. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - on_completion: Whether to delete or keep the thread created for a stateless run. - Must be one of 'delete' or 'keep'. - if_not_exists: How to handle missing thread. Defaults to 'reject'. - Must be either 'reject' (raise error if missing), or 'create' (create new thread). - after_seconds: The number of seconds to wait before starting the run. - Use to schedule future runs. - - Returns: - Run: The created background run. - - Example Usage: - - background_run = await client.runs.create( - thread_id="my_thread_id", - assistant_id="my_assistant_id", - input={"messages": [{"role": "user", "content": "hello!"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "openai"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - print(background_run) - - -------------------------------------------------------------------------------- - - { - 'run_id': 'my_run_id', - 'thread_id': 'my_thread_id', - 'assistant_id': 'my_assistant_id', - 'created_at': '2024-07-25T15:35:42.598503+00:00', - 'updated_at': '2024-07-25T15:35:42.598503+00:00', - 'metadata': {}, - 'status': 'pending', - 'kwargs': - { - 'input': - { - 'messages': [ - { - 'role': 'user', - 'content': 'how are you?' - } - ] - }, - 'config': - { - 'metadata': - { - 'created_by': 'system' - }, - 'configurable': - { - 'run_id': 'my_run_id', - 'user_id': None, - 'graph_id': 'agent', - 'thread_id': 'my_thread_id', - 'checkpoint_id': None, - 'model_name': "openai", - 'assistant_id': 'my_assistant_id' - } - }, - 'webhook': "https://my.fake.webhook.com", - 'temporary': False, - 'stream_mode': ['values'], - 'feedback_keys': None, - 'interrupt_after': ["node_to_stop_after_1","node_to_stop_after_2"], - 'interrupt_before': ["node_to_stop_before_1","node_to_stop_before_2"] - }, - 'multitask_strategy': 'interrupt' - } - - """ # noqa: E501 - payload = { - "input": input, - "command": ( - {k: v for k, v in command.items() if v is not None} if command else None - ), - "stream_mode": stream_mode, - "stream_subgraphs": stream_subgraphs, - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - "checkpoint": checkpoint, - "checkpoint_id": checkpoint_id, - "multitask_strategy": multitask_strategy, - "if_not_exists": if_not_exists, - "on_completion": on_completion, - "after_seconds": after_seconds, - } - payload = {k: v for k, v in payload.items() if v is not None} - if thread_id: - return await self.http.post(f"/threads/{thread_id}/runs", json=payload) - else: - return await self.http.post("/runs", json=payload) - - async def create_batch(self, payloads: list[RunCreate]) -> list[Run]: - """Create a batch of stateless background runs.""" - - def filter_payload(payload: RunCreate): - return {k: v for k, v in payload.items() if v is not None} - - payloads = [filter_payload(payload) for payload in payloads] - return await self.http.post("/runs/batch", json=payloads) - - @overload - async def wait( - self, - thread_id: str, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_disconnect: Optional[DisconnectMode] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - raise_error: bool = True, - ) -> Union[list[dict], dict[str, Any]]: ... - - @overload - async def wait( - self, - thread_id: None, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - raise_error: bool = True, - ) -> Union[list[dict], dict[str, Any]]: ... - - async def wait( - self, - thread_id: Optional[str], - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - raise_error: bool = True, - ) -> Union[list[dict], dict[str, Any]]: - """Create a run, wait until it finishes and return the final state. - - Args: - thread_id: the thread ID to create the run on. - If None will create a stateless run. - assistant_id: The assistant ID or graph name to run. - If using graph name, will default to first assistant created from that graph. - input: The input to the graph. - command: A command to execute. Cannot be combined with input. - metadata: Metadata to assign to the run. - config: The configuration for the assistant. - checkpoint: The checkpoint to resume from. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - webhook: Webhook to call after LangGraph API call is done. - on_disconnect: The disconnect mode to use. - Must be one of 'cancel' or 'continue'. - on_completion: Whether to delete or keep the thread created for a stateless run. - Must be one of 'delete' or 'keep'. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - if_not_exists: How to handle missing thread. Defaults to 'reject'. - Must be either 'reject' (raise error if missing), or 'create' (create new thread). - after_seconds: The number of seconds to wait before starting the run. - Use to schedule future runs. - - Returns: - Union[list[dict], dict[str, Any]]: The output of the run. - - Example Usage: - - final_state_of_run = await client.runs.wait( - thread_id=None, - assistant_id="agent", - input={"messages": [{"role": "user", "content": "how are you?"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "anthropic"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - print(final_state_of_run) - - ------------------------------------------------------------------------------------------------------------------------------------------- - - { - 'messages': [ - { - 'content': 'how are you?', - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'human', - 'name': None, - 'id': 'f51a862c-62fe-4866-863b-b0863e8ad78a', - 'example': False - }, - { - 'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'ai', - 'name': None, - 'id': 'run-bf1cd3c6-768f-4c16-b62d-ba6f17ad8b36', - 'example': False, - 'tool_calls': [], - 'invalid_tool_calls': [], - 'usage_metadata': None - } - ] - } - - """ # noqa: E501 - payload = { - "input": input, - "command": ( - {k: v for k, v in command.items() if v is not None} if command else None - ), - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - "checkpoint": checkpoint, - "checkpoint_id": checkpoint_id, - "multitask_strategy": multitask_strategy, - "if_not_exists": if_not_exists, - "on_disconnect": on_disconnect, - "on_completion": on_completion, - "after_seconds": after_seconds, - } - endpoint = ( - f"/threads/{thread_id}/runs/wait" if thread_id is not None else "/runs/wait" - ) - response = await self.http.post( - endpoint, json={k: v for k, v in payload.items() if v is not None} - ) - if ( - raise_error - and isinstance(response, dict) - and "__error__" in response - and isinstance(response["__error__"], dict) - ): - raise Exception( - f"{response['__error__'].get('error')}: {response['__error__'].get('message')}" - ) - return response - - async def list( - self, - thread_id: str, - *, - limit: int = 10, - offset: int = 0, - status: Optional[RunStatus] = None, - ) -> List[Run]: - """List runs. - - Args: - thread_id: The thread ID to list runs for. - limit: The maximum number of results to return. - offset: The number of results to skip. - status: The status of the run to filter by. - - Returns: - List[Run]: The runs for the thread. - - Example Usage: - - await client.runs.list( - thread_id="thread_id", - limit=5, - offset=5, - ) - - """ # noqa: E501 - params = { - "limit": limit, - "offset": offset, - } - if status is not None: - params["status"] = status - return await self.http.get(f"/threads/{thread_id}/runs", params=params) - - async def get(self, thread_id: str, run_id: str) -> Run: - """Get a run. - - Args: - thread_id: The thread ID to get. - run_id: The run ID to get. - - Returns: - Run: Run object. - - Example Usage: - - run = await client.runs.get( - thread_id="thread_id_to_delete", - run_id="run_id_to_delete", - ) - - """ # noqa: E501 - - return await self.http.get(f"/threads/{thread_id}/runs/{run_id}") - - async def cancel( - self, - thread_id: str, - run_id: str, - *, - wait: bool = False, - action: CancelAction = "interrupt", - ) -> None: - """Get a run. - - Args: - thread_id: The thread ID to cancel. - run_id: The run ID to cancel. - wait: Whether to wait until run has completed. - action: Action to take when cancelling the run. Possible values - are `interrupt` or `rollback`. Default is `interrupt`. - - Returns: - None - - Example Usage: - - await client.runs.cancel( - thread_id="thread_id_to_cancel", - run_id="run_id_to_cancel", - wait=True, - action="interrupt" - ) - - """ # noqa: E501 - return await self.http.post( - f"/threads/{thread_id}/runs/{run_id}/cancel?wait={1 if wait else 0}&action={action}", - json=None, - ) - - async def join(self, thread_id: str, run_id: str) -> dict: - """Block until a run is done. Returns the final state of the thread. - - Args: - thread_id: The thread ID to join. - run_id: The run ID to join. - - Returns: - None - - Example Usage: - - result =await client.runs.join( - thread_id="thread_id_to_join", - run_id="run_id_to_join" - ) - - """ # noqa: E501 - return await self.http.get(f"/threads/{thread_id}/runs/{run_id}/join") - - def join_stream( - self, thread_id: str, run_id: str, *, cancel_on_disconnect: bool = False - ) -> AsyncIterator[StreamPart]: - """Stream output from a run in real-time, until the run is done. - Output is not buffered, so any output produced before this call will - not be received here. - - Args: - thread_id: The thread ID to join. - run_id: The run ID to join. - cancel_on_disconnect: Whether to cancel the run when the stream is disconnected. - - Returns: - None - - Example Usage: - - await client.runs.join_stream( - thread_id="thread_id_to_join", - run_id="run_id_to_join" - ) - - """ # noqa: E501 - return self.http.stream( - f"/threads/{thread_id}/runs/{run_id}/stream", - "GET", - params={"cancel_on_disconnect": cancel_on_disconnect}, - ) - - async def delete(self, thread_id: str, run_id: str) -> None: - """Delete a run. - - Args: - thread_id: The thread ID to delete. - run_id: The run ID to delete. - - Returns: - None - - Example Usage: - - await client.runs.delete( - thread_id="thread_id_to_delete", - run_id="run_id_to_delete" - ) - - """ # noqa: E501 - await self.http.delete(f"/threads/{thread_id}/runs/{run_id}") - - -class CronClient: - """Client for managing recurrent runs (cron jobs) in LangGraph. - - A run is a single invocation of an assistant with optional input and config. - This client allows scheduling recurring runs to occur automatically. - - Example: - - client = get_client() - cron_job = await client.crons.create_for_thread( - thread_id="thread_123", - assistant_id="asst_456", - schedule="0 9 * * *", - input={"message": "Daily update"} - ) - """ - - def __init__(self, http_client: HttpClient) -> None: - self.http = http_client - - async def create_for_thread( - self, - thread_id: str, - assistant_id: str, - *, - schedule: str, - input: Optional[dict] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, list[str]]] = None, - interrupt_after: Optional[Union[All, list[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[str] = None, - ) -> Run: - """Create a cron job for a thread. - - Args: - thread_id: the thread ID to run the cron job on. - assistant_id: The assistant ID or graph name to use for the cron job. - If using graph name, will default to first assistant created from that graph. - schedule: The cron schedule to execute this job on. - input: The input to the graph. - metadata: Metadata to assign to the cron job runs. - config: The configuration for the assistant. - interrupt_before: Nodes to interrupt immediately before they get executed. - - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - - Returns: - Run: The cron run. - - Example Usage: - - cron_run = await client.crons.create_for_thread( - thread_id="my-thread-id", - assistant_id="agent", - schedule="27 15 * * *", - input={"messages": [{"role": "user", "content": "hello!"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "openai"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - - """ # noqa: E501 - payload = { - "schedule": schedule, - "input": input, - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - } - if multitask_strategy: - payload["multitask_strategy"] = multitask_strategy - payload = {k: v for k, v in payload.items() if v is not None} - return await self.http.post(f"/threads/{thread_id}/runs/crons", json=payload) - - async def create( - self, - assistant_id: str, - *, - schedule: str, - input: Optional[dict] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, list[str]]] = None, - interrupt_after: Optional[Union[All, list[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[str] = None, - ) -> Run: - """Create a cron run. - - Args: - assistant_id: The assistant ID or graph name to use for the cron job. - If using graph name, will default to first assistant created from that graph. - schedule: The cron schedule to execute this job on. - input: The input to the graph. - metadata: Metadata to assign to the cron job runs. - config: The configuration for the assistant. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - - Returns: - Run: The cron run. - - Example Usage: - - cron_run = client.crons.create( - assistant_id="agent", - schedule="27 15 * * *", - input={"messages": [{"role": "user", "content": "hello!"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "openai"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - - """ # noqa: E501 - payload = { - "schedule": schedule, - "input": input, - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - } - if multitask_strategy: - payload["multitask_strategy"] = multitask_strategy - payload = {k: v for k, v in payload.items() if v is not None} - return await self.http.post("/runs/crons", json=payload) - - async def delete(self, cron_id: str) -> None: - """Delete a cron. - - Args: - cron_id: The cron ID to delete. - - Returns: - None - - Example Usage: - - await client.crons.delete( - cron_id="cron_to_delete" - ) - - """ # noqa: E501 - await self.http.delete(f"/runs/crons/{cron_id}") - - async def search( - self, - *, - assistant_id: Optional[str] = None, - thread_id: Optional[str] = None, - limit: int = 10, - offset: int = 0, - ) -> list[Cron]: - """Get a list of cron jobs. - - Args: - assistant_id: The assistant ID or graph name to search for. - thread_id: the thread ID to search for. - limit: The maximum number of results to return. - offset: The number of results to skip. - - Returns: - list[Cron]: The list of cron jobs returned by the search, - - Example Usage: - - cron_jobs = await client.crons.search( - assistant_id="my_assistant_id", - thread_id="my_thread_id", - limit=5, - offset=5, - ) - print(cron_jobs) - - ---------------------------------------------------------- - - [ - { - 'cron_id': '1ef3cefa-4c09-6926-96d0-3dc97fd5e39b', - 'assistant_id': 'my_assistant_id', - 'thread_id': 'my_thread_id', - 'user_id': None, - 'payload': - { - 'input': {'start_time': ''}, - 'schedule': '4 * * * *', - 'assistant_id': 'my_assistant_id' - }, - 'schedule': '4 * * * *', - 'next_run_date': '2024-07-25T17:04:00+00:00', - 'end_time': None, - 'created_at': '2024-07-08T06:02:23.073257+00:00', - 'updated_at': '2024-07-08T06:02:23.073257+00:00' - } - ] - - """ # noqa: E501 - payload = { - "assistant_id": assistant_id, - "thread_id": thread_id, - "limit": limit, - "offset": offset, - } - payload = {k: v for k, v in payload.items() if v is not None} - return await self.http.post("/runs/crons/search", json=payload) - - -class StoreClient: - """Client for interacting with the graph's shared storage. - - The Store provides a key-value storage system for persisting data across graph executions, - allowing for stateful operations and data sharing across threads. - - Example: - - client = get_client() - await client.store.put_item(["users", "user123"], "mem-123451342", {"name": "Alice", "score": 100}) - """ - - def __init__(self, http: HttpClient) -> None: - self.http = http - - async def put_item( - self, - namespace: Sequence[str], - /, - key: str, - value: dict[str, Any], - index: Optional[Union[Literal[False], list[str]]] = None, - ) -> None: - """Store or update an item. - - Args: - namespace: A list of strings representing the namespace path. - key: The unique identifier for the item within the namespace. - value: A dictionary containing the item's data. - index: Controls search indexing - None (use defaults), False (disable), or list of field paths to index. - - Returns: - None - - Example Usage: - - await client.store.put_item( - ["documents", "user123"], - key="item456", - value={"title": "My Document", "content": "Hello World"} - ) - """ - for label in namespace: - if "." in label: - raise ValueError( - f"Invalid namespace label '{label}'. Namespace labels cannot contain periods ('.')." - ) - payload = {"namespace": namespace, "key": key, "value": value, "index": index} - await self.http.put("/store/items", json=payload) - - async def get_item(self, namespace: Sequence[str], /, key: str) -> Item: - """Retrieve a single item. - - Args: - key: The unique identifier for the item. - namespace: Optional list of strings representing the namespace path. - - Returns: - Item: The retrieved item. - - Example Usage: - - item = await client.store.get_item( - ["documents", "user123"], - key="item456", - ) - print(item) - - ---------------------------------------------------------------- - - { - 'namespace': ['documents', 'user123'], - 'key': 'item456', - 'value': {'title': 'My Document', 'content': 'Hello World'}, - 'created_at': '2024-07-30T12:00:00Z', - 'updated_at': '2024-07-30T12:00:00Z' - } - """ - for label in namespace: - if "." in label: - raise ValueError( - f"Invalid namespace label '{label}'. Namespace labels cannot contain periods ('.')." - ) - return await self.http.get( - "/store/items", params={"namespace": ".".join(namespace), "key": key} - ) - - async def delete_item(self, namespace: Sequence[str], /, key: str) -> None: - """Delete an item. - - Args: - key: The unique identifier for the item. - namespace: Optional list of strings representing the namespace path. - - Returns: - None - - Example Usage: - - await client.store.delete_item( - ["documents", "user123"], - key="item456", - ) - """ - await self.http.delete( - "/store/items", json={"namespace": namespace, "key": key} - ) - - async def search_items( - self, - namespace_prefix: Sequence[str], - /, - filter: Optional[dict[str, Any]] = None, - limit: int = 10, - offset: int = 0, - query: Optional[str] = None, - ) -> SearchItemsResponse: - """Search for items within a namespace prefix. - - Args: - namespace_prefix: List of strings representing the namespace prefix. - filter: Optional dictionary of key-value pairs to filter results. - limit: Maximum number of items to return (default is 10). - offset: Number of items to skip before returning results (default is 0). - query: Optional query for natural language search. - - Returns: - List[Item]: A list of items matching the search criteria. - - Example Usage: - - items = await client.store.search_items( - ["documents"], - filter={"author": "John Doe"}, - limit=5, - offset=0 - ) - print(items) - - ---------------------------------------------------------------- - - { - "items": [ - { - "namespace": ["documents", "user123"], - "key": "item789", - "value": { - "title": "Another Document", - "author": "John Doe" - }, - "created_at": "2024-07-30T12:00:00Z", - "updated_at": "2024-07-30T12:00:00Z" - }, - # ... additional items ... - ] - } - """ - payload = { - "namespace_prefix": namespace_prefix, - "filter": filter, - "limit": limit, - "offset": offset, - "query": query, - } - - return await self.http.post("/store/items/search", json=_provided_vals(payload)) - - async def list_namespaces( - self, - prefix: Optional[List[str]] = None, - suffix: Optional[List[str]] = None, - max_depth: Optional[int] = None, - limit: int = 100, - offset: int = 0, - ) -> ListNamespaceResponse: - """List namespaces with optional match conditions. - - Args: - prefix: Optional list of strings representing the prefix to filter namespaces. - suffix: Optional list of strings representing the suffix to filter namespaces. - max_depth: Optional integer specifying the maximum depth of namespaces to return. - limit: Maximum number of namespaces to return (default is 100). - offset: Number of namespaces to skip before returning results (default is 0). - - Returns: - List[List[str]]: A list of namespaces matching the criteria. - - Example Usage: - - namespaces = await client.store.list_namespaces( - prefix=["documents"], - max_depth=3, - limit=10, - offset=0 - ) - print(namespaces) - - ---------------------------------------------------------------- - - [ - ["documents", "user123", "reports"], - ["documents", "user456", "invoices"], - ... - ] - """ - payload = { - "prefix": prefix, - "suffix": suffix, - "max_depth": max_depth, - "limit": limit, - "offset": offset, - } - return await self.http.post("/store/namespaces", json=_provided_vals(payload)) - - -def get_sync_client( - *, - url: Optional[str] = None, - api_key: Optional[str] = None, - headers: Optional[dict[str, str]] = None, -) -> SyncLangGraphClient: - """Get a synchronous LangGraphClient instance. - - Args: - url: The URL of the LangGraph API. - api_key: The API key. If not provided, it will be read from the environment. - Precedence: - 1. explicit argument - 2. LANGGRAPH_API_KEY - 3. LANGSMITH_API_KEY - 4. LANGCHAIN_API_KEY - headers: Optional custom headers - Returns: - SyncLangGraphClient: The top-level synchronous client for accessing AssistantsClient, - ThreadsClient, RunsClient, and CronClient. - - Example: - - from langgraph_sdk import get_sync_client - - # get top-level synchronous LangGraphClient - client = get_sync_client(url="http://localhost:8123") - - # example usage: client..() - assistant = client.assistants.get(assistant_id="some_uuid") - """ - - if url is None: - url = "http://localhost:8123" - - transport = httpx.HTTPTransport(retries=5) - client = httpx.Client( - base_url=url, - transport=transport, - timeout=httpx.Timeout(connect=5, read=300, write=300, pool=5), - headers=get_headers(api_key, headers), - ) - return SyncLangGraphClient(client) - - -class SyncLangGraphClient: - """Synchronous client for interacting with the LangGraph API. - - This class provides synchronous access to LangGraph API endpoints for managing - assistants, threads, runs, cron jobs, and data storage. - - Example: - - client = get_sync_client() - assistant = client.assistants.get("asst_123") - """ - - def __init__(self, client: httpx.Client) -> None: - self.http = SyncHttpClient(client) - self.assistants = SyncAssistantsClient(self.http) - self.threads = SyncThreadsClient(self.http) - self.runs = SyncRunsClient(self.http) - self.crons = SyncCronClient(self.http) - self.store = SyncStoreClient(self.http) - - -class SyncHttpClient: - def __init__(self, client: httpx.Client) -> None: - self.client = client - - def get(self, path: str, *, params: Optional[QueryParamTypes] = None) -> Any: - """Send a GET request.""" - r = self.client.get(path, params=params) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = r.read().decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return decode_json(r) - - def post(self, path: str, *, json: Optional[dict]) -> Any: - """Send a POST request.""" - if json is not None: - headers, content = encode_json(json) - else: - headers, content = {}, b"" - r = self.client.post(path, headers=headers, content=content) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = r.read().decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return decode_json(r) - - def put(self, path: str, *, json: dict) -> Any: - """Send a PUT request.""" - headers, content = encode_json(json) - r = self.client.put(path, headers=headers, content=content) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = r.read().decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return decode_json(r) - - def patch(self, path: str, *, json: dict) -> Any: - """Send a PATCH request.""" - headers, content = encode_json(json) - r = self.client.patch(path, headers=headers, content=content) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = r.read().decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - return decode_json(r) - - def delete(self, path: str, *, json: Optional[Any] = None) -> None: - """Send a DELETE request.""" - r = self.client.request("DELETE", path, json=json) - try: - r.raise_for_status() - except httpx.HTTPStatusError as e: - body = r.read().decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - - def stream( - self, - path: str, - method: str, - *, - json: Optional[dict] = None, - params: Optional[QueryParamTypes] = None, - ) -> Iterator[StreamPart]: - """Stream the results of a request using SSE.""" - headers, content = encode_json(json) - with self.client.stream( - method, path, headers=headers, content=content, params=params - ) as res: - # check status - try: - res.raise_for_status() - except httpx.HTTPStatusError as e: - body = (res.read()).decode() - if sys.version_info >= (3, 11): - e.add_note(body) - else: - logger.error(f"Error from langgraph-api: {body}", exc_info=e) - raise e - # check content type - content_type = res.headers.get("content-type", "").partition(";")[0] - if "text/event-stream" not in content_type: - raise httpx.TransportError( - "Expected response header Content-Type to contain 'text/event-stream', " - f"got {content_type!r}" - ) - # parse SSE - decoder = SSEDecoder() - for line in iter_lines_raw(res): - sse = decoder.decode(line.rstrip(b"\n")) - if sse is not None: - yield sse - - -def encode_json(json: Any) -> tuple[dict[str, str], bytes]: - body = orjson.dumps( - json, - orjson_default, - orjson.OPT_SERIALIZE_NUMPY | orjson.OPT_NON_STR_KEYS, - ) - content_length = str(len(body)) - content_type = "application/json" - headers = {"Content-Length": content_length, "Content-Type": content_type} - return headers, body - - -def decode_json(r: httpx.Response) -> Any: - body = r.read() - return orjson.loads(body if body else None) - - -class SyncAssistantsClient: - """Client for managing assistants in LangGraph synchronously. - - This class provides methods to interact with assistants, which are versioned configurations of your graph. - - Example: - - client = get_client() - assistant = client.assistants.get("assistant_id_123") - """ - - def __init__(self, http: SyncHttpClient) -> None: - self.http = http - - def get(self, assistant_id: str) -> Assistant: - """Get an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get. - - Returns: - Assistant: Assistant Object. - - Example Usage: - - assistant = client.assistants.get( - assistant_id="my_assistant_id" - ) - print(assistant) - - ---------------------------------------------------- - - { - 'assistant_id': 'my_assistant_id', - 'graph_id': 'agent', - 'created_at': '2024-06-25T17:10:33.109781+00:00', - 'updated_at': '2024-06-25T17:10:33.109781+00:00', - 'config': {}, - 'metadata': {'created_by': 'system'} - } - - """ # noqa: E501 - return self.http.get(f"/assistants/{assistant_id}") - - def get_graph( - self, assistant_id: str, *, xray: Union[int, bool] = False - ) -> dict[str, list[dict[str, Any]]]: - """Get the graph of an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get the graph of. - xray: Include graph representation of subgraphs. If an integer value is provided, only subgraphs with a depth less than or equal to the value will be included. - - Returns: - Graph: The graph information for the assistant in JSON format. - - Example Usage: - - graph_info = client.assistants.get_graph( - assistant_id="my_assistant_id" - ) - print(graph_info) - - -------------------------------------------------------------------------------------------------------------------------- - - { - 'nodes': - [ - {'id': '__start__', 'type': 'schema', 'data': '__start__'}, - {'id': '__end__', 'type': 'schema', 'data': '__end__'}, - {'id': 'agent','type': 'runnable','data': {'id': ['langgraph', 'utils', 'RunnableCallable'],'name': 'agent'}}, - ], - 'edges': - [ - {'source': '__start__', 'target': 'agent'}, - {'source': 'agent','target': '__end__'} - ] - } - - - """ # noqa: E501 - return self.http.get(f"/assistants/{assistant_id}/graph", params={"xray": xray}) - - def get_schemas(self, assistant_id: str) -> GraphSchema: - """Get the schemas of an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get the schema of. - - Returns: - GraphSchema: The graph schema for the assistant. - - Example Usage: - - schema = client.assistants.get_schemas( - assistant_id="my_assistant_id" - ) - print(schema) - - ---------------------------------------------------------------------------------------------------------------------------- - - { - 'graph_id': 'agent', - 'state_schema': - { - 'title': 'LangGraphInput', - '$ref': '#/definitions/AgentState', - 'definitions': - { - 'BaseMessage': - { - 'title': 'BaseMessage', - 'description': 'Base abstract Message class. Messages are the inputs and outputs of ChatModels.', - 'type': 'object', - 'properties': - { - 'content': - { - 'title': 'Content', - 'anyOf': [ - {'type': 'string'}, - {'type': 'array','items': {'anyOf': [{'type': 'string'}, {'type': 'object'}]}} - ] - }, - 'additional_kwargs': - { - 'title': 'Additional Kwargs', - 'type': 'object' - }, - 'response_metadata': - { - 'title': 'Response Metadata', - 'type': 'object' - }, - 'type': - { - 'title': 'Type', - 'type': 'string' - }, - 'name': - { - 'title': 'Name', - 'type': 'string' - }, - 'id': - { - 'title': 'Id', - 'type': 'string' - } - }, - 'required': ['content', 'type'] - }, - 'AgentState': - { - 'title': 'AgentState', - 'type': 'object', - 'properties': - { - 'messages': - { - 'title': 'Messages', - 'type': 'array', - 'items': {'$ref': '#/definitions/BaseMessage'} - } - }, - 'required': ['messages'] - } - } - }, - 'config_schema': - { - 'title': 'Configurable', - 'type': 'object', - 'properties': - { - 'model_name': - { - 'title': 'Model Name', - 'enum': ['anthropic', 'openai'], - 'type': 'string' - } - } - } - } - - """ # noqa: E501 - return self.http.get(f"/assistants/{assistant_id}/schemas") - - def get_subgraphs( - self, assistant_id: str, namespace: Optional[str] = None, recurse: bool = False - ) -> Subgraphs: - """Get the schemas of an assistant by ID. - - Args: - assistant_id: The ID of the assistant to get the schema of. - - Returns: - Subgraphs: The graph schema for the assistant. - - """ # noqa: E501 - if namespace is not None: - return self.http.get( - f"/assistants/{assistant_id}/subgraphs/{namespace}", - params={"recurse": recurse}, - ) - else: - return self.http.get( - f"/assistants/{assistant_id}/subgraphs", - params={"recurse": recurse}, - ) - - def create( - self, - graph_id: Optional[str], - config: Optional[Config] = None, - *, - metadata: Json = None, - assistant_id: Optional[str] = None, - if_exists: Optional[OnConflictBehavior] = None, - name: Optional[str] = None, - ) -> Assistant: - """Create a new assistant. - - Useful when graph is configurable and you want to create different assistants based on different configurations. - - Args: - graph_id: The ID of the graph the assistant should use. The graph ID is normally set in your langgraph.json configuration. - config: Configuration to use for the graph. - metadata: Metadata to add to assistant. - assistant_id: Assistant ID to use, will default to a random UUID if not provided. - if_exists: How to handle duplicate creation. Defaults to 'raise' under the hood. - Must be either 'raise' (raise error if duplicate), or 'do_nothing' (return existing assistant). - name: The name of the assistant. Defaults to 'Untitled' under the hood. - - Returns: - Assistant: The created assistant. - - Example Usage: - - assistant = client.assistants.create( - graph_id="agent", - config={"configurable": {"model_name": "openai"}}, - metadata={"number":1}, - assistant_id="my-assistant-id", - if_exists="do_nothing", - name="my_name" - ) - """ # noqa: E501 - payload: Dict[str, Any] = { - "graph_id": graph_id, - } - if config: - payload["config"] = config - if metadata: - payload["metadata"] = metadata - if assistant_id: - payload["assistant_id"] = assistant_id - if if_exists: - payload["if_exists"] = if_exists - if name: - payload["name"] = name - return self.http.post("/assistants", json=payload) - - def update( - self, - assistant_id: str, - *, - graph_id: Optional[str] = None, - config: Optional[Config] = None, - metadata: Json = None, - name: Optional[str] = None, - ) -> Assistant: - """Update an assistant. - - Use this to point to a different graph, update the configuration, or change the metadata of an assistant. - - Args: - assistant_id: Assistant to update. - graph_id: The ID of the graph the assistant should use. - The graph ID is normally set in your langgraph.json configuration. If None, assistant will keep pointing to same graph. - config: Configuration to use for the graph. - metadata: Metadata to merge with existing assistant metadata. - name: The new name for the assistant. - - Returns: - Assistant: The updated assistant. - - Example Usage: - - assistant = client.assistants.update( - assistant_id='e280dad7-8618-443f-87f1-8e41841c180f', - graph_id="other-graph", - config={"configurable": {"model_name": "anthropic"}}, - metadata={"number":2} - ) - - """ # noqa: E501 - payload: Dict[str, Any] = {} - if graph_id: - payload["graph_id"] = graph_id - if config: - payload["config"] = config - if metadata: - payload["metadata"] = metadata - if name: - payload["name"] = name - return self.http.patch( - f"/assistants/{assistant_id}", - json=payload, - ) - - def delete( - self, - assistant_id: str, - ) -> None: - """Delete an assistant. - - Args: - assistant_id: The assistant ID to delete. - - Returns: - None - - Example Usage: - - client.assistants.delete( - assistant_id="my_assistant_id" - ) - - """ # noqa: E501 - self.http.delete(f"/assistants/{assistant_id}") - - def search( - self, - *, - metadata: Json = None, - graph_id: Optional[str] = None, - limit: int = 10, - offset: int = 0, - ) -> list[Assistant]: - """Search for assistants. - - Args: - metadata: Metadata to filter by. Exact match filter for each KV pair. - graph_id: The ID of the graph to filter by. - The graph ID is normally set in your langgraph.json configuration. - limit: The maximum number of results to return. - offset: The number of results to skip. - - Returns: - list[Assistant]: A list of assistants. - - Example Usage: - - assistants = client.assistants.search( - metadata = {"name":"my_name"}, - graph_id="my_graph_id", - limit=5, - offset=5 - ) - """ - payload: Dict[str, Any] = { - "limit": limit, - "offset": offset, - } - if metadata: - payload["metadata"] = metadata - if graph_id: - payload["graph_id"] = graph_id - return self.http.post( - "/assistants/search", - json=payload, - ) - - def get_versions( - self, - assistant_id: str, - metadata: Json = None, - limit: int = 10, - offset: int = 0, - ) -> list[AssistantVersion]: - """List all versions of an assistant. - - Args: - assistant_id: The assistant ID to get versions for. - metadata: Metadata to filter versions by. Exact match filter for each KV pair. - limit: The maximum number of versions to return. - offset: The number of versions to skip. - - Returns: - list[Assistant]: A list of assistants. - - Example Usage: - - assistant_versions = await client.assistants.get_versions( - assistant_id="my_assistant_id" - ) - - """ # noqa: E501 - - payload: Dict[str, Any] = { - "limit": limit, - "offset": offset, - } - if metadata: - payload["metadata"] = metadata - return self.http.post(f"/assistants/{assistant_id}/versions", json=payload) - - def set_latest(self, assistant_id: str, version: int) -> Assistant: - """Change the version of an assistant. - - Args: - assistant_id: The assistant ID to delete. - version: The version to change to. - - Returns: - Assistant: Assistant Object. - - Example Usage: - - new_version_assistant = await client.assistants.set_latest( - assistant_id="my_assistant_id", - version=3 - ) - - """ # noqa: E501 - - payload: Dict[str, Any] = {"version": version} - - return self.http.post(f"/assistants/{assistant_id}/latest", json=payload) - - -class SyncThreadsClient: - """Synchronous client for managing threads in LangGraph. - - This class provides methods to create, retrieve, and manage threads, - which represent conversations or stateful interactions. - - Example: - - client = get_sync_client() - thread = client.threads.create(metadata={"user_id": "123"}) - """ - - def __init__(self, http: SyncHttpClient) -> None: - self.http = http - - def get(self, thread_id: str) -> Thread: - """Get a thread by ID. - - Args: - thread_id: The ID of the thread to get. - - Returns: - Thread: Thread object. - - Example Usage: - - thread = client.threads.get( - thread_id="my_thread_id" - ) - print(thread) - - ----------------------------------------------------- - - { - 'thread_id': 'my_thread_id', - 'created_at': '2024-07-18T18:35:15.540834+00:00', - 'updated_at': '2024-07-18T18:35:15.540834+00:00', - 'metadata': {'graph_id': 'agent'} - } - - """ # noqa: E501 - - return self.http.get(f"/threads/{thread_id}") - - def create( - self, - *, - metadata: Json = None, - thread_id: Optional[str] = None, - if_exists: Optional[OnConflictBehavior] = None, - ) -> Thread: - """Create a new thread. - - Args: - metadata: Metadata to add to thread. - thread_id: ID of thread. - If None, ID will be a randomly generated UUID. - if_exists: How to handle duplicate creation. Defaults to 'raise' under the hood. - Must be either 'raise' (raise error if duplicate), or 'do_nothing' (return existing thread). - - Returns: - Thread: The created thread. - - Example Usage: - - thread = client.threads.create( - metadata={"number":1}, - thread_id="my-thread-id", - if_exists="raise" - ) - """ # noqa: E501 - payload: Dict[str, Any] = {} - if thread_id: - payload["thread_id"] = thread_id - if metadata: - payload["metadata"] = metadata - if if_exists: - payload["if_exists"] = if_exists - return self.http.post("/threads", json=payload) - - def update(self, thread_id: str, *, metadata: dict[str, Any]) -> Thread: - """Update a thread. - - Args: - thread_id: ID of thread to update. - metadata: Metadata to merge with existing thread metadata. - - Returns: - Thread: The created thread. - - Example Usage: - - thread = client.threads.update( - thread_id="my-thread-id", - metadata={"number":1}, - ) - """ # noqa: E501 - return self.http.patch(f"/threads/{thread_id}", json={"metadata": metadata}) - - def delete(self, thread_id: str) -> None: - """Delete a thread. - - Args: - thread_id: The ID of the thread to delete. - - Returns: - None - - Example Usage: - - client.threads.delete( - thread_id="my_thread_id" - ) - - """ # noqa: E501 - self.http.delete(f"/threads/{thread_id}") - - def search( - self, - *, - metadata: Json = None, - values: Json = None, - status: Optional[ThreadStatus] = None, - limit: int = 10, - offset: int = 0, - ) -> list[Thread]: - """Search for threads. - - Args: - metadata: Thread metadata to filter on. - values: State values to filter on. - status: Thread status to filter on. - Must be one of 'idle', 'busy', 'interrupted' or 'error'. - limit: Limit on number of threads to return. - offset: Offset in threads table to start search from. - - Returns: - list[Thread]: List of the threads matching the search parameters. - - Example Usage: - - threads = client.threads.search( - metadata={"number":1}, - status="interrupted", - limit=15, - offset=5 - ) - - """ # noqa: E501 - payload: Dict[str, Any] = { - "limit": limit, - "offset": offset, - } - if metadata: - payload["metadata"] = metadata - if values: - payload["values"] = values - if status: - payload["status"] = status - return self.http.post( - "/threads/search", - json=payload, - ) - - def copy(self, thread_id: str) -> None: - """Copy a thread. - - Args: - thread_id: The ID of the thread to copy. - - Returns: - None - - Example Usage: - - client.threads.copy( - thread_id="my_thread_id" - ) - - """ # noqa: E501 - return self.http.post(f"/threads/{thread_id}/copy", json=None) - - def get_state( - self, - thread_id: str, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, # deprecated - *, - subgraphs: bool = False, - ) -> ThreadState: - """Get the state of a thread. - - Args: - thread_id: The ID of the thread to get the state of. - checkpoint: The checkpoint to get the state of. - subgraphs: Include subgraphs states. - - Returns: - ThreadState: the thread of the state. - - Example Usage: - - thread_state = client.threads.get_state( - thread_id="my_thread_id", - checkpoint_id="my_checkpoint_id" - ) - print(thread_state) - - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - { - 'values': { - 'messages': [ - { - 'content': 'how are you?', - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'human', - 'name': None, - 'id': 'fe0a5778-cfe9-42ee-b807-0adaa1873c10', - 'example': False - }, - { - 'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'ai', - 'name': None, - 'id': 'run-159b782c-b679-4830-83c6-cef87798fe8b', - 'example': False, - 'tool_calls': [], - 'invalid_tool_calls': [], - 'usage_metadata': None - } - ] - }, - 'next': [], - 'checkpoint': - { - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'checkpoint_ns': '', - 'checkpoint_id': '1ef4a9b8-e6fb-67b1-8001-abd5184439d1' - } - 'metadata': - { - 'step': 1, - 'run_id': '1ef4a9b8-d7da-679a-a45a-872054341df2', - 'source': 'loop', - 'writes': - { - 'agent': - { - 'messages': [ - { - 'id': 'run-159b782c-b679-4830-83c6-cef87798fe8b', - 'name': None, - 'type': 'ai', - 'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", - 'example': False, - 'tool_calls': [], - 'usage_metadata': None, - 'additional_kwargs': {}, - 'response_metadata': {}, - 'invalid_tool_calls': [] - } - ] - } - }, - 'user_id': None, - 'graph_id': 'agent', - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'created_by': 'system', - 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca'}, - 'created_at': '2024-07-25T15:35:44.184703+00:00', - 'parent_config': - { - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'checkpoint_ns': '', - 'checkpoint_id': '1ef4a9b8-d80d-6fa7-8000-9300467fad0f' - } - } - - """ # noqa: E501 - if checkpoint: - return self.http.post( - f"/threads/{thread_id}/state/checkpoint", - json={"checkpoint": checkpoint, "subgraphs": subgraphs}, - ) - elif checkpoint_id: - return self.http.get( - f"/threads/{thread_id}/state/{checkpoint_id}", - params={"subgraphs": subgraphs}, - ) - else: - return self.http.get( - f"/threads/{thread_id}/state", - params={"subgraphs": subgraphs}, - ) - - def update_state( - self, - thread_id: str, - values: Optional[Union[dict, Sequence[dict]]], - *, - as_node: Optional[str] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, # deprecated - ) -> ThreadUpdateStateResponse: - """Update the state of a thread. - - Args: - thread_id: The ID of the thread to update. - values: The values to update the state with. - as_node: Update the state as if this node had just executed. - checkpoint: The checkpoint to update the state of. - - Returns: - ThreadUpdateStateResponse: Response after updating a thread's state. - - Example Usage: - - response = client.threads.update_state( - thread_id="my_thread_id", - values={"messages":[{"role": "user", "content": "hello!"}]}, - as_node="my_node", - ) - print(response) - - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - { - 'checkpoint': { - 'thread_id': 'e2496803-ecd5-4e0c-a779-3226296181c2', - 'checkpoint_ns': '', - 'checkpoint_id': '1ef4a9b8-e6fb-67b1-8001-abd5184439d1', - 'checkpoint_map': {} - } - } - - """ # noqa: E501 - payload: Dict[str, Any] = { - "values": values, - } - if checkpoint_id: - payload["checkpoint_id"] = checkpoint_id - if checkpoint: - payload["checkpoint"] = checkpoint - if as_node: - payload["as_node"] = as_node - return self.http.post(f"/threads/{thread_id}/state", json=payload) - - def get_history( - self, - thread_id: str, - *, - limit: int = 10, - before: Optional[str | Checkpoint] = None, - metadata: Optional[dict] = None, - checkpoint: Optional[Checkpoint] = None, - ) -> list[ThreadState]: - """Get the state history of a thread. - - Args: - thread_id: The ID of the thread to get the state history for. - checkpoint: Return states for this subgraph. If empty defaults to root. - limit: The maximum number of states to return. - before: Return states before this checkpoint. - metadata: Filter states by metadata key-value pairs. - - Returns: - list[ThreadState]: the state history of the thread. - - Example Usage: - - thread_state = client.threads.get_history( - thread_id="my_thread_id", - limit=5, - before="my_timestamp", - metadata={"name":"my_name"} - ) - - """ # noqa: E501 - payload: Dict[str, Any] = { - "limit": limit, - } - if before: - payload["before"] = before - if metadata: - payload["metadata"] = metadata - if checkpoint: - payload["checkpoint"] = checkpoint - return self.http.post(f"/threads/{thread_id}/history", json=payload) - - -class SyncRunsClient: - """Synchronous client for managing runs in LangGraph. - - This class provides methods to create, retrieve, and manage runs, which represent - individual executions of graphs. - - Example: - - client = get_sync_client() - run = client.runs.create(thread_id="thread_123", assistant_id="asst_456") - """ - - def __init__(self, http: SyncHttpClient) -> None: - self.http = http - - @overload - def stream( - self, - thread_id: str, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - feedback_keys: Optional[Sequence[str]] = None, - on_disconnect: Optional[DisconnectMode] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Iterator[StreamPart]: ... - - @overload - def stream( - self, - thread_id: None, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - feedback_keys: Optional[Sequence[str]] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - webhook: Optional[str] = None, - after_seconds: Optional[int] = None, - ) -> Iterator[StreamPart]: ... - - def stream( - self, - thread_id: Optional[str], - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - feedback_keys: Optional[Sequence[str]] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Iterator[StreamPart]: - """Create a run and stream the results. - - Args: - thread_id: the thread ID to assign to the thread. - If None will create a stateless run. - assistant_id: The assistant ID or graph name to stream from. - If using graph name, will default to first assistant created from that graph. - input: The input to the graph. - command: The command to execute. - stream_mode: The stream mode(s) to use. - stream_subgraphs: Whether to stream output from subgraphs. - metadata: Metadata to assign to the run. - config: The configuration for the assistant. - checkpoint: The checkpoint to resume from. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - feedback_keys: Feedback keys to assign to run. - on_disconnect: The disconnect mode to use. - Must be one of 'cancel' or 'continue'. - on_completion: Whether to delete or keep the thread created for a stateless run. - Must be one of 'delete' or 'keep'. - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - if_not_exists: How to handle missing thread. Defaults to 'reject'. - Must be either 'reject' (raise error if missing), or 'create' (create new thread). - after_seconds: The number of seconds to wait before starting the run. - Use to schedule future runs. - - Returns: - Iterator[StreamPart]: Iterator of stream results. - - Example Usage: - - async for chunk in client.runs.stream( - thread_id=None, - assistant_id="agent", - input={"messages": [{"role": "user", "content": "how are you?"}]}, - stream_mode=["values","debug"], - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "anthropic"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - feedback_keys=["my_feedback_key_1","my_feedback_key_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ): - print(chunk) - - ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - - StreamPart(event='metadata', data={'run_id': '1ef4a9b8-d7da-679a-a45a-872054341df2'}) - StreamPart(event='values', data={'messages': [{'content': 'how are you?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'fe0a5778-cfe9-42ee-b807-0adaa1873c10', 'example': False}]}) - StreamPart(event='values', data={'messages': [{'content': 'how are you?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'fe0a5778-cfe9-42ee-b807-0adaa1873c10', 'example': False}, {'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run-159b782c-b679-4830-83c6-cef87798fe8b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}]}) - StreamPart(event='end', data=None) - - """ # noqa: E501 - payload = { - "input": input, - "command": ( - {k: v for k, v in command.items() if v is not None} if command else None - ), - "config": config, - "metadata": metadata, - "stream_mode": stream_mode, - "stream_subgraphs": stream_subgraphs, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "feedback_keys": feedback_keys, - "webhook": webhook, - "checkpoint": checkpoint, - "checkpoint_id": checkpoint_id, - "multitask_strategy": multitask_strategy, - "if_not_exists": if_not_exists, - "on_disconnect": on_disconnect, - "on_completion": on_completion, - "after_seconds": after_seconds, - } - endpoint = ( - f"/threads/{thread_id}/runs/stream" - if thread_id is not None - else "/runs/stream" - ) - return self.http.stream( - endpoint, "POST", json={k: v for k, v in payload.items() if v is not None} - ) - - @overload - def create( - self, - thread_id: None, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Run: ... - - @overload - def create( - self, - thread_id: str, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Run: ... - - def create( - self, - thread_id: Optional[str], - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - stream_mode: Union[StreamMode, Sequence[StreamMode]] = "values", - stream_subgraphs: bool = False, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Run: - """Create a background run. - - Args: - thread_id: the thread ID to assign to the thread. - If None will create a stateless run. - assistant_id: The assistant ID or graph name to stream from. - If using graph name, will default to first assistant created from that graph. - input: The input to the graph. - command: The command to execute. - stream_mode: The stream mode(s) to use. - stream_subgraphs: Whether to stream output from subgraphs. - metadata: Metadata to assign to the run. - config: The configuration for the assistant. - checkpoint: The checkpoint to resume from. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - on_completion: Whether to delete or keep the thread created for a stateless run. - Must be one of 'delete' or 'keep'. - if_not_exists: How to handle missing thread. Defaults to 'reject'. - Must be either 'reject' (raise error if missing), or 'create' (create new thread). - after_seconds: The number of seconds to wait before starting the run. - Use to schedule future runs. - - Returns: - Run: The created background run. - - Example Usage: - - background_run = client.runs.create( - thread_id="my_thread_id", - assistant_id="my_assistant_id", - input={"messages": [{"role": "user", "content": "hello!"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "openai"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - print(background_run) - - -------------------------------------------------------------------------------- - - { - 'run_id': 'my_run_id', - 'thread_id': 'my_thread_id', - 'assistant_id': 'my_assistant_id', - 'created_at': '2024-07-25T15:35:42.598503+00:00', - 'updated_at': '2024-07-25T15:35:42.598503+00:00', - 'metadata': {}, - 'status': 'pending', - 'kwargs': - { - 'input': - { - 'messages': [ - { - 'role': 'user', - 'content': 'how are you?' - } - ] - }, - 'config': - { - 'metadata': - { - 'created_by': 'system' - }, - 'configurable': - { - 'run_id': 'my_run_id', - 'user_id': None, - 'graph_id': 'agent', - 'thread_id': 'my_thread_id', - 'checkpoint_id': None, - 'model_name': "openai", - 'assistant_id': 'my_assistant_id' - } - }, - 'webhook': "https://my.fake.webhook.com", - 'temporary': False, - 'stream_mode': ['values'], - 'feedback_keys': None, - 'interrupt_after': ["node_to_stop_after_1","node_to_stop_after_2"], - 'interrupt_before': ["node_to_stop_before_1","node_to_stop_before_2"] - }, - 'multitask_strategy': 'interrupt' - } - - """ # noqa: E501 - payload = { - "input": input, - "command": ( - {k: v for k, v in command.items() if v is not None} if command else None - ), - "stream_mode": stream_mode, - "stream_subgraphs": stream_subgraphs, - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - "checkpoint": checkpoint, - "checkpoint_id": checkpoint_id, - "multitask_strategy": multitask_strategy, - "if_not_exists": if_not_exists, - "on_completion": on_completion, - "after_seconds": after_seconds, - } - payload = {k: v for k, v in payload.items() if v is not None} - if thread_id: - return self.http.post(f"/threads/{thread_id}/runs", json=payload) - else: - return self.http.post("/runs", json=payload) - - def create_batch(self, payloads: list[RunCreate]) -> list[Run]: - """Create a batch of stateless background runs.""" - - def filter_payload(payload: RunCreate): - return {k: v for k, v in payload.items() if v is not None} - - payloads = [filter_payload(payload) for payload in payloads] - return self.http.post("/runs/batch", json=payloads) - - @overload - def wait( - self, - thread_id: str, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_disconnect: Optional[DisconnectMode] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Union[list[dict], dict[str, Any]]: ... - - @overload - def wait( - self, - thread_id: None, - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Union[list[dict], dict[str, Any]]: ... - - def wait( - self, - thread_id: Optional[str], - assistant_id: str, - *, - input: Optional[dict] = None, - command: Optional[Command] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - checkpoint: Optional[Checkpoint] = None, - checkpoint_id: Optional[str] = None, - interrupt_before: Optional[Union[All, Sequence[str]]] = None, - interrupt_after: Optional[Union[All, Sequence[str]]] = None, - webhook: Optional[str] = None, - on_disconnect: Optional[DisconnectMode] = None, - on_completion: Optional[OnCompletionBehavior] = None, - multitask_strategy: Optional[MultitaskStrategy] = None, - if_not_exists: Optional[IfNotExists] = None, - after_seconds: Optional[int] = None, - ) -> Union[list[dict], dict[str, Any]]: - """Create a run, wait until it finishes and return the final state. - - Args: - thread_id: the thread ID to create the run on. - If None will create a stateless run. - assistant_id: The assistant ID or graph name to run. - If using graph name, will default to first assistant created from that graph. - input: The input to the graph. - command: The command to execute. - metadata: Metadata to assign to the run. - config: The configuration for the assistant. - checkpoint: The checkpoint to resume from. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - webhook: Webhook to call after LangGraph API call is done. - on_disconnect: The disconnect mode to use. - Must be one of 'cancel' or 'continue'. - on_completion: Whether to delete or keep the thread created for a stateless run. - Must be one of 'delete' or 'keep'. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - if_not_exists: How to handle missing thread. Defaults to 'reject'. - Must be either 'reject' (raise error if missing), or 'create' (create new thread). - after_seconds: The number of seconds to wait before starting the run. - Use to schedule future runs. - - Returns: - Union[list[dict], dict[str, Any]]: The output of the run. - - Example Usage: - - final_state_of_run = client.runs.wait( - thread_id=None, - assistant_id="agent", - input={"messages": [{"role": "user", "content": "how are you?"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "anthropic"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - print(final_state_of_run) - - ------------------------------------------------------------------------------------------------------------------------------------------- - - { - 'messages': [ - { - 'content': 'how are you?', - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'human', - 'name': None, - 'id': 'f51a862c-62fe-4866-863b-b0863e8ad78a', - 'example': False - }, - { - 'content': "I'm doing well, thanks for asking! I'm an AI assistant created by Anthropic to be helpful, honest, and harmless.", - 'additional_kwargs': {}, - 'response_metadata': {}, - 'type': 'ai', - 'name': None, - 'id': 'run-bf1cd3c6-768f-4c16-b62d-ba6f17ad8b36', - 'example': False, - 'tool_calls': [], - 'invalid_tool_calls': [], - 'usage_metadata': None - } - ] - } - - """ # noqa: E501 - payload = { - "input": input, - "command": ( - {k: v for k, v in command.items() if v is not None} if command else None - ), - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - "checkpoint": checkpoint, - "checkpoint_id": checkpoint_id, - "multitask_strategy": multitask_strategy, - "if_not_exists": if_not_exists, - "on_disconnect": on_disconnect, - "on_completion": on_completion, - "after_seconds": after_seconds, - } - endpoint = ( - f"/threads/{thread_id}/runs/wait" if thread_id is not None else "/runs/wait" - ) - return self.http.post( - endpoint, json={k: v for k, v in payload.items() if v is not None} - ) - - def list(self, thread_id: str, *, limit: int = 10, offset: int = 0) -> List[Run]: - """List runs. - - Args: - thread_id: The thread ID to list runs for. - limit: The maximum number of results to return. - offset: The number of results to skip. - - Returns: - List[Run]: The runs for the thread. - - Example Usage: - - client.runs.list( - thread_id="thread_id", - limit=5, - offset=5, - ) - - """ # noqa: E501 - return self.http.get(f"/threads/{thread_id}/runs?limit={limit}&offset={offset}") - - def get(self, thread_id: str, run_id: str) -> Run: - """Get a run. - - Args: - thread_id: The thread ID to get. - run_id: The run ID to get. - - Returns: - Run: Run object. - - Example Usage: - - run = client.runs.get( - thread_id="thread_id_to_delete", - run_id="run_id_to_delete", - ) - - """ # noqa: E501 - - return self.http.get(f"/threads/{thread_id}/runs/{run_id}") - - def cancel( - self, - thread_id: str, - run_id: str, - *, - wait: bool = False, - action: CancelAction = "interrupt", - ) -> None: - """Get a run. - - Args: - thread_id: The thread ID to cancel. - run_id: The run ID to cancel. - wait: Whether to wait until run has completed. - action: Action to take when cancelling the run. Possible values - are `interrupt` or `rollback`. Default is `interrupt`. - - Returns: - None - - Example Usage: - - client.runs.cancel( - thread_id="thread_id_to_cancel", - run_id="run_id_to_cancel", - wait=True, - action="interrupt" - ) - - """ # noqa: E501 - return self.http.post( - f"/threads/{thread_id}/runs/{run_id}/cancel?wait={1 if wait else 0}&action={action}", - json=None, - ) - - def join(self, thread_id: str, run_id: str) -> dict: - """Block until a run is done. Returns the final state of the thread. - - Args: - thread_id: The thread ID to join. - run_id: The run ID to join. - - Returns: - None - - Example Usage: - - client.runs.join( - thread_id="thread_id_to_join", - run_id="run_id_to_join" - ) - - """ # noqa: E501 - return self.http.get(f"/threads/{thread_id}/runs/{run_id}/join") - - def join_stream(self, thread_id: str, run_id: str) -> Iterator[StreamPart]: - """Stream output from a run in real-time, until the run is done. - Output is not buffered, so any output produced before this call will - not be received here. - - Args: - thread_id: The thread ID to join. - run_id: The run ID to join. - - Returns: - None - - Example Usage: - - client.runs.join_stream( - thread_id="thread_id_to_join", - run_id="run_id_to_join" - ) - - """ # noqa: E501 - return self.http.stream(f"/threads/{thread_id}/runs/{run_id}/stream", "GET") - - def delete(self, thread_id: str, run_id: str) -> None: - """Delete a run. - - Args: - thread_id: The thread ID to delete. - run_id: The run ID to delete. - - Returns: - None - - Example Usage: - - client.runs.delete( - thread_id="thread_id_to_delete", - run_id="run_id_to_delete" - ) - - """ # noqa: E501 - self.http.delete(f"/threads/{thread_id}/runs/{run_id}") - - -class SyncCronClient: - """Synchronous client for managing cron jobs in LangGraph. - - This class provides methods to create and manage scheduled tasks (cron jobs) for automated graph executions. - - Example: - - client = get_sync_client() - cron_job = client.crons.create_for_thread(thread_id="thread_123", assistant_id="asst_456", schedule="0 * * * *") - """ - - def __init__(self, http_client: SyncHttpClient) -> None: - self.http = http_client - - def create_for_thread( - self, - thread_id: str, - assistant_id: str, - *, - schedule: str, - input: Optional[dict] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, list[str]]] = None, - interrupt_after: Optional[Union[All, list[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[str] = None, - ) -> Run: - """Create a cron job for a thread. - - Args: - thread_id: the thread ID to run the cron job on. - assistant_id: The assistant ID or graph name to use for the cron job. - If using graph name, will default to first assistant created from that graph. - schedule: The cron schedule to execute this job on. - input: The input to the graph. - metadata: Metadata to assign to the cron job runs. - config: The configuration for the assistant. - interrupt_before: Nodes to interrupt immediately before they get executed. - - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - - Returns: - Run: The cron run. - - Example Usage: - - cron_run = client.crons.create_for_thread( - thread_id="my-thread-id", - assistant_id="agent", - schedule="27 15 * * *", - input={"messages": [{"role": "user", "content": "hello!"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "openai"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - - """ # noqa: E501 - payload = { - "schedule": schedule, - "input": input, - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - } - if multitask_strategy: - payload["multitask_strategy"] = multitask_strategy - payload = {k: v for k, v in payload.items() if v is not None} - return self.http.post(f"/threads/{thread_id}/runs/crons", json=payload) - - def create( - self, - assistant_id: str, - *, - schedule: str, - input: Optional[dict] = None, - metadata: Optional[dict] = None, - config: Optional[Config] = None, - interrupt_before: Optional[Union[All, list[str]]] = None, - interrupt_after: Optional[Union[All, list[str]]] = None, - webhook: Optional[str] = None, - multitask_strategy: Optional[str] = None, - ) -> Run: - """Create a cron run. - - Args: - assistant_id: The assistant ID or graph name to use for the cron job. - If using graph name, will default to first assistant created from that graph. - schedule: The cron schedule to execute this job on. - input: The input to the graph. - metadata: Metadata to assign to the cron job runs. - config: The configuration for the assistant. - interrupt_before: Nodes to interrupt immediately before they get executed. - interrupt_after: Nodes to Nodes to interrupt immediately after they get executed. - webhook: Webhook to call after LangGraph API call is done. - multitask_strategy: Multitask strategy to use. - Must be one of 'reject', 'interrupt', 'rollback', or 'enqueue'. - - Returns: - Run: The cron run. - - Example Usage: - - cron_run = client.crons.create( - assistant_id="agent", - schedule="27 15 * * *", - input={"messages": [{"role": "user", "content": "hello!"}]}, - metadata={"name":"my_run"}, - config={"configurable": {"model_name": "openai"}}, - interrupt_before=["node_to_stop_before_1","node_to_stop_before_2"], - interrupt_after=["node_to_stop_after_1","node_to_stop_after_2"], - webhook="https://my.fake.webhook.com", - multitask_strategy="interrupt" - ) - - """ # noqa: E501 - payload = { - "schedule": schedule, - "input": input, - "config": config, - "metadata": metadata, - "assistant_id": assistant_id, - "interrupt_before": interrupt_before, - "interrupt_after": interrupt_after, - "webhook": webhook, - } - if multitask_strategy: - payload["multitask_strategy"] = multitask_strategy - payload = {k: v for k, v in payload.items() if v is not None} - return self.http.post("/runs/crons", json=payload) - - def delete(self, cron_id: str) -> None: - """Delete a cron. - - Args: - cron_id: The cron ID to delete. - - Returns: - None - - Example Usage: - - client.crons.delete( - cron_id="cron_to_delete" - ) - - """ # noqa: E501 - self.http.delete(f"/runs/crons/{cron_id}") - - def search( - self, - *, - assistant_id: Optional[str] = None, - thread_id: Optional[str] = None, - limit: int = 10, - offset: int = 0, - ) -> list[Cron]: - """Get a list of cron jobs. - - Args: - assistant_id: The assistant ID or graph name to search for. - thread_id: the thread ID to search for. - limit: The maximum number of results to return. - offset: The number of results to skip. - - Returns: - list[Cron]: The list of cron jobs returned by the search, - - Example Usage: - - cron_jobs = client.crons.search( - assistant_id="my_assistant_id", - thread_id="my_thread_id", - limit=5, - offset=5, - ) - print(cron_jobs) - - ---------------------------------------------------------- - - [ - { - 'cron_id': '1ef3cefa-4c09-6926-96d0-3dc97fd5e39b', - 'assistant_id': 'my_assistant_id', - 'thread_id': 'my_thread_id', - 'user_id': None, - 'payload': - { - 'input': {'start_time': ''}, - 'schedule': '4 * * * *', - 'assistant_id': 'my_assistant_id' - }, - 'schedule': '4 * * * *', - 'next_run_date': '2024-07-25T17:04:00+00:00', - 'end_time': None, - 'created_at': '2024-07-08T06:02:23.073257+00:00', - 'updated_at': '2024-07-08T06:02:23.073257+00:00' - } - ] - - """ # noqa: E501 - payload = { - "assistant_id": assistant_id, - "thread_id": thread_id, - "limit": limit, - "offset": offset, - } - payload = {k: v for k, v in payload.items() if v is not None} - return self.http.post("/runs/crons/search", json=payload) - - -class SyncStoreClient: - """A client for synchronous operations on a key-value store. - - Provides methods to interact with a remote key-value store, allowing - storage and retrieval of items within namespaced hierarchies. - - Example: - - client = get_sync_client() - client.store.put_item(["users", "profiles"], "user123", {"name": "Alice", "age": 30}) - """ - - def __init__(self, http: SyncHttpClient) -> None: - self.http = http - - def put_item( - self, - namespace: Sequence[str], - /, - key: str, - value: dict[str, Any], - index: Optional[Union[Literal[False], list[str]]] = None, - ) -> None: - """Store or update an item. - - Args: - namespace: A list of strings representing the namespace path. - key: The unique identifier for the item within the namespace. - value: A dictionary containing the item's data. - index: Controls search indexing - None (use defaults), False (disable), or list of field paths to index. - - Returns: - None - - Example Usage: - - client.store.put_item( - ["documents", "user123"], - key="item456", - value={"title": "My Document", "content": "Hello World"} - ) - """ - for label in namespace: - if "." in label: - raise ValueError( - f"Invalid namespace label '{label}'. Namespace labels cannot contain periods ('.')." - ) - payload = { - "namespace": namespace, - "key": key, - "value": value, - "index": index, - } - self.http.put("/store/items", json=payload) - - def get_item(self, namespace: Sequence[str], /, key: str) -> Item: - """Retrieve a single item. - - Args: - key: The unique identifier for the item. - namespace: Optional list of strings representing the namespace path. - - Returns: - Item: The retrieved item. - - Example Usage: - - item = client.store.get_item( - ["documents", "user123"], - key="item456", - ) - print(item) - - ---------------------------------------------------------------- - - { - 'namespace': ['documents', 'user123'], - 'key': 'item456', - 'value': {'title': 'My Document', 'content': 'Hello World'}, - 'created_at': '2024-07-30T12:00:00Z', - 'updated_at': '2024-07-30T12:00:00Z' - } - """ - for label in namespace: - if "." in label: - raise ValueError( - f"Invalid namespace label '{label}'. Namespace labels cannot contain periods ('.')." - ) - - return self.http.get( - "/store/items", params={"key": key, "namespace": ".".join(namespace)} - ) - - def delete_item(self, namespace: Sequence[str], /, key: str) -> None: - """Delete an item. - - Args: - key: The unique identifier for the item. - namespace: Optional list of strings representing the namespace path. - - Returns: - None - - Example Usage: - - client.store.delete_item( - ["documents", "user123"], - key="item456", - ) - """ - self.http.delete("/store/items", json={"key": key, "namespace": namespace}) - - def search_items( - self, - namespace_prefix: Sequence[str], - /, - filter: Optional[dict[str, Any]] = None, - limit: int = 10, - offset: int = 0, - query: Optional[str] = None, - ) -> SearchItemsResponse: - """Search for items within a namespace prefix. - - Args: - namespace_prefix: List of strings representing the namespace prefix. - filter: Optional dictionary of key-value pairs to filter results. - limit: Maximum number of items to return (default is 10). - offset: Number of items to skip before returning results (default is 0). - query: Optional query for natural language search. - - Returns: - List[Item]: A list of items matching the search criteria. - - Example Usage: - - items = client.store.search_items( - ["documents"], - filter={"author": "John Doe"}, - limit=5, - offset=0 - ) - print(items) - - ---------------------------------------------------------------- - - { - "items": [ - { - "namespace": ["documents", "user123"], - "key": "item789", - "value": { - "title": "Another Document", - "author": "John Doe" - }, - "created_at": "2024-07-30T12:00:00Z", - "updated_at": "2024-07-30T12:00:00Z" - }, - # ... additional items ... - ] - } - """ - payload = { - "namespace_prefix": namespace_prefix, - "filter": filter, - "limit": limit, - "offset": offset, - "query": query, - } - return self.http.post("/store/items/search", json=_provided_vals(payload)) - - def list_namespaces( - self, - prefix: Optional[List[str]] = None, - suffix: Optional[List[str]] = None, - max_depth: Optional[int] = None, - limit: int = 100, - offset: int = 0, - ) -> ListNamespaceResponse: - """List namespaces with optional match conditions. - - Args: - prefix: Optional list of strings representing the prefix to filter namespaces. - suffix: Optional list of strings representing the suffix to filter namespaces. - max_depth: Optional integer specifying the maximum depth of namespaces to return. - limit: Maximum number of namespaces to return (default is 100). - offset: Number of namespaces to skip before returning results (default is 0). - - Returns: - List[List[str]]: A list of namespaces matching the criteria. - - Example Usage: - - namespaces = client.store.list_namespaces( - prefix=["documents"], - max_depth=3, - limit=10, - offset=0 - ) - print(namespaces) - - ---------------------------------------------------------------- - - [ - ["documents", "user123", "reports"], - ["documents", "user456", "invoices"], - ... - ] - """ - payload = { - "prefix": prefix, - "suffix": suffix, - "max_depth": max_depth, - "limit": limit, - "offset": offset, - } - return self.http.post("/store/namespaces", json=_provided_vals(payload)) - - -def _provided_vals(d: dict): - return {k: v for k, v in d.items() if v is not None} - - -_registered_transports: list[httpx.ASGITransport] = [] - - -# Do not move; this is used in the server. -def configure_loopback_transports(app: Any) -> None: - for transport in _registered_transports: - transport.app = app diff --git a/libs/sdk-py/langgraph_sdk/py.typed b/libs/sdk-py/langgraph_sdk/py.typed deleted file mode 100644 index e69de29bb..000000000 diff --git a/libs/sdk-py/langgraph_sdk/schema.py b/libs/sdk-py/langgraph_sdk/schema.py deleted file mode 100644 index ab5ad65f5..000000000 --- a/libs/sdk-py/langgraph_sdk/schema.py +++ /dev/null @@ -1,419 +0,0 @@ -"""Data models for interacting with the LangGraph API.""" - -from datetime import datetime -from typing import ( - Any, - Dict, - Literal, - NamedTuple, - Optional, - Sequence, - Tuple, - TypedDict, - Union, -) - -Json = Optional[dict[str, Any]] -"""Represents a JSON-like structure, which can be None or a dictionary with string keys and any values.""" - -RunStatus = Literal["pending", "error", "success", "timeout", "interrupted"] -""" -Represents the status of a run: -- "pending": The run is waiting to start. -- "error": The run encountered an error and stopped. -- "success": The run completed successfully. -- "timeout": The run exceeded its time limit. -- "interrupted": The run was manually stopped or interrupted. -""" - -ThreadStatus = Literal["idle", "busy", "interrupted", "error"] -""" -Represents the status of a thread: -- "idle": The thread is not currently processing any task. -- "busy": The thread is actively processing a task. -- "interrupted": The thread's execution was interrupted. -- "error": An exception occurred during task processing. -""" - -StreamMode = Literal[ - "values", "messages", "updates", "events", "debug", "custom", "messages-tuple" -] -""" -Defines the mode of streaming: -- "values": Stream only the values. -- "messages": Stream complete messages. -- "updates": Stream updates to the state. -- "events": Stream events occurring during execution. -- "debug": Stream detailed debug information. -- "custom": Stream custom events. -""" - -DisconnectMode = Literal["cancel", "continue"] -""" -Specifies behavior on disconnection: -- "cancel": Cancel the operation on disconnection. -- "continue": Continue the operation even if disconnected. -""" - -MultitaskStrategy = Literal["reject", "interrupt", "rollback", "enqueue"] -""" -Defines how to handle multiple tasks: -- "reject": Reject new tasks when busy. -- "interrupt": Interrupt current task for new ones. -- "rollback": Roll back current task and start new one. -- "enqueue": Queue new tasks for later execution. -""" - -OnConflictBehavior = Literal["raise", "do_nothing"] -""" -Specifies behavior on conflict: -- "raise": Raise an exception when a conflict occurs. -- "do_nothing": Ignore conflicts and proceed. -""" - -OnCompletionBehavior = Literal["delete", "keep"] -""" -Defines action after completion: -- "delete": Delete resources after completion. -- "keep": Retain resources after completion. -""" - -All = Literal["*"] -"""Represents a wildcard or 'all' selector.""" - -IfNotExists = Literal["create", "reject"] -""" -Specifies behavior if the thread doesn't exist: -- "create": Create a new thread if it doesn't exist. -- "reject": Reject the operation if the thread doesn't exist. -""" - -CancelAction = Literal["interrupt", "rollback"] -""" -Action to take when cancelling the run. -- "interrupt": Simply cancel the run. -- "rollback": Cancel the run. Then delete the run and associated checkpoints. -""" - - -class Config(TypedDict, total=False): - """Configuration options for a call.""" - - tags: list[str] - """ - Tags for this call and any sub-calls (eg. a Chain calling an LLM). - You can use these to filter calls. - """ - - recursion_limit: int - """ - Maximum number of times a call can recurse. If not provided, defaults to 25. - """ - - configurable: dict[str, Any] - """ - Runtime values for attributes previously made configurable on this Runnable, - or sub-Runnables, through .configurable_fields() or .configurable_alternatives(). - Check .output_schema() for a description of the attributes that have been made - configurable. - """ - - -class Checkpoint(TypedDict): - """Represents a checkpoint in the execution process.""" - - thread_id: str - """Unique identifier for the thread associated with this checkpoint.""" - checkpoint_ns: str - """Namespace for the checkpoint, used for organization and retrieval.""" - checkpoint_id: Optional[str] - """Optional unique identifier for the checkpoint itself.""" - checkpoint_map: Optional[dict[str, Any]] - """Optional dictionary containing checkpoint-specific data.""" - - -class GraphSchema(TypedDict): - """Defines the structure and properties of a graph.""" - - graph_id: str - """The ID of the graph.""" - input_schema: Optional[dict] - """The schema for the graph input. - Missing if unable to generate JSON schema from graph.""" - output_schema: Optional[dict] - """The schema for the graph output. - Missing if unable to generate JSON schema from graph.""" - state_schema: Optional[dict] - """The schema for the graph state. - Missing if unable to generate JSON schema from graph.""" - config_schema: Optional[dict] - """The schema for the graph config. - Missing if unable to generate JSON schema from graph.""" - - -Subgraphs = dict[str, GraphSchema] - - -class AssistantBase(TypedDict): - """Base model for an assistant.""" - - assistant_id: str - """The ID of the assistant.""" - graph_id: str - """The ID of the graph.""" - config: Config - """The assistant config.""" - created_at: datetime - """The time the assistant was created.""" - metadata: Json - """The assistant metadata.""" - version: int - """The version of the assistant""" - - -class AssistantVersion(AssistantBase): - """Represents a specific version of an assistant.""" - - pass - - -class Assistant(AssistantBase): - """Represents an assistant with additional properties.""" - - updated_at: datetime - """The last time the assistant was updated.""" - name: str - """The name of the assistant""" - - -class Interrupt(TypedDict, total=False): - """Represents an interruption in the execution flow.""" - - value: Any - """The value associated with the interrupt.""" - when: Literal["during"] - """When the interrupt occurred.""" - resumable: bool - """Whether the interrupt can be resumed.""" - ns: Optional[list[str]] - """Optional namespace for the interrupt.""" - - -class Thread(TypedDict): - """Represents a conversation thread.""" - - thread_id: str - """The ID of the thread.""" - created_at: datetime - """The time the thread was created.""" - updated_at: datetime - """The last time the thread was updated.""" - metadata: Json - """The thread metadata.""" - status: ThreadStatus - """The status of the thread, one of 'idle', 'busy', 'interrupted'.""" - values: Json - """The current state of the thread.""" - interrupts: Dict[str, list[Interrupt]] - """Interrupts which were thrown in this thread""" - - -class ThreadTask(TypedDict): - """Represents a task within a thread.""" - - id: str - name: str - error: Optional[str] - interrupts: list[Interrupt] - checkpoint: Optional[Checkpoint] - state: Optional["ThreadState"] - result: Optional[dict[str, Any]] - - -class ThreadState(TypedDict): - """Represents the state of a thread.""" - - values: Union[list[dict], dict[str, Any]] - """The state values.""" - next: Sequence[str] - """The next nodes to execute. If empty, the thread is done until new input is - received.""" - checkpoint: Checkpoint - """The ID of the checkpoint.""" - metadata: Json - """Metadata for this state""" - created_at: Optional[str] - """Timestamp of state creation""" - parent_checkpoint: Optional[Checkpoint] - """The ID of the parent checkpoint. If missing, this is the root checkpoint.""" - tasks: Sequence[ThreadTask] - """Tasks to execute in this step. If already attempted, may contain an error.""" - - -class ThreadUpdateStateResponse(TypedDict): - """Represents the response from updating a thread's state.""" - - checkpoint: Checkpoint - """Checkpoint of the latest state.""" - - -class Run(TypedDict): - """Represents a single execution run.""" - - run_id: str - """The ID of the run.""" - thread_id: str - """The ID of the thread.""" - assistant_id: str - """The assistant that was used for this run.""" - created_at: datetime - """The time the run was created.""" - updated_at: datetime - """The last time the run was updated.""" - status: RunStatus - """The status of the run. One of 'pending', 'running', "error", 'success', "timeout", "interrupted".""" - metadata: Json - """The run metadata.""" - multitask_strategy: MultitaskStrategy - """Strategy to handle concurrent runs on the same thread.""" - - -class Cron(TypedDict): - """Represents a scheduled task.""" - - cron_id: str - """The ID of the cron.""" - thread_id: Optional[str] - """The ID of the thread.""" - end_time: Optional[datetime] - """The end date to stop running the cron.""" - schedule: str - """The schedule to run, cron format.""" - created_at: datetime - """The time the cron was created.""" - updated_at: datetime - """The last time the cron was updated.""" - payload: dict - """The run payload to use for creating new run.""" - - -class RunCreate(TypedDict): - """Defines the parameters for initiating a background run.""" - - thread_id: Optional[str] - """The identifier of the thread to run. If not provided, the run is stateless.""" - assistant_id: str - """The identifier of the assistant to use for this run.""" - input: Optional[dict] - """Initial input data for the run.""" - metadata: Optional[dict] - """Additional metadata to associate with the run.""" - config: Optional[Config] - """Configuration options for the run.""" - checkpoint_id: Optional[str] - """The identifier of a checkpoint to resume from.""" - interrupt_before: Optional[list[str]] - """List of node names to interrupt execution before.""" - interrupt_after: Optional[list[str]] - """List of node names to interrupt execution after.""" - webhook: Optional[str] - """URL to send webhook notifications about the run's progress.""" - multitask_strategy: Optional[MultitaskStrategy] - """Strategy for handling concurrent runs on the same thread.""" - - -class Item(TypedDict): - """Represents a single document or data entry in the graph's Store. - - Items are used to store cross-thread memories. - """ - - namespace: list[str] - """The namespace of the item. A namespace is analogous to a document's directory.""" - key: str - """The unique identifier of the item within its namespace. - - In general, keys needn't be globally unique. - """ - value: dict[str, Any] - """The value stored in the item. This is the document itself.""" - created_at: datetime - """The timestamp when the item was created.""" - updated_at: datetime - """The timestamp when the item was last updated.""" - - -class ListNamespaceResponse(TypedDict): - """Response structure for listing namespaces.""" - - namespaces: list[list[str]] - """A list of namespace paths, where each path is a list of strings.""" - - -class SearchItem(Item, total=False): - """Item with an optional relevance score from search operations. - - Attributes: - score (Optional[float]): Relevance/similarity score. Included when - searching a compatible store with a natural language query. - """ - - score: Optional[float] - - -class SearchItemsResponse(TypedDict): - """Response structure for searching items.""" - - items: list[SearchItem] - """A list of items matching the search criteria.""" - - -class StreamPart(NamedTuple): - """Represents a part of a stream response.""" - - event: str - """The type of event for this stream part.""" - data: dict - """The data payload associated with the event.""" - - -class Send(TypedDict): - """Represents a message to be sent to a specific node in the graph. - - This type is used to explicitly send messages to nodes in the graph, typically - used within Command objects to control graph execution flow. - """ - - node: str - """The name of the target node to send the message to.""" - input: Optional[dict[str, Any]] - """Optional dictionary containing the input data to be passed to the node. - - If None, the node will be called with no input.""" - - -class Command(TypedDict, total=False): - """Represents one or more commands to control graph execution flow and state. - - This type defines the control commands that can be returned by nodes to influence - graph execution. It lets you navigate to other nodes, update graph state, - and resume from interruptions. - """ - - goto: Union[Send, str, Sequence[Union[Send, str]]] - """Specifies where execution should continue. Can be: - - - A string node name to navigate to - - A Send object to execute a node with specific input - - A sequence of node names or Send objects to execute in order - """ - update: Union[dict[str, Any], Sequence[Tuple[str, Any]]] - """Updates to apply to the graph's state. Can be: - - - A dictionary of state updates to merge - - A sequence of (key, value) tuples for ordered updates - """ - resume: Any - """Value to resume execution with after an interruption. - Used in conjunction with interrupt() to implement control flow. - """ diff --git a/libs/sdk-py/langgraph_sdk/sse.py b/libs/sdk-py/langgraph_sdk/sse.py deleted file mode 100644 index 6460b363c..000000000 --- a/libs/sdk-py/langgraph_sdk/sse.py +++ /dev/null @@ -1,148 +0,0 @@ -"""Adapted from httpx_sse to split lines on \n, \r, \r\n per the SSE spec.""" - -from typing import AsyncIterator, Iterator, Optional, Union - -import httpx -import orjson - -from langgraph_sdk.schema import StreamPart - -BytesLike = Union[bytes, bytearray, memoryview] - - -class BytesLineDecoder: - """ - Handles incrementally reading lines from text. - - Has the same behaviour as the stdllib bytes splitlines, - but handling the input iteratively. - """ - - def __init__(self) -> None: - self.buffer = bytearray() - self.trailing_cr: bool = False - - def decode(self, text: bytes) -> list[BytesLike]: - # See https://docs.python.org/3/glossary.html#term-universal-newlines - NEWLINE_CHARS = b"\n\r" - - # We always push a trailing `\r` into the next decode iteration. - if self.trailing_cr: - text = b"\r" + text - self.trailing_cr = False - if text.endswith(b"\r"): - self.trailing_cr = True - text = text[:-1] - - if not text: - # NOTE: the edge case input of empty text doesn't occur in practice, - # because other httpx internals filter out this value - return [] # pragma: no cover - - trailing_newline = text[-1] in NEWLINE_CHARS - lines = text.splitlines() - - if len(lines) == 1 and not trailing_newline: - # No new lines, buffer the input and continue. - self.buffer.extend(lines[0]) - return [] - - if self.buffer: - # Include any existing buffer in the first portion of the - # splitlines result. - self.buffer.extend(lines[0]) - lines = [self.buffer] + lines[1:] - self.buffer = bytearray() - - if not trailing_newline: - # If the last segment of splitlines is not newline terminated, - # then drop it from our output and start a new buffer. - self.buffer.extend(lines.pop()) - - return lines - - def flush(self) -> list[BytesLike]: - if not self.buffer and not self.trailing_cr: - return [] - - lines = [self.buffer] - self.buffer = bytearray() - self.trailing_cr = False - return lines - - -class SSEDecoder: - def __init__(self) -> None: - self._event = "" - self._data = bytearray() - self._last_event_id = "" - self._retry: Optional[int] = None - - def decode(self, line: bytes) -> Optional[StreamPart]: - # See: https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation # noqa: E501 - - if not line: - if ( - not self._event - and not self._data - and not self._last_event_id - and self._retry is None - ): - return None - - sse = StreamPart( - event=self._event, - data=orjson.loads(self._data) if self._data else None, - ) - - # NOTE: as per the SSE spec, do not reset last_event_id. - self._event = "" - self._data = bytearray() - self._retry = None - - return sse - - if line.startswith(b":"): - return None - - fieldname, _, value = line.partition(b":") - - if value.startswith(b" "): - value = value[1:] - - if fieldname == b"event": - self._event = value.decode() - elif fieldname == b"data": - self._data.extend(value) - elif fieldname == b"id": - if b"\0" in value: - pass - else: - self._last_event_id = value.decode() - elif fieldname == b"retry": - try: - self._retry = int(value) - except (TypeError, ValueError): - pass - else: - pass # Field is ignored. - - return None - - -async def aiter_lines_raw(response: httpx.Response) -> AsyncIterator[BytesLike]: - decoder = BytesLineDecoder() - async for chunk in response.aiter_bytes(): - for line in decoder.decode(chunk): - yield line - for line in decoder.flush(): - yield line - - -def iter_lines_raw(response: httpx.Response) -> Iterator[BytesLike]: - decoder = BytesLineDecoder() - for chunk in response.iter_bytes(): - for line in decoder.decode(chunk): - yield line - for line in decoder.flush(): - yield line diff --git a/libs/sdk-py/poetry.lock b/libs/sdk-py/poetry.lock deleted file mode 100644 index 583d001ae..000000000 --- a/libs/sdk-py/poetry.lock +++ /dev/null @@ -1,551 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. - -[[package]] -name = "anyio" -version = "4.7.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, - {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, -] - -[package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} - -[package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "certifi" -version = "2024.8.30" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] - -[[package]] -name = "codespell" -version = "2.3.0" -description = "Codespell" -optional = false -python-versions = ">=3.8" -files = [ - {file = "codespell-2.3.0-py3-none-any.whl", hash = "sha256:a9c7cef2501c9cfede2110fd6d4e5e62296920efe9abfb84648df866e47f58d1"}, - {file = "codespell-2.3.0.tar.gz", hash = "sha256:360c7d10f75e65f67bad720af7007e1060a5d395670ec11a7ed1fed9dd17471f"}, -] - -[package.extras] -dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] -hard-encoding-detection = ["chardet"] -toml = ["tomli"] -types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -optional = false -python-versions = "*" -files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.28.1" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, - {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.10" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "mypy" -version = "1.13.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -faster-cache = ["orjson"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "orjson" -version = "3.10.12" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = false -python-versions = ">=3.8" -files = [ - {file = "orjson-3.10.12-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ece01a7ec71d9940cc654c482907a6b65df27251255097629d0dea781f255c6d"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34ec9aebc04f11f4b978dd6caf697a2df2dd9b47d35aa4cc606cabcb9df69d7"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd6ec8658da3480939c79b9e9e27e0db31dffcd4ba69c334e98c9976ac29140e"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f17e6baf4cf01534c9de8a16c0c611f3d94925d1701bf5f4aff17003677d8ced"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6402ebb74a14ef96f94a868569f5dccf70d791de49feb73180eb3c6fda2ade56"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0000758ae7c7853e0a4a6063f534c61656ebff644391e1f81698c1b2d2fc8cd2"}, - {file = "orjson-3.10.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:888442dcee99fd1e5bd37a4abb94930915ca6af4db50e23e746cdf4d1e63db13"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c1f7a3ce79246aa0e92f5458d86c54f257fb5dfdc14a192651ba7ec2c00f8a05"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:802a3935f45605c66fb4a586488a38af63cb37aaad1c1d94c982c40dcc452e85"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1da1ef0113a2be19bb6c557fb0ec2d79c92ebd2fed4cfb1b26bab93f021fb885"}, - {file = "orjson-3.10.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a3273e99f367f137d5b3fecb5e9f45bcdbfac2a8b2f32fbc72129bbd48789c2"}, - {file = "orjson-3.10.12-cp310-none-win32.whl", hash = "sha256:475661bf249fd7907d9b0a2a2421b4e684355a77ceef85b8352439a9163418c3"}, - {file = "orjson-3.10.12-cp310-none-win_amd64.whl", hash = "sha256:87251dc1fb2b9e5ab91ce65d8f4caf21910d99ba8fb24b49fd0c118b2362d509"}, - {file = "orjson-3.10.12-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a734c62efa42e7df94926d70fe7d37621c783dea9f707a98cdea796964d4cf74"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:750f8b27259d3409eda8350c2919a58b0cfcd2054ddc1bd317a643afc646ef23"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb52c22bfffe2857e7aa13b4622afd0dd9d16ea7cc65fd2bf318d3223b1b6252"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:440d9a337ac8c199ff8251e100c62e9488924c92852362cd27af0e67308c16ef"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9e15c06491c69997dfa067369baab3bf094ecb74be9912bdc4339972323f252"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:362d204ad4b0b8724cf370d0cd917bb2dc913c394030da748a3bb632445ce7c4"}, - {file = "orjson-3.10.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b57cbb4031153db37b41622eac67329c7810e5f480fda4cfd30542186f006ae"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:165c89b53ef03ce0d7c59ca5c82fa65fe13ddf52eeb22e859e58c237d4e33b9b"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5dee91b8dfd54557c1a1596eb90bcd47dbcd26b0baaed919e6861f076583e9da"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a4e1cfb72de6f905bdff061172adfb3caf7a4578ebf481d8f0530879476c07"}, - {file = "orjson-3.10.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:038d42c7bc0606443459b8fe2d1f121db474c49067d8d14c6a075bbea8bf14dd"}, - {file = "orjson-3.10.12-cp311-none-win32.whl", hash = "sha256:03b553c02ab39bed249bedd4abe37b2118324d1674e639b33fab3d1dafdf4d79"}, - {file = "orjson-3.10.12-cp311-none-win_amd64.whl", hash = "sha256:8b8713b9e46a45b2af6b96f559bfb13b1e02006f4242c156cbadef27800a55a8"}, - {file = "orjson-3.10.12-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:53206d72eb656ca5ac7d3a7141e83c5bbd3ac30d5eccfe019409177a57634b0d"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac8010afc2150d417ebda810e8df08dd3f544e0dd2acab5370cfa6bcc0662f8f"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed459b46012ae950dd2e17150e838ab08215421487371fa79d0eced8d1461d70"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dcb9673f108a93c1b52bfc51b0af422c2d08d4fc710ce9c839faad25020bb69"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22a51ae77680c5c4652ebc63a83d5255ac7d65582891d9424b566fb3b5375ee9"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910fdf2ac0637b9a77d1aad65f803bac414f0b06f720073438a7bd8906298192"}, - {file = "orjson-3.10.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24ce85f7100160936bc2116c09d1a8492639418633119a2224114f67f63a4559"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a76ba5fc8dd9c913640292df27bff80a685bed3a3c990d59aa6ce24c352f8fc"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ff70ef093895fd53f4055ca75f93f047e088d1430888ca1229393a7c0521100f"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4244b7018b5753ecd10a6d324ec1f347da130c953a9c88432c7fbc8875d13be"}, - {file = "orjson-3.10.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16135ccca03445f37921fa4b585cff9a58aa8d81ebcb27622e69bfadd220b32c"}, - {file = "orjson-3.10.12-cp312-none-win32.whl", hash = "sha256:2d879c81172d583e34153d524fcba5d4adafbab8349a7b9f16ae511c2cee8708"}, - {file = "orjson-3.10.12-cp312-none-win_amd64.whl", hash = "sha256:fc23f691fa0f5c140576b8c365bc942d577d861a9ee1142e4db468e4e17094fb"}, - {file = "orjson-3.10.12-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:47962841b2a8aa9a258b377f5188db31ba49af47d4003a32f55d6f8b19006543"}, - {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6334730e2532e77b6054e87ca84f3072bee308a45a452ea0bffbbbc40a67e296"}, - {file = "orjson-3.10.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:accfe93f42713c899fdac2747e8d0d5c659592df2792888c6c5f829472e4f85e"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a7974c490c014c48810d1dede6c754c3cc46598da758c25ca3b4001ac45b703f"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3f250ce7727b0b2682f834a3facff88e310f52f07a5dcfd852d99637d386e79e"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f31422ff9486ae484f10ffc51b5ab2a60359e92d0716fcce1b3593d7bb8a9af6"}, - {file = "orjson-3.10.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5f29c5d282bb2d577c2a6bbde88d8fdcc4919c593f806aac50133f01b733846e"}, - {file = "orjson-3.10.12-cp313-none-win32.whl", hash = "sha256:f45653775f38f63dc0e6cd4f14323984c3149c05d6007b58cb154dd080ddc0dc"}, - {file = "orjson-3.10.12-cp313-none-win_amd64.whl", hash = "sha256:229994d0c376d5bdc91d92b3c9e6be2f1fbabd4cc1b59daae1443a46ee5e9825"}, - {file = "orjson-3.10.12-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7d69af5b54617a5fac5c8e5ed0859eb798e2ce8913262eb522590239db6c6763"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ed119ea7d2953365724a7059231a44830eb6bbb0cfead33fcbc562f5fd8f935"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c5fc1238ef197e7cad5c91415f524aaa51e004be5a9b35a1b8a84ade196f73f"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43509843990439b05f848539d6f6198d4ac86ff01dd024b2f9a795c0daeeab60"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f72e27a62041cfb37a3de512247ece9f240a561e6c8662276beaf4d53d406db4"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a904f9572092bb6742ab7c16c623f0cdccbad9eeb2d14d4aa06284867bddd31"}, - {file = "orjson-3.10.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:855c0833999ed5dc62f64552db26f9be767434917d8348d77bacaab84f787d7b"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:897830244e2320f6184699f598df7fb9db9f5087d6f3f03666ae89d607e4f8ed"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:0b32652eaa4a7539f6f04abc6243619c56f8530c53bf9b023e1269df5f7816dd"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:36b4aa31e0f6a1aeeb6f8377769ca5d125db000f05c20e54163aef1d3fe8e833"}, - {file = "orjson-3.10.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5535163054d6cbf2796f93e4f0dbc800f61914c0e3c4ed8499cf6ece22b4a3da"}, - {file = "orjson-3.10.12-cp38-none-win32.whl", hash = "sha256:90a5551f6f5a5fa07010bf3d0b4ca2de21adafbbc0af6cb700b63cd767266cb9"}, - {file = "orjson-3.10.12-cp38-none-win_amd64.whl", hash = "sha256:703a2fb35a06cdd45adf5d733cf613cbc0cb3ae57643472b16bc22d325b5fb6c"}, - {file = "orjson-3.10.12-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:f29de3ef71a42a5822765def1febfb36e0859d33abf5c2ad240acad5c6a1b78d"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de365a42acc65d74953f05e4772c974dad6c51cfc13c3240899f534d611be967"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a5a0158648a67ff0004cb0df5df7dcc55bfc9ca154d9c01597a23ad54c8d0c"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c47ce6b8d90fe9646a25b6fb52284a14ff215c9595914af63a5933a49972ce36"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0eee4c2c5bfb5c1b47a5db80d2ac7aaa7e938956ae88089f098aff2c0f35d5d8"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d3081bbe8b86587eb5c98a73b97f13d8f9fea685cf91a579beddacc0d10566"}, - {file = "orjson-3.10.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c23a6e90383884068bc2dba83d5222c9fcc3b99a0ed2411d38150734236755"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5472be7dc3269b4b52acba1433dac239215366f89dc1d8d0e64029abac4e714e"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:7319cda750fca96ae5973efb31b17d97a5c5225ae0bc79bf5bf84df9e1ec2ab6"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:74d5ca5a255bf20b8def6a2b96b1e18ad37b4a122d59b154c458ee9494377f80"}, - {file = "orjson-3.10.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ff31d22ecc5fb85ef62c7d4afe8301d10c558d00dd24274d4bbe464380d3cd69"}, - {file = "orjson-3.10.12-cp39-none-win32.whl", hash = "sha256:c22c3ea6fba91d84fcb4cda30e64aff548fcf0c44c876e681f47d61d24b12e6b"}, - {file = "orjson-3.10.12-cp39-none-win_amd64.whl", hash = "sha256:be604f60d45ace6b0b33dd990a66b4526f1a7a186ac411c942674625456ca548"}, - {file = "orjson-3.10.12.tar.gz", hash = "sha256:0a78bbda3aea0f9f079057ee1ee8a1ecf790d4f1af88dd67493c6b8ee52506ff"}, -] - -[[package]] -name = "packaging" -version = "24.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pytest" -version = "7.4.4" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.21.2" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"}, - {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"}, -] - -[package.dependencies] -pytest = ">=7.0.0" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] - -[[package]] -name = "pytest-mock" -version = "3.14.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, - {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, -] - -[package.dependencies] -pytest = ">=6.2.5" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "pytest-watch" -version = "4.2.0" -description = "Local continuous test runner with pytest and watchdog." -optional = false -python-versions = "*" -files = [ - {file = "pytest-watch-4.2.0.tar.gz", hash = "sha256:06136f03d5b361718b8d0d234042f7b2f203910d8568f63df2f866b547b3d4b9"}, -] - -[package.dependencies] -colorama = ">=0.3.3" -docopt = ">=0.4.0" -pytest = ">=2.6.4" -watchdog = ">=0.6.0" - -[[package]] -name = "ruff" -version = "0.6.9" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"}, - {file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"}, - {file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"}, - {file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"}, - {file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"}, - {file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"}, - {file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"}, - {file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"}, - {file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "tomli" -version = "2.2.1" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.8" -files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "watchdog" -version = "6.0.0" -description = "Filesystem events monitoring" -optional = false -python-versions = ">=3.9" -files = [ - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, - {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, - {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, - {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, - {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.9.0,<4.0" -content-hash = "1262a6148df18cc44ade00466b6e0f8305897a460eea370c8de649d8d20cd7a2" diff --git a/libs/sdk-py/pyproject.toml b/libs/sdk-py/pyproject.toml deleted file mode 100644 index 600ff91be..000000000 --- a/libs/sdk-py/pyproject.toml +++ /dev/null @@ -1,48 +0,0 @@ -[tool.poetry] -name = "langgraph-sdk" -version = "0.1.53" -description = "SDK for interacting with LangGraph API" -authors = [] -license = "MIT" -readme = "README.md" -repository = "https://www.github.com/langchain-ai/langgraph" -packages = [{ include = "langgraph_sdk" }] - -[tool.poetry.dependencies] -python = "^3.9.0,<4.0" -httpx = ">=0.25.2" -orjson = ">=3.10.1" - -[tool.poetry.group.dev.dependencies] -ruff = "^0.6.2" -codespell = "^2.2.0" -pytest = "^7.2.1" -pytest-asyncio = "^0.21.1" -pytest-mock = "^3.11.1" -pytest-watch = "^4.2.0" -mypy = "^1.10.0" - -[tool.pytest.ini_options] -# --strict-markers will raise errors on unknown marks. -# https://docs.pytest.org/en/7.1.x/how-to/mark.html#raising-errors-on-unknown-marks -# -# https://docs.pytest.org/en/7.1.x/reference/reference.html -# --strict-config any warnings encountered while parsing the `pytest` -# section of the configuration file raise errors. -addopts = "--strict-markers --strict-config --durations=5 -vv" -asyncio_mode = "auto" - - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.ruff] -lint.select = [ - "E", # pycodestyle - "F", # Pyflakes - "UP", # pyupgrade - "B", # flake8-bugbear - "I", # isort -] -lint.ignore = ["E501", "B008", "UP007", "UP006"]