From 29ddedf3490e4372af2da2a5f027a8e0196e7e89 Mon Sep 17 00:00:00 2001 From: AIFlow_ML Date: Wed, 15 Jan 2025 06:17:19 +0700 Subject: [PATCH] feat: Add TypeScript implementation of Hyperbolic AgentKit This commit introduces a complete TypeScript port of the Hyperbolic AgentKit, providing strongly-typed implementations for both Hyperbolic Compute and CDP blockchain operations. Includes full test coverage and proper TypeScript configurations. --- hyperbolic_agentkit_TS/.eslintignore | 3 + hyperbolic_agentkit_TS/.eslintrc.json | 28 + .../agent-toolkits/hyperbolic-toolkit.ts | 57 + hyperbolic_agentkit_TS/langchain/index.ts | 3 + .../langchain/tools/hyperbolic-tool.ts | 111 + .../utils/hyperbolic-agentkit-wrapper.ts | 34 + hyperbolic_agentkit_TS/package.json | 40 + hyperbolic_agentkit_TS/pnpm-lock.yaml | 4030 +++++++++++++++++ hyperbolic_agentkit_TS/src/actions.ts | 12 + .../src/actions/cdp/cdp-action.ts | 26 + .../src/actions/cdp/get-balance.ts | 62 + .../src/actions/cdp/index.ts | 4 + .../src/actions/cdp/register-basename.ts | 194 + .../src/actions/cdp/transfer.ts | 72 + .../src/actions/get-available-gpus.ts | 70 + .../src/actions/get-current-balance.ts | 110 + .../src/actions/get-gpu-status.ts | 71 + .../src/actions/get-spend-history.ts | 72 + .../src/actions/hyperbolic-action.ts | 48 + .../src/actions/remote-shell.ts | 86 + .../src/actions/rent-compute.ts | 98 + .../src/actions/ssh-access.ts | 77 + .../src/actions/terminate-compute.ts | 88 + hyperbolic_agentkit_TS/src/errors/base.ts | 47 + .../src/errors/configuration.ts | 9 + .../src/errors/validation.ts | 6 + hyperbolic_agentkit_TS/src/index.ts | 100 + .../src/types/environment.ts | 71 + hyperbolic_agentkit_TS/src/utils/api.ts | 58 + .../src/utils/ssh-manager.ts | 112 + .../tests/actions/cdp/get-balance.test.ts | 60 + .../actions/cdp/register-basename.test.ts | 115 + .../tests/actions/cdp/transfer.test.ts | 93 + .../tests/actions/get-available-gpus.test.ts | 74 + .../tests/actions/get-current-balance.test.ts | 164 + .../tests/actions/get-gpu-status.test.ts | 74 + .../tests/actions/get-spend-history.test.ts | 120 + .../tests/actions/remote-shell.test.ts | 104 + .../tests/actions/rent-compute.test.ts | 97 + .../tests/actions/ssh-access.test.ts | 90 + .../tests/actions/terminate-compute.test.ts | 91 + .../tests/utils/ssh-manager.test.ts | 116 + hyperbolic_agentkit_TS/tsconfig.json | 34 + hyperbolic_agentkit_TS/tsconfig.test.json | 8 + hyperbolic_agentkit_TS/vitest.config.ts | 13 + 45 files changed, 7052 insertions(+) create mode 100644 hyperbolic_agentkit_TS/.eslintignore create mode 100644 hyperbolic_agentkit_TS/.eslintrc.json create mode 100644 hyperbolic_agentkit_TS/langchain/agent-toolkits/hyperbolic-toolkit.ts create mode 100644 hyperbolic_agentkit_TS/langchain/index.ts create mode 100644 hyperbolic_agentkit_TS/langchain/tools/hyperbolic-tool.ts create mode 100644 hyperbolic_agentkit_TS/langchain/utils/hyperbolic-agentkit-wrapper.ts create mode 100644 hyperbolic_agentkit_TS/package.json create mode 100644 hyperbolic_agentkit_TS/pnpm-lock.yaml create mode 100644 hyperbolic_agentkit_TS/src/actions.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/cdp/cdp-action.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/cdp/get-balance.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/cdp/index.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/cdp/register-basename.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/cdp/transfer.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/get-available-gpus.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/get-current-balance.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/get-gpu-status.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/get-spend-history.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/hyperbolic-action.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/remote-shell.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/rent-compute.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/ssh-access.ts create mode 100644 hyperbolic_agentkit_TS/src/actions/terminate-compute.ts create mode 100644 hyperbolic_agentkit_TS/src/errors/base.ts create mode 100644 hyperbolic_agentkit_TS/src/errors/configuration.ts create mode 100644 hyperbolic_agentkit_TS/src/errors/validation.ts create mode 100644 hyperbolic_agentkit_TS/src/index.ts create mode 100644 hyperbolic_agentkit_TS/src/types/environment.ts create mode 100644 hyperbolic_agentkit_TS/src/utils/api.ts create mode 100644 hyperbolic_agentkit_TS/src/utils/ssh-manager.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/cdp/get-balance.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/cdp/register-basename.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/cdp/transfer.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/get-available-gpus.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/get-current-balance.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/get-gpu-status.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/get-spend-history.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/remote-shell.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/rent-compute.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/ssh-access.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/actions/terminate-compute.test.ts create mode 100644 hyperbolic_agentkit_TS/tests/utils/ssh-manager.test.ts create mode 100644 hyperbolic_agentkit_TS/tsconfig.json create mode 100644 hyperbolic_agentkit_TS/tsconfig.test.json create mode 100644 hyperbolic_agentkit_TS/vitest.config.ts diff --git a/hyperbolic_agentkit_TS/.eslintignore b/hyperbolic_agentkit_TS/.eslintignore new file mode 100644 index 00000000..9ebfc2d9 --- /dev/null +++ b/hyperbolic_agentkit_TS/.eslintignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +coverage/ diff --git a/hyperbolic_agentkit_TS/.eslintrc.json b/hyperbolic_agentkit_TS/.eslintrc.json new file mode 100644 index 00000000..2772a496 --- /dev/null +++ b/hyperbolic_agentkit_TS/.eslintrc.json @@ -0,0 +1,28 @@ +{ + "env": { + "node": true, + "es2020": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "project": "./tsconfig.test.json" + }, + "plugins": ["@typescript-eslint"], + "rules": { + "@typescript-eslint/explicit-function-return-type": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-unsafe-assignment": "error", + "@typescript-eslint/no-unsafe-member-access": "error", + "@typescript-eslint/no-unsafe-call": "error", + "@typescript-eslint/no-unsafe-return": "error", + "no-console": ["error", { "allow": ["warn", "error"] }] + } +} diff --git a/hyperbolic_agentkit_TS/langchain/agent-toolkits/hyperbolic-toolkit.ts b/hyperbolic_agentkit_TS/langchain/agent-toolkits/hyperbolic-toolkit.ts new file mode 100644 index 00000000..f23c1e9f --- /dev/null +++ b/hyperbolic_agentkit_TS/langchain/agent-toolkits/hyperbolic-toolkit.ts @@ -0,0 +1,57 @@ +import { Tool } from "@langchain/core/tools"; +import { HyperbolicTool } from "../tools/hyperbolic-tool"; +import { HyperbolicAgentkitWrapper } from "../utils/hyperbolic-agentkit-wrapper"; +import { HYPERBOLIC_ACTIONS, HyperbolicAction } from "../../src/actions"; + +/** + * Hyperbolic Platform Toolkit. + * + * Security Note: This toolkit contains tools that can read and modify + * the state of a service; e.g., by creating, deleting, or updating, + * reading underlying data. + * + * For example, this toolkit can be used to rent compute, check GPU status, + * and manage compute resources on Hyperbolic supported infrastructure. + */ +export class HyperbolicToolkit { + private readonly tools: Tool[]; + + constructor(private readonly hyperbolicAgentkitWrapper: HyperbolicAgentkitWrapper) { + this.tools = this.loadTools(); + } + + /** + * Get the tools in the toolkit. + * @returns Array of tools + */ + getTools(): Tool[] { + return this.tools; + } + + /** + * Create a toolkit from a HyperbolicAgentkitWrapper instance. + * @param hyperbolicAgentkitWrapper The wrapper instance + * @returns HyperbolicToolkit instance + */ + static fromHyperbolicAgentkitWrapper( + hyperbolicAgentkitWrapper: HyperbolicAgentkitWrapper + ): HyperbolicToolkit { + return new HyperbolicToolkit(hyperbolicAgentkitWrapper); + } + + /** + * Load all available Hyperbolic tools. + * @returns Array of Tool instances + */ + private loadTools(): Tool[] { + return Object.entries(HYPERBOLIC_ACTIONS).map(([name, action]: [string, HyperbolicAction]) => { + return new HyperbolicTool( + this.hyperbolicAgentkitWrapper, + name, + action.description || "", + action.execute.bind(action), + action.schema + ); + }); + } +} diff --git a/hyperbolic_agentkit_TS/langchain/index.ts b/hyperbolic_agentkit_TS/langchain/index.ts new file mode 100644 index 00000000..aaa546cf --- /dev/null +++ b/hyperbolic_agentkit_TS/langchain/index.ts @@ -0,0 +1,3 @@ +export { HyperbolicTool } from "./tools/hyperbolic-tool"; +export { HyperbolicToolkit } from "./agent-toolkits/hyperbolic-toolkit"; +export { HyperbolicAgentkitWrapper } from "./utils/hyperbolic-agentkit-wrapper"; diff --git a/hyperbolic_agentkit_TS/langchain/tools/hyperbolic-tool.ts b/hyperbolic_agentkit_TS/langchain/tools/hyperbolic-tool.ts new file mode 100644 index 00000000..35c050a7 --- /dev/null +++ b/hyperbolic_agentkit_TS/langchain/tools/hyperbolic-tool.ts @@ -0,0 +1,111 @@ +import { Tool, ToolParams } from "@langchain/core/tools"; +import { z } from "zod"; +import { CallbackManagerForToolRun } from "@langchain/core/callbacks/manager"; +import { RunnableConfig } from "@langchain/core/runnables"; +import { HyperbolicAgentkitWrapper } from "../utils/hyperbolic-agentkit-wrapper"; + +/** + * Exception raised when a command execution times out. + */ +class CommandTimeout extends Error { + constructor(message: string) { + super(message); + this.name = "CommandTimeout"; + } +} + +type ToolInputSchema = z.ZodEffects< + z.ZodObject< + { input: z.ZodOptional }, + "strip", + z.ZodTypeAny, + { input?: string }, + { input?: string } + >, + string | undefined, + { input?: string } +>; + +const DEFAULT_SCHEMA: ToolInputSchema = z + .object({ + input: z.string().optional().describe("The input to the tool"), + }) + .strip() + .transform((obj) => obj.input); + +const createToolSchema = (schema: z.ZodObject): ToolInputSchema => { + return schema.strip().transform((obj) => obj.input) as ToolInputSchema; +}; + +interface HyperbolicToolParams extends ToolParams { + schema?: z.ZodObject; +} + +/** + * Tool for interacting with the Hyperbolic SDK. + */ +export class HyperbolicTool extends Tool { + public name: string; + public description: string; + private readonly hyperbolicAgentkitWrapper: HyperbolicAgentkitWrapper; + private readonly func: (...args: any[]) => Promise; + private readonly timeoutSeconds = 10; + private readonly customSchema?: z.ZodObject; + + constructor( + hyperbolicAgentkitWrapper: HyperbolicAgentkitWrapper, + toolName: string, + toolDescription: string, + func: (...args: any[]) => Promise, + schema?: z.ZodObject + ) { + const params: HyperbolicToolParams = { + verbose: true + }; + super(params); + + this.name = toolName; + this.description = toolDescription; + this.hyperbolicAgentkitWrapper = hyperbolicAgentkitWrapper; + this.func = func; + this.customSchema = schema; + + this.schema = schema ? createToolSchema(schema) : DEFAULT_SCHEMA; + } + + /** @ignore */ + protected async _call( + args: Record, + runManager?: CallbackManagerForToolRun, + config?: RunnableConfig + ): Promise { + let parsedInputArgs: Record; + if (this.customSchema) { + parsedInputArgs = this.customSchema.parse(args); + } else { + const input = args.input || ""; + parsedInputArgs = { instructions: input }; + } + + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + reject( + new CommandTimeout( + `Command timed out after ${this.timeoutSeconds} seconds` + ) + ); + }, this.timeoutSeconds * 1000); + + this.hyperbolicAgentkitWrapper + .runAction(this.func, parsedInputArgs) + .then((result) => { + clearTimeout(timeoutId); + resolve(result); + }) + .catch((error) => { + clearTimeout(timeoutId); + reject(error); + }); + }); + } +} diff --git a/hyperbolic_agentkit_TS/langchain/utils/hyperbolic-agentkit-wrapper.ts b/hyperbolic_agentkit_TS/langchain/utils/hyperbolic-agentkit-wrapper.ts new file mode 100644 index 00000000..6a9e1b7f --- /dev/null +++ b/hyperbolic_agentkit_TS/langchain/utils/hyperbolic-agentkit-wrapper.ts @@ -0,0 +1,34 @@ +import { getEnvironmentVariable } from "@langchain/core/utils/env"; + +/** + * Wrapper for Hyperbolic Agentkit Core. + */ +export class HyperbolicAgentkitWrapper { + hyperbolicApiKey: string; + + constructor(fields?: { hyperbolicApiKey?: string }) { + const apiKey = fields?.hyperbolicApiKey ?? + getEnvironmentVariable("HYPERBOLIC_API_KEY"); + + if (!apiKey) { + throw new Error( + "Hyperbolic API Key not found. Please set HYPERBOLIC_API_KEY environment variable or pass it in the constructor." + ); + } + + this.hyperbolicApiKey = apiKey; + } + + /** + * Run a Hyperbolic Action. + * @param func The function to run + * @param args The arguments to pass to the function + * @returns The result of the function call + */ + async runAction( + func: (...args: any[]) => Promise, + args: Record + ): Promise { + return await func(args); + } +} diff --git a/hyperbolic_agentkit_TS/package.json b/hyperbolic_agentkit_TS/package.json new file mode 100644 index 00000000..94ea1fa5 --- /dev/null +++ b/hyperbolic_agentkit_TS/package.json @@ -0,0 +1,40 @@ +{ + "name": "@elizaos/hyperbolic-agentkit-ts", + "version": "1.0.0", + "description": "TypeScript version of Hyperbolic Agent Kit", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "private": true, + "scripts": { + "build": "tsc", + "lint": "eslint 'src/**/*.{js,ts}'", + "lint:fix": "eslint 'src/**/*.{js,ts}' --fix", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "prepare": "npm run build" + }, + "dependencies": { + "axios": "^1.6.5", + "ssh2": "^1.15.0", + "zod": "^3.22.4", + "@coinbase/coinbase-sdk": "^0.13.0", + "viem": "^2.0.0", + "decimal.js": "^10.4.3", + "@langchain/core": "^0.1.15", + "langchain": "^0.1.9" + }, + "devDependencies": { + "@types/node": "^20.11.5", + "@types/ssh2": "^1.11.18", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "@typescript-eslint/parser": "^6.19.0", + "@vitest/coverage-v8": "^1.2.1", + "eslint": "^8.56.0", + "typescript": "^5.3.3", + "vitest": "^1.2.1" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/hyperbolic_agentkit_TS/pnpm-lock.yaml b/hyperbolic_agentkit_TS/pnpm-lock.yaml new file mode 100644 index 00000000..b646182c --- /dev/null +++ b/hyperbolic_agentkit_TS/pnpm-lock.yaml @@ -0,0 +1,4030 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@coinbase/coinbase-sdk': + specifier: ^0.13.0 + version: 0.13.0(typescript@5.7.3)(zod@3.24.1) + '@langchain/core': + specifier: ^0.1.15 + version: 0.1.63(openai@4.78.1(zod@3.24.1)) + axios: + specifier: ^1.6.5 + version: 1.7.9 + decimal.js: + specifier: ^10.4.3 + version: 10.4.3 + langchain: + specifier: ^0.1.9 + version: 0.1.37(axios@1.7.9)(ignore@5.3.2)(lodash@4.17.21)(openai@4.78.1(zod@3.24.1))(ws@8.18.0) + ssh2: + specifier: ^1.15.0 + version: 1.16.0 + viem: + specifier: ^2.0.0 + version: 2.22.8(typescript@5.7.3)(zod@3.24.1) + zod: + specifier: ^3.22.4 + version: 3.24.1 + devDependencies: + '@types/node': + specifier: ^20.11.5 + version: 20.17.13 + '@types/ssh2': + specifier: ^1.11.18 + version: 1.15.4 + '@typescript-eslint/eslint-plugin': + specifier: ^6.19.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^6.19.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@vitest/coverage-v8': + specifier: ^1.2.1 + version: 1.6.0(vitest@1.6.0(@types/node@20.17.13)) + eslint: + specifier: ^8.56.0 + version: 8.57.1 + typescript: + specifier: ^5.3.3 + version: 5.7.3 + vitest: + specifier: ^1.2.1 + version: 1.6.0(@types/node@20.17.13) + +packages: + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@anthropic-ai/sdk@0.9.1': + resolution: {integrity: sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA==} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@coinbase/coinbase-sdk@0.13.0': + resolution: {integrity: sha512-qYOcFwTANhiJvSTF2sn53Hkycj2UebOIzieNOkg42qWD606gCudCBuzV3PDrOQYVJBS/g10hyX10u5yPkIZ89w==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@langchain/community@0.0.57': + resolution: {integrity: sha512-tib4UJNkyA4TPNsTNChiBtZmThVJBr7X/iooSmKeCr+yUEha2Yxly3A4OAO95Vlpj4Q+od8HAfCbZih/1XqAMw==} + engines: {node: '>=18'} + peerDependencies: + '@aws-crypto/sha256-js': ^5.0.0 + '@aws-sdk/client-bedrock-agent-runtime': ^3.485.0 + '@aws-sdk/client-bedrock-runtime': ^3.422.0 + '@aws-sdk/client-dynamodb': ^3.310.0 + '@aws-sdk/client-kendra': ^3.352.0 + '@aws-sdk/client-lambda': ^3.310.0 + '@aws-sdk/client-sagemaker-runtime': ^3.310.0 + '@aws-sdk/client-sfn': ^3.310.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@azure/search-documents': ^12.0.0 + '@clickhouse/client': ^0.2.5 + '@cloudflare/ai': '*' + '@datastax/astra-db-ts': ^1.0.0 + '@elastic/elasticsearch': ^8.4.0 + '@getmetal/metal-sdk': '*' + '@getzep/zep-js': ^0.9.0 + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@google-ai/generativelanguage': ^0.2.1 + '@gradientai/nodejs-sdk': ^1.2.0 + '@huggingface/inference': ^2.6.4 + '@mlc-ai/web-llm': ^0.2.35 + '@mozilla/readability': '*' + '@neondatabase/serverless': '*' + '@opensearch-project/opensearch': '*' + '@pinecone-database/pinecone': '*' + '@planetscale/database': ^1.8.0 + '@premai/prem-sdk': ^0.3.25 + '@qdrant/js-client-rest': ^1.8.2 + '@raycast/api': ^1.55.2 + '@rockset/client': ^0.9.1 + '@smithy/eventstream-codec': ^2.0.5 + '@smithy/protocol-http': ^3.0.6 + '@smithy/signature-v4': ^2.0.10 + '@smithy/util-utf8': ^2.0.0 + '@supabase/postgrest-js': ^1.1.1 + '@supabase/supabase-js': ^2.10.0 + '@tensorflow-models/universal-sentence-encoder': '*' + '@tensorflow/tfjs-converter': '*' + '@tensorflow/tfjs-core': '*' + '@upstash/redis': ^1.20.6 + '@upstash/vector': ^1.0.7 + '@vercel/kv': ^0.2.3 + '@vercel/postgres': ^0.5.0 + '@writerai/writer-sdk': ^0.40.2 + '@xata.io/client': ^0.28.0 + '@xenova/transformers': ^2.5.4 + '@zilliz/milvus2-sdk-node': '>=2.2.7' + better-sqlite3: ^9.4.0 + cassandra-driver: ^4.7.2 + cborg: ^4.1.1 + chromadb: '*' + closevector-common: 0.1.3 + closevector-node: 0.1.6 + closevector-web: 0.1.6 + cohere-ai: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + discord.js: ^14.14.1 + dria: ^0.0.3 + duck-duck-scrape: ^2.2.5 + faiss-node: ^0.5.1 + firebase-admin: ^11.9.0 || ^12.0.0 + google-auth-library: ^8.9.0 + googleapis: ^126.0.1 + hnswlib-node: ^3.0.0 + html-to-text: ^9.0.5 + interface-datastore: ^8.2.11 + ioredis: ^5.3.2 + it-all: ^3.0.4 + jsdom: '*' + jsonwebtoken: ^9.0.2 + llmonitor: ^0.5.9 + lodash: ^4.17.21 + lunary: ^0.6.11 + mongodb: '>=5.2.0' + mysql2: ^3.3.3 + neo4j-driver: '*' + node-llama-cpp: '*' + pg: ^8.11.0 + pg-copy-streams: ^6.0.5 + pickleparser: ^0.2.1 + portkey-ai: ^0.1.11 + redis: '*' + replicate: ^0.18.0 + typeorm: ^0.3.12 + typesense: ^1.5.3 + usearch: ^1.1.1 + vectordb: ^0.1.4 + voy-search: 0.6.2 + weaviate-ts-client: '*' + web-auth-library: ^1.0.3 + ws: ^8.14.2 + peerDependenciesMeta: + '@aws-crypto/sha256-js': + optional: true + '@aws-sdk/client-bedrock-agent-runtime': + optional: true + '@aws-sdk/client-bedrock-runtime': + optional: true + '@aws-sdk/client-dynamodb': + optional: true + '@aws-sdk/client-kendra': + optional: true + '@aws-sdk/client-lambda': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/search-documents': + optional: true + '@clickhouse/client': + optional: true + '@cloudflare/ai': + optional: true + '@datastax/astra-db-ts': + optional: true + '@elastic/elasticsearch': + optional: true + '@getmetal/metal-sdk': + optional: true + '@getzep/zep-js': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@google-ai/generativelanguage': + optional: true + '@gradientai/nodejs-sdk': + optional: true + '@huggingface/inference': + optional: true + '@mlc-ai/web-llm': + optional: true + '@mozilla/readability': + optional: true + '@neondatabase/serverless': + optional: true + '@opensearch-project/opensearch': + optional: true + '@pinecone-database/pinecone': + optional: true + '@planetscale/database': + optional: true + '@premai/prem-sdk': + optional: true + '@qdrant/js-client-rest': + optional: true + '@raycast/api': + optional: true + '@rockset/client': + optional: true + '@smithy/eventstream-codec': + optional: true + '@smithy/protocol-http': + optional: true + '@smithy/signature-v4': + optional: true + '@smithy/util-utf8': + optional: true + '@supabase/postgrest-js': + optional: true + '@supabase/supabase-js': + optional: true + '@tensorflow-models/universal-sentence-encoder': + optional: true + '@tensorflow/tfjs-converter': + optional: true + '@tensorflow/tfjs-core': + optional: true + '@upstash/redis': + optional: true + '@upstash/vector': + optional: true + '@vercel/kv': + optional: true + '@vercel/postgres': + optional: true + '@writerai/writer-sdk': + optional: true + '@xata.io/client': + optional: true + '@xenova/transformers': + optional: true + '@zilliz/milvus2-sdk-node': + optional: true + better-sqlite3: + optional: true + cassandra-driver: + optional: true + cborg: + optional: true + chromadb: + optional: true + closevector-common: + optional: true + closevector-node: + optional: true + closevector-web: + optional: true + cohere-ai: + optional: true + convex: + optional: true + couchbase: + optional: true + discord.js: + optional: true + dria: + optional: true + duck-duck-scrape: + optional: true + faiss-node: + optional: true + firebase-admin: + optional: true + google-auth-library: + optional: true + googleapis: + optional: true + hnswlib-node: + optional: true + html-to-text: + optional: true + interface-datastore: + optional: true + ioredis: + optional: true + it-all: + optional: true + jsdom: + optional: true + jsonwebtoken: + optional: true + llmonitor: + optional: true + lodash: + optional: true + lunary: + optional: true + mongodb: + optional: true + mysql2: + optional: true + neo4j-driver: + optional: true + node-llama-cpp: + optional: true + pg: + optional: true + pg-copy-streams: + optional: true + pickleparser: + optional: true + portkey-ai: + optional: true + redis: + optional: true + replicate: + optional: true + typeorm: + optional: true + typesense: + optional: true + usearch: + optional: true + vectordb: + optional: true + voy-search: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + + '@langchain/core@0.1.63': + resolution: {integrity: sha512-+fjyYi8wy6x1P+Ee1RWfIIEyxd9Ee9jksEwvrggPwwI/p45kIDTdYTblXsM13y4mNWTiACyLSdbwnPaxxdoz+w==} + engines: {node: '>=18'} + + '@langchain/core@0.2.36': + resolution: {integrity: sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg==} + engines: {node: '>=18'} + + '@langchain/openai@0.0.34': + resolution: {integrity: sha512-M+CW4oXle5fdoz2T2SwdOef8pl3/1XmUx1vjn2mXUVM/128aO0l23FMF0SNBsAbRV6P+p/TuzjodchJbi0Ht/A==} + engines: {node: '>=18'} + + '@langchain/textsplitters@0.0.3': + resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==} + engines: {node: '>=18'} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + cpu: [x64] + os: [win32] + + '@scure/base@1.2.1': + resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + + '@scure/bip32@1.6.0': + resolution: {integrity: sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA==} + + '@scure/bip32@1.6.1': + resolution: {integrity: sha512-jSO+5Ud1E588Y+LFo8TaB8JVPNAZw/lGGao+1SepHDeTs2dFLurdNIAgUuDlwezqEjRjElkCJajVrtrZaBxvaQ==} + + '@scure/bip39@1.5.0': + resolution: {integrity: sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} + + '@types/node@18.19.70': + resolution: {integrity: sha512-RE+K0+KZoEpDUbGGctnGdkrLFwi1eYKTlIHNl2Um98mUkGsm1u2Ff6Ltd0e8DktTtC98uy7rSj+hO8t/QuLoVQ==} + + '@types/node@20.17.13': + resolution: {integrity: sha512-RNf+4dEeV69PIvyp++4IKM2vnLXtmp/JovfeQm5P5+qpKb6wHoH7INywLdZ7z+gVX46kgBP/fwJJvZYaHxtdyw==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/ssh2@1.15.4': + resolution: {integrity: sha512-9JTQgVBWSgq6mAen6PVnrAmty1lqgCMvpfN+1Ck5WRUsyMYPa6qd50/vMJ0y1zkGpOEgLzm8m8Dx/Y5vRouLaA==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + + '@vitest/coverage-v8@1.6.0': + resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + peerDependencies: + vitest: 1.6.0 + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + abitype@1.0.7: + resolution: {integrity: sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios-mock-adapter@1.22.0: + resolution: {integrity: sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==} + peerDependencies: + axios: '>= 0.17.0' + + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-64@0.1.0: + resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64url@3.0.1: + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + + bip32@4.0.0: + resolution: {integrity: sha512-aOGy88DDlVUhspIXJN+dVEtclhIsfAUppD43V0j40cPTld3pv/0X/MlrZSZ6jowIaQQzFwP8M6rFU2z2mVYjDQ==} + engines: {node: '>=6.0.0'} + + bip39@3.1.0: + resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} + + bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + digest-fetch@1.3.0: + resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethers@6.13.5: + resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + engines: {node: '>=14.0.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expr-eval@2.0.2: + resolution: {integrity: sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-any-array@2.0.1: + resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + js-tiktoken@1.0.16: + resolution: {integrity: sha512-nUVdO5k/M9llWpiaZlBBDdtmr6qWXwSD6fgaDu2zM8UP+OXxx9V37lFkI6w0/1IuaDx7WffZ37oYd9KvcWKElg==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + langchain@0.1.37: + resolution: {integrity: sha512-rpaLEJtRrLYhAViEp7/aHfSkxbgSqHJ5n10tXv3o4kHP/wOin85RpTgewwvGjEaKc3797jOg+sLSk6a7e0UlMg==} + engines: {node: '>=18'} + peerDependencies: + '@aws-sdk/client-s3': ^3.310.0 + '@aws-sdk/client-sagemaker-runtime': ^3.310.0 + '@aws-sdk/client-sfn': ^3.310.0 + '@aws-sdk/credential-provider-node': ^3.388.0 + '@azure/storage-blob': ^12.15.0 + '@browserbasehq/sdk': '*' + '@gomomento/sdk': ^1.51.1 + '@gomomento/sdk-core': ^1.51.1 + '@gomomento/sdk-web': ^1.51.1 + '@google-ai/generativelanguage': ^0.2.1 + '@google-cloud/storage': ^6.10.1 || ^7.7.0 + '@mendable/firecrawl-js': ^0.0.13 + '@notionhq/client': ^2.2.10 + '@pinecone-database/pinecone': '*' + '@supabase/supabase-js': ^2.10.0 + '@vercel/kv': ^0.2.3 + '@xata.io/client': ^0.28.0 + apify-client: ^2.7.1 + assemblyai: ^4.0.0 + axios: '*' + cheerio: ^1.0.0-rc.12 + chromadb: '*' + convex: ^1.3.1 + couchbase: ^4.3.0 + d3-dsv: ^2.0.0 + epub2: ^3.0.1 + faiss-node: '*' + fast-xml-parser: '*' + google-auth-library: ^8.9.0 + handlebars: ^4.7.8 + html-to-text: ^9.0.5 + ignore: ^5.2.0 + ioredis: ^5.3.2 + jsdom: '*' + mammoth: ^1.6.0 + mongodb: '>=5.2.0' + node-llama-cpp: '*' + notion-to-md: ^3.1.0 + officeparser: ^4.0.4 + pdf-parse: 1.1.1 + peggy: ^3.0.2 + playwright: ^1.32.1 + puppeteer: ^19.7.2 + pyodide: ^0.24.1 + redis: ^4.6.4 + sonix-speech-recognition: ^2.1.1 + srt-parser-2: ^1.2.3 + typeorm: ^0.3.12 + weaviate-ts-client: '*' + web-auth-library: ^1.0.3 + ws: ^8.14.2 + youtube-transcript: ^1.0.6 + youtubei.js: ^9.1.0 + peerDependenciesMeta: + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/client-sagemaker-runtime': + optional: true + '@aws-sdk/client-sfn': + optional: true + '@aws-sdk/credential-provider-node': + optional: true + '@azure/storage-blob': + optional: true + '@browserbasehq/sdk': + optional: true + '@gomomento/sdk': + optional: true + '@gomomento/sdk-core': + optional: true + '@gomomento/sdk-web': + optional: true + '@google-ai/generativelanguage': + optional: true + '@google-cloud/storage': + optional: true + '@mendable/firecrawl-js': + optional: true + '@notionhq/client': + optional: true + '@pinecone-database/pinecone': + optional: true + '@supabase/supabase-js': + optional: true + '@vercel/kv': + optional: true + '@xata.io/client': + optional: true + apify-client: + optional: true + assemblyai: + optional: true + axios: + optional: true + cheerio: + optional: true + chromadb: + optional: true + convex: + optional: true + couchbase: + optional: true + d3-dsv: + optional: true + epub2: + optional: true + faiss-node: + optional: true + fast-xml-parser: + optional: true + google-auth-library: + optional: true + handlebars: + optional: true + html-to-text: + optional: true + ignore: + optional: true + ioredis: + optional: true + jsdom: + optional: true + mammoth: + optional: true + mongodb: + optional: true + node-llama-cpp: + optional: true + notion-to-md: + optional: true + officeparser: + optional: true + pdf-parse: + optional: true + peggy: + optional: true + playwright: + optional: true + puppeteer: + optional: true + pyodide: + optional: true + redis: + optional: true + sonix-speech-recognition: + optional: true + srt-parser-2: + optional: true + typeorm: + optional: true + weaviate-ts-client: + optional: true + web-auth-library: + optional: true + ws: + optional: true + youtube-transcript: + optional: true + youtubei.js: + optional: true + + langchainhub@0.0.11: + resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==} + + langsmith@0.1.68: + resolution: {integrity: sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ==} + peerDependencies: + openai: '*' + peerDependenciesMeta: + openai: + optional: true + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@5.2.4: + resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + ml-array-mean@1.1.6: + resolution: {integrity: sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ==} + + ml-array-sum@1.1.6: + resolution: {integrity: sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw==} + + ml-distance-euclidean@2.0.0: + resolution: {integrity: sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==} + + ml-distance@4.0.1: + resolution: {integrity: sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw==} + + ml-tree-similarity@1.0.0: + resolution: {integrity: sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg==} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + nan@2.22.0: + resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-jose@2.2.0: + resolution: {integrity: sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + num-sort@2.1.0: + resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} + engines: {node: '>=8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + openai@4.78.1: + resolution: {integrity: sha512-drt0lHZBd2lMyORckOXFPQTmnGLWSLt8VK0W9BhOKWpMFBEoHMoz5gxMPmVq5icp+sOrsbMnsmZTVHUlKvD1Ow==} + hasBin: true + peerDependencies: + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ox@0.6.0: + resolution: {integrity: sha512-blUzTLidvUlshv0O02CnLFqBLidNzPoAZdIth894avUAotTuWziznv6IENv5idRuOSSP3dH8WzcYw84zVdu0Aw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.1: + resolution: {integrity: sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + secp256k1@5.0.1: + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + ssh2@1.16.0: + resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} + engines: {node: '>=10.16.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + viem@2.22.8: + resolution: {integrity: sha512-iB3PW/a/qzpYbpjo3R662u6a/zo6piZHez/N/bOC25C79FYXBCs8mQDqwiHk3FYErUhS4KVZLabKV9zGMd+EgQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webauthn-p256@0.0.10: + resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} + hasBin: true + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + peerDependencies: + zod: ^3.24.1 + + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + +snapshots: + + '@adraffy/ens-normalize@1.10.1': {} + + '@adraffy/ens-normalize@1.11.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@anthropic-ai/sdk@0.9.1': + dependencies: + '@types/node': 18.19.70 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + digest-fetch: 1.3.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + + '@coinbase/coinbase-sdk@0.13.0(typescript@5.7.3)(zod@3.24.1)': + dependencies: + '@scure/bip32': 1.6.1 + abitype: 1.0.8(typescript@5.7.3)(zod@3.24.1) + axios: 1.7.9 + axios-mock-adapter: 1.22.0(axios@1.7.9) + axios-retry: 4.5.0(axios@1.7.9) + bip32: 4.0.0 + bip39: 3.1.0 + decimal.js: 10.4.3 + dotenv: 16.4.7 + ethers: 6.13.5 + node-jose: 2.2.0 + secp256k1: 5.0.1 + viem: 2.22.8(typescript@5.7.3)(zod@3.24.1) + transitivePeerDependencies: + - bufferutil + - debug + - typescript + - utf-8-validate + - zod + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@langchain/community@0.0.57(lodash@4.17.21)(openai@4.78.1(zod@3.24.1))(ws@8.18.0)': + dependencies: + '@langchain/core': 0.1.63(openai@4.78.1(zod@3.24.1)) + '@langchain/openai': 0.0.34 + expr-eval: 2.0.2 + flat: 5.0.2 + langsmith: 0.1.68(openai@4.78.1(zod@3.24.1)) + uuid: 9.0.1 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + optionalDependencies: + lodash: 4.17.21 + ws: 8.18.0 + transitivePeerDependencies: + - encoding + - openai + + '@langchain/core@0.1.63(openai@4.78.1(zod@3.24.1))': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.16 + langsmith: 0.1.68(openai@4.78.1(zod@3.24.1)) + ml-distance: 4.0.1 + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 9.0.1 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - openai + + '@langchain/core@0.2.36(openai@4.78.1(zod@3.24.1))': + dependencies: + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.16 + langsmith: 0.1.68(openai@4.78.1(zod@3.24.1)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - openai + + '@langchain/openai@0.0.34': + dependencies: + '@langchain/core': 0.1.63(openai@4.78.1(zod@3.24.1)) + js-tiktoken: 1.0.16 + openai: 4.78.1(zod@3.24.1) + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + transitivePeerDependencies: + - encoding + + '@langchain/textsplitters@0.0.3(openai@4.78.1(zod@3.24.1))': + dependencies: + '@langchain/core': 0.2.36(openai@4.78.1(zod@3.24.1)) + js-tiktoken: 1.0.16 + transitivePeerDependencies: + - openai + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.6.0': {} + + '@noble/hashes@1.6.1': {} + + '@noble/hashes@1.7.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.18.0 + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true + + '@rollup/rollup-android-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-x64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.30.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.30.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.30.1': + optional: true + + '@scure/base@1.2.1': {} + + '@scure/bip32@1.6.0': + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + + '@scure/bip32@1.6.1': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + + '@scure/bip39@1.5.0': + dependencies: + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + + '@sinclair/typebox@0.27.8': {} + + '@types/estree@1.0.6': {} + + '@types/json-schema@7.0.15': {} + + '@types/node-fetch@2.6.12': + dependencies: + '@types/node': 20.17.13 + form-data: 4.0.1 + + '@types/node@18.19.70': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.17.13': + dependencies: + undici-types: 6.19.8 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/retry@0.12.0': {} + + '@types/semver@7.5.8': {} + + '@types/ssh2@1.15.4': + dependencies: + '@types/node': 18.19.70 + + '@types/uuid@10.0.0': {} + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) + eslint: 8.57.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.1': {} + + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.17.13))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + picocolors: 1.1.1 + std-env: 3.8.0 + strip-literal: 2.1.1 + test-exclude: 6.0.0 + vitest: 1.6.0(@types/node@20.17.13) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.5.0 + + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + abitype@1.0.7(typescript@5.7.3)(zod@3.24.1): + optionalDependencies: + typescript: 5.7.3 + zod: 3.24.1 + + abitype@1.0.8(typescript@5.7.3)(zod@3.24.1): + optionalDependencies: + typescript: 5.7.3 + zod: 3.24.1 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + aes-js@4.0.0-beta.5: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assertion-error@1.1.0: {} + + asynckit@0.4.0: {} + + axios-mock-adapter@1.22.0(axios@1.7.9): + dependencies: + axios: 1.7.9 + fast-deep-equal: 3.1.3 + is-buffer: 2.0.5 + + axios-retry@4.5.0(axios@1.7.9): + dependencies: + axios: 1.7.9 + is-retry-allowed: 2.2.0 + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-64@0.1.0: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + base64url@3.0.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + binary-extensions@2.3.0: {} + + binary-search@1.3.6: {} + + bip32@4.0.0: + dependencies: + '@noble/hashes': 1.7.0 + '@scure/base': 1.2.1 + typeforce: 1.18.0 + wif: 2.0.6 + + bip39@3.1.0: + dependencies: + '@noble/hashes': 1.7.0 + + bn.js@4.12.1: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buildcheck@0.0.6: + optional: true + + cac@6.7.14: {} + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + charenc@0.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + cipher-base@1.0.6: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.6 + nan: 2.22.0 + optional: true + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.6 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypt@0.0.2: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decimal.js@10.4.3: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + diff-sequences@29.6.3: {} + + digest-fetch@1.3.0: + dependencies: + base-64: 0.1.0 + md5: 2.3.0 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.4.7: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + es6-promise@4.2.8: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escape-string-regexp@4.0.0: {} + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.1 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + ethers@6.13.5: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expr-eval@2.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.18.0: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.3.2: {} + + follow-redirects@1.15.9: {} + + form-data-encoder@1.7.2: {} + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-func-name@2.0.2: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + html-escaper@2.0.2: {} + + human-signals@5.0.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-any-array@2.0.1: {} + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-retry-allowed@2.2.0: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + isows@1.0.6(ws@8.18.0): + dependencies: + ws: 8.18.0 + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + js-tiktoken@1.0.16: + dependencies: + base64-js: 1.5.1 + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonpointer@5.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + langchain@0.1.37(axios@1.7.9)(ignore@5.3.2)(lodash@4.17.21)(openai@4.78.1(zod@3.24.1))(ws@8.18.0): + dependencies: + '@anthropic-ai/sdk': 0.9.1 + '@langchain/community': 0.0.57(lodash@4.17.21)(openai@4.78.1(zod@3.24.1))(ws@8.18.0) + '@langchain/core': 0.1.63(openai@4.78.1(zod@3.24.1)) + '@langchain/openai': 0.0.34 + '@langchain/textsplitters': 0.0.3(openai@4.78.1(zod@3.24.1)) + binary-extensions: 2.3.0 + js-tiktoken: 1.0.16 + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + langchainhub: 0.0.11 + langsmith: 0.1.68(openai@4.78.1(zod@3.24.1)) + ml-distance: 4.0.1 + openapi-types: 12.1.3 + p-retry: 4.6.2 + uuid: 9.0.1 + yaml: 2.7.0 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + optionalDependencies: + axios: 1.7.9 + ignore: 5.3.2 + ws: 8.18.0 + transitivePeerDependencies: + - '@aws-crypto/sha256-js' + - '@aws-sdk/client-bedrock-agent-runtime' + - '@aws-sdk/client-bedrock-runtime' + - '@aws-sdk/client-dynamodb' + - '@aws-sdk/client-kendra' + - '@aws-sdk/client-lambda' + - '@azure/search-documents' + - '@clickhouse/client' + - '@cloudflare/ai' + - '@datastax/astra-db-ts' + - '@elastic/elasticsearch' + - '@getmetal/metal-sdk' + - '@getzep/zep-js' + - '@gradientai/nodejs-sdk' + - '@huggingface/inference' + - '@mlc-ai/web-llm' + - '@mozilla/readability' + - '@neondatabase/serverless' + - '@opensearch-project/opensearch' + - '@planetscale/database' + - '@premai/prem-sdk' + - '@qdrant/js-client-rest' + - '@raycast/api' + - '@rockset/client' + - '@smithy/eventstream-codec' + - '@smithy/protocol-http' + - '@smithy/signature-v4' + - '@smithy/util-utf8' + - '@supabase/postgrest-js' + - '@tensorflow-models/universal-sentence-encoder' + - '@tensorflow/tfjs-converter' + - '@tensorflow/tfjs-core' + - '@upstash/redis' + - '@upstash/vector' + - '@vercel/postgres' + - '@writerai/writer-sdk' + - '@xenova/transformers' + - '@zilliz/milvus2-sdk-node' + - better-sqlite3 + - cassandra-driver + - cborg + - closevector-common + - closevector-node + - closevector-web + - cohere-ai + - discord.js + - dria + - duck-duck-scrape + - encoding + - firebase-admin + - googleapis + - hnswlib-node + - interface-datastore + - it-all + - jsonwebtoken + - llmonitor + - lodash + - lunary + - mysql2 + - neo4j-driver + - openai + - pg + - pg-copy-streams + - pickleparser + - portkey-ai + - replicate + - typesense + - usearch + - vectordb + - voy-search + + langchainhub@0.0.11: {} + + langsmith@0.1.68(openai@4.78.1(zod@3.24.1)): + dependencies: + '@types/uuid': 10.0.0 + commander: 10.0.1 + p-queue: 6.6.2 + p-retry: 4.6.2 + semver: 7.6.3 + uuid: 10.0.0 + optionalDependencies: + openai: 4.78.1(zod@3.24.1) + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + long@5.2.4: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@4.0.0: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + ml-array-mean@1.1.6: + dependencies: + ml-array-sum: 1.1.6 + + ml-array-sum@1.1.6: + dependencies: + is-any-array: 2.0.1 + + ml-distance-euclidean@2.0.0: {} + + ml-distance@4.0.1: + dependencies: + ml-array-mean: 1.1.6 + ml-distance-euclidean: 2.0.0 + ml-tree-similarity: 1.0.0 + + ml-tree-similarity@1.0.0: + dependencies: + binary-search: 1.3.6 + num-sort: 2.1.0 + + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.1 + pkg-types: 1.3.1 + ufo: 1.5.4 + + ms@2.1.3: {} + + mustache@4.2.0: {} + + nan@2.22.0: + optional: true + + nanoid@3.3.8: {} + + natural-compare@1.4.0: {} + + node-addon-api@5.1.0: {} + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.4: {} + + node-jose@2.2.0: + dependencies: + base64url: 3.0.1 + buffer: 6.0.3 + es6-promise: 4.2.8 + lodash: 4.17.21 + long: 5.2.4 + node-forge: 1.3.1 + pako: 2.1.0 + process: 0.11.10 + uuid: 9.0.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + num-sort@2.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + openai@4.78.1(zod@3.24.1): + dependencies: + '@types/node': 18.19.70 + '@types/node-fetch': 2.6.12 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + zod: 3.24.1 + transitivePeerDependencies: + - encoding + + openapi-types@12.1.3: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ox@0.6.0(typescript@5.7.3)(zod@3.24.1): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.7.3)(zod@3.24.1) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - zod + + p-finally@1.0.0: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + pako@2.1.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.1: {} + + pathval@1.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.1 + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process@0.11.10: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-is@18.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + resolve-from@4.0.0: {} + + retry@0.13.1: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rollup@4.30.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + secp256k1@5.0.1: + dependencies: + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + semver@7.6.3: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + ssh2@1.16.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.22.0 + + stackback@0.0.2: {} + + std-env@3.8.0: {} + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + tinybench@2.9.0: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + ts-api-utils@1.4.3(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tslib@2.7.0: {} + + tweetnacl@0.14.5: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + typeforce@1.18.0: {} + + typescript@5.7.3: {} + + ufo@1.5.4: {} + + undici-types@5.26.5: {} + + undici-types@6.19.8: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@10.0.0: {} + + uuid@9.0.1: {} + + viem@2.22.8(typescript@5.7.3)(zod@3.24.1): + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/bip32': 1.6.0 + '@scure/bip39': 1.5.0 + abitype: 1.0.7(typescript@5.7.3)(zod@3.24.1) + isows: 1.0.6(ws@8.18.0) + ox: 0.6.0(typescript@5.7.3)(zod@3.24.1) + webauthn-p256: 0.0.10 + ws: 8.18.0 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-node@1.6.0(@types/node@20.17.13): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.11(@types/node@20.17.13) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.11(@types/node@20.17.13): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.30.1 + optionalDependencies: + '@types/node': 20.17.13 + fsevents: 2.3.3 + + vitest@1.6.0(@types/node@20.17.13): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.0 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.8.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.11(@types/node@20.17.13) + vite-node: 1.6.0(@types/node@20.17.13) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.17.13 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + web-streams-polyfill@3.3.3: {} + + web-streams-polyfill@4.0.0-beta.3: {} + + webauthn-p256@0.0.10: + dependencies: + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wif@2.0.6: + dependencies: + bs58check: 2.1.2 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + ws@8.18.0: {} + + yaml@2.7.0: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + zod-to-json-schema@3.24.1(zod@3.24.1): + dependencies: + zod: 3.24.1 + + zod@3.24.1: {} diff --git a/hyperbolic_agentkit_TS/src/actions.ts b/hyperbolic_agentkit_TS/src/actions.ts new file mode 100644 index 00000000..42421010 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +export interface HyperbolicAction { + name: string; + description: string; + execute: (...args: any[]) => Promise; + schema?: z.ZodObject; +} + +export const HYPERBOLIC_ACTIONS: Record = { + // Add your actions here +}; diff --git a/hyperbolic_agentkit_TS/src/actions/cdp/cdp-action.ts b/hyperbolic_agentkit_TS/src/actions/cdp/cdp-action.ts new file mode 100644 index 00000000..e0043c19 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/cdp/cdp-action.ts @@ -0,0 +1,26 @@ +import { z } from 'zod'; +import { Wallet } from '@coinbase/coinbase-sdk'; +import { HyperbolicAction } from '../hyperbolic-action'; + +/** + * Base class for CDP actions that require wallet operations + */ +export abstract class CdpAction extends HyperbolicAction> { + protected wallet: Wallet; + + constructor( + name: string, + description: string, + argsSchema: T, + wallet: Wallet, + func: (wallet: Wallet, args: z.infer) => Promise + ) { + super( + name, + description, + argsSchema, + async (args) => await func(wallet, args) + ); + this.wallet = wallet; + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/cdp/get-balance.ts b/hyperbolic_agentkit_TS/src/actions/cdp/get-balance.ts new file mode 100644 index 00000000..1159e2e7 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/cdp/get-balance.ts @@ -0,0 +1,62 @@ +import { z } from 'zod'; +import { Wallet } from '@coinbase/coinbase-sdk'; +import Decimal from 'decimal.js'; +import { CdpAction } from './cdp-action'; + +const GET_BALANCE_PROMPT = ` +This tool will get the balance of all the addresses in the wallet for a given asset. +It takes the asset ID as input. Always use 'eth' for the native asset ETH and 'usdc' for USDC. +`; + +/** + * Input schema for get balance action + */ +export const GetBalanceInputSchema = z.object({ + assetId: z.string().describe('The asset ID to get the balance for') +}); + +export type GetBalanceInput = z.infer; + +/** + * Gets balance for all addresses in the wallet for a given asset + * @param wallet The wallet to get the balance for + * @param args The input arguments for the action + * @returns A promise that resolves to a message containing the balance information + */ +async function getBalance( + wallet: Wallet, + args: GetBalanceInput +): Promise { + const balances: Record = {}; + + try { + const addresses = await wallet.listAddresses(); + for (const address of addresses) { + const balance = await address.getBalance(args.assetId); + balances[address.getId()] = balance; + } + + const balanceLines = Object.entries(balances).map( + ([addr, balance]) => `${addr}: ${balance}` + ); + const formattedBalances = balanceLines.join('\n'); + return `Balances for wallet ${wallet.getId()}:\n${formattedBalances}`; + } catch (error) { + return `Error getting balance for all addresses in the wallet: ${(error as Error).message}`; + } +} + +/** + * Action class for getting wallet balance + */ +export class GetBalanceAction extends CdpAction { + constructor(wallet: Wallet) { + super( + 'get_balance', + GET_BALANCE_PROMPT, + GetBalanceInputSchema, + wallet, + getBalance + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/cdp/index.ts b/hyperbolic_agentkit_TS/src/actions/cdp/index.ts new file mode 100644 index 00000000..a63ecf23 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/cdp/index.ts @@ -0,0 +1,4 @@ +export * from './cdp-action'; +export * from './get-balance'; +export * from './register-basename'; +export * from './transfer'; diff --git a/hyperbolic_agentkit_TS/src/actions/cdp/register-basename.ts b/hyperbolic_agentkit_TS/src/actions/cdp/register-basename.ts new file mode 100644 index 00000000..5651a361 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/cdp/register-basename.ts @@ -0,0 +1,194 @@ +import { z } from 'zod'; +import { Coinbase, Wallet } from '@coinbase/coinbase-sdk'; +import { encodeFunctionData, namehash } from 'viem'; +import { Decimal } from 'decimal.js'; +import { CdpAction } from './cdp-action'; + +const REGISTER_BASENAME_PROMPT = ` +This tool will register a Basename for the agent. The agent should have a wallet associated to register a Basename. +When your network ID is 'base-mainnet' (also sometimes known simply as 'base'), the name must end with .base.eth, and when your network ID is 'base-sepolia', it must ends with .basetest.eth. +Do not suggest any alternatives and never try to register a Basename with another postfix. The prefix of the name must be unique so if the registration of the +Basename fails, you should prompt to try again with a more unique name. +`; + +// Contract addresses +const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET = + '0x4cCb0BB02FCABA27e82a56646E81d8c5bC4119a5'; +const BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET = + '0x49aE3cC2e3AA768B1e5654f5D3C6002144A59581'; + +const L2_RESOLVER_ADDRESS_MAINNET = '0xC6d566A56A1aFf6508b41f6c90ff131615583BCD'; +const L2_RESOLVER_ADDRESS_TESTNET = '0x6533C94869D28fAA8dF77cc63f9e2b2D6Cf77eBA'; + +// Default registration duration (1 year in seconds) +const REGISTRATION_DURATION = '31557600'; + +// Relevant ABI for L2 Resolver Contract +const L2_RESOLVER_ABI = [ + { + inputs: [ + { internalType: 'bytes32', name: 'node', type: 'bytes32' }, + { internalType: 'address', name: 'a', type: 'address' }, + ], + name: 'setAddr', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, + { + inputs: [ + { internalType: 'bytes32', name: 'node', type: 'bytes32' }, + { internalType: 'string', name: 'newName', type: 'string' }, + ], + name: 'setName', + outputs: [], + stateMutability: 'nonpayable', + type: 'function', + }, +]; + +// Relevant ABI for Basenames Registrar Controller Contract +const REGISTRAR_ABI = [ + { + inputs: [ + { + components: [ + { + internalType: 'string', + name: 'name', + type: 'string', + }, + { + internalType: 'address', + name: 'owner', + type: 'address', + }, + { + internalType: 'uint256', + name: 'duration', + type: 'uint256', + }, + { + internalType: 'address', + name: 'resolver', + type: 'address', + }, + { + internalType: 'bytes[]', + name: 'data', + type: 'bytes[]', + }, + { + internalType: 'bool', + name: 'reverseRecord', + type: 'bool', + }, + ], + internalType: 'struct RegistrarController.RegisterRequest', + name: 'request', + type: 'tuple', + }, + ], + name: 'register', + outputs: [], + stateMutability: 'payable', + type: 'function', + }, +]; + +/** + * Input schema for registering a Basename + */ +export const RegisterBasenameInputSchema = z.object({ + basename: z.string().describe('The Basename to assign to the agent'), + amount: z.string().default('0.002').describe('The amount of ETH to pay for registration') +}); + +export type RegisterBasenameInput = z.infer; + +/** + * Creates registration arguments for Basenames + */ +function createRegisterContractMethodArgs( + baseName: string, + addressId: string, + isMainnet: boolean +): object { + const l2ResolverAddress = isMainnet ? L2_RESOLVER_ADDRESS_MAINNET : L2_RESOLVER_ADDRESS_TESTNET; + const suffix = isMainnet ? '.base.eth' : '.basetest.eth'; + + const addressData = encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: 'setAddr', + args: [namehash(baseName), addressId], + }); + const nameData = encodeFunctionData({ + abi: L2_RESOLVER_ABI, + functionName: 'setName', + args: [namehash(baseName), baseName], + }); + + return { + request: [ + baseName.replace(suffix, ''), + addressId, + REGISTRATION_DURATION, + l2ResolverAddress, + [addressData, nameData], + true, + ], + }; +} + +/** + * Registers a Basename for the agent + */ +async function registerBasename( + wallet: Wallet, + args: RegisterBasenameInput +): Promise { + const addressId = (await wallet.getDefaultAddress()).getId(); + const isMainnet = wallet.getNetworkId() === Coinbase.networks.BaseMainnet; + + const suffix = isMainnet ? '.base.eth' : '.basetest.eth'; + if (!args.basename.endsWith(suffix)) { + args.basename += suffix; + } + + const registerArgs = createRegisterContractMethodArgs(args.basename, addressId, isMainnet); + + try { + const contractAddress = isMainnet + ? BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_MAINNET + : BASENAMES_REGISTRAR_CONTROLLER_ADDRESS_TESTNET; + + const invocation = await wallet.invokeContract({ + contractAddress, + method: 'register', + args: registerArgs, + abi: REGISTRAR_ABI, + amount: new Decimal(args.amount), + assetId: 'eth', + }); + + await invocation.wait(); + return `Successfully registered basename ${args.basename} for address ${addressId}`; + } catch (error) { + return `Error registering basename: ${(error as Error).message}`; + } +} + +/** + * Action class for registering a Basename + */ +export class RegisterBasenameAction extends CdpAction { + constructor(wallet: Wallet) { + super( + 'register_basename', + REGISTER_BASENAME_PROMPT, + RegisterBasenameInputSchema, + wallet, + registerBasename + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/cdp/transfer.ts b/hyperbolic_agentkit_TS/src/actions/cdp/transfer.ts new file mode 100644 index 00000000..e409f66c --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/cdp/transfer.ts @@ -0,0 +1,72 @@ +import { z } from 'zod'; +import { Wallet, Amount } from '@coinbase/coinbase-sdk'; +import { CdpAction } from './cdp-action'; + +const TRANSFER_PROMPT = ` +This tool will transfer an asset from the wallet to another onchain address. + +It takes the following inputs: +- amount: The amount to transfer +- assetId: The asset ID to transfer +- destination: Where to send the funds (can be an onchain address, ENS 'example.eth', or Basename 'example.base.eth') +- gasless: Whether to do a gasless transfer + +Important notes: +- Gasless transfers are only available on base-sepolia and base-mainnet (base) networks for 'usdc' asset +- Always use gasless transfers when available +- Always use asset ID 'usdc' when transferring USDC +- Ensure sufficient balance of the input asset before transferring +- When sending native assets (e.g. 'eth' on base-mainnet), ensure there is sufficient balance for the transfer itself AND the gas cost of this transfer +`; + +/** + * Input schema for transfer action + */ +export const TransferInputSchema = z.object({ + amount: z.custom().describe('The amount of the asset to transfer'), + assetId: z.string().describe('The asset ID to transfer'), + destination: z.string().describe('The destination to transfer the funds'), + gasless: z.boolean().default(false).describe('Whether to do a gasless transfer') +}); + +export type TransferInput = z.infer; + +/** + * Transfers a specified amount of an asset to a destination onchain + */ +async function transfer( + wallet: Wallet, + args: TransferInput +): Promise { + try { + const transferResult = await wallet.createTransfer({ + amount: args.amount, + assetId: args.assetId, + destination: args.destination, + gasless: args.gasless, + }); + + const result = await transferResult.wait(); + + return `Transferred ${args.amount} of ${args.assetId} to ${args.destination}. +Transaction hash for the transfer: ${result.getTransactionHash()} +Transaction link for the transfer: ${result.getTransactionLink()}`; + } catch (error) { + return `Error transferring the asset: ${(error as Error).message}`; + } +} + +/** + * Action class for transferring assets + */ +export class TransferAction extends CdpAction { + constructor(wallet: Wallet) { + super( + 'transfer', + TRANSFER_PROMPT, + TransferInputSchema, + wallet, + transfer + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/get-available-gpus.ts b/hyperbolic_agentkit_TS/src/actions/get-available-gpus.ts new file mode 100644 index 00000000..329523ed --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/get-available-gpus.ts @@ -0,0 +1,70 @@ +import { z } from 'zod'; +import axios from 'axios'; +import { HyperbolicAction } from './hyperbolic-action'; +import { getApiKey } from '../utils/api'; +import { APIError } from '../errors/base'; +import { Environment } from '../types/environment'; + +const GET_AVAILABLE_GPUS_PROMPT = ` +This tool will get all the available GPU machines on the Hyperbolic platform. + +It does not take any following inputs + +Important notes: +- Authorization key is required for this operation +- The GPU prices are in CENTS per hour +`; + +/** + * Input schema for getting available GPU machines + */ +export const GetAvailableGpusInputSchema = z.object({}); +export type GetAvailableGpusInput = z.infer; + +/** + * Get available GPUs from the Hyperbolic API + * @param env The environment object containing API keys + * @returns A promise that resolves to a string representation of the API response + * @throws {APIError} If the API request fails + * @throws {ConfigurationError} If the API key is not set + */ +async function getAvailableGpus(env: Partial): Promise { + const apiKey = getApiKey(env); + + try { + const response = await axios.post( + 'https://api.hyperbolic.xyz/v1/marketplace', + { filters: {} }, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + } + } + ); + + return JSON.stringify(response.data); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new APIError( + `Failed to get available GPUs: ${error.message}`, + error.response?.status + ); + } + throw error; + } +} + +/** + * Action class for getting available GPUs + */ +export class GetAvailableGpusAction extends HyperbolicAction { + constructor(env: Partial) { + super( + 'get_available_gpus', + GET_AVAILABLE_GPUS_PROMPT, + GetAvailableGpusInputSchema, + async () => await getAvailableGpus(env) + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/get-current-balance.ts b/hyperbolic_agentkit_TS/src/actions/get-current-balance.ts new file mode 100644 index 00000000..322f9f0e --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/get-current-balance.ts @@ -0,0 +1,110 @@ +import { z } from 'zod'; +import axios from 'axios'; +import { HyperbolicAction } from './hyperbolic-action'; +import { getApiKey } from '../utils/api'; +import { APIError } from '../errors/base'; +import { Environment } from '../types/environment'; + +const GET_CURRENT_BALANCE_PROMPT = ` +This tool retrieves your current Hyperbolic platform credit balance. +It shows: +- Available Hyperbolic platform credits in your account (in USD) +- Recent credit purchase history +Note: This is NOT for checking cryptocurrency wallet balances (ETH/USDC). +For crypto wallet balances, please use a different command. +No input parameters required. +`; + +/** + * Input schema for getting current balance + */ +export const GetCurrentBalanceInputSchema = z.object({}); +export type GetCurrentBalanceInput = z.infer; + +interface BalanceResponse { + credits: number; +} + +interface PurchaseHistory { + amount: string; + timestamp: string; +} + +interface PurchaseHistoryResponse { + purchase_history: PurchaseHistory[]; +} + +/** + * Retrieve current balance and purchase history from the account + * @param env The environment object containing API keys + * @returns A promise that resolves to formatted current balance and purchase history information + * @throws {APIError} If the API request fails + */ +async function getCurrentBalance(env: Partial): Promise { + const apiKey = getApiKey(env); + const headers = { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + }; + + try { + // Get current balance + const balanceResponse = await axios.get( + 'https://api.hyperbolic.xyz/billing/get_current_balance', + { headers } + ); + + // Get purchase history + const historyResponse = await axios.get( + 'https://api.hyperbolic.xyz/billing/purchase_history', + { headers } + ); + + // Format the output + const credits = balanceResponse.data.credits ?? 0; + const balanceUsd = credits / 100; // Convert tokens to dollars + + const output: string[] = [`Your current Hyperbolic platform balance is $${balanceUsd.toFixed(2)}.`]; + + const purchases = historyResponse.data.purchase_history ?? []; + if (purchases.length > 0) { + output.push('\nPurchase History:'); + for (const purchase of purchases) { + const amount = parseFloat(purchase.amount) / 100; + const timestamp = new Date(purchase.timestamp); + const formattedDate = timestamp.toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }); + output.push(`- $${amount.toFixed(2)} on ${formattedDate}`); + } + } else { + output.push('\nNo previous purchases found.'); + } + + return output.join('\n'); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new APIError( + `Error retrieving balance information: ${error.message}`, + error.response?.status + ); + } + throw error; + } +} + +/** + * Action class for getting current balance + */ +export class GetCurrentBalanceAction extends HyperbolicAction { + constructor(env: Partial) { + super( + 'get_current_balance', + GET_CURRENT_BALANCE_PROMPT, + GetCurrentBalanceInputSchema, + async () => await getCurrentBalance(env) + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/get-gpu-status.ts b/hyperbolic_agentkit_TS/src/actions/get-gpu-status.ts new file mode 100644 index 00000000..183fba85 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/get-gpu-status.ts @@ -0,0 +1,71 @@ +import { z } from 'zod'; +import axios from 'axios'; +import { HyperbolicAction } from './hyperbolic-action'; +import { getApiKey } from '../utils/api'; +import { APIError } from '../errors/base'; +import { Environment } from '../types/environment'; + +const GET_GPU_STATUS_PROMPT = ` +This tool will get all the the status and ssh commands of you currently rented GPUs on the Hyperbolic platform. + +It does not take any inputs + +Important notes: +- Authorization key is required for this operation +- The GPU prices are in CENTS per hour +- If the status is "starting", it means the GPU is not ready yet. You can use the GetGPUStatus Action to check the status again after 5 seconds. +- You can access it through the SSHAccess Action and run commands on it through the RemoteShell Action. +`; + +/** + * Input schema for getting GPU status + */ +export const GetGpuStatusInputSchema = z.object({}); +export type GetGpuStatusInput = z.infer; + +/** + * Get status of currently rented GPUs from the Hyperbolic API + * @param env The environment object containing API keys + * @returns A promise that resolves to a string representation of the API response + * @throws {APIError} If the API request fails + * @throws {ConfigurationError} If the API key is not set + */ +async function getGpuStatus(env: Partial): Promise { + const apiKey = getApiKey(env); + + try { + const response = await axios.get( + 'https://api.hyperbolic.xyz/v1/marketplace/instances', + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + } + } + ); + + return JSON.stringify(response.data); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new APIError( + `Failed to get GPU status: ${error.message}`, + error.response?.status + ); + } + throw error; + } +} + +/** + * Action class for getting GPU status + */ +export class GetGpuStatusAction extends HyperbolicAction { + constructor(env: Partial) { + super( + 'get_gpu_status', + GET_GPU_STATUS_PROMPT, + GetGpuStatusInputSchema, + async () => await getGpuStatus(env) + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/get-spend-history.ts b/hyperbolic_agentkit_TS/src/actions/get-spend-history.ts new file mode 100644 index 00000000..a349ef57 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/get-spend-history.ts @@ -0,0 +1,72 @@ +import { z } from 'zod'; +import axios from 'axios'; +import { HyperbolicAction } from './hyperbolic-action'; +import { ConfigurationError } from '../errors/configuration'; +import { APIError } from '../errors/base'; + +const GET_SPEND_HISTORY_PROMPT = ` +This tool retrieves and analyzes your GPU rental spending history from the Hyperbolic platform. +It provides information about: +- List of all instances rented +- Duration of each rental in seconds +- Cost per rental +- Total spending per GPU type +- Overall total spending +No input parameters required. +`; + +const GetSpendHistorySchema = z.object({}).strict(); + +type GetSpendHistoryInput = z.infer; + +/** + * Action class for getting spend history + */ +export class GetSpendHistoryAction extends HyperbolicAction { + private readonly apiKey: string; + + constructor(env: Record) { + super( + 'get_spend_history', + GET_SPEND_HISTORY_PROMPT, + GetSpendHistorySchema, + (args: GetSpendHistoryInput) => this.execute(args) + ); + this.apiKey = env.HYPERBOLIC_API_KEY; + } + + protected validateInput(input: GetSpendHistoryInput): GetSpendHistoryInput { + return GetSpendHistorySchema.parse(input); + } + + async execute(_input: GetSpendHistoryInput): Promise { + if (!this.apiKey) { + throw new ConfigurationError('HYPERBOLIC_API_KEY environment variable is not set'); + } + + try { + const response = await axios.get( + 'https://api.hyperbolic.xyz/v1/marketplace/instances/history', + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.apiKey}`, + }, + } + ); + + // Return empty object if no data + if (!response.data) { + return JSON.stringify({}, null, 2); + } + + // Return response data with pretty formatting + return JSON.stringify(response.data, null, 2); + } catch (error) { + if (axios.isAxiosError(error)) { + throw new APIError(`Failed to get spend history: ${error.message}`); + } + throw error; + } + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/hyperbolic-action.ts b/hyperbolic_agentkit_TS/src/actions/hyperbolic-action.ts new file mode 100644 index 00000000..10dad59e --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/hyperbolic-action.ts @@ -0,0 +1,48 @@ +import { z } from 'zod'; + +/** + * Base interface for all action arguments + */ +export interface BaseActionArgs { + [key: string]: unknown; +} + +/** + * Type for the action function + */ +export type ActionFunction = (args: T) => Promise; + +/** + * Base class for all Hyperbolic actions + */ +export class HyperbolicAction { + constructor( + public readonly name: string, + public readonly description: string, + public readonly argsSchema: z.ZodType | null, + public readonly func: ActionFunction + ) {} + + /** + * Validates the input arguments against the schema and executes the action + * @param args The input arguments for the action + * @returns A promise that resolves to the action result + * @throws {ValidationError} If the arguments fail validation + */ + async execute(args: T): Promise { + if (this.argsSchema) { + try { + this.argsSchema.parse(args); + } catch (error) { + if (error instanceof z.ZodError) { + throw new ValidationError(`Invalid arguments: ${error.message}`); + } + throw error; + } + } + return await this.func(args); + } +} + +// Re-export error for convenience +import { ValidationError } from '../errors/base'; diff --git a/hyperbolic_agentkit_TS/src/actions/remote-shell.ts b/hyperbolic_agentkit_TS/src/actions/remote-shell.ts new file mode 100644 index 00000000..ec7c8838 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/remote-shell.ts @@ -0,0 +1,86 @@ +import { z } from 'zod'; +import { HyperbolicAction } from './hyperbolic-action'; +import { SSHManager } from '../utils/ssh-manager'; + +const REMOTE_SHELL_PROMPT = ` +This tool will execute a command on the remote server via SSH. +It takes the following inputs: +- host: The hostname or IP address of the remote machine +- username: The username to connect with +- password: (Optional) The password for authentication +- privateKey: (Optional) The private key content for authentication +- privateKeyPath: (Optional) Path to the private key file for authentication +- port: The SSH port number +- command: The shell command to execute + +Note: Either password or privateKey/privateKeyPath must be provided for authentication. +`; + +const RemoteShellSchema = z.object({ + host: z.string().min(1), + username: z.string().min(1), + password: z.string().optional(), + privateKey: z.string().optional(), + privateKeyPath: z.string().optional(), + port: z.number().int().min(1).max(65535), + command: z.string().min(1), +}).strict().refine( + (data) => data.password || data.privateKey || data.privateKeyPath, + { + message: 'Either password, privateKey, or privateKeyPath must be provided', + } +); + +export type RemoteShellInput = z.infer; + +/** + * Action class for remote shell execution + */ +export class RemoteShellAction extends HyperbolicAction { + private sshManager: SSHManager | null = null; + + constructor(_env: Record) { + super( + 'remote_shell', + REMOTE_SHELL_PROMPT, + RemoteShellSchema, + (args: RemoteShellInput) => this.execute(args) + ); + } + + protected validateInput(input: RemoteShellInput): RemoteShellInput { + return RemoteShellSchema.parse(input); + } + + async execute(args: RemoteShellInput): Promise { + const input = this.validateInput(args); + + try { + this.sshManager = new SSHManager({ + host: input.host, + username: input.username, + password: input.password, + privateKey: input.privateKey, + privateKeyPath: input.privateKeyPath, + port: input.port, + }); + + await this.sshManager.connect(); + + try { + const result = await this.sshManager.executeCommand(input.command); + return JSON.stringify({ + output: result.output, + exitCode: result.exitCode, + }); + } finally { + await this.sshManager.disconnect(); + } + } catch (error) { + if (this.sshManager) { + await this.sshManager.disconnect(); + } + throw error; + } + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/rent-compute.ts b/hyperbolic_agentkit_TS/src/actions/rent-compute.ts new file mode 100644 index 00000000..db18b59e --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/rent-compute.ts @@ -0,0 +1,98 @@ +import { z } from 'zod'; +import axios from 'axios'; +import { HyperbolicAction } from './hyperbolic-action'; +import { getApiKey } from '../utils/api'; +import { APIError, ValidationError } from '../errors/base'; +import { Environment } from '../types/environment'; + +const RENT_COMPUTE_PROMPT = ` +This tool will allow you to rent a GPU machine on Hyperbolic platform. + +It takes the following inputs: +- cluster_name: Which cluster the node is on +- node_name: Which node the user wants to rent +- gpu_count: How many GPUs the user wants to rent + +Important notes: +- All inputs must be recognized in order to process the rental +- If the inputs are not recognized, automatically use the GetAvailableGpus Action to get the available GPUs +- After renting, you will be able to find it through the GetGPUStatus Action, access it through the SSHAccess Action and run commands on it through the RemoteShell Action. +`; + +/** + * Input schema for compute rental action + */ +export const RentComputeInputSchema = z.object({ + cluster_name: z.string().min(1, 'Cluster name is required'), + node_name: z.string().min(1, 'Node name is required'), + gpu_count: z.string().min(1, 'GPU count is required') +}); + +export type RentComputeInput = z.infer; + +/** + * Creates a marketplace instance using the Hyperbolic API + * @param env The environment object containing API keys + * @param args The rental arguments + * @returns A promise that resolves to a formatted string representation of the API response + * @throws {ValidationError} If required parameters are invalid + * @throws {APIError} If the API request fails + */ +async function rentCompute( + env: Partial, + args: RentComputeInput +): Promise { + const { cluster_name, node_name, gpu_count } = args; + + // Input validation + if (!cluster_name || !node_name || !gpu_count) { + throw new ValidationError('cluster_name, node_name, and gpu_count are required'); + } + + const apiKey = getApiKey(env); + + try { + const response = await axios.post( + 'https://api.hyperbolic.xyz/v1/marketplace/instances/create', + { + cluster_name, + node_name, + gpu_count + }, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + } + } + ); + + return JSON.stringify(response.data, null, 2); + } catch (error) { + if (axios.isAxiosError(error)) { + let errorMessage = `Error renting compute from Hyperbolic marketplace: ${error.message}`; + + if (error.response) { + const responseData = error.response.data; + errorMessage += `\nResponse: ${JSON.stringify(responseData, null, 2)}`; + } + + throw new APIError(errorMessage, error.response?.status); + } + throw error; + } +} + +/** + * Action class for renting compute resources + */ +export class RentComputeAction extends HyperbolicAction { + constructor(env: Partial) { + super( + 'rent_compute', + RENT_COMPUTE_PROMPT, + RentComputeInputSchema, + async (args) => await rentCompute(env, args) + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/ssh-access.ts b/hyperbolic_agentkit_TS/src/actions/ssh-access.ts new file mode 100644 index 00000000..4edaf39a --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/ssh-access.ts @@ -0,0 +1,77 @@ +import { z } from 'zod'; +import { HyperbolicAction } from './hyperbolic-action'; +import { SSHManager } from '../utils/ssh-manager'; + +const SSH_ACCESS_PROMPT = ` +This tool will establish an SSH connection to a remote machine. +It takes the following inputs: +- host: The hostname or IP address of the remote machine +- username: The username to connect with +- password: (Optional) The password for authentication +- privateKey: (Optional) The private key content for authentication +- privateKeyPath: (Optional) Path to the private key file for authentication +- port: The SSH port number + +Note: Either password or privateKey/privateKeyPath must be provided for authentication. +`; + +/** + * Input schema for SSH access + */ +const SSHAccessInputSchema = z.object({ + host: z.string().describe('The hostname or IP address of the remote machine'), + username: z.string().describe('The username to connect with'), + password: z.string().optional().describe('The password for authentication'), + privateKey: z.string().optional().describe('The private key content for authentication'), + privateKeyPath: z.string().optional().describe('Path to the private key file for authentication'), + port: z.number().int().min(1).max(65535).describe('The SSH port number') +}).strict().refine( + data => data.password !== undefined || data.privateKey !== undefined || data.privateKeyPath !== undefined, + { message: 'Either password or privateKey/privateKeyPath must be provided' } +); + +export type SSHAccessInput = z.infer; + +/** + * Action class for SSH access + */ +export class SSHAccessAction extends HyperbolicAction { + private sshManager: SSHManager | null = null; + + constructor(_env: Record) { + super( + 'ssh_access', + SSH_ACCESS_PROMPT, + SSHAccessInputSchema, + (args: SSHAccessInput) => this.execute(args) + ); + } + + protected validateInput(input: SSHAccessInput): SSHAccessInput { + return SSHAccessInputSchema.parse(input); + } + + async execute(input: SSHAccessInput): Promise { + const config = this.validateInput(input); + + try { + this.sshManager = new SSHManager({ + host: config.host, + username: config.username, + password: config.password, + privateKey: config.privateKey, + privateKeyPath: config.privateKeyPath, + port: config.port + }); + + await this.sshManager.connect(); + return `Successfully established SSH connection to ${config.host}`; + } catch (error) { + return `Failed to establish SSH connection: ${(error as Error).message}`; + } finally { + if (this.sshManager) { + await this.sshManager.disconnect(); + } + } + } +} diff --git a/hyperbolic_agentkit_TS/src/actions/terminate-compute.ts b/hyperbolic_agentkit_TS/src/actions/terminate-compute.ts new file mode 100644 index 00000000..383af644 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/actions/terminate-compute.ts @@ -0,0 +1,88 @@ +import { z } from 'zod'; +import axios from 'axios'; +import { HyperbolicAction } from './hyperbolic-action'; +import { getApiKey } from '../utils/api'; +import { APIError, ValidationError } from '../errors/base'; +import { Environment } from '../types/environment'; + +const TERMINATE_COMPUTE_PROMPT = ` +This tool allows you to terminate a GPU instance on the Hyperbolic platform. +It takes the following input: +- instance_id: The ID of the instance to terminate (e.g., "respectful-rose-pelican") +Important notes: +- The instance ID must be valid and active +- After termination, the instance will no longer be accessible +- You can get instance IDs using the GetGPUStatus Action +`; + +/** + * Input schema for compute termination action + */ +export const TerminateComputeInputSchema = z.object({ + instance_id: z.string().min(1, 'Instance ID is required') +}); + +export type TerminateComputeInput = z.infer; + +/** + * Terminates a marketplace instance using the Hyperbolic API + * @param env The environment object containing API keys + * @param args The termination arguments + * @returns A promise that resolves to a formatted string representation of the API response + * @throws {ValidationError} If instance_id is invalid + * @throws {APIError} If the API request fails + */ +async function terminateCompute( + env: Partial, + args: TerminateComputeInput +): Promise { + const { instance_id } = args; + + // Input validation + if (!instance_id) { + throw new ValidationError('instance_id is required'); + } + + const apiKey = getApiKey(env); + + try { + const response = await axios.post( + 'https://api.hyperbolic.xyz/v1/marketplace/instances/terminate', + { id: instance_id }, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + } + } + ); + + return JSON.stringify(response.data, null, 2); + } catch (error) { + if (axios.isAxiosError(error)) { + let errorMessage = `Error terminating compute instance: ${error.message}`; + + if (error.response) { + const responseData = error.response.data; + errorMessage += `\nResponse: ${JSON.stringify(responseData, null, 2)}`; + } + + throw new APIError(errorMessage, error.response?.status); + } + throw error; + } +} + +/** + * Action class for terminating compute resources + */ +export class TerminateComputeAction extends HyperbolicAction { + constructor(env: Partial) { + super( + 'terminate_compute', + TERMINATE_COMPUTE_PROMPT, + TerminateComputeInputSchema, + async (args) => await terminateCompute(env, args) + ); + } +} diff --git a/hyperbolic_agentkit_TS/src/errors/base.ts b/hyperbolic_agentkit_TS/src/errors/base.ts new file mode 100644 index 00000000..632b42ff --- /dev/null +++ b/hyperbolic_agentkit_TS/src/errors/base.ts @@ -0,0 +1,47 @@ +export class HyperbolicError extends Error { + constructor(message: string) { + super(message); + this.name = 'HyperbolicError'; + Object.setPrototypeOf(this, HyperbolicError.prototype); + } +} + +export class ConfigurationError extends HyperbolicError { + constructor(message: string) { + super(message); + this.name = 'ConfigurationError'; + Object.setPrototypeOf(this, ConfigurationError.prototype); + } +} + +export class APIError extends HyperbolicError { + constructor(message: string, public statusCode?: number) { + super(message); + this.name = 'APIError'; + Object.setPrototypeOf(this, APIError.prototype); + } +} + +export class ValidationError extends HyperbolicError { + constructor(message: string) { + super(message); + this.name = 'ValidationError'; + Object.setPrototypeOf(this, ValidationError.prototype); + } +} + +export class SSHError extends HyperbolicError { + constructor(message: string) { + super(message); + this.name = 'SSHError'; + Object.setPrototypeOf(this, SSHError.prototype); + } +} + +export class GPUError extends HyperbolicError { + constructor(message: string) { + super(message); + this.name = 'GPUError'; + Object.setPrototypeOf(this, GPUError.prototype); + } +} diff --git a/hyperbolic_agentkit_TS/src/errors/configuration.ts b/hyperbolic_agentkit_TS/src/errors/configuration.ts new file mode 100644 index 00000000..4b57ca56 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/errors/configuration.ts @@ -0,0 +1,9 @@ +/** + * Error class for configuration-related errors + */ +export class ConfigurationError extends Error { + constructor(message: string) { + super(message); + this.name = 'ConfigurationError'; + } +} diff --git a/hyperbolic_agentkit_TS/src/errors/validation.ts b/hyperbolic_agentkit_TS/src/errors/validation.ts new file mode 100644 index 00000000..0fd2d3a7 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/errors/validation.ts @@ -0,0 +1,6 @@ +export class ValidationError extends Error { + constructor(message: string) { + super(message); + this.name = 'ValidationError'; + } +} diff --git a/hyperbolic_agentkit_TS/src/index.ts b/hyperbolic_agentkit_TS/src/index.ts new file mode 100644 index 00000000..2ddd92c1 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/index.ts @@ -0,0 +1,100 @@ +// Export base types and interfaces +export * from './types/environment'; + +// Export error types +export * from './errors/base'; + +// Export utilities +export * from './utils/api'; +export * from './utils/ssh-manager'; + +// Export actions +export * from './actions/hyperbolic-action'; +export * from './actions/get-available-gpus'; +export * from './actions/get-gpu-status'; +export * from './actions/rent-compute'; +export * from './actions/terminate-compute'; +export * from './actions/ssh-access'; +export * from './actions/remote-shell'; +export * from './actions/get-current-balance'; +export * from './actions/get-spend-history'; + +// Create action instances +import { SSHAccessAction } from './actions/ssh-access'; +import { RemoteShellAction } from './actions/remote-shell'; +import { GetAvailableGpusAction } from './actions/get-available-gpus'; +import { GetGpuStatusAction } from './actions/get-gpu-status'; +import { RentComputeAction } from './actions/rent-compute'; +import { TerminateComputeAction } from './actions/terminate-compute'; +import { GetCurrentBalanceAction } from './actions/get-current-balance'; +import { GetSpendHistoryAction } from './actions/get-spend-history'; + +/** + * Create all Hyperbolic actions with the provided environment + * @param env The environment object containing API keys and configuration + * @returns An object containing all initialized actions + */ +export class HyperbolicAgentKit { + private sshAccess: SSHAccessAction; + private remoteShell: RemoteShellAction; + private getAvailableGpus: GetAvailableGpusAction; + private getGpuStatus: GetGpuStatusAction; + private rentCompute: RentComputeAction; + private terminateCompute: TerminateComputeAction; + private getCurrentBalance: GetCurrentBalanceAction; + private getSpendHistory: GetSpendHistoryAction; + + constructor(env: Record) { + this.sshAccess = new SSHAccessAction(env); + this.remoteShell = new RemoteShellAction(env); + this.getAvailableGpus = new GetAvailableGpusAction(env); + this.getGpuStatus = new GetGpuStatusAction(env); + this.rentCompute = new RentComputeAction(env); + this.terminateCompute = new TerminateComputeAction(env); + this.getCurrentBalance = new GetCurrentBalanceAction(env); + this.getSpendHistory = new GetSpendHistoryAction(env); + } + + async sshAccessAction(input: Parameters[0]): Promise { + return await this.sshAccess.execute(input); + } + + async remoteShellAction(input: Parameters[0]): Promise { + return await this.remoteShell.execute(input); + } + + async getAvailableGpusAction(): Promise { + return await this.getAvailableGpus.execute({}); + } + + async getGpuStatusAction(input: Parameters[0]): Promise { + return await this.getGpuStatus.execute(input); + } + + async rentComputeAction(input: Parameters[0]): Promise { + return await this.rentCompute.execute(input); + } + + async terminateComputeAction(input: Parameters[0]): Promise { + return await this.terminateCompute.execute(input); + } + + async getCurrentBalanceAction(): Promise { + return await this.getCurrentBalance.execute({}); + } + + async getSpendHistoryAction(): Promise { + return await this.getSpendHistory.execute({}); + } +} + +export { + SSHAccessAction, + RemoteShellAction, + GetAvailableGpusAction, + GetGpuStatusAction, + RentComputeAction, + TerminateComputeAction, + GetCurrentBalanceAction, + GetSpendHistoryAction +}; diff --git a/hyperbolic_agentkit_TS/src/types/environment.ts b/hyperbolic_agentkit_TS/src/types/environment.ts new file mode 100644 index 00000000..06c8ee24 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/types/environment.ts @@ -0,0 +1,71 @@ +import { z } from 'zod'; + +/** + * Environment schema for validating environment variables + */ +export const EnvironmentSchema = z.object({ + ANTHROPIC_API_KEY: z.string().min(1, 'ANTHROPIC_API_KEY is required'), + OPENAI_API_KEY: z.string().optional(), + HYPERBOLIC_API_KEY: z.string().min(1, 'HYPERBOLIC_API_KEY is required'), + CDP_API_KEY_NAME: z.string().min(1, 'CDP_API_KEY_NAME is required'), + CDP_API_KEY_PRIVATE_KEY: z.string().min(1, 'CDP_API_KEY_PRIVATE_KEY is required'), + TWITTER_API_KEY: z.string().min(1, 'TWITTER_API_KEY is required'), + TWITTER_API_SECRET: z.string().min(1, 'TWITTER_API_SECRET is required'), + TWITTER_ACCESS_TOKEN: z.string().min(1, 'TWITTER_ACCESS_TOKEN is required'), + TWITTER_ACCESS_TOKEN_SECRET: z.string().min(1, 'TWITTER_ACCESS_TOKEN_SECRET is required'), + SSH_PRIVATE_KEY_PATH: z.string().min(1, 'SSH_PRIVATE_KEY_PATH is required'), + LANGCHAIN_TRACING_V2: z.preprocess((val) => { + if (typeof val === 'string') { + return val.toLowerCase() === 'true'; + } + return val; + }, z.boolean().optional()), + LANGCHAIN_ENDPOINT: z.string().min(1, 'LANGCHAIN_ENDPOINT is required'), + LANGCHAIN_API_KEY: z.string().min(1, 'LANGCHAIN_API_KEY is required'), + LANGCHAIN_PROJECT: z.string().min(1, 'LANGCHAIN_PROJECT is required') +}); + +export type Environment = z.infer; + +/** + * Validates environment variables + * @param env Partial environment object to validate + * @returns Validated environment object + * @throws {Error} If validation fails + */ +export function validateEnvironment(env: Partial): Environment { + try { + return EnvironmentSchema.parse(env); + } catch (error) { + if (error instanceof z.ZodError) { + const errors = error.errors.map(err => err.message).join('\n'); + throw new Error(`Environment validation failed:\n${errors}`); + } + throw error; + } +} + +/** + * Gets environment variables from process.env + * @returns Environment object + */ +export function getEnvironment(): Environment { + const env: Partial = { + ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY, + OPENAI_API_KEY: process.env.OPENAI_API_KEY, + HYPERBOLIC_API_KEY: process.env.HYPERBOLIC_API_KEY, + CDP_API_KEY_NAME: process.env.CDP_API_KEY_NAME, + CDP_API_KEY_PRIVATE_KEY: process.env.CDP_API_KEY_PRIVATE_KEY, + TWITTER_API_KEY: process.env.TWITTER_API_KEY, + TWITTER_API_SECRET: process.env.TWITTER_API_SECRET, + TWITTER_ACCESS_TOKEN: process.env.TWITTER_ACCESS_TOKEN, + TWITTER_ACCESS_TOKEN_SECRET: process.env.TWITTER_ACCESS_TOKEN_SECRET, + SSH_PRIVATE_KEY_PATH: process.env.SSH_PRIVATE_KEY_PATH, + LANGCHAIN_TRACING_V2: process.env.LANGCHAIN_TRACING_V2 === 'true', + LANGCHAIN_ENDPOINT: process.env.LANGCHAIN_ENDPOINT, + LANGCHAIN_API_KEY: process.env.LANGCHAIN_API_KEY, + LANGCHAIN_PROJECT: process.env.LANGCHAIN_PROJECT + }; + + return validateEnvironment(env); +} diff --git a/hyperbolic_agentkit_TS/src/utils/api.ts b/hyperbolic_agentkit_TS/src/utils/api.ts new file mode 100644 index 00000000..305cd701 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/utils/api.ts @@ -0,0 +1,58 @@ +import { ConfigurationError } from '../errors/base'; +import { Environment } from '../types/environment'; + +/** + * Get the Hyperbolic API key from environment variables + * @param env The environment object + * @returns The API key + * @throws {ConfigurationError} If HYPERBOLIC_API_KEY is not set in environment variables + */ +export function getApiKey(env: Partial): string { + const apiKey = env.HYPERBOLIC_API_KEY; + if (!apiKey) { + throw new ConfigurationError('HYPERBOLIC_API_KEY environment variable is not set'); + } + return apiKey; +} + +/** + * Get all required API keys and configuration from environment variables + * @param env The environment object + * @returns Object containing all required API keys and configuration + * @throws {ConfigurationError} If any required environment variables are missing + */ +export function getApiConfig(env: Partial): { + hyperbolicApiKey: string; + cdpApiKeyName: string; + cdpApiKeyPrivateKey: string; + twitterApiKey: string; + twitterApiSecret: string; + twitterAccessToken: string; + twitterAccessTokenSecret: string; +} { + const hyperbolicApiKey = getApiKey(env); + const cdpApiKeyName = env.CDP_API_KEY_NAME; + const cdpApiKeyPrivateKey = env.CDP_API_KEY_PRIVATE_KEY; + const twitterApiKey = env.TWITTER_API_KEY; + const twitterApiSecret = env.TWITTER_API_SECRET; + const twitterAccessToken = env.TWITTER_ACCESS_TOKEN; + const twitterAccessTokenSecret = env.TWITTER_ACCESS_TOKEN_SECRET; + + if (!cdpApiKeyName || !cdpApiKeyPrivateKey) { + throw new ConfigurationError('CDP API key configuration is missing'); + } + + if (!twitterApiKey || !twitterApiSecret || !twitterAccessToken || !twitterAccessTokenSecret) { + throw new ConfigurationError('Twitter API configuration is missing'); + } + + return { + hyperbolicApiKey, + cdpApiKeyName, + cdpApiKeyPrivateKey, + twitterApiKey, + twitterApiSecret, + twitterAccessToken, + twitterAccessTokenSecret, + }; +} diff --git a/hyperbolic_agentkit_TS/src/utils/ssh-manager.ts b/hyperbolic_agentkit_TS/src/utils/ssh-manager.ts new file mode 100644 index 00000000..571ed145 --- /dev/null +++ b/hyperbolic_agentkit_TS/src/utils/ssh-manager.ts @@ -0,0 +1,112 @@ +import { Client, ClientChannel } from 'ssh2'; +import { APIError } from '../errors/base'; +import { readFileSync } from 'fs'; + +export interface SSHConfig { + host: string; + username: string; + password?: string; + privateKey?: string; + privateKeyPath?: string; + port: number; +} + +export interface CommandResult { + output: string; + exitCode: number; +} + +/** + * Manages SSH connections and command execution + */ +export class SSHManager { + private client: Client; + private channel: ClientChannel | null = null; + + constructor(config: SSHConfig) { + this.client = new Client(); + this.config = config; + } + + private config: SSHConfig; + + /** + * Connects to a remote server via SSH + */ + async connect(): Promise { + try { + const config = { + host: this.config.host, + username: this.config.username, + password: this.config.password, + privateKey: this.config.privateKey || (this.config.privateKeyPath ? readFileSync(this.config.privateKeyPath) : undefined), + port: this.config.port + }; + + await new Promise((resolve, reject) => { + this.client.on('ready', () => { + resolve(); + }).on('error', (err: Error) => { + reject(err); + }); + + this.client.connect(config); + }); + } catch (error) { + throw new APIError(`SSH connection failed: ${(error as Error).message}`); + } + } + + /** + * Executes a command on the remote server + */ + async executeCommand(command: string): Promise { + if (!this.client) { + throw new APIError('SSH client not initialized'); + } + + try { + return await new Promise((resolve, reject) => { + this.client.exec(command, (err: Error | undefined, channel: ClientChannel) => { + if (err) { + reject(new APIError(`Command execution failed: ${err.message}`)); + return; + } + + let output = ''; + let exitCode = 0; + + channel.on('data', (data: Buffer) => { + output += data.toString(); + }); + + channel.stderr.on('data', (data: Buffer) => { + output += data.toString(); + }); + + channel.on('close', (code: number) => { + exitCode = code; + resolve({ output, exitCode }); + }); + + channel.on('error', (err: Error) => { + reject(new APIError(`Command execution failed: ${err.message}`)); + }); + }); + }); + } catch (error) { + throw new APIError(`Command execution failed: ${(error as Error).message}`); + } + } + + /** + * Disconnects from the remote server + */ + disconnect(): void { + if (this.channel) { + this.channel.close(); + this.channel = null; + } + this.client.end(); + } +} diff --git a/hyperbolic_agentkit_TS/tests/actions/cdp/get-balance.test.ts b/hyperbolic_agentkit_TS/tests/actions/cdp/get-balance.test.ts new file mode 100644 index 00000000..db6ea2ec --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/cdp/get-balance.test.ts @@ -0,0 +1,60 @@ +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; +import { Wallet, Address } from '@coinbase/coinbase-sdk'; +import Decimal from 'decimal.js'; +import { GetBalanceAction, GetBalanceInput } from '../../../src/actions/cdp/get-balance'; + +vi.mock('@coinbase/coinbase-sdk'); + +describe('GetBalanceAction', () => { + let getBalanceAction: GetBalanceAction; + let mockWallet: Wallet; + const validInput: GetBalanceInput = { + assetId: 'eth' + }; + + beforeEach(() => { + vi.clearAllMocks(); + + // Mock wallet and addresses + const mockAddress1 = { + getId: vi.fn().mockReturnValue('addr1'), + getBalance: vi.fn().mockResolvedValue(new Decimal('1.5')) + } as unknown as Address; + + const mockAddress2 = { + getId: vi.fn().mockReturnValue('addr2'), + getBalance: vi.fn().mockResolvedValue(new Decimal('2.5')) + } as unknown as Address; + + mockWallet = { + getId: vi.fn().mockReturnValue('wallet1'), + listAddresses: vi.fn().mockResolvedValue([mockAddress1, mockAddress2]) + } as unknown as Wallet; + + getBalanceAction = new GetBalanceAction(mockWallet); + }); + + describe('execute', () => { + it('should get balance for all addresses successfully', async () => { + const result = await getBalanceAction.execute(validInput); + expect(result).toContain('Balances for wallet wallet1'); + expect(result).toContain('addr1: 1.5'); + expect(result).toContain('addr2: 2.5'); + expect(mockWallet.listAddresses).toHaveBeenCalled(); + }); + + it('should handle errors when getting balance', async () => { + const error = new Error('Failed to get balance'); + (mockWallet.listAddresses as Mock).mockRejectedValue(error); + + const result = await getBalanceAction.execute(validInput); + expect(result).toContain('Error getting balance'); + expect(result).toContain(error.message); + }); + + it('should validate input before execution', async () => { + const invalidInput = {} as GetBalanceInput; + await expect(getBalanceAction.execute(invalidInput)).rejects.toThrow(); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/cdp/register-basename.test.ts b/hyperbolic_agentkit_TS/tests/actions/cdp/register-basename.test.ts new file mode 100644 index 00000000..4c7efdbc --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/cdp/register-basename.test.ts @@ -0,0 +1,115 @@ +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; +import { Wallet, Coinbase } from '@coinbase/coinbase-sdk'; +import { RegisterBasenameAction, RegisterBasenameInput } from '../../../src/actions/cdp/register-basename'; +import { Decimal } from 'decimal.js'; + +vi.mock('@coinbase/coinbase-sdk'); +vi.mock('viem', () => ({ + encodeFunctionData: vi.fn().mockReturnValue('0x123'), + namehash: vi.fn().mockReturnValue('0x456') +})); + +describe('RegisterBasenameAction', () => { + let registerBasenameAction: RegisterBasenameAction; + let mockWallet: Wallet; + + const validInput: RegisterBasenameInput = { + basename: 'example.base.eth', + amount: '0.002' + }; + + beforeEach(() => { + vi.clearAllMocks(); + + // Mock transaction + const mockTxResult = { + wait: vi.fn().mockResolvedValue({ + hash: '0xabc', + status: 'success' + }) + }; + + // Mock address + const mockAddress = { + getId: vi.fn().mockReturnValue('0x789') + }; + + mockWallet = { + getDefaultAddress: vi.fn().mockResolvedValue(mockAddress), + getNetworkId: vi.fn().mockReturnValue(Coinbase.networks.BaseMainnet), + invokeContract: vi.fn().mockResolvedValue(mockTxResult) + } as unknown as Wallet; + + registerBasenameAction = new RegisterBasenameAction(mockWallet); + }); + + describe('execute', () => { + it('should register basename successfully on mainnet', async () => { + const result = await registerBasenameAction.execute(validInput); + + expect(mockWallet.invokeContract).toHaveBeenCalledWith({ + contractAddress: expect.any(String), + method: 'register', + args: expect.any(Object), + abi: expect.any(Array), + amount: new Decimal('0.002'), + assetId: 'eth' + }); + expect(result).toContain('Successfully registered'); + expect(result).toContain('example.base.eth'); + }); + + it('should register basename successfully on testnet', async () => { + const testnetInput: RegisterBasenameInput = { + basename: 'example.basetest.eth', + amount: '0.002' + }; + + (mockWallet.getNetworkId as Mock).mockReturnValue(Coinbase.networks.BaseSepolia); + + const result = await registerBasenameAction.execute(testnetInput); + + expect(mockWallet.invokeContract).toHaveBeenCalledWith({ + contractAddress: expect.any(String), + method: 'register', + args: expect.any(Object), + abi: expect.any(Array), + amount: new Decimal('0.002'), + assetId: 'eth' + }); + expect(result).toContain('Successfully registered'); + expect(result).toContain('example.basetest.eth'); + }); + + it('should handle registration errors', async () => { + const error = new Error('Registration failed'); + (mockWallet.invokeContract as Mock).mockRejectedValue(error); + + const result = await registerBasenameAction.execute(validInput); + expect(result).toContain('Error registering basename'); + expect(result).toContain(error.message); + }); + + it('should validate basename format for mainnet', async () => { + const invalidInput: RegisterBasenameInput = { + basename: 'example.eth', + amount: '0.002' + }; + + const result = await registerBasenameAction.execute(invalidInput); + expect(result).toContain('example.eth.base.eth'); + }); + + it('should validate basename format for testnet', async () => { + const invalidInput: RegisterBasenameInput = { + basename: 'example.base.eth', + amount: '0.002' + }; + + (mockWallet.getNetworkId as Mock).mockReturnValue(Coinbase.networks.BaseSepolia); + + const result = await registerBasenameAction.execute(invalidInput); + expect(result).toContain('example.base.eth.basetest.eth'); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/cdp/transfer.test.ts b/hyperbolic_agentkit_TS/tests/actions/cdp/transfer.test.ts new file mode 100644 index 00000000..ff313d74 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/cdp/transfer.test.ts @@ -0,0 +1,93 @@ +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; +import { Wallet, Amount } from '@coinbase/coinbase-sdk'; +import { TransferAction, TransferInput } from '../../../src/actions/cdp/transfer'; + +vi.mock('@coinbase/coinbase-sdk'); + +describe('TransferAction', () => { + let transferAction: TransferAction; + let mockWallet: Wallet; + const mockAmount = 100 as Amount; + + const validInput: TransferInput = { + amount: mockAmount, + assetId: 'usdc', + destination: 'example.base.eth', + gasless: true + }; + + beforeEach(() => { + vi.clearAllMocks(); + + // Mock transfer result + const mockTransferResult = { + wait: vi.fn().mockResolvedValue({ + getTransactionHash: vi.fn().mockReturnValue('0x123'), + getTransactionLink: vi.fn().mockReturnValue('https://example.com/tx/0x123') + }) + }; + + mockWallet = { + createTransfer: vi.fn().mockResolvedValue(mockTransferResult) + } as unknown as Wallet; + + transferAction = new TransferAction(mockWallet); + }); + + describe('execute', () => { + it('should execute transfer successfully', async () => { + const result = await transferAction.execute(validInput); + + expect(mockWallet.createTransfer).toHaveBeenCalledWith({ + amount: mockAmount, + assetId: 'usdc', + destination: 'example.base.eth', + gasless: true + }); + + expect(result).toContain('Transferred'); + expect(result).toContain('usdc'); + expect(result).toContain('example.base.eth'); + expect(result).toContain('0x123'); + }); + + it('should handle transfer errors', async () => { + const error = new Error('Transfer failed'); + (mockWallet.createTransfer as Mock).mockRejectedValue(error); + + const result = await transferAction.execute(validInput); + expect(result).toContain('Error transferring the asset'); + expect(result).toContain('Transfer failed'); + }); + + it('should handle non-gasless transfers', async () => { + const nonGaslessInput = { + ...validInput, + gasless: false + }; + + await transferAction.execute(nonGaslessInput); + + expect(mockWallet.createTransfer).toHaveBeenCalledWith({ + amount: mockAmount, + assetId: 'usdc', + destination: 'example.base.eth', + gasless: false + }); + }); + + it('should validate input before execution', async () => { + const invalidInput = { + ...validInput, + amount: undefined + } as unknown as TransferInput; + + // Mock createTransfer to throw error for invalid input + (mockWallet.createTransfer as Mock).mockRejectedValue(new Error('Invalid amount')); + + const result = await transferAction.execute(invalidInput); + expect(result).toContain('Error transferring the asset'); + expect(result).toContain('Invalid amount'); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/get-available-gpus.test.ts b/hyperbolic_agentkit_TS/tests/actions/get-available-gpus.test.ts new file mode 100644 index 00000000..9f5bbc6f --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/get-available-gpus.test.ts @@ -0,0 +1,74 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import axios from 'axios'; +import { GetAvailableGpusAction } from '../../src/actions/get-available-gpus'; +import { APIError } from '../../src/errors/base'; +import { ConfigurationError } from '../../src/errors/configuration'; + +vi.mock('axios'); + +describe('GetAvailableGpusAction', () => { + const mockApiKey = 'test-api-key'; + const mockEnv = { HYPERBOLIC_API_KEY: mockApiKey }; + let action: GetAvailableGpusAction; + + beforeEach(() => { + vi.clearAllMocks(); + action = new GetAvailableGpusAction(mockEnv); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + expect(action).toBeInstanceOf(GetAvailableGpusAction); + }); + }); + + describe('execute', () => { + it('should get available GPUs successfully', async () => { + const mockResponse = { + data: { + machines: [ + { + id: 'gpu-1', + gpu_type: 'RTX 4090', + price_per_hour: 100, + }, + ], + }, + }; + + vi.mocked(axios.post).mockResolvedValue(mockResponse); + + const result = await action.execute({}); + expect(result).toBe(JSON.stringify(mockResponse.data)); + + expect(axios.post).toHaveBeenCalledWith( + 'https://api.hyperbolic.xyz/v1/marketplace', + { filters: {} }, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + }); + + it('should handle API errors', async () => { + const errorMessage = 'API request failed'; + vi.mocked(axios.post).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 500 }, + }); + + await expect(action.execute({})).rejects.toThrow(errorMessage); + }); + + it('should handle missing API key', async () => { + action = new GetAvailableGpusAction({}); + await expect(action.execute({})).rejects.toThrow( + 'HYPERBOLIC_API_KEY environment variable is not set' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/get-current-balance.test.ts b/hyperbolic_agentkit_TS/tests/actions/get-current-balance.test.ts new file mode 100644 index 00000000..de61f114 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/get-current-balance.test.ts @@ -0,0 +1,164 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import axios from 'axios'; +import { GetCurrentBalanceAction } from '../../src/actions/get-current-balance'; +import { APIError } from '../../src/errors/base'; +import { ConfigurationError } from '../../src/errors/configuration'; + +vi.mock('axios'); + +describe('GetCurrentBalanceAction', () => { + const mockApiKey = 'test-api-key'; + const mockEnv = { HYPERBOLIC_API_KEY: mockApiKey }; + let action: GetCurrentBalanceAction; + + beforeEach(() => { + vi.clearAllMocks(); + action = new GetCurrentBalanceAction(mockEnv); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + expect(action).toBeInstanceOf(GetCurrentBalanceAction); + }); + }); + + describe('execute', () => { + it('should get current balance and purchase history successfully', async () => { + const mockBalanceResponse = { + data: { + credits: 10000, // $100.00 + }, + }; + + const mockPurchaseHistoryResponse = { + data: { + purchase_history: [ + { + amount: '5000', // $50.00 + timestamp: '2025-01-14T12:00:00Z', + }, + { + amount: '5000', // $50.00 + timestamp: '2025-01-13T12:00:00Z', + }, + ], + }, + }; + + vi.mocked(axios.get) + .mockResolvedValueOnce(mockBalanceResponse) + .mockResolvedValueOnce(mockPurchaseHistoryResponse); + + const result = await action.execute({}); + expect(result).toBe( + 'Your current Hyperbolic platform balance is $100.00.\n\n' + + 'Purchase History:\n' + + '- $50.00 on January 14, 2025\n' + + '- $50.00 on January 13, 2025' + ); + + expect(axios.get).toHaveBeenNthCalledWith(1, + 'https://api.hyperbolic.xyz/billing/get_current_balance', + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + + expect(axios.get).toHaveBeenNthCalledWith(2, + 'https://api.hyperbolic.xyz/billing/purchase_history', + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + }); + + it('should handle empty purchase history', async () => { + const mockBalanceResponse = { + data: { + credits: 10000, // $100.00 + }, + }; + + const mockPurchaseHistoryResponse = { + data: { + purchase_history: [], + }, + }; + + vi.mocked(axios.get) + .mockResolvedValueOnce(mockBalanceResponse) + .mockResolvedValueOnce(mockPurchaseHistoryResponse); + + const result = await action.execute({}); + expect(result).toBe( + 'Your current Hyperbolic platform balance is $100.00.\n\n' + + 'No previous purchases found.' + ); + }); + + it('should handle missing balance data', async () => { + const mockBalanceResponse = { + data: {}, + }; + + const mockPurchaseHistoryResponse = { + data: { + purchase_history: [], + }, + }; + + vi.mocked(axios.get) + .mockResolvedValueOnce(mockBalanceResponse) + .mockResolvedValueOnce(mockPurchaseHistoryResponse); + + const result = await action.execute({}); + expect(result).toBe( + 'Your current Hyperbolic platform balance is $0.00.\n\n' + + 'No previous purchases found.' + ); + }); + + it('should handle API errors - balance request', async () => { + const errorMessage = 'Failed to fetch balance'; + vi.mocked(axios.get).mockRejectedValueOnce({ + isAxiosError: true, + message: errorMessage, + response: { status: 500 }, + }); + + await expect(action.execute({})).rejects.toThrow(errorMessage); + }); + + it('should handle API errors - purchase history request', async () => { + const mockBalanceResponse = { + data: { + credits: 10000, + }, + }; + + const errorMessage = 'Failed to fetch purchase history'; + vi.mocked(axios.get) + .mockResolvedValueOnce(mockBalanceResponse) + .mockRejectedValueOnce({ + isAxiosError: true, + message: errorMessage, + response: { status: 500 }, + }); + + await expect(action.execute({})).rejects.toThrow(errorMessage); + }); + + it('should handle missing API key', async () => { + action = new GetCurrentBalanceAction({}); + await expect(action.execute({})).rejects.toThrow( + 'HYPERBOLIC_API_KEY environment variable is not set' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/get-gpu-status.test.ts b/hyperbolic_agentkit_TS/tests/actions/get-gpu-status.test.ts new file mode 100644 index 00000000..09bad929 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/get-gpu-status.test.ts @@ -0,0 +1,74 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import axios from 'axios'; +import { GetGpuStatusAction } from '../../src/actions/get-gpu-status'; +import { APIError } from '../../src/errors/base'; +import { ConfigurationError } from '../../src/errors/configuration'; + +vi.mock('axios'); + +describe('GetGpuStatusAction', () => { + const mockApiKey = 'test-api-key'; + const mockEnv = { HYPERBOLIC_API_KEY: mockApiKey }; + let action: GetGpuStatusAction; + + beforeEach(() => { + vi.clearAllMocks(); + action = new GetGpuStatusAction(mockEnv); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + expect(action).toBeInstanceOf(GetGpuStatusAction); + }); + }); + + describe('execute', () => { + it('should get GPU status successfully', async () => { + const mockResponse = { + data: { + instances: [ + { + id: 'instance-1', + status: 'running', + gpu_type: 'RTX 4090', + ssh_command: 'ssh user@host', + }, + ], + }, + }; + + vi.mocked(axios.get).mockResolvedValue(mockResponse); + + const result = await action.execute({}); + expect(result).toBe(JSON.stringify(mockResponse.data)); + + expect(axios.get).toHaveBeenCalledWith( + 'https://api.hyperbolic.xyz/v1/marketplace/instances', + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + }); + + it('should handle API errors', async () => { + const errorMessage = 'API request failed'; + vi.mocked(axios.get).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 500 }, + }); + + await expect(action.execute({})).rejects.toThrow(errorMessage); + }); + + it('should handle missing API key', async () => { + action = new GetGpuStatusAction({}); + await expect(action.execute({})).rejects.toThrow( + 'HYPERBOLIC_API_KEY environment variable is not set' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/get-spend-history.test.ts b/hyperbolic_agentkit_TS/tests/actions/get-spend-history.test.ts new file mode 100644 index 00000000..7c1249b1 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/get-spend-history.test.ts @@ -0,0 +1,120 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import axios from 'axios'; +import { GetSpendHistoryAction } from '../../src/actions/get-spend-history'; +import { APIError } from '../../src/errors/base'; +import { ConfigurationError } from '../../src/errors/configuration'; + +vi.mock('axios'); + +describe('GetSpendHistoryAction', () => { + const mockApiKey = 'test-api-key'; + const mockEnv = { HYPERBOLIC_API_KEY: mockApiKey }; + let action: GetSpendHistoryAction; + + beforeEach(() => { + vi.clearAllMocks(); + action = new GetSpendHistoryAction(mockEnv); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + expect(action).toBeInstanceOf(GetSpendHistoryAction); + }); + }); + + describe('execute', () => { + it('should get spend history successfully', async () => { + const mockResponse = { + data: { + instances: [ + { + instance_id: 'instance-1', + start_time: '2025-01-14T12:00:00Z', + end_time: '2025-01-14T13:00:00Z', + cost: 5000, + gpu_type: 'RTX 4090', + }, + { + instance_id: 'instance-2', + start_time: '2025-01-13T12:00:00Z', + end_time: '2025-01-13T14:00:00Z', + cost: 10000, + gpu_type: 'RTX 4090', + }, + ], + }, + }; + + vi.mocked(axios.get).mockResolvedValue(mockResponse); + + const result = await action.execute({}); + const expected = JSON.stringify(mockResponse.data, null, 2); + expect(result).toBe(expected); + + expect(axios.get).toHaveBeenCalledWith( + 'https://api.hyperbolic.xyz/v1/marketplace/instances/history', + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + }); + + it('should handle empty instance history', async () => { + const mockResponse = { + data: { + instances: [], + }, + }; + + vi.mocked(axios.get).mockResolvedValue(mockResponse); + + const result = await action.execute({}); + const expected = JSON.stringify(mockResponse.data, null, 2); + expect(result).toBe(expected); + }); + + it('should handle missing instance data', async () => { + const mockResponse = { + data: {}, + }; + + vi.mocked(axios.get).mockResolvedValue(mockResponse); + + const result = await action.execute({}); + const expected = JSON.stringify(mockResponse.data, null, 2); + expect(result).toBe(expected); + }); + + it('should handle API errors', async () => { + const errorMessage = 'API request failed'; + vi.mocked(axios.get).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 500 }, + }); + + await expect(action.execute({})).rejects.toThrow(errorMessage); + }); + + it('should handle unauthorized error', async () => { + const errorMessage = 'Unauthorized'; + vi.mocked(axios.get).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 401 }, + }); + + await expect(action.execute({})).rejects.toThrow(errorMessage); + }); + + it('should handle missing API key', async () => { + action = new GetSpendHistoryAction({}); + await expect(action.execute({})).rejects.toThrow( + 'HYPERBOLIC_API_KEY environment variable is not set' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/remote-shell.test.ts b/hyperbolic_agentkit_TS/tests/actions/remote-shell.test.ts new file mode 100644 index 00000000..8103a7b0 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/remote-shell.test.ts @@ -0,0 +1,104 @@ +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; +import { RemoteShellAction, RemoteShellInput } from '../../src/actions/remote-shell'; +import { SSHManager } from '../../src/utils/ssh-manager'; + +vi.mock('../../src/utils/ssh-manager'); + +describe('RemoteShellAction', () => { + let remoteShellAction: RemoteShellAction; + const mockEnv = { HYPERBOLIC_API_KEY: 'test-key' }; + const validInput: RemoteShellInput = { + host: 'test-host', + username: 'test-user', + password: 'test-password', + port: 22, + command: 'ls -la', + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + remoteShellAction = new RemoteShellAction(mockEnv); + expect(remoteShellAction).toBeInstanceOf(RemoteShellAction); + }); + }); + + describe('execute', () => { + it('should execute command successfully', async () => { + const mockConnect = vi.fn(); + const mockExecuteCommand = vi.fn().mockResolvedValue({ + output: 'command output', + exitCode: 0, + }); + const mockDisconnect = vi.fn(); + + (SSHManager as Mock).mockImplementation(() => ({ + connect: mockConnect, + executeCommand: mockExecuteCommand, + disconnect: mockDisconnect, + })); + + remoteShellAction = new RemoteShellAction(mockEnv); + const result = await remoteShellAction.execute(validInput); + const parsedResult = JSON.parse(result); + + expect(mockConnect).toHaveBeenCalled(); + expect(mockExecuteCommand).toHaveBeenCalledWith(validInput.command); + expect(mockDisconnect).toHaveBeenCalled(); + expect(parsedResult).toEqual({ + output: 'command output', + exitCode: 0, + }); + }); + + it('should handle command execution errors', async () => { + const errorMessage = 'Command execution failed'; + const mockConnect = vi.fn(); + const mockExecuteCommand = vi.fn().mockRejectedValue(new Error(errorMessage)); + const mockDisconnect = vi.fn(); + + (SSHManager as Mock).mockImplementation(() => ({ + connect: mockConnect, + executeCommand: mockExecuteCommand, + disconnect: mockDisconnect, + })); + + remoteShellAction = new RemoteShellAction(mockEnv); + await expect(remoteShellAction.execute(validInput)).rejects.toThrow(errorMessage); + + expect(mockConnect).toHaveBeenCalled(); + expect(mockExecuteCommand).toHaveBeenCalledWith(validInput.command); + expect(mockDisconnect).toHaveBeenCalled(); + }); + + it('should handle connection errors', async () => { + const errorMessage = 'Connection failed'; + const mockConnect = vi.fn().mockRejectedValue(new Error(errorMessage)); + const mockExecuteCommand = vi.fn(); + const mockDisconnect = vi.fn(); + + (SSHManager as Mock).mockImplementation(() => ({ + connect: mockConnect, + executeCommand: mockExecuteCommand, + disconnect: mockDisconnect, + })); + + remoteShellAction = new RemoteShellAction(mockEnv); + await expect(remoteShellAction.execute(validInput)).rejects.toThrow(errorMessage); + + expect(mockConnect).toHaveBeenCalled(); + expect(mockExecuteCommand).not.toHaveBeenCalled(); + expect(mockDisconnect).toHaveBeenCalled(); + }); + + it('should validate input before execution', async () => { + remoteShellAction = new RemoteShellAction(mockEnv); + const invalidInput = { ...validInput, port: undefined }; + + await expect(remoteShellAction.execute(invalidInput as any)).rejects.toThrow(); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/rent-compute.test.ts b/hyperbolic_agentkit_TS/tests/actions/rent-compute.test.ts new file mode 100644 index 00000000..2304bbf5 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/rent-compute.test.ts @@ -0,0 +1,97 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import axios from 'axios'; +import { RentComputeAction } from '../../src/actions/rent-compute'; +import { APIError } from '../../src/errors/base'; +import { ConfigurationError } from '../../src/errors/configuration'; +import { ValidationError } from '../../src/errors/validation'; + +vi.mock('axios'); + +describe('RentComputeAction', () => { + const mockApiKey = 'test-api-key'; + const mockEnv = { HYPERBOLIC_API_KEY: mockApiKey }; + let action: RentComputeAction; + + const validInput = { + cluster_name: 'test-cluster', + node_name: 'test-node', + gpu_count: '1', + }; + + beforeEach(() => { + vi.clearAllMocks(); + action = new RentComputeAction(mockEnv); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + expect(action).toBeInstanceOf(RentComputeAction); + }); + }); + + describe('execute', () => { + it('should rent compute successfully', async () => { + const mockResponse = { + data: { + instance_id: 'test-instance-id', + status: 'provisioning', + ssh_command: 'ssh user@host', + }, + }; + + vi.mocked(axios.post).mockResolvedValue(mockResponse); + + const result = await action.execute(validInput); + const expected = JSON.stringify(mockResponse.data, null, 2); + expect(result).toBe(expected); + + expect(axios.post).toHaveBeenCalledWith( + 'https://api.hyperbolic.xyz/v1/marketplace/instances/create', + { + cluster_name: validInput.cluster_name, + node_name: validInput.node_name, + gpu_count: validInput.gpu_count, + }, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + }); + + it('should handle validation errors - missing cluster_name', async () => { + const input = { ...validInput, cluster_name: '' }; + await expect(action.execute(input)).rejects.toThrow('Invalid arguments'); + }); + + it('should handle validation errors - missing node_name', async () => { + const input = { ...validInput, node_name: '' }; + await expect(action.execute(input)).rejects.toThrow('Invalid arguments'); + }); + + it('should handle validation errors - missing gpu_count', async () => { + const input = { ...validInput, gpu_count: '' }; + await expect(action.execute(input)).rejects.toThrow('Invalid arguments'); + }); + + it('should handle API errors', async () => { + const errorMessage = 'API request failed'; + vi.mocked(axios.post).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 500 }, + }); + + await expect(action.execute(validInput)).rejects.toThrow(errorMessage); + }); + + it('should handle missing API key', async () => { + action = new RentComputeAction({}); + await expect(action.execute(validInput)).rejects.toThrow( + 'HYPERBOLIC_API_KEY environment variable is not set' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/ssh-access.test.ts b/hyperbolic_agentkit_TS/tests/actions/ssh-access.test.ts new file mode 100644 index 00000000..78806a36 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/ssh-access.test.ts @@ -0,0 +1,90 @@ +import { describe, it, expect, vi, beforeEach, Mock } from 'vitest'; +import { SSHAccessAction, SSHAccessInput } from '../../src/actions/ssh-access'; +import { SSHManager } from '../../src/utils/ssh-manager'; + +vi.mock('../../src/utils/ssh-manager'); + +describe('SSHAccessAction', () => { + let sshAccessAction: SSHAccessAction; + const mockEnv = { HYPERBOLIC_API_KEY: 'test-key' }; + const validInput: SSHAccessInput = { + host: 'test-host', + username: 'test-user', + password: 'test-password', + port: 22, + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + sshAccessAction = new SSHAccessAction(mockEnv); + expect(sshAccessAction).toBeInstanceOf(SSHAccessAction); + }); + + it('should validate input during execution', async () => { + sshAccessAction = new SSHAccessAction(mockEnv); + const inputWithKey = { + ...validInput, + password: undefined, + privateKey: 'test-private-key', + }; + const result = await sshAccessAction.execute(inputWithKey); + expect(result).toContain('Successfully established SSH connection'); + }); + }); + + describe('execute', () => { + it('should execute SSH access successfully', async () => { + const mockConnect = vi.fn().mockResolvedValue(undefined); + const mockDisconnect = vi.fn(); + + (SSHManager as Mock).mockImplementation(() => ({ + connect: mockConnect, + disconnect: mockDisconnect, + host: validInput.host, + })); + + sshAccessAction = new SSHAccessAction(mockEnv); + const result = await sshAccessAction.execute(validInput); + expect(result).toBe(`Successfully established SSH connection to ${validInput.host}`); + + expect(mockConnect).toHaveBeenCalled(); + expect(mockDisconnect).toHaveBeenCalled(); + }); + + it('should handle SSH access errors', async () => { + const errorMessage = 'Connection failed'; + const mockConnect = vi.fn().mockRejectedValue(new Error(errorMessage)); + const mockDisconnect = vi.fn(); + + (SSHManager as Mock).mockImplementation(() => ({ + connect: mockConnect, + disconnect: mockDisconnect, + host: validInput.host, + })); + + sshAccessAction = new SSHAccessAction(mockEnv); + const result = await sshAccessAction.execute(validInput); + expect(result).toBe(`Failed to establish SSH connection: ${errorMessage}`); + + expect(mockConnect).toHaveBeenCalled(); + expect(mockDisconnect).toHaveBeenCalled(); + }); + + it('should validate input before execution', async () => { + sshAccessAction = new SSHAccessAction(mockEnv); + const invalidInput = { + ...validInput, + password: undefined, + privateKey: undefined, + }; + + await expect(sshAccessAction.execute(invalidInput)).rejects.toThrow( + 'Either password or privateKey/privateKeyPath must be provided' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/actions/terminate-compute.test.ts b/hyperbolic_agentkit_TS/tests/actions/terminate-compute.test.ts new file mode 100644 index 00000000..0b60d832 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/actions/terminate-compute.test.ts @@ -0,0 +1,91 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import axios from 'axios'; +import { TerminateComputeAction } from '../../src/actions/terminate-compute'; +import { APIError } from '../../src/errors/base'; +import { ConfigurationError } from '../../src/errors/configuration'; +import { ValidationError } from '../../src/errors/validation'; + +vi.mock('axios'); + +describe('TerminateComputeAction', () => { + const mockApiKey = 'test-api-key'; + const mockEnv = { HYPERBOLIC_API_KEY: mockApiKey }; + let action: TerminateComputeAction; + + const validInput = { + instance_id: 'test-instance-id', + }; + + beforeEach(() => { + vi.clearAllMocks(); + action = new TerminateComputeAction(mockEnv); + }); + + describe('constructor', () => { + it('should create instance with valid input', () => { + expect(action).toBeInstanceOf(TerminateComputeAction); + }); + }); + + describe('execute', () => { + it('should terminate compute successfully', async () => { + const mockResponse = { + data: { + instance_id: validInput.instance_id, + status: 'terminated', + }, + }; + + vi.mocked(axios.post).mockResolvedValue(mockResponse); + + const result = await action.execute(validInput); + const expected = JSON.stringify(mockResponse.data, null, 2); + expect(result).toBe(expected); + + expect(axios.post).toHaveBeenCalledWith( + 'https://api.hyperbolic.xyz/v1/marketplace/instances/terminate', + { id: validInput.instance_id }, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${mockApiKey}`, + }, + } + ); + }); + + it('should handle validation errors - missing instance_id', async () => { + const input = { instance_id: '' }; + await expect(action.execute(input)).rejects.toThrow('Invalid arguments'); + }); + + it('should handle API errors - instance not found', async () => { + const errorMessage = 'Instance not found'; + vi.mocked(axios.post).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 404 }, + }); + + await expect(action.execute(validInput)).rejects.toThrow(errorMessage); + }); + + it('should handle API errors - unauthorized', async () => { + const errorMessage = 'Unauthorized'; + vi.mocked(axios.post).mockRejectedValue({ + isAxiosError: true, + message: errorMessage, + response: { status: 401 }, + }); + + await expect(action.execute(validInput)).rejects.toThrow(errorMessage); + }); + + it('should handle missing API key', async () => { + action = new TerminateComputeAction({}); + await expect(action.execute(validInput)).rejects.toThrow( + 'HYPERBOLIC_API_KEY environment variable is not set' + ); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tests/utils/ssh-manager.test.ts b/hyperbolic_agentkit_TS/tests/utils/ssh-manager.test.ts new file mode 100644 index 00000000..c77c60c3 --- /dev/null +++ b/hyperbolic_agentkit_TS/tests/utils/ssh-manager.test.ts @@ -0,0 +1,116 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { SSHManager, SSHConfig, CommandResult } from '../../src/utils/ssh-manager'; +import { Client, ClientChannel } from 'ssh2'; +import { EventEmitter } from 'events'; + +// Create a mock Client class +class MockClient extends EventEmitter { + connect: any; + exec: any; + end: any; + + constructor() { + super(); + this.connect = vi.fn((config) => { + setTimeout(() => this.emit('ready'), 0); + return this; + }); + this.exec = vi.fn((command, callback) => { + const channel = new EventEmitter() as ClientChannel; + channel.stderr = new EventEmitter(); + callback(undefined, channel); + setTimeout(() => { + channel.emit('data', Buffer.from('test output')); + channel.stderr.emit('data', Buffer.from('test error')); + channel.emit('close', 0); + }, 0); + }); + this.end = vi.fn(); + } +} + +// Mock the ssh2 Client +vi.mock('ssh2', () => { + return { + Client: vi.fn().mockImplementation(() => new MockClient()), + }; +}); + +describe('SSHManager', () => { + let sshManager: SSHManager; + const config: SSHConfig = { + host: 'test-host', + username: 'test-user', + password: 'test-password', + port: 22, + }; + + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(Client).mockClear(); + sshManager = new SSHManager(config); + }); + + describe('connect', () => { + it('should connect successfully with password', async () => { + await expect(sshManager.connect()).resolves.not.toThrow(); + }); + + it('should connect successfully with private key', async () => { + const configWithKey: SSHConfig = { + ...config, + password: undefined, + privateKey: 'test-private-key', + }; + sshManager = new SSHManager(configWithKey); + await expect(sshManager.connect()).resolves.not.toThrow(); + }); + + it('should handle connection errors', async () => { + const mockClient = new MockClient(); + mockClient.connect = vi.fn().mockImplementation(() => { + process.nextTick(() => mockClient.emit('error', new Error('Connection failed'))); + return mockClient; + }); + vi.mocked(Client).mockImplementation(() => mockClient); + + sshManager = new SSHManager(config); + await expect(sshManager.connect()).rejects.toThrow('SSH connection failed'); + }); + }); + + describe('executeCommand', () => { + it('should execute command successfully', async () => { + const mockClient = new MockClient(); + vi.mocked(Client).mockImplementation(() => mockClient); + + sshManager = new SSHManager(config); + await sshManager.connect(); + const result = await sshManager.executeCommand('test command'); + expect(result).toEqual({ + output: 'test outputtest error', + exitCode: 0, + }); + }); + + it('should handle command execution errors', async () => { + const mockClient = new MockClient(); + mockClient.exec = vi.fn().mockImplementation((command, callback) => { + callback(new Error('Command execution failed'), {} as ClientChannel); + }); + vi.mocked(Client).mockImplementation(() => mockClient); + + sshManager = new SSHManager(config); + await sshManager.connect(); + await expect(sshManager.executeCommand('test command')).rejects.toThrow('Command execution failed'); + }); + }); + + describe('disconnect', () => { + it('should disconnect successfully', async () => { + await sshManager.connect(); + sshManager.disconnect(); + expect(vi.mocked(Client).mock.results[0].value.end).toHaveBeenCalled(); + }); + }); +}); diff --git a/hyperbolic_agentkit_TS/tsconfig.json b/hyperbolic_agentkit_TS/tsconfig.json new file mode 100644 index 00000000..f818aa33 --- /dev/null +++ b/hyperbolic_agentkit_TS/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["ES2020"], + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "baseUrl": "./", + "paths": { + "*": ["node_modules/*"] + }, + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/hyperbolic_agentkit_TS/tsconfig.test.json b/hyperbolic_agentkit_TS/tsconfig.test.json new file mode 100644 index 00000000..bf4c9ae4 --- /dev/null +++ b/hyperbolic_agentkit_TS/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "tsconfig.json", + "include": ["src/**/*", "tests/**/*"], + "exclude": ["node_modules", "dist"], + "compilerOptions": { + "rootDir": "." + } +} diff --git a/hyperbolic_agentkit_TS/vitest.config.ts b/hyperbolic_agentkit_TS/vitest.config.ts new file mode 100644 index 00000000..07342a62 --- /dev/null +++ b/hyperbolic_agentkit_TS/vitest.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: ['node_modules/**', 'dist/**', '**/*.test.ts'], + }, + }, +});