From 5b80b36d365d0d1b9814ee45d7d45bff8a759b6b Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Sat, 21 Feb 2026 06:25:45 +0000 Subject: [PATCH 1/3] refactor: reorganize client code into consumer/, provider/, and auth/ subdirs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move scattered client code under src/client/ with role-based organization: - src/client/ → src/client/consumer/ (HTTP client for purchasing inference) - src/ws/ → src/client/provider/ws/ (WebSocket client for offering inference) - src/schemas/ → src/client/provider/schemas/ (protocol schemas) - src/auth/ → src/client/auth/ (shared authentication) Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- src/cli/start.ts | 6 +++--- src/{ => client}/auth/credentials.ts | 0 src/{ => client}/auth/programmatic.ts | 2 +- src/{ => client}/auth/setup.ts | 0 src/client/{ => consumer}/index.ts | 0 src/client/{ => consumer}/permit2.ts | 0 src/client/{ => consumer}/signers.ts | 0 src/client/{ => consumer}/sixerr-client.ts | 0 src/client/{ => consumer}/types.ts | 0 src/{ => client/provider}/schemas/errors.ts | 0 src/{ => client/provider}/schemas/index.ts | 0 src/{ => client/provider}/schemas/openresponses.ts | 0 src/{ => client/provider}/schemas/protocol.ts | 0 src/{ => client/provider}/schemas/schemas.test.ts | 0 src/{ => client/provider}/ws/display.ts | 0 src/{ => client/provider}/ws/raw-data.ts | 0 src/{ => client/provider}/ws/reconnect.test.ts | 0 src/{ => client/provider}/ws/reconnect.ts | 0 src/{ => client/provider}/ws/ws-client.test.ts | 0 src/{ => client/provider}/ws/ws-client.ts | 4 ++-- src/plugin.ts | 4 ++-- src/proxy/http-proxy.ts | 2 +- src/start-programmatic.ts | 6 +++--- 24 files changed, 13 insertions(+), 13 deletions(-) rename src/{ => client}/auth/credentials.ts (100%) rename src/{ => client}/auth/programmatic.ts (97%) rename src/{ => client}/auth/setup.ts (100%) rename src/client/{ => consumer}/index.ts (100%) rename src/client/{ => consumer}/permit2.ts (100%) rename src/client/{ => consumer}/signers.ts (100%) rename src/client/{ => consumer}/sixerr-client.ts (100%) rename src/client/{ => consumer}/types.ts (100%) rename src/{ => client/provider}/schemas/errors.ts (100%) rename src/{ => client/provider}/schemas/index.ts (100%) rename src/{ => client/provider}/schemas/openresponses.ts (100%) rename src/{ => client/provider}/schemas/protocol.ts (100%) rename src/{ => client/provider}/schemas/schemas.test.ts (100%) rename src/{ => client/provider}/ws/display.ts (100%) rename src/{ => client/provider}/ws/raw-data.ts (100%) rename src/{ => client/provider}/ws/reconnect.test.ts (100%) rename src/{ => client/provider}/ws/reconnect.ts (100%) rename src/{ => client/provider}/ws/ws-client.test.ts (100%) rename src/{ => client/provider}/ws/ws-client.ts (98%) diff --git a/package.json b/package.json index 4f87f8d..b7b7330 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ }, "exports": { "./openclaw": "./src/openclaw/index.ts", - "./client": "./src/client/index.ts", + "./client": "./src/client/consumer/index.ts", "./setup": "./src/config/setup-programmatic.ts", "./start": "./src/start-programmatic.ts" }, diff --git a/src/cli/start.ts b/src/cli/start.ts index 89cf09e..1c29722 100644 --- a/src/cli/start.ts +++ b/src/cli/start.ts @@ -12,12 +12,12 @@ import { createCdpSigner } from "../wallet/cdp-signer.js"; import { createLocalSigner } from "../wallet/local-signer.js"; import { decryptKeystore } from "../wallet/keystore.js"; import type { KeystoreV3 } from "../wallet/keystore.js"; -import { authenticateProgrammatic } from "../auth/programmatic.js"; +import { authenticateProgrammatic } from "../client/auth/programmatic.js"; import { startPlugin } from "../plugin.js"; import type { WalletSigner } from "../wallet/types.js"; -import { SixerrClient, createLocalPaymentSigner, createCdpPaymentSigner } from "../client/index.js"; +import { SixerrClient, createLocalPaymentSigner, createCdpPaymentSigner } from "../client/consumer/index.js"; import { createHttpProxy } from "../proxy/http-proxy.js"; -import type { PaymentSigner } from "../client/types.js"; +import type { PaymentSigner } from "../client/consumer/types.js"; // --------------------------------------------------------------------------- // Start Command diff --git a/src/auth/credentials.ts b/src/client/auth/credentials.ts similarity index 100% rename from src/auth/credentials.ts rename to src/client/auth/credentials.ts diff --git a/src/auth/programmatic.ts b/src/client/auth/programmatic.ts similarity index 97% rename from src/auth/programmatic.ts rename to src/client/auth/programmatic.ts index 88cd4a9..dd36412 100644 --- a/src/auth/programmatic.ts +++ b/src/client/auth/programmatic.ts @@ -1,4 +1,4 @@ -import type { WalletSigner } from "../wallet/types.js"; +import type { WalletSigner } from "../../wallet/types.js"; // --------------------------------------------------------------------------- // Types diff --git a/src/auth/setup.ts b/src/client/auth/setup.ts similarity index 100% rename from src/auth/setup.ts rename to src/client/auth/setup.ts diff --git a/src/client/index.ts b/src/client/consumer/index.ts similarity index 100% rename from src/client/index.ts rename to src/client/consumer/index.ts diff --git a/src/client/permit2.ts b/src/client/consumer/permit2.ts similarity index 100% rename from src/client/permit2.ts rename to src/client/consumer/permit2.ts diff --git a/src/client/signers.ts b/src/client/consumer/signers.ts similarity index 100% rename from src/client/signers.ts rename to src/client/consumer/signers.ts diff --git a/src/client/sixerr-client.ts b/src/client/consumer/sixerr-client.ts similarity index 100% rename from src/client/sixerr-client.ts rename to src/client/consumer/sixerr-client.ts diff --git a/src/client/types.ts b/src/client/consumer/types.ts similarity index 100% rename from src/client/types.ts rename to src/client/consumer/types.ts diff --git a/src/schemas/errors.ts b/src/client/provider/schemas/errors.ts similarity index 100% rename from src/schemas/errors.ts rename to src/client/provider/schemas/errors.ts diff --git a/src/schemas/index.ts b/src/client/provider/schemas/index.ts similarity index 100% rename from src/schemas/index.ts rename to src/client/provider/schemas/index.ts diff --git a/src/schemas/openresponses.ts b/src/client/provider/schemas/openresponses.ts similarity index 100% rename from src/schemas/openresponses.ts rename to src/client/provider/schemas/openresponses.ts diff --git a/src/schemas/protocol.ts b/src/client/provider/schemas/protocol.ts similarity index 100% rename from src/schemas/protocol.ts rename to src/client/provider/schemas/protocol.ts diff --git a/src/schemas/schemas.test.ts b/src/client/provider/schemas/schemas.test.ts similarity index 100% rename from src/schemas/schemas.test.ts rename to src/client/provider/schemas/schemas.test.ts diff --git a/src/ws/display.ts b/src/client/provider/ws/display.ts similarity index 100% rename from src/ws/display.ts rename to src/client/provider/ws/display.ts diff --git a/src/ws/raw-data.ts b/src/client/provider/ws/raw-data.ts similarity index 100% rename from src/ws/raw-data.ts rename to src/client/provider/ws/raw-data.ts diff --git a/src/ws/reconnect.test.ts b/src/client/provider/ws/reconnect.test.ts similarity index 100% rename from src/ws/reconnect.test.ts rename to src/client/provider/ws/reconnect.test.ts diff --git a/src/ws/reconnect.ts b/src/client/provider/ws/reconnect.ts similarity index 100% rename from src/ws/reconnect.ts rename to src/client/provider/ws/reconnect.ts diff --git a/src/ws/ws-client.test.ts b/src/client/provider/ws/ws-client.test.ts similarity index 100% rename from src/ws/ws-client.test.ts rename to src/client/provider/ws/ws-client.test.ts diff --git a/src/ws/ws-client.ts b/src/client/provider/ws/ws-client.ts similarity index 98% rename from src/ws/ws-client.ts rename to src/client/provider/ws/ws-client.ts index 3b74579..32f454b 100644 --- a/src/ws/ws-client.ts +++ b/src/client/provider/ws/ws-client.ts @@ -1,7 +1,7 @@ import WebSocket from "ws"; import { ServerMessageSchema, SIXERR_PROTOCOL_VERSION } from "../schemas/protocol.js"; -import type { OpenClawClientConfig } from "../relay/openclaw-client.js"; -import { handleIncomingRequest } from "../relay/request-forwarder.js"; +import type { OpenClawClientConfig } from "../../../relay/openclaw-client.js"; +import { handleIncomingRequest } from "../../../relay/request-forwarder.js"; import { rawDataToString } from "./raw-data.js"; import { computeBackoff, DEFAULT_RECONNECT_POLICY, type BackoffPolicy } from "./reconnect.js"; diff --git a/src/plugin.ts b/src/plugin.ts index a224c78..fe254e4 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,7 +1,7 @@ import * as http from "node:http"; import { fileURLToPath } from "node:url"; -import { PluginClient } from "./ws/ws-client.js"; -import { createStatusDisplay } from "./ws/display.js"; +import { PluginClient } from "./client/provider/ws/ws-client.js"; +import { createStatusDisplay } from "./client/provider/ws/display.js"; // --------------------------------------------------------------------------- // Types diff --git a/src/proxy/http-proxy.ts b/src/proxy/http-proxy.ts index a649c14..201a2e2 100644 --- a/src/proxy/http-proxy.ts +++ b/src/proxy/http-proxy.ts @@ -1,6 +1,6 @@ import * as http from "node:http"; import { Readable } from "node:stream"; -import type { SixerrClient } from "../client/sixerr-client.js"; +import type { SixerrClient } from "../client/consumer/sixerr-client.js"; // --------------------------------------------------------------------------- // Local HTTP Proxy diff --git a/src/start-programmatic.ts b/src/start-programmatic.ts index 461b823..364a25f 100644 --- a/src/start-programmatic.ts +++ b/src/start-programmatic.ts @@ -3,7 +3,7 @@ import { createCdpSigner } from "./wallet/cdp-signer.js"; import { createLocalSigner } from "./wallet/local-signer.js"; import { decryptKeystore } from "./wallet/keystore.js"; import type { KeystoreV3 } from "./wallet/keystore.js"; -import { authenticateProgrammatic } from "./auth/programmatic.js"; +import { authenticateProgrammatic } from "./client/auth/programmatic.js"; import { startPlugin } from "./plugin.js"; import type { WalletSigner } from "./wallet/types.js"; import type { PluginHandle } from "./plugin.js"; @@ -11,9 +11,9 @@ import { SixerrClient, createLocalPaymentSigner, createCdpPaymentSigner, -} from "./client/index.js"; +} from "./client/consumer/index.js"; import { createHttpProxy } from "./proxy/http-proxy.js"; -import type { PaymentSigner } from "./client/types.js"; +import type { PaymentSigner } from "./client/consumer/types.js"; import type { SixerrConfig } from "./config/schema.js"; // --------------------------------------------------------------------------- From cca784a8fe57a1cb3a40cd505782cf45f1bb75f5 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Sat, 21 Feb 2026 14:20:00 +0000 Subject: [PATCH 2/3] refactor: replace OpenClaw gateway with direct pi-ai SDK inference Call the LLM directly from the plugin using pi-ai's streamSimple/completeSimple instead of forwarding requests to the OpenClaw gateway at localhost:18789. Model config is read from /openclaw.json and credentials/model registry from auth.json + models.json in the agent directory. Startup fails fast if any of these are missing or misconfigured. Co-Authored-By: Claude Opus 4.6 --- package.json | 3 +- pnpm-lock.yaml | 2765 ++++++++++++++++- src/cli/start.ts | 13 +- src/client/provider/inference/index.ts | 3 + .../provider/inference/inference-handler.ts | 464 +++ .../provider/inference/model-resolver.ts | 147 + src/client/provider/inference/types.ts | 12 + src/client/provider/ws/ws-client.test.ts | 10 +- src/client/provider/ws/ws-client.ts | 10 +- src/plugin.ts | 11 +- src/relay/openclaw-client.test.ts | 602 ---- src/relay/openclaw-client.ts | 233 -- src/relay/request-forwarder.ts | 88 - src/start-programmatic.ts | 12 +- 14 files changed, 3356 insertions(+), 1017 deletions(-) create mode 100644 src/client/provider/inference/index.ts create mode 100644 src/client/provider/inference/inference-handler.ts create mode 100644 src/client/provider/inference/model-resolver.ts create mode 100644 src/client/provider/inference/types.ts delete mode 100644 src/relay/openclaw-client.test.ts delete mode 100644 src/relay/openclaw-client.ts delete mode 100644 src/relay/request-forwarder.ts diff --git a/package.json b/package.json index b7b7330..6cf181b 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "node": ">=22.12.0" }, "exports": { - "./openclaw": "./src/openclaw/index.ts", "./client": "./src/client/consumer/index.ts", "./setup": "./src/config/setup-programmatic.ts", "./start": "./src/start-programmatic.ts" @@ -25,6 +24,8 @@ "dependencies": { "@clack/prompts": "^1.0.1", "@coinbase/cdp-sdk": "^1.44.1", + "@mariozechner/pi-ai": "0.53.0", + "@mariozechner/pi-coding-agent": "0.53.0", "jose": "^6.1.3", "open": "^11.0.0", "viem": "^2.45.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 716066f..659cfef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,12 @@ importers: '@coinbase/cdp-sdk': specifier: ^1.44.1 version: 1.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@mariozechner/pi-ai': + specifier: 0.53.0 + version: 0.53.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + '@mariozechner/pi-coding-agent': + specifier: 0.53.0 + version: 0.53.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) jose: specifier: ^6.1.3 version: 6.1.3 @@ -44,17 +50,178 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.2.3)(tsx@4.21.0) + version: 4.0.18(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) packages: '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + '@anthropic-ai/sdk@0.73.0': + resolution: {integrity: sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw==} + hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-bedrock-runtime@3.995.0': + resolution: {integrity: sha512-nI7tT11L9s34AKr95GHmxs6k2+3ie+rEOew2cXOwsMC9k/5aifrZwh0JjAkBop4FqbmS8n0ZjCKDjBZFY/0YxQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-sso@3.993.0': + resolution: {integrity: sha512-VLUN+wIeNX24fg12SCbzTUBnBENlL014yMKZvRhPkcn4wHR6LKgNrjsG3fZ03Xs0XoKaGtNFi1VVrq666sGBoQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.973.11': + resolution: {integrity: sha512-wdQ8vrvHkKIV7yNUKXyjPWKCdYEUrZTHJ8Ojd5uJxXp9vqPCkUR1dpi1NtOLcrDgueJH7MUH5lQZxshjFPSbDA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.9': + resolution: {integrity: sha512-ZptrOwQynfupubvcngLkbdIq/aXvl/czdpEG8XJ8mN8Nb19BR0jaK0bR+tfuMU36Ez9q4xv7GGkHFqEEP2hUUQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.11': + resolution: {integrity: sha512-hECWoOoH386bGr89NQc9vA/abkGf5TJrMREt+lhNcnSNmoBS04fK7vc3LrJBSQAUGGVj0Tz3f4dHB3w5veovig==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.9': + resolution: {integrity: sha512-zr1csEu9n4eDiHMTYJabX1mDGuGLgjgUnNckIivvk43DocJC9/f6DefFrnUPZXE+GHtbW50YuXb+JIxKykU74A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.9': + resolution: {integrity: sha512-m4RIpVgZChv0vWS/HKChg1xLgZPpx8Z+ly9Fv7FwA8SOfuC6I3htcSaBz2Ch4bneRIiBUhwP4ziUo0UZgtJStQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.10': + resolution: {integrity: sha512-70nCESlvnzjo4LjJ8By8MYIiBogkYPSXl3WmMZfH9RZcB/Nt9qVWbFpYj6Fk1vLa4Vk8qagFVeXgxdieMxG1QA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.9': + resolution: {integrity: sha512-gOWl0Fe2gETj5Bk151+LYKpeGi2lBDLNu+NMNpHRlIrKHdBmVun8/AalwMK8ci4uRfG5a3/+zvZBMpuen1SZ0A==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.9': + resolution: {integrity: sha512-ey7S686foGTArvFhi3ifQXmgptKYvLSGE2250BAQceMSXZddz7sUSNERGJT2S7u5KIe/kgugxrt01hntXVln6w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.9': + resolution: {integrity: sha512-8LnfS76nHXoEc9aRRiMMpxZxJeDG0yusdyo3NvPhCgESmBUgpMa4luhGbClW5NoX/qRcGxxM6Z/esqANSNMTow==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/eventstream-handler-node@3.972.5': + resolution: {integrity: sha512-xEmd3dnyn83K6t4AJxBJA63wpEoCD45ERFG0XMTViD2E/Ohls9TLxjOWPb1PAxR9/46cKy/TImez1GoqP6xVNQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-eventstream@3.972.3': + resolution: {integrity: sha512-pbvZ6Ye/Ks6BAZPa3RhsNjHrvxU9li25PMhSdDpbX0jzdpKpAkIR65gXSNKmA/REnSdEMWSD4vKUW+5eMFzB6w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.11': + resolution: {integrity: sha512-R8CvPsPHXwzIHCAza+bllY6PrctEk4lYq/SkHJz9NLoBHCcKQrbOcsfXxO6xmipSbUNIbNIUhH0lBsJGgsRdiw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-websocket@3.972.6': + resolution: {integrity: sha512-1DedO6N3m8zQ/vG6twNiHtsdwBgk773VdavLEbB3NXeKZDlzSK1BTviqWwvJdKx5UnIy4kGGP6WWpCEFEt/bhQ==} + engines: {node: '>= 14.0.0'} + + '@aws-sdk/nested-clients@3.993.0': + resolution: {integrity: sha512-iOq86f2H67924kQUIPOAvlmMaOAvOLoDOIb66I2YqSUpMYB6ufiuJW3RlREgskxv86S5qKzMnfy/X6CqMjK6XQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.995.0': + resolution: {integrity: sha512-7gq9gismVhESiRsSt0eYe1y1b6jS20LqLk+e/YSyPmGi9yHdndHQLIq73RbEJnK/QPpkQGFqq70M1mI46M1HGw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.993.0': + resolution: {integrity: sha512-+35g4c+8r7sB9Sjp1KPdM8qxGn6B/shBjJtEUN4e+Edw9UEQlZKIzioOGu3UAbyE0a/s450LdLZr4wbJChtmww==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.995.0': + resolution: {integrity: sha512-lYSadNdZZ513qCKoj/KlJ+PgCycL3n8ZNS37qLVFC0t7TbHzoxvGquu9aD2n9OCERAn43OMhQ7dXjYDYdjAXzA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.993.0': + resolution: {integrity: sha512-j6vioBeRZ4eHX4SWGvGPpwGg/xSOcK7f1GL0VM+rdf3ZFTIsUEhCFmD78B+5r2PgztcECSzEfvHQX01k8dPQPw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.995.0': + resolution: {integrity: sha512-aym/pjB8SLbo9w2nmkrDdAAVKVlf7CM71B9mKhjDbJTzwpSFBPHqJIMdDyj0mLumKC0aIVDr1H6U+59m9GvMFw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-format-url@3.972.3': + resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} + + '@aws-sdk/util-user-agent-node@3.972.10': + resolution: {integrity: sha512-LVXzICPlsheET+sE6tkcS47Q5HkSTrANIlqL1iFxGAY/wRQ236DX/PCAK56qMh9QJoXAfXfoRW0B0Og4R+X7Nw==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.972.5': + resolution: {integrity: sha512-mCae5Ys6Qm1LDu0qdGwx2UQ63ONUe+FHw908fJzLDqFKTDBK4LDZUqKWm4OkTCNFq19bftjsBSESIGLD/s3/rA==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + engines: {node: '>=18.0.0'} + '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} + '@borewit/text-codec@0.2.1': + resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} + '@clack/core@1.0.1': resolution: {integrity: sha512-WKeyK3NOBwDOzagPR5H08rFk9D/WuN705yEbuZvKqlkmoLM2woKtXb10OO2k1NoSU4SFG947i2/SCYh+2u5e4g==} @@ -220,9 +387,120 @@ packages: cpu: [x64] os: [win32] + '@google/genai@1.42.0': + resolution: {integrity: sha512-+3nlMTcrQufbQ8IumGkOphxD5Pd5kKyJOzLcnY0/1IuE8upJk5aLmoexZ2BJhBp1zAjRJMEB4a2CJwKI9e2EYw==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.25.2 + peerDependenciesMeta: + '@modelcontextprotocol/sdk': + optional: true + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@mariozechner/clipboard-darwin-arm64@0.3.2': + resolution: {integrity: sha512-uBf6K7Je1ihsgvmWxA8UCGCeI+nbRVRXoarZdLjl6slz94Zs1tNKFZqx7aCI5O1i3e0B6ja82zZ06BWrl0MCVw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@mariozechner/clipboard-darwin-universal@0.3.2': + resolution: {integrity: sha512-mxSheKTW2U9LsBdXy0SdmdCAE5HqNS9QUmpNHLnfJ+SsbFKALjEZc5oRrVMXxGQSirDvYf5bjmRyT0QYYonnlg==} + engines: {node: '>= 10'} + os: [darwin] + + '@mariozechner/clipboard-darwin-x64@0.3.2': + resolution: {integrity: sha512-U1BcVEoidvwIp95+HJswSW+xr28EQiHR7rZjH6pn8Sja5yO4Yoe3yCN0Zm8Lo72BbSOK/fTSq0je7CJpaPCspg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': + resolution: {integrity: sha512-BsinwG3yWTIjdgNCxsFlip7LkfwPk+ruw/aFCXHUg/fb5XC/Ksp+YMQ7u0LUtiKzIv/7LMXgZInJQH6gxbAaqQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@mariozechner/clipboard-linux-arm64-musl@0.3.2': + resolution: {integrity: sha512-0/Gi5Xq2V6goXBop19ePoHvXsmJD9SzFlO3S+d6+T2b+BlPcpOu3Oa0wTjl+cZrLAAEzA86aPNBI+VVAFDFPKw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': + resolution: {integrity: sha512-2AFFiXB24qf0zOZsxI1GJGb9wQGlOJyN6UwoXqmKS3dpQi/l6ix30IzDDA4c4ZcCcx4D+9HLYXhC1w7Sov8pXA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@mariozechner/clipboard-linux-x64-gnu@0.3.2': + resolution: {integrity: sha512-v6fVnsn7WMGg73Dab8QMwyFce7tzGfgEixKgzLP8f1GJqkJZi5zO4k4FOHzSgUufgLil63gnxvMpjWkgfeQN7A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@mariozechner/clipboard-linux-x64-musl@0.3.2': + resolution: {integrity: sha512-xVUtnoMQ8v2JVyfJLKKXACA6avdnchdbBkTsZs8BgJQo29qwCp5NIHAUO8gbJ40iaEGToW5RlmVk2M9V0HsHEw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': + resolution: {integrity: sha512-AEgg95TNi8TGgak2wSXZkXKCvAUTjWoU1Pqb0ON7JHrX78p616XUFNTJohtIon3e0w6k0pYPZeCuqRCza/Tqeg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@mariozechner/clipboard-win32-x64-msvc@0.3.2': + resolution: {integrity: sha512-tGRuYpZwDOD7HBrCpyRuhGnHHSCknELvqwKKUG4JSfSB7JIU7LKRh6zx6fMUOQd8uISK35TjFg5UcNih+vJhFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@mariozechner/clipboard@0.3.2': + resolution: {integrity: sha512-IHQpksNjo7EAtGuHFU+tbWDp5LarH3HU/8WiB9O70ZEoBPHOg0/6afwSLK0QyNMMmx4Bpi/zl6+DcBXe95nWYA==} + engines: {node: '>= 10'} + + '@mariozechner/jiti@2.6.5': + resolution: {integrity: sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==} + hasBin: true + + '@mariozechner/pi-agent-core@0.53.1': + resolution: {integrity: sha512-oYLZrgWtvi/lBqIWgYFgsfZ8xXGo45TRu9Li8q8o9Pc0oY2w1K//OqqYuN+ssnxu+s5MJSRdWdhTR2S3r0ccSw==} + engines: {node: '>=20.0.0'} + + '@mariozechner/pi-ai@0.53.0': + resolution: {integrity: sha512-f6dIzxLoVlB7TrT18N48oEUKzyoTw/ujB5zLxklFtpgaCVj9TRVf5manpT+2OYFwq3B6KANJ8X3WfDNCiKBEhA==} + engines: {node: '>=20.0.0'} + hasBin: true + + '@mariozechner/pi-ai@0.53.1': + resolution: {integrity: sha512-2XuWg1XigK+0iSsq21nNEQoCnYMsVKhMMNx9kXMrtTJ7YUSflWG9eZ0qU2dfDQ2ccX5lAf9Gx4OszoLrsGkBvA==} + engines: {node: '>=20.0.0'} + hasBin: true + + '@mariozechner/pi-coding-agent@0.53.0': + resolution: {integrity: sha512-phqo3A7WuKUTZ/HVtVQyWfaHrezVgeAdDc0hc9sw9d4gT4djVtCCOrD3cUtkyo6bYvGYKAD+aWL5bi5RMmCQew==} + engines: {node: '>=20.0.0'} + hasBin: true + + '@mariozechner/pi-tui@0.53.1': + resolution: {integrity: sha512-Y417vM7cUDaNcSXAh6wH+xKdEU7ltcj7p6xmlz/BvZokKLcEkoKaaMiFC+3Mlrip2j1SJdu7Y1cv/uxYWDF//Q==} + engines: {node: '>=20.0.0'} + + '@mistralai/mistralai@1.10.0': + resolution: {integrity: sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg==} + '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} @@ -235,6 +513,40 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/rollup-android-arm-eabi@4.57.1': resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] @@ -382,6 +694,204 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@silvia-odwyer/photon-node@0.3.4': + resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} + + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} + + '@smithy/abort-controller@4.2.8': + resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.6': + resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.23.2': + resolution: {integrity: sha512-HaaH4VbGie4t0+9nY3tNBRSxVTr96wzIqexUa6C2qx3MPePAuz7lIxPxYtt1Wc//SPfJLNoZJzfdt0B6ksj2jA==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.8': + resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.8': + resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.8': + resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.8': + resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.8': + resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.8': + resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.9': + resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.8': + resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.8': + resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.8': + resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.16': + resolution: {integrity: sha512-L5GICFCSsNhbJ5JSKeWFGFy16Q2OhoBizb3X2DrxaJwXSEujVvjG9Jt386dpQn2t7jINglQl0b4K/Su69BdbMA==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.33': + resolution: {integrity: sha512-jLqZOdJhtIL4lnA9hXnAG6GgnJlo1sD3FqsTxm9wSfjviqgWesY/TMBVnT84yr4O0Vfe0jWoXlfFbzsBVph3WA==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.9': + resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.8': + resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.8': + resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.10': + resolution: {integrity: sha512-u4YeUwOWRZaHbWaebvrs3UhwQwj+2VNmcVCwXcYTvPIuVyM7Ex1ftAj+fdbG/P4AkBwLq/+SKn+ydOI4ZJE9PA==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.8': + resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.8': + resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.8': + resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.8': + resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.8': + resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.3': + resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.8': + resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.11.5': + resolution: {integrity: sha512-xixwBRqoeP2IUgcAl3U9dvJXc+qJum4lzo3maaJxifsZxKUYLfVfCXvhT4/jD01sRrHg5zjd1cw2Zmjr4/SuKQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.12.0': + resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.8': + resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.32': + resolution: {integrity: sha512-092sjYfFMQ/iaPH798LY/OJFBcYu0sSK34Oy9vdixhsU36zlZu8OcYjF3TD4e2ARupyK7xaxPXl+T0VIJTEkkg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.35': + resolution: {integrity: sha512-miz/ggz87M8VuM29y7jJZMYkn7+IErM5p5UgKIf8OtqVs/h2bXr1Bt3uTsREsI/4nK8a0PQERbAPsVPVNIsG7Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.8': + resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.8': + resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.8': + resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.12': + resolution: {integrity: sha512-D8tgkrmhAX/UNeCZbqbEO3uqyghUnEmmoO9YEvRuwxjlkKKUE7FOgCJnqpTlQPe9MApdWPky58mNQQHbnCzoNg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + '@solana-program/system@0.10.0': resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} peerDependencies: @@ -779,6 +1289,16 @@ packages: '@swc/helpers@0.5.18': resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -791,12 +1311,18 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/mime-types@2.1.4': + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} '@types/node@25.2.3': resolution: {integrity: sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==} + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -857,14 +1383,52 @@ packages: zod: optional: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + agentkeepalive@4.6.0: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -876,21 +1440,48 @@ packages: axios@1.13.5: resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.3: + resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} + engines: {node: 20 || >=22} + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + engines: {node: '>=10.0.0'} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + bn.js@5.2.2: resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -910,6 +1501,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -917,6 +1512,21 @@ packages: charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + 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'} @@ -932,9 +1542,30 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + default-browser-id@5.0.1: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} @@ -947,6 +1578,10 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} @@ -955,10 +1590,26 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -989,9 +1640,31 @@ packages: engines: {node: '>=18'} hasBin: true + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + 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'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -999,13 +1672,26 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@5.3.6: + resolution: {integrity: sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==} + hasBin: true + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1015,6 +1701,14 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-type@21.3.0: + resolution: {integrity: sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==} + engines: {node: '>=20'} + follow-redirects@1.15.11: resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} @@ -1024,10 +1718,18 @@ packages: debug: optional: true + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1036,6 +1738,22 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} + + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1047,10 +1765,42 @@ packages: get-tsconfig@4.13.6: resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + google-auth-library@10.5.0: + resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} + engines: {node: '>=18'} + + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1063,12 +1813,35 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + 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@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} @@ -1077,6 +1850,10 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-in-ssh@1.0.0: resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} engines: {node: '>=20'} @@ -1094,6 +1871,9 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -1104,6 +1884,9 @@ packages: peerDependencies: ws: '*' + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jayson@4.3.0: resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} engines: {node: '>=8'} @@ -1112,12 +1895,50 @@ packages: jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + koffi@2.15.1: + resolution: {integrity: sha512-mnc0C0crx/xMSljb5s9QbnLrlFHprioFO1hkXyuSuO/QtbpLDa0l/uM21944UfQunMKmp3/r789DTDxVyyH6aA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + engines: {node: '>= 18'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1129,18 +1950,50 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + minimatch@10.2.2: + resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + engines: {node: 18 || 20 || >=22} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -1150,10 +2003,18 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -1161,6 +2022,18 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + openai@6.10.0: + resolution: {integrity: sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + ox@0.12.1: resolution: {integrity: sha512-uU0llpthaaw4UJoXlseCyBHmQ3bLrQmz9rRLIAUHqv46uHuae9SE+ukYBRIPVCnlEnHKuWjDUcDFHWx9gbGNoA==} peerDependencies: @@ -1169,6 +2042,45 @@ packages: typescript: optional: true + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -1187,12 +2099,43 @@ packages: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + rollup@4.57.1: resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1208,16 +2151,47 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + 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@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1230,13 +2204,47 @@ packages: stream-json@1.9.1: resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + superstruct@2.0.2: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1252,9 +2260,16 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1268,6 +2283,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -1277,6 +2296,10 @@ packages: undici-types@7.21.0: resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} + undici@7.22.0: + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + engines: {node: '>=20.18.1'} + utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} @@ -1367,17 +2390,34 @@ packages: jsdom: optional: true + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + 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 + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -1418,6 +2458,32 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + peerDependencies: + zod: ^3.25 || ^4 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -1428,81 +2494,569 @@ snapshots: '@adraffy/ens-normalize@1.11.1': {} - '@babel/runtime@7.28.6': {} - - '@clack/core@1.0.1': + '@anthropic-ai/sdk@0.73.0(zod@4.3.6)': dependencies: - picocolors: 1.1.1 - sisteransi: 1.0.5 + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 4.3.6 - '@clack/prompts@1.0.1': + '@aws-crypto/crc32@5.2.0': dependencies: - '@clack/core': 1.0.1 - picocolors: 1.1.1 - sisteransi: 1.0.5 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 - '@coinbase/cdp-sdk@1.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@aws-crypto/sha256-browser@5.2.0': dependencies: - '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) - axios: 1.13.5 - axios-retry: 4.5.0(axios@1.13.5) - jose: 6.1.3 - md5: 2.3.0 - uncrypto: 0.1.3 - viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zod: 3.25.76 - transitivePeerDependencies: - - bufferutil - - debug - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 - '@esbuild/aix-ppc64@0.27.3': - optional: true + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 - '@esbuild/android-arm64@0.27.3': - optional: true + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 - '@esbuild/android-arm@0.27.3': - optional: true + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 - '@esbuild/android-x64@0.27.3': - optional: true + '@aws-sdk/client-bedrock-runtime@3.995.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.11 + '@aws-sdk/credential-provider-node': 3.972.10 + '@aws-sdk/eventstream-handler-node': 3.972.5 + '@aws-sdk/middleware-eventstream': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.11 + '@aws-sdk/middleware-websocket': 3.972.6 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/token-providers': 3.995.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.995.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.10 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.2 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.16 + '@smithy/middleware-retry': 4.4.33 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.32 + '@smithy/util-defaults-mode-node': 4.2.35 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.12 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@esbuild/darwin-arm64@0.27.3': - optional: true + '@aws-sdk/client-sso@3.993.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.11 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.11 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.993.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.10 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.2 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.16 + '@smithy/middleware-retry': 4.4.33 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.32 + '@smithy/util-defaults-mode-node': 4.2.35 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@esbuild/darwin-x64@0.27.3': - optional: true + '@aws-sdk/core@3.973.11': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.5 + '@smithy/core': 3.23.2 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@esbuild/freebsd-arm64@0.27.3': - optional: true + '@aws-sdk/credential-provider-env@3.972.9': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@esbuild/freebsd-x64@0.27.3': - optional: true + '@aws-sdk/credential-provider-http@3.972.11': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.10 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.12 + tslib: 2.8.1 - '@esbuild/linux-arm64@0.27.3': - optional: true + '@aws-sdk/credential-provider-ini@3.972.9': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/credential-provider-env': 3.972.9 + '@aws-sdk/credential-provider-http': 3.972.11 + '@aws-sdk/credential-provider-login': 3.972.9 + '@aws-sdk/credential-provider-process': 3.972.9 + '@aws-sdk/credential-provider-sso': 3.972.9 + '@aws-sdk/credential-provider-web-identity': 3.972.9 + '@aws-sdk/nested-clients': 3.993.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@esbuild/linux-arm@0.27.3': - optional: true + '@aws-sdk/credential-provider-login@3.972.9': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/nested-clients': 3.993.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@esbuild/linux-ia32@0.27.3': - optional: true + '@aws-sdk/credential-provider-node@3.972.10': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.9 + '@aws-sdk/credential-provider-http': 3.972.11 + '@aws-sdk/credential-provider-ini': 3.972.9 + '@aws-sdk/credential-provider-process': 3.972.9 + '@aws-sdk/credential-provider-sso': 3.972.9 + '@aws-sdk/credential-provider-web-identity': 3.972.9 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@esbuild/linux-loong64@0.27.3': - optional: true + '@aws-sdk/credential-provider-process@3.972.9': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@esbuild/linux-mips64el@0.27.3': - optional: true + '@aws-sdk/credential-provider-sso@3.972.9': + dependencies: + '@aws-sdk/client-sso': 3.993.0 + '@aws-sdk/core': 3.973.11 + '@aws-sdk/token-providers': 3.993.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@esbuild/linux-ppc64@0.27.3': + '@aws-sdk/credential-provider-web-identity@3.972.9': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/nested-clients': 3.993.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/eventstream-handler-node@3.972.5': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-eventstream@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.972.11': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.993.0 + '@smithy/core': 3.23.2 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-websocket@3.972.6': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-format-url': 3.972.3 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.993.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.11 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.11 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.993.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.10 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.2 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.16 + '@smithy/middleware-retry': 4.4.33 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.32 + '@smithy/util-defaults-mode-node': 4.2.35 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/nested-clients@3.995.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.11 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.11 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.995.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.10 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.23.2 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.16 + '@smithy/middleware-retry': 4.4.33 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.10 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.32 + '@smithy/util-defaults-mode-node': 4.2.35 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.993.0': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/nested-clients': 3.993.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/token-providers@3.995.0': + dependencies: + '@aws-sdk/core': 3.973.11 + '@aws-sdk/nested-clients': 3.995.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.973.1': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.993.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.995.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 + + '@aws-sdk/util-format-url@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.965.4': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.972.10': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.11 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.5': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.3.6 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.3': {} + + '@babel/runtime@7.28.6': {} + + '@borewit/text-codec@0.2.1': {} + + '@clack/core@1.0.1': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@1.0.1': + dependencies: + '@clack/core': 1.0.1 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@coinbase/cdp-sdk@1.44.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) + axios: 1.13.5 + axios-retry: 4.5.0(axios@1.13.5) + jose: 6.1.3 + md5: 2.3.0 + uncrypto: 0.1.3 + viem: 2.45.3(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.27.3': optional: true '@esbuild/linux-riscv64@0.27.3': @@ -1541,8 +3095,180 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true + '@google/genai@1.42.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + google-auth-library: 10.5.0 + p-retry: 4.6.2 + protobufjs: 7.5.4 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/sourcemap-codec@1.5.5': {} + '@mariozechner/clipboard-darwin-arm64@0.3.2': + optional: true + + '@mariozechner/clipboard-darwin-universal@0.3.2': + optional: true + + '@mariozechner/clipboard-darwin-x64@0.3.2': + optional: true + + '@mariozechner/clipboard-linux-arm64-gnu@0.3.2': + optional: true + + '@mariozechner/clipboard-linux-arm64-musl@0.3.2': + optional: true + + '@mariozechner/clipboard-linux-riscv64-gnu@0.3.2': + optional: true + + '@mariozechner/clipboard-linux-x64-gnu@0.3.2': + optional: true + + '@mariozechner/clipboard-linux-x64-musl@0.3.2': + optional: true + + '@mariozechner/clipboard-win32-arm64-msvc@0.3.2': + optional: true + + '@mariozechner/clipboard-win32-x64-msvc@0.3.2': + optional: true + + '@mariozechner/clipboard@0.3.2': + optionalDependencies: + '@mariozechner/clipboard-darwin-arm64': 0.3.2 + '@mariozechner/clipboard-darwin-universal': 0.3.2 + '@mariozechner/clipboard-darwin-x64': 0.3.2 + '@mariozechner/clipboard-linux-arm64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-arm64-musl': 0.3.2 + '@mariozechner/clipboard-linux-riscv64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-x64-gnu': 0.3.2 + '@mariozechner/clipboard-linux-x64-musl': 0.3.2 + '@mariozechner/clipboard-win32-arm64-msvc': 0.3.2 + '@mariozechner/clipboard-win32-x64-msvc': 0.3.2 + optional: true + + '@mariozechner/jiti@2.6.5': + dependencies: + std-env: 3.10.0 + yoctocolors: 2.1.2 + + '@mariozechner/pi-agent-core@0.53.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)': + dependencies: + '@mariozechner/pi-ai': 0.53.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-ai@0.53.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) + '@aws-sdk/client-bedrock-runtime': 3.995.0 + '@google/genai': 1.42.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@mistralai/mistralai': 1.10.0 + '@sinclair/typebox': 0.34.48 + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + chalk: 5.6.2 + openai: 6.10.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + partial-json: 0.1.7 + proxy-agent: 6.5.0 + undici: 7.22.0 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-ai@0.53.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)': + dependencies: + '@anthropic-ai/sdk': 0.73.0(zod@4.3.6) + '@aws-sdk/client-bedrock-runtime': 3.995.0 + '@google/genai': 1.42.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@mistralai/mistralai': 1.10.0 + '@sinclair/typebox': 0.34.48 + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + chalk: 5.6.2 + openai: 6.10.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + partial-json: 0.1.7 + proxy-agent: 6.5.0 + undici: 7.22.0 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-coding-agent@0.53.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6)': + dependencies: + '@mariozechner/jiti': 2.6.5 + '@mariozechner/pi-agent-core': 0.53.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + '@mariozechner/pi-ai': 0.53.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6) + '@mariozechner/pi-tui': 0.53.1 + '@silvia-odwyer/photon-node': 0.3.4 + chalk: 5.6.2 + cli-highlight: 2.1.11 + diff: 8.0.3 + file-type: 21.3.0 + glob: 13.0.6 + hosted-git-info: 9.0.2 + ignore: 7.0.5 + marked: 15.0.12 + minimatch: 10.2.2 + proper-lockfile: 4.1.2 + yaml: 2.8.2 + optionalDependencies: + '@mariozechner/clipboard': 0.3.2 + transitivePeerDependencies: + - '@modelcontextprotocol/sdk' + - aws-crt + - bufferutil + - supports-color + - utf-8-validate + - ws + - zod + + '@mariozechner/pi-tui@0.53.1': + dependencies: + '@types/mime-types': 2.1.4 + chalk: 5.6.2 + get-east-asian-width: 1.5.0 + koffi: 2.15.1 + marked: 15.0.12 + mime-types: 3.0.2 + + '@mistralai/mistralai@1.10.0': + dependencies: + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + '@noble/ciphers@1.3.0': {} '@noble/curves@1.9.1': @@ -1551,6 +3277,32 @@ snapshots: '@noble/hashes@1.8.0': {} + '@pkgjs/parseargs@0.11.0': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true @@ -1626,18 +3378,326 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - '@scure/base@1.2.6': {} + '@scure/base@1.2.6': {} + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@silvia-odwyer/photon-node@0.3.4': {} + + '@sinclair/typebox@0.34.48': {} + + '@smithy/abort-controller@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.6': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/core@3.23.2': + dependencies: + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.12 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.8': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.8': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.8': + dependencies: + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.8': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.4.16': + dependencies: + '@smithy/core': 3.23.2 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.33': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.8': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.10': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + + '@smithy/shared-ini-file-loader@4.4.3': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.8': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.11.5': + dependencies: + '@smithy/core': 3.23.2 + '@smithy/middleware-endpoint': 4.4.16 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.12 + tslib: 2.8.1 + + '@smithy/types@4.12.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.8': + dependencies: + '@smithy/querystring-parser': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.32': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.35': + dependencies: + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.5 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.8': + dependencies: + '@smithy/service-error-classification': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.12': + dependencies: + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.10 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 - '@scure/bip32@1.7.0': + '@smithy/util-utf8@2.3.0': dependencies: - '@noble/curves': 1.9.1 - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 - '@scure/bip39@1.6.0': + '@smithy/util-utf8@4.2.0': dependencies: - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: @@ -2121,6 +4181,17 @@ snapshots: dependencies: tslib: 2.8.1 + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -2134,12 +4205,16 @@ snapshots: '@types/estree@1.0.8': {} + '@types/mime-types@2.1.4': {} + '@types/node@12.20.55': {} '@types/node@25.2.3': dependencies: undici-types: 7.16.0 + '@types/retry@0.12.0': {} + '@types/uuid@8.3.4': {} '@types/ws@7.4.7': @@ -2159,13 +4234,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0) + vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: @@ -2204,12 +4279,41 @@ snapshots: typescript: 5.9.3 zod: 4.3.6 + agent-base@7.1.4: {} + agentkeepalive@4.6.0: dependencies: humanize-ms: 1.2.1 + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + any-promise@1.3.0: {} + assertion-error@2.0.1: {} + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + asynckit@0.4.0: {} axios-retry@4.5.0(axios@1.13.5): @@ -2225,12 +4329,20 @@ snapshots: transitivePeerDependencies: - debug + balanced-match@1.0.2: {} + + balanced-match@4.0.3: {} + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 base64-js@1.5.1: {} + basic-ftp@5.1.0: {} + + bignumber.js@9.3.1: {} + bn.js@5.2.2: {} borsh@0.7.0: @@ -2239,10 +4351,22 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 + bowser@2.14.1: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.3 + bs58@4.0.1: dependencies: base-x: 3.0.11 + buffer-equal-constant-time@1.0.1: {} + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -2264,10 +4388,36 @@ snapshots: chai@6.2.2: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chalk@5.6.2: {} charenc@0.0.2: {} + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + 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 @@ -2278,8 +4428,22 @@ snapshots: commander@2.20.3: {} + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + crypt@0.0.2: {} + data-uri-to-buffer@4.0.1: {} + + data-uri-to-buffer@6.0.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + default-browser-id@5.0.1: {} default-browser@5.5.0: @@ -2289,16 +4453,34 @@ snapshots: define-lazy-prop@3.0.0: {} + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + delay@5.0.0: {} delayed-stream@1.0.0: {} + diff@8.0.3: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -2351,24 +4533,69 @@ snapshots: '@esbuild/win32-ia32': 0.27.3 '@esbuild/win32-x64': 0.27.3 + escalade@3.2.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + esutils@2.0.3: {} + eventemitter3@5.0.1: {} expect-type@1.3.0: {} + extend@3.0.2: {} + eyes@0.1.8: {} + fast-deep-equal@3.1.3: {} + fast-stable-stringify@1.0.0: {} + fast-uri@3.1.0: {} + + fast-xml-parser@5.3.6: + dependencies: + strnum: 2.1.2 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-type@21.3.0: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.4 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + follow-redirects@1.15.11: {} + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -2377,11 +4604,36 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fsevents@2.3.3: optional: true function-bind@1.1.2: {} + gaxios@7.1.3: + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.1.3 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -2404,8 +4656,56 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-uri@6.0.5: + dependencies: + basic-ftp: 5.1.0 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.6: + dependencies: + minimatch: 10.2.2 + minipass: 7.1.3 + path-scurry: 2.0.2 + + google-auth-library@10.5.0: + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.3 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + gtoken: 8.0.0 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + google-logging-utils@1.1.3: {} + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + + gtoken@8.0.0: + dependencies: + gaxios: 7.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + has-flag@4.0.0: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: @@ -2416,16 +4716,42 @@ snapshots: dependencies: function-bind: 1.1.2 + highlight.js@10.7.3: {} + + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.6 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + humanize-ms@1.2.1: dependencies: ms: 2.1.3 ieee754@1.2.1: {} + ignore@7.0.5: {} + + ip-address@10.1.0: {} + is-buffer@1.1.6: {} is-docker@3.0.0: {} + is-fullwidth-code-point@3.0.0: {} + is-in-ssh@1.0.0: {} is-inside-container@1.0.0: @@ -2438,6 +4764,8 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isexe@2.0.0: {} + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -2446,6 +4774,12 @@ snapshots: dependencies: ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 @@ -2466,12 +4800,46 @@ snapshots: jose@6.1.3: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.28.6 + ts-algebra: 2.0.0 + + json-schema-traverse@1.0.0: {} + json-stringify-safe@5.0.1: {} + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + koffi@2.15.1: {} + + long@5.3.2: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.6: {} + + lru-cache@7.18.3: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + marked@15.0.12: {} + math-intrinsics@1.1.0: {} md5@2.3.0: @@ -2482,21 +4850,55 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + minimatch@10.2.2: + dependencies: + brace-expansion: 5.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass@7.1.3: {} + ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.11: {} + netmask@2.0.2: {} + + node-domexception@1.0.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: optional: true + object-assign@4.1.1: {} + obug@2.1.1: {} open@11.0.0: @@ -2508,6 +4910,11 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + openai@6.10.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(zod@4.3.6): + optionalDependencies: + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + zod: 4.3.6 + ox@0.12.1(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 @@ -2538,6 +4945,53 @@ snapshots: transitivePeerDependencies: - zod + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + package-json-from-dist@1.0.1: {} + + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@5.1.1: {} + + parse5@6.0.1: {} + + partial-json@0.1.7: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.3 + pathe@2.0.3: {} picocolors@1.1.1: {} @@ -2552,10 +5006,56 @@ snapshots: powershell-utils@0.1.0: {} + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 25.2.3 + long: 5.3.2 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + proxy-from-env@1.1.0: {} + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + resolve-pkg-maps@1.0.0: {} + retry@0.12.0: {} + + retry@0.13.1: {} + + rimraf@5.0.10: + dependencies: + glob: 10.5.0 + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 @@ -2604,12 +5104,40 @@ snapshots: 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@3.0.7: {} + + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + source-map-js@1.2.1: {} + source-map@0.6.1: + optional: true + stackback@0.0.2: {} std-env@3.10.0: {} @@ -2620,10 +5148,48 @@ snapshots: dependencies: stream-chain: 2.2.5 + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strnum@2.1.2: {} + + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + superstruct@2.0.2: {} + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + text-encoding-utf-8@1.0.2: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + tinybench@2.9.0: {} tinyexec@1.0.2: {} @@ -2635,8 +5201,16 @@ snapshots: tinyrainbow@3.0.3: {} + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tr46@0.0.3: {} + ts-algebra@2.0.0: {} + tslib@2.8.1: {} tsx@4.21.0: @@ -2648,12 +5222,16 @@ snapshots: typescript@5.9.3: {} + uint8array-extras@1.5.0: {} + uncrypto@0.1.3: {} undici-types@7.16.0: {} undici-types@7.21.0: {} + undici@7.22.0: {} + utf-8-validate@5.0.10: dependencies: node-gyp-build: 4.8.4 @@ -2695,7 +5273,7 @@ snapshots: - utf-8-validate - zod - vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0): + vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -2707,11 +5285,12 @@ snapshots: '@types/node': 25.2.3 fsevents: 2.3.3 tsx: 4.21.0 + yaml: 2.8.2 - vitest@4.0.18(@types/node@25.2.3)(tsx@4.21.0): + vitest@4.0.18(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -2728,7 +5307,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0) + vite: 7.3.1(@types/node@25.2.3)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.2.3 @@ -2745,6 +5324,8 @@ snapshots: - tsx - yaml + web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -2752,11 +5333,27 @@ snapshots: 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 + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.1.0 @@ -2777,6 +5374,32 @@ snapshots: is-wsl: 3.1.0 powershell-utils: 0.1.0 + y18n@5.0.8: {} + + yaml@2.8.2: {} + + yargs-parser@20.2.9: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-to-json-schema@3.25.1(zod@4.3.6): + dependencies: + zod: 4.3.6 + zod@3.25.76: {} zod@4.3.6: {} diff --git a/src/cli/start.ts b/src/cli/start.ts index 1c29722..cd71862 100644 --- a/src/cli/start.ts +++ b/src/cli/start.ts @@ -18,6 +18,7 @@ import type { WalletSigner } from "../wallet/types.js"; import { SixerrClient, createLocalPaymentSigner, createCdpPaymentSigner } from "../client/consumer/index.js"; import { createHttpProxy } from "../proxy/http-proxy.js"; import type { PaymentSigner } from "../client/consumer/types.js"; +import { resolveInferenceConfig } from "../client/provider/inference/model-resolver.js"; // --------------------------------------------------------------------------- // Start Command @@ -48,7 +49,14 @@ export async function runStart(): Promise { log.info(`Server: ${config.serverUrl}`); // ------------------------------------------------------------------------- - // 2. Resolve wallet signer (BEFORE challenge fetch — nonce expiry safe) + // 2. Resolve LLM inference configuration (fail fast before auth/connect) + // ------------------------------------------------------------------------- + + const inferenceConfig = resolveInferenceConfig(); + log.info(`Model: ${inferenceConfig.provider}/${inferenceConfig.model}`); + + // ------------------------------------------------------------------------- + // 3. Resolve wallet signer (BEFORE challenge fetch — nonce expiry safe) // ------------------------------------------------------------------------- let signer: WalletSigner; @@ -163,8 +171,7 @@ export async function runStart(): Promise { const handle = startPlugin({ serverUrl: wsUrl, jwt: authJwt, - openClawToken: config.openClawToken, - openClawUrl: config.openClawUrl, + inferenceConfig, pricing: config.pricing, agentName: config.agentCard?.name, agentDescription: config.agentCard?.description, diff --git a/src/client/provider/inference/index.ts b/src/client/provider/inference/index.ts new file mode 100644 index 0000000..f3c9d1b --- /dev/null +++ b/src/client/provider/inference/index.ts @@ -0,0 +1,3 @@ +export { handleIncomingRequest } from "./inference-handler.js"; +export { resolveInferenceConfig, resolveAgentDir } from "./model-resolver.js"; +export type { InferenceConfig } from "./types.js"; diff --git a/src/client/provider/inference/inference-handler.ts b/src/client/provider/inference/inference-handler.ts new file mode 100644 index 0000000..331952d --- /dev/null +++ b/src/client/provider/inference/inference-handler.ts @@ -0,0 +1,464 @@ +import * as crypto from "node:crypto"; +import { streamSimple, completeSimple } from "@mariozechner/pi-ai"; +import type { + Api, + AssistantMessage, + AssistantMessageEvent, + Context, + ImageContent, + Message, + UserMessage, +} from "@mariozechner/pi-ai"; +import type { InferenceConfig } from "./types.js"; + +// --------------------------------------------------------------------------- +// OpenResponses input types (subset needed for prompt building) +// --------------------------------------------------------------------------- + +type ContentPart = + | { type: "input_text"; text: string } + | { type: "input_image"; source: { type: "url"; url: string } | { type: "base64"; data: string; media_type: string } } + | { type: "input_file"; source: { type: "url"; url: string } | { type: "base64"; data: string; media_type: string } } + | { type: "output_text"; text: string }; + +type ItemParam = + | { type: "message"; role: "system" | "developer" | "user" | "assistant"; content: string | ContentPart[] } + | { type: "function_call_output"; call_id: string; output: string } + | { type: "reasoning"; content?: string; summary?: string }; + +// --------------------------------------------------------------------------- +// OpenResponses response types +// --------------------------------------------------------------------------- + +interface Usage { + input_tokens: number; + output_tokens: number; + total_tokens: number; +} + +interface OutputItem { + type: "message"; + id: string; + role: "assistant"; + content: { type: "output_text"; text: string }[]; + status: "completed"; +} + +interface ResponseResource { + id: string; + object: "response"; + created_at: number; + status: "completed" | "failed" | "incomplete"; + model: string; + output: OutputItem[]; + usage: Usage; +} + +// --------------------------------------------------------------------------- +// Prompt building (adapted from openclaw/src/gateway/openresponses-http.ts) +// --------------------------------------------------------------------------- + +function extractTextContent(content: string | ContentPart[]): string { + if (typeof content === "string") return content; + return content + .map((part) => { + if (part.type === "input_text") return part.text; + if (part.type === "output_text") return part.text; + return ""; + }) + .filter(Boolean) + .join("\n"); +} + +function extractImages(content: string | ContentPart[]): ImageContent[] { + if (typeof content === "string") return []; + const images: ImageContent[] = []; + for (const part of content) { + if (part.type === "input_image" && part.source.type === "base64") { + images.push({ + type: "image", + data: part.source.data, + mimeType: part.source.media_type, + }); + } + } + return images; +} + +/** + * Convert OpenResponses input to pi-ai Context. + */ +function buildContext( + input: string | ItemParam[], + instructions?: string, +): { context: Context; images: ImageContent[] } { + const systemParts: string[] = []; + const messages: Message[] = []; + const images: ImageContent[] = []; + + if (instructions) { + systemParts.push(instructions); + } + + if (typeof input === "string") { + messages.push({ + role: "user", + content: input, + timestamp: Date.now(), + } as UserMessage); + } else { + for (const item of input) { + if (item.type === "message") { + const text = extractTextContent(item.content).trim(); + if (!text) continue; + + if (item.role === "system" || item.role === "developer") { + systemParts.push(text); + } else if (item.role === "user") { + const itemImages = extractImages(item.content); + if (itemImages.length > 0) { + images.push(...itemImages); + messages.push({ + role: "user", + content: [{ type: "text" as const, text }], + timestamp: Date.now(), + } as UserMessage); + } else { + messages.push({ + role: "user", + content: text, + timestamp: Date.now(), + } as UserMessage); + } + } else if (item.role === "assistant") { + messages.push({ + role: "assistant", + content: [{ type: "text" as const, text }], + api: "openai-responses" as Api, + provider: "", + model: "", + usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, + stopReason: "stop", + timestamp: Date.now(), + } as AssistantMessage); + } + } else if (item.type === "function_call_output") { + messages.push({ + role: "toolResult", + toolCallId: item.call_id, + toolName: "", + content: [{ type: "text" as const, text: item.output }], + isError: false, + timestamp: Date.now(), + }); + } + // Skip reasoning items + } + } + + // If no user messages, add an empty one to satisfy context requirements + if (messages.length === 0) { + messages.push({ + role: "user", + content: "", + timestamp: Date.now(), + } as UserMessage); + } + + return { + context: { + systemPrompt: systemParts.length > 0 ? systemParts.join("\n\n") : undefined, + messages, + }, + images, + }; +} + +// --------------------------------------------------------------------------- +// Usage conversion +// --------------------------------------------------------------------------- + +function toOpenResponsesUsage(piUsage: AssistantMessage["usage"]): Usage { + return { + input_tokens: piUsage.input, + output_tokens: piUsage.output, + total_tokens: piUsage.totalTokens, + }; +} + +// --------------------------------------------------------------------------- +// Response building +// --------------------------------------------------------------------------- + +function buildResponseResource( + responseId: string, + model: string, + text: string, + usage: Usage, + status: "completed" | "failed" = "completed", +): ResponseResource { + return { + id: responseId, + object: "response", + created_at: Math.floor(Date.now() / 1000), + status, + model, + output: [ + { + type: "message", + id: `msg_${crypto.randomUUID().replace(/-/g, "").slice(0, 12)}`, + role: "assistant", + content: [{ type: "output_text", text }], + status: "completed", + }, + ], + usage, + }; +} + +// --------------------------------------------------------------------------- +// handleIncomingRequest +// --------------------------------------------------------------------------- + +/** + * Handle an incoming request from the Sixerr server by calling the LLM + * directly via pi-ai SDK. + * + * 1. Parses OpenResponses body to extract message text and images + * 2. Calls the LLM using streamSimple/completeSimple + * 3. Converts output to OpenResponses format → WS messages + * 4. Sends error WS message on failure + */ +export async function handleIncomingRequest( + requestId: string, + body: unknown, + inferenceConfig: InferenceConfig, + sendMessage: (msg: unknown) => void, +): Promise { + try { + const forwardBody = { ...(body as Record) }; + const isStreaming = forwardBody.stream === true; + const input = forwardBody.input as string | ItemParam[]; + const instructions = forwardBody.instructions as string | undefined; + + const { context, images } = buildContext(input, instructions); + const { resolvedModel, modelRegistry } = inferenceConfig; + + // Resolve API key for this model + const apiKey = await modelRegistry.getApiKey(resolvedModel); + + const timeoutMs = inferenceConfig.timeoutMs ?? 120_000; + const abortController = new AbortController(); + const timeoutId = setTimeout(() => abortController.abort(), timeoutMs); + + const responseId = `resp_${crypto.randomUUID().replace(/-/g, "").slice(0, 12)}`; + const outputItemId = `msg_${crypto.randomUUID().replace(/-/g, "").slice(0, 12)}`; + const modelName = `${inferenceConfig.provider}/${inferenceConfig.model}`; + + try { + if (isStreaming) { + await handleStreaming( + requestId, + responseId, + outputItemId, + modelName, + resolvedModel, + context, + images, + apiKey, + abortController.signal, + sendMessage, + ); + } else { + await handleNonStreaming( + requestId, + responseId, + modelName, + resolvedModel, + context, + images, + apiKey, + abortController.signal, + sendMessage, + ); + } + } finally { + clearTimeout(timeoutId); + } + } catch (err) { + sendMessage({ + type: "error", + id: requestId, + code: "plugin_error", + message: (err as Error).message || String(err), + }); + } +} + +// --------------------------------------------------------------------------- +// Streaming path +// --------------------------------------------------------------------------- + +async function handleStreaming( + requestId: string, + responseId: string, + outputItemId: string, + modelName: string, + model: ReturnType, + context: Context, + images: ImageContent[], + apiKey: string | undefined, + signal: AbortSignal, + sendMessage: (msg: unknown) => void, +): Promise { + let accumulatedText = ""; + let usage: Usage = { input_tokens: 0, output_tokens: 0, total_tokens: 0 }; + + // Send initial response.created event + const initialResponse = buildResponseResource(responseId, modelName, "", usage); + initialResponse.status = "completed"; // will be overwritten + + sendMessage({ + type: "stream_event", + id: requestId, + event: { + type: "response.created", + response: { ...initialResponse, status: "in_progress" as const, output: [] }, + }, + }); + + // Send output item added + sendMessage({ + type: "stream_event", + id: requestId, + event: { + type: "response.output_item.added", + output_index: 0, + item: { + type: "message", + id: outputItemId, + role: "assistant", + content: [], + status: "in_progress", + }, + }, + }); + + // Send content part added + sendMessage({ + type: "stream_event", + id: requestId, + event: { + type: "response.content_part.added", + item_id: outputItemId, + output_index: 0, + content_index: 0, + part: { type: "output_text", text: "" }, + }, + }); + + try { + const eventStream = streamSimple(model as any, context, { + apiKey, + signal, + ...(images.length > 0 ? { images } : {}), + } as any); + + for await (const event of eventStream) { + if (event.type === "text_delta") { + accumulatedText += event.delta; + sendMessage({ + type: "stream_event", + id: requestId, + event: { + type: "response.output_text.delta", + item_id: outputItemId, + output_index: 0, + content_index: 0, + delta: event.delta, + }, + }); + } else if (event.type === "done") { + usage = toOpenResponsesUsage(event.message.usage); + } else if (event.type === "error") { + usage = toOpenResponsesUsage(event.error.usage); + if (event.error.errorMessage) { + sendMessage({ + type: "error", + id: requestId, + code: "plugin_error", + message: event.error.errorMessage, + }); + } + } + } + } catch (err) { + sendMessage({ + type: "error", + id: requestId, + code: "plugin_error", + message: (err as Error).message || String(err), + }); + } + + // Send text done + sendMessage({ + type: "stream_event", + id: requestId, + event: { + type: "response.output_text.done", + item_id: outputItemId, + output_index: 0, + content_index: 0, + text: accumulatedText, + }, + }); + + // Send response.completed + const finalResponse = buildResponseResource(responseId, modelName, accumulatedText, usage); + sendMessage({ + type: "stream_event", + id: requestId, + event: { type: "response.completed", response: finalResponse }, + }); + + // Send stream_end + sendMessage({ type: "stream_end", id: requestId, usage }); +} + +// --------------------------------------------------------------------------- +// Non-streaming path +// --------------------------------------------------------------------------- + +async function handleNonStreaming( + requestId: string, + responseId: string, + modelName: string, + model: ReturnType, + context: Context, + images: ImageContent[], + apiKey: string | undefined, + signal: AbortSignal, + sendMessage: (msg: unknown) => void, +): Promise { + const result = await completeSimple(model as any, context, { + apiKey, + signal, + ...(images.length > 0 ? { images } : {}), + } as any); + + // Extract text from assistant message + const text = result.content + .filter((c): c is { type: "text"; text: string } => c.type === "text") + .map((c) => c.text) + .join(""); + + const usage = toOpenResponsesUsage(result.usage); + const response = buildResponseResource(responseId, modelName, text, usage); + + sendMessage({ + type: "response", + id: requestId, + body: response, + }); +} diff --git a/src/client/provider/inference/model-resolver.ts b/src/client/provider/inference/model-resolver.ts new file mode 100644 index 0000000..74a0efb --- /dev/null +++ b/src/client/provider/inference/model-resolver.ts @@ -0,0 +1,147 @@ +import * as path from "node:path"; +import * as os from "node:os"; +import * as fs from "node:fs"; +import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent"; +import type { Api, Model } from "@mariozechner/pi-ai"; +import type { InferenceConfig } from "./types.js"; + +// --------------------------------------------------------------------------- +// Agent directory resolution +// --------------------------------------------------------------------------- + +export function resolveAgentDir(): string { + const envDir = process.env.OPENCLAW_AGENT_DIR; + if (envDir) return envDir; + return path.join(os.homedir(), ".openclaw", "agents", "default", "agent"); +} + +// --------------------------------------------------------------------------- +// Auth + model discovery (inlined from openclaw/src/agents/pi-model-discovery.ts) +// --------------------------------------------------------------------------- + +function createAuthStorage(authPath: string): AuthStorage { + // pi-coding-agent 0.50+ uses AuthStorage.create(path) + const withFactory = AuthStorage as unknown as { create?: (p: string) => AuthStorage }; + if (typeof withFactory.create === "function") { + return withFactory.create(authPath); + } + return new (AuthStorage as unknown as new (p: string) => AuthStorage)(authPath); +} + +function discoverAuthStorage(agentDir: string): AuthStorage { + return createAuthStorage(path.join(agentDir, "auth.json")); +} + +function discoverModels(authStorage: AuthStorage, agentDir: string): ModelRegistry { + return new ModelRegistry(authStorage, path.join(agentDir, "models.json")); +} + +// --------------------------------------------------------------------------- +// OpenClaw config reading +// --------------------------------------------------------------------------- + +interface OpenClawConfig { + agents?: { + defaults?: { + model?: { + primary?: string; + fallbacks?: string[]; + }; + }; + }; +} + +/** + * Parse a "provider/model" string into its parts. + * Splits on the first "/" only, so model IDs containing "/" are preserved. + */ +function parseModelSpec(spec: string): { provider: string; model: string } | null { + const slashIdx = spec.indexOf("/"); + if (slashIdx === -1) { + return null; + } + return { + provider: spec.slice(0, slashIdx), + model: spec.slice(slashIdx + 1), + }; +} + +/** + * Read the provider/model from openclaw.json in the agent directory. + */ +function readModelConfig(agentDir: string): { provider: string; model: string } { + const configPath = path.join(agentDir, "openclaw.json"); + let raw: string; + try { + raw = fs.readFileSync(configPath, "utf-8"); + } catch { + throw new Error(`Missing ${configPath} — cannot determine which model to use.`); + } + + let config: OpenClawConfig; + try { + config = JSON.parse(raw) as OpenClawConfig; + } catch { + throw new Error(`Invalid JSON in ${configPath}`); + } + + const primary = config.agents?.defaults?.model?.primary; + if (!primary) { + throw new Error( + `No agents.defaults.model.primary in ${configPath}. ` + + 'Set it to e.g. "anthropic/claude-opus-4-6".', + ); + } + + const parsed = parseModelSpec(primary); + if (!parsed) { + throw new Error( + `Invalid model spec "${primary}" in ${configPath} — expected "provider/model" format.`, + ); + } + + return parsed; +} + +// --------------------------------------------------------------------------- +// Model resolution +// --------------------------------------------------------------------------- + +/** + * Discover auth storage and model registry from the agent directory, + * then resolve the configured model for inference. + */ +export function resolveInferenceConfig(overrides?: { + agentDir?: string; + provider?: string; + model?: string; + timeoutMs?: number; +}): InferenceConfig { + const agentDir = overrides?.agentDir ?? resolveAgentDir(); + + const configModel = readModelConfig(agentDir); + const provider = overrides?.provider ?? configModel.provider; + const modelId = overrides?.model ?? configModel.model; + + // Discover auth + model registry from agent dir + const authStorage = discoverAuthStorage(agentDir); + const modelRegistry = discoverModels(authStorage, agentDir); + + // Look up the model in the registry — fail if not found + const resolvedModel = modelRegistry.find(provider, modelId) as Model | undefined; + if (!resolvedModel) { + throw new Error( + `Model "${provider}/${modelId}" not found in ${agentDir}/models.json.`, + ); + } + + return { + agentDir, + provider, + model: modelId, + timeoutMs: overrides?.timeoutMs, + authStorage, + modelRegistry, + resolvedModel, + }; +} diff --git a/src/client/provider/inference/types.ts b/src/client/provider/inference/types.ts new file mode 100644 index 0000000..8705039 --- /dev/null +++ b/src/client/provider/inference/types.ts @@ -0,0 +1,12 @@ +import type { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent"; +import type { Api, Model } from "@mariozechner/pi-ai"; + +export interface InferenceConfig { + agentDir: string; // from OPENCLAW_AGENT_DIR or ~/.openclaw/agents/default/agent/ + provider: string; // e.g. "anthropic" — from OpenClaw config + model: string; // e.g. "claude-sonnet-4-5-20250929" — from OpenClaw config + timeoutMs?: number; // default 120_000 + authStorage: AuthStorage; + modelRegistry: ModelRegistry; + resolvedModel: Model; +} diff --git a/src/client/provider/ws/ws-client.test.ts b/src/client/provider/ws/ws-client.test.ts index 81ba59c..05e4ffc 100644 --- a/src/client/provider/ws/ws-client.test.ts +++ b/src/client/provider/ws/ws-client.test.ts @@ -102,9 +102,13 @@ describe("PluginClient", () => { factor: 2, jitter: 0, }, - openClawConfig: { - gatewayUrl: "http://127.0.0.1:18789", - gatewayToken: "test-token", + inferenceConfig: { + agentDir: "/tmp/test-agent", + provider: "anthropic", + model: "claude-opus-4-6", + authStorage: {} as any, + modelRegistry: {} as any, + resolvedModel: {} as any, }, ...overrides, }); diff --git a/src/client/provider/ws/ws-client.ts b/src/client/provider/ws/ws-client.ts index 32f454b..6236875 100644 --- a/src/client/provider/ws/ws-client.ts +++ b/src/client/provider/ws/ws-client.ts @@ -1,7 +1,7 @@ import WebSocket from "ws"; import { ServerMessageSchema, SIXERR_PROTOCOL_VERSION } from "../schemas/protocol.js"; -import type { OpenClawClientConfig } from "../../../relay/openclaw-client.js"; -import { handleIncomingRequest } from "../../../relay/request-forwarder.js"; +import type { InferenceConfig } from "../inference/types.js"; +import { handleIncomingRequest } from "../inference/inference-handler.js"; import { rawDataToString } from "./raw-data.js"; import { computeBackoff, DEFAULT_RECONNECT_POLICY, type BackoffPolicy } from "./reconnect.js"; @@ -18,7 +18,7 @@ export interface PluginClientConfig { onJwtRefresh?: (newJwt: string) => void; // callback when server sends a refresh onPriceUpdateAck?: (pricing: { inputTokenPrice: string; outputTokenPrice: string }) => void; reconnectPolicy?: BackoffPolicy; // defaults to DEFAULT_RECONNECT_POLICY - openClawConfig: OpenClawClientConfig; // OpenClaw Gateway connection settings + inferenceConfig: InferenceConfig; // Direct LLM inference configuration /** Optional per-token pricing declaration (DISC-01). Sent in auth handshake. */ pricing?: { inputTokenPrice: string; // Atomic USDC per token @@ -200,11 +200,11 @@ export class PluginClient { break; case "request": { - // Forward to OpenClaw asynchronously -- do not await in message handler + // Forward to LLM asynchronously -- do not await in message handler handleIncomingRequest( msg.id, msg.body, - this.config.openClawConfig, + this.config.inferenceConfig, (response) => this.sendMessage(response), ).then(() => { this.requestCount++; diff --git a/src/plugin.ts b/src/plugin.ts index fe254e4..d1fd383 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -2,6 +2,7 @@ import * as http from "node:http"; import { fileURLToPath } from "node:url"; import { PluginClient } from "./client/provider/ws/ws-client.js"; import { createStatusDisplay } from "./client/provider/ws/display.js"; +import type { InferenceConfig } from "./client/provider/inference/types.js"; // --------------------------------------------------------------------------- // Types @@ -11,9 +12,7 @@ export interface PluginConfig { serverUrl: string; // ws://host:port or wss://host:port jwt: string; // JWT token for WebSocket auth sixerrServerUrl?: string; // HTTPS URL for setup flow (e.g. "https://sixerr.ai") - openClawUrl?: string; // default "http://localhost:18789" - openClawToken: string; // OPENCLAW_GATEWAY_TOKEN (required) - openClawTimeoutMs?: number; // default 120_000 + inferenceConfig: InferenceConfig; // Direct LLM inference configuration /** Optional per-token pricing for marketplace discovery (DISC-01). */ pricing?: { inputTokenPrice: string; // Atomic USDC per token @@ -53,11 +52,7 @@ export function startPlugin(config: PluginConfig): PluginHandle { // JWT refresh is handled in-memory by the WS client. // No persistence needed -- the start command re-authenticates each session. }, - openClawConfig: { - gatewayUrl: config.openClawUrl ?? "http://localhost:18789", - gatewayToken: config.openClawToken, - timeoutMs: config.openClawTimeoutMs, - }, + inferenceConfig: config.inferenceConfig, // Phase 7: Pass pricing config if provided pricing: config.pricing, // Phase 11: Pass agent identity if provided diff --git a/src/relay/openclaw-client.test.ts b/src/relay/openclaw-client.test.ts deleted file mode 100644 index e02c1f9..0000000 --- a/src/relay/openclaw-client.test.ts +++ /dev/null @@ -1,602 +0,0 @@ -import { describe, it, expect, afterEach, vi, beforeEach } from "vitest"; -import * as http from "node:http"; -import { forwardToOpenClaw, streamFromOpenClaw, type OpenClawClientConfig, type StreamCallbacks } from "./openclaw-client.js"; -import { handleIncomingRequest } from "./request-forwarder.js"; - -// --------------------------------------------------------------------------- -// Test helpers -// --------------------------------------------------------------------------- - -/** Create a test HTTP server that responds with the given handler. */ -function createMockServer( - handler: (req: http.IncomingMessage, res: http.ServerResponse) => void, -): Promise<{ server: http.Server; port: number; url: string }> { - return new Promise((resolve) => { - const server = http.createServer(handler); - server.listen(0, "127.0.0.1", () => { - const addr = server.address(); - const port = typeof addr === "object" && addr !== null ? addr.port : 0; - resolve({ server, port, url: `http://127.0.0.1:${port}` }); - }); - }); -} - -function closeServer(server: http.Server): Promise { - return new Promise((resolve) => { - server.close(() => resolve()); - }); -} - -/** Collect the full body from an incoming request. */ -function collectBody(req: http.IncomingMessage): Promise { - return new Promise((resolve) => { - const chunks: Buffer[] = []; - req.on("data", (chunk: Buffer) => chunks.push(chunk)); - req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8"))); - }); -} - -// --------------------------------------------------------------------------- -// forwardToOpenClaw tests -// --------------------------------------------------------------------------- - -describe("forwardToOpenClaw", () => { - let server: http.Server; - - afterEach(async () => { - if (server) { - await closeServer(server); - } - }); - - it("resolves with parsed JSON on 200 success", async () => { - const responseBody = { id: "resp-1", object: "response", status: "completed" }; - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify(responseBody)); - }); - server = mock.server; - - const config: OpenClawClientConfig = { - gatewayUrl: mock.url, - gatewayToken: "test-token", - }; - - const result = await forwardToOpenClaw(config, { model: "test", input: "hello" }); - expect(result).toEqual(responseBody); - }); - - it("rejects with descriptive error on 500 response", async () => { - const errorBody = { error: { code: "internal_error", message: "Something broke" } }; - const mock = await createMockServer((_req, res) => { - res.writeHead(500, { "Content-Type": "application/json" }); - res.end(JSON.stringify(errorBody)); - }); - server = mock.server; - - const config: OpenClawClientConfig = { - gatewayUrl: mock.url, - gatewayToken: "test-token", - }; - - await expect(forwardToOpenClaw(config, { model: "test", input: "hello" })).rejects.toThrow( - /OpenClaw Gateway error \(status 500\)/, - ); - }); - - it("rejects with parse error on invalid JSON response", async () => { - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "text/html" }); - res.end("not json"); - }); - server = mock.server; - - const config: OpenClawClientConfig = { - gatewayUrl: mock.url, - gatewayToken: "test-token", - }; - - await expect(forwardToOpenClaw(config, { model: "test", input: "hello" })).rejects.toThrow( - /OpenClaw Gateway returned invalid JSON/, - ); - }); - - it("rejects with timeout error when server does not respond", async () => { - const mock = await createMockServer((_req, _res) => { - // Intentionally never respond - }); - server = mock.server; - - const config: OpenClawClientConfig = { - gatewayUrl: mock.url, - gatewayToken: "test-token", - timeoutMs: 100, - }; - - await expect(forwardToOpenClaw(config, { model: "test", input: "hello" })).rejects.toThrow( - /timed out/i, - ); - }); - - it("rejects with ECONNREFUSED on non-listening port", async () => { - const config: OpenClawClientConfig = { - gatewayUrl: "http://127.0.0.1:59999", - gatewayToken: "test-token", - timeoutMs: 2000, - }; - - await expect(forwardToOpenClaw(config, { model: "test", input: "hello" })).rejects.toThrow( - /ECONNREFUSED/, - ); - }); - - it("sends correct headers and path", async () => { - let capturedHeaders: http.IncomingHttpHeaders = {}; - let capturedUrl = ""; - const mock = await createMockServer((req, res) => { - capturedHeaders = req.headers; - capturedUrl = req.url ?? ""; - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ ok: true })); - }); - server = mock.server; - - const config: OpenClawClientConfig = { - gatewayUrl: mock.url, - gatewayToken: "my-secret-token", - }; - - await forwardToOpenClaw(config, { model: "test" }); - - expect(capturedUrl).toBe("/v1/responses"); - expect(capturedHeaders["content-type"]).toBe("application/json; charset=utf-8"); - expect(capturedHeaders["authorization"]).toBe("Bearer my-secret-token"); - expect(capturedHeaders["content-length"]).toBeDefined(); - }); -}); - -// --------------------------------------------------------------------------- -// handleIncomingRequest tests -// --------------------------------------------------------------------------- - -describe("handleIncomingRequest", () => { - let server: http.Server; - - afterEach(async () => { - if (server) { - await closeServer(server); - } - }); - - it("sends response message on successful OpenClaw call", async () => { - const responseBody = { id: "resp-1", object: "response", status: "completed" }; - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify(responseBody)); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - await handleIncomingRequest( - "req-123", - { model: "test", input: "hello" }, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - expect(messages).toHaveLength(1); - expect(messages[0]).toEqual({ - type: "response", - id: "req-123", - body: responseBody, - }); - }); - - it("sends error message when OpenClaw call fails", async () => { - const mock = await createMockServer((_req, res) => { - res.writeHead(500, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ error: "fail" })); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - await handleIncomingRequest( - "req-456", - { model: "test", input: "hello" }, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - expect(messages).toHaveLength(1); - const msg = messages[0] as Record; - expect(msg.type).toBe("error"); - expect(msg.id).toBe("req-456"); - expect(msg.code).toBe("plugin_error"); - expect(typeof msg.message).toBe("string"); - }); - - it("enforces stream: false on non-streaming path", async () => { - let capturedBody: Record = {}; - const mock = await createMockServer(async (req, res) => { - const raw = await collectBody(req); - capturedBody = JSON.parse(raw); - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ ok: true })); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - // When stream is not true, the non-streaming path sets stream: false - await handleIncomingRequest( - "req-stream", - { model: "test", input: "hello" }, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - expect(capturedBody.stream).toBe(false); - }); - - it("passes tools through as-is to OpenClaw (gateway handles security via agent config)", async () => { - let capturedBody: Record = {}; - const mock = await createMockServer(async (req, res) => { - const raw = await collectBody(req); - capturedBody = JSON.parse(raw); - res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ ok: true })); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - const bodyWithTools = { - model: "test", - input: "hello", - tools: [ - { - type: "function", - function: { - name: "test_tool", - description: "A test tool", - parameters: { type: "object" }, - }, - }, - ], - }; - - await handleIncomingRequest( - "req-tools", - bodyWithTools, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - const forwardedTools = capturedBody.tools as Array>; - expect(forwardedTools).toHaveLength(1); - - const tool = forwardedTools[0]; - expect(tool.type).toBe("function"); - - const fn = tool.function as Record; - expect(fn.name).toBe("test_tool"); - expect(fn.description).toBe("A test tool"); - expect(fn.parameters).toEqual({ type: "object" }); - }); -}); - -// --------------------------------------------------------------------------- -// streamFromOpenClaw tests -// --------------------------------------------------------------------------- - -describe("streamFromOpenClaw", () => { - let server: http.Server; - - afterEach(async () => { - if (server) { - await closeServer(server); - } - }); - - it("calls onEvent for each SSE event and onDone at end", async () => { - const sseEvents = [ - { type: "response.created", response: { id: "resp-1", status: "in_progress" } }, - { type: "response.output_text.delta", delta: "Hello" }, - { type: "response.output_text.delta", delta: " world" }, - { type: "response.completed", response: { id: "resp-1", status: "completed", usage: { input_tokens: 10, output_tokens: 5, total_tokens: 15 } } }, - ]; - - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "text/event-stream" }); - for (const evt of sseEvents) { - res.write(`event: ${evt.type}\ndata: ${JSON.stringify(evt)}\n\n`); - } - res.write("data: [DONE]\n\n"); - res.end(); - }); - server = mock.server; - - const config: OpenClawClientConfig = { gatewayUrl: mock.url, gatewayToken: "tok" }; - const events: unknown[] = []; - let doneCalled = false; - let errorCalled = false; - - await streamFromOpenClaw(config, { model: "test", stream: true }, { - onEvent: (event) => events.push(event), - onError: () => { errorCalled = true; }, - onDone: () => { doneCalled = true; }, - }); - - expect(events).toHaveLength(4); - expect(events[0]).toEqual(sseEvents[0]); - expect(events[1]).toEqual(sseEvents[1]); - expect(events[2]).toEqual(sseEvents[2]); - expect(events[3]).toEqual(sseEvents[3]); - expect(doneCalled).toBe(true); - expect(errorCalled).toBe(false); - }); - - it("calls onError on HTTP error response", async () => { - const mock = await createMockServer((_req, res) => { - res.writeHead(500, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ error: { code: "internal_error", message: "Boom" } })); - }); - server = mock.server; - - const config: OpenClawClientConfig = { gatewayUrl: mock.url, gatewayToken: "tok" }; - const events: unknown[] = []; - let errorMsg = ""; - - await streamFromOpenClaw(config, { model: "test", stream: true }, { - onEvent: (event) => events.push(event), - onError: (err) => { errorMsg = err.message; }, - onDone: () => {}, - }); - - expect(events).toHaveLength(0); - expect(errorMsg).toMatch(/status 500/); - }); - - it("handles chunked SSE (event split across chunks)", async () => { - const fullEvent = { type: "response.output_text.delta", delta: "chunked data" }; - const sseStr = `event: ${fullEvent.type}\ndata: ${JSON.stringify(fullEvent)}\n\n`; - - // Split the SSE string roughly in the middle - const splitPoint = Math.floor(sseStr.length / 2); - const chunk1 = sseStr.slice(0, splitPoint); - const chunk2 = sseStr.slice(splitPoint); - - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "text/event-stream" }); - // Write the event in two separate chunks - res.write(chunk1); - // Small delay to ensure separate chunks - setTimeout(() => { - res.write(chunk2); - res.end(); - }, 20); - }); - server = mock.server; - - const config: OpenClawClientConfig = { gatewayUrl: mock.url, gatewayToken: "tok" }; - const events: unknown[] = []; - let doneCalled = false; - - await streamFromOpenClaw(config, { model: "test", stream: true }, { - onEvent: (event) => events.push(event), - onError: () => {}, - onDone: () => { doneCalled = true; }, - }); - - expect(events).toHaveLength(1); - expect(events[0]).toEqual(fullEvent); - expect(doneCalled).toBe(true); - }); - - it("skips [DONE] sentinel without calling onEvent", async () => { - const sseEvent = { type: "response.created", response: { id: "resp-1" } }; - - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "text/event-stream" }); - res.write(`event: ${sseEvent.type}\ndata: ${JSON.stringify(sseEvent)}\n\n`); - res.write("data: [DONE]\n\n"); - res.end(); - }); - server = mock.server; - - const config: OpenClawClientConfig = { gatewayUrl: mock.url, gatewayToken: "tok" }; - const events: unknown[] = []; - - await streamFromOpenClaw(config, { model: "test", stream: true }, { - onEvent: (event) => events.push(event), - onError: () => {}, - onDone: () => {}, - }); - - // Only the actual event, not the [DONE] sentinel - expect(events).toHaveLength(1); - expect(events[0]).toEqual(sseEvent); - }); - - it("sends Accept: text/event-stream header", async () => { - let capturedHeaders: http.IncomingHttpHeaders = {}; - const mock = await createMockServer((req, res) => { - capturedHeaders = req.headers; - res.writeHead(200, { "Content-Type": "text/event-stream" }); - res.end(); - }); - server = mock.server; - - const config: OpenClawClientConfig = { gatewayUrl: mock.url, gatewayToken: "tok" }; - - await streamFromOpenClaw(config, { model: "test", stream: true }, { - onEvent: () => {}, - onError: () => {}, - onDone: () => {}, - }); - - expect(capturedHeaders["accept"]).toBe("text/event-stream"); - }); -}); - -// --------------------------------------------------------------------------- -// handleIncomingRequest - streaming tests -// --------------------------------------------------------------------------- - -describe("handleIncomingRequest - streaming", () => { - let server: http.Server; - - afterEach(async () => { - if (server) { - await closeServer(server); - } - }); - - it("streaming request: sends stream_event messages then stream_end", async () => { - const sseEvents = [ - { type: "response.created", response: { id: "resp-1", status: "in_progress" } }, - { type: "response.output_text.delta", delta: "Hi" }, - { type: "response.completed", response: { id: "resp-1", status: "completed", usage: { input_tokens: 10, output_tokens: 3, total_tokens: 13 } } }, - ]; - - const mock = await createMockServer((_req, res) => { - res.writeHead(200, { "Content-Type": "text/event-stream" }); - for (const evt of sseEvents) { - res.write(`event: ${evt.type}\ndata: ${JSON.stringify(evt)}\n\n`); - } - res.write("data: [DONE]\n\n"); - res.end(); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - await handleIncomingRequest( - "req-stream-1", - { model: "test", input: "hello", stream: true }, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - // Should have 3 stream_event messages + 1 stream_end - expect(messages).toHaveLength(4); - - // First 3 are stream_event - for (let i = 0; i < 3; i++) { - const msg = messages[i] as Record; - expect(msg.type).toBe("stream_event"); - expect(msg.id).toBe("req-stream-1"); - expect(msg.event).toEqual(sseEvents[i]); - } - - // Last is stream_end with usage extracted from response.completed - const endMsg = messages[3] as Record; - expect(endMsg.type).toBe("stream_end"); - expect(endMsg.id).toBe("req-stream-1"); - expect(endMsg.usage).toEqual({ input_tokens: 10, output_tokens: 3, total_tokens: 13 }); - }); - - it("streaming request preserves stream: true in forwarded body", async () => { - let capturedBody: Record = {}; - const mock = await createMockServer(async (req, res) => { - const raw = await collectBody(req); - capturedBody = JSON.parse(raw); - res.writeHead(200, { "Content-Type": "text/event-stream" }); - res.end(); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - await handleIncomingRequest( - "req-stream-2", - { model: "test", input: "hello", stream: true }, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - expect(capturedBody.stream).toBe(true); - }); - - it("streaming request passes tools through as-is", async () => { - let capturedBody: Record = {}; - const mock = await createMockServer(async (req, res) => { - const raw = await collectBody(req); - capturedBody = JSON.parse(raw); - res.writeHead(200, { "Content-Type": "text/event-stream" }); - res.end(); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - const bodyWithTools = { - model: "test", - input: "hello", - stream: true, - tools: [ - { - type: "function", - function: { - name: "test_tool", - description: "A test tool", - parameters: { type: "object" }, - }, - }, - ], - }; - - await handleIncomingRequest( - "req-stream-tools", - bodyWithTools, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - const forwardedTools = capturedBody.tools as Array>; - expect(forwardedTools).toHaveLength(1); - - const tool = forwardedTools[0]; - expect(tool.type).toBe("function"); - - const fn = tool.function as Record; - expect(fn.name).toBe("test_tool"); - expect(fn.description).toBe("A test tool"); - }); - - it("streaming request sends error message on OpenClaw failure", async () => { - const mock = await createMockServer((_req, res) => { - res.writeHead(500, { "Content-Type": "application/json" }); - res.end(JSON.stringify({ error: "fail" })); - }); - server = mock.server; - - const messages: unknown[] = []; - const sendMessage = (msg: unknown) => messages.push(msg); - - await handleIncomingRequest( - "req-stream-err", - { model: "test", input: "hello", stream: true }, - { gatewayUrl: mock.url, gatewayToken: "tok" }, - sendMessage, - ); - - // Should have error message + stream_end message - expect(messages.length).toBeGreaterThanOrEqual(1); - const errorMsg = messages.find((m) => (m as Record).type === "error") as Record; - expect(errorMsg).toBeDefined(); - expect(errorMsg.type).toBe("error"); - expect(errorMsg.id).toBe("req-stream-err"); - expect(errorMsg.code).toBe("plugin_error"); - expect(typeof errorMsg.message).toBe("string"); - }); -}); diff --git a/src/relay/openclaw-client.ts b/src/relay/openclaw-client.ts deleted file mode 100644 index 7dac098..0000000 --- a/src/relay/openclaw-client.ts +++ /dev/null @@ -1,233 +0,0 @@ -import * as http from "node:http"; -import * as https from "node:https"; -import * as crypto from "node:crypto"; - -// --------------------------------------------------------------------------- -// Types -// --------------------------------------------------------------------------- - -export interface OpenClawClientConfig { - gatewayUrl: string; // e.g. "http://localhost:18789" - gatewayToken: string; // OPENCLAW_GATEWAY_TOKEN - agentId?: string; // OpenClaw agent ID for session key routing (default "sixerr-default") - timeoutMs?: number; // default 120_000 -} - -// --------------------------------------------------------------------------- -// forwardToOpenClaw -// --------------------------------------------------------------------------- - -/** - * Forward a request body to the local OpenClaw Gateway via HTTP POST. - * - * Uses node:http/node:https for explicit control (project convention). - * Sets Authorization header, Content-Type, and timeout. - * Returns the parsed JSON response body on success. - * Rejects with descriptive error on 4xx/5xx, parse failure, or timeout. - */ -export function forwardToOpenClaw( - config: OpenClawClientConfig, - requestBody: unknown, -): Promise { - return new Promise((resolve, reject) => { - const url = new URL("/v1/responses", config.gatewayUrl); - const isHttps = url.protocol === "https:"; - const transport = isHttps ? https : http; - - const bodyStr = JSON.stringify(requestBody); - const bodyBytes = Buffer.byteLength(bodyStr, "utf-8"); - const timeoutMs = config.timeoutMs ?? 120_000; - - const options: http.RequestOptions = { - hostname: url.hostname, - port: url.port || (isHttps ? 443 : 80), - path: url.pathname + url.search, - method: "POST", - timeout: timeoutMs, - headers: { - "Content-Type": "application/json; charset=utf-8", - "Content-Length": bodyBytes, - Authorization: `Bearer ${config.gatewayToken}`, - "X-OpenClaw-Session-Key": `agent:${config.agentId ?? "sixerr-default"}:subagent:${crypto.randomUUID()}`, - }, - }; - - const req = transport.request(options, (res) => { - const chunks: Buffer[] = []; - - res.on("data", (chunk: Buffer) => { - chunks.push(chunk); - }); - - res.on("end", () => { - const raw = Buffer.concat(chunks).toString("utf-8"); - - let parsed: unknown; - try { - parsed = JSON.parse(raw); - } catch { - reject( - new Error( - `OpenClaw Gateway returned invalid JSON (status ${res.statusCode}): ${raw.slice(0, 200)}`, - ), - ); - return; - } - - if (res.statusCode !== undefined && res.statusCode >= 400) { - reject( - new Error( - `OpenClaw Gateway error (status ${res.statusCode}): ${JSON.stringify(parsed)}`, - ), - ); - return; - } - - resolve(parsed); - }); - }); - - req.on("timeout", () => { - req.destroy(new Error("OpenClaw Gateway request timed out")); - }); - - req.on("error", (err) => { - reject(err); - }); - - req.write(bodyStr); - req.end(); - }); -} - -// --------------------------------------------------------------------------- -// StreamCallbacks + streamFromOpenClaw (Phase 4 Streaming) -// --------------------------------------------------------------------------- - -export interface StreamCallbacks { - onEvent: (event: unknown) => void; - onError: (err: Error) => void; - onDone: () => void; -} - -/** - * Stream a request to the local OpenClaw Gateway via HTTP POST with SSE. - * - * Same HTTP endpoint as `forwardToOpenClaw` but adds `Accept: text/event-stream` - * and parses the SSE response stream, invoking callbacks for each event. - * - * Always resolves (never rejects) -- errors are reported through `callbacks.onError`. - * This ensures the caller (request-forwarder) can always send error WS messages. - */ -export function streamFromOpenClaw( - config: OpenClawClientConfig, - requestBody: unknown, - callbacks: StreamCallbacks, -): Promise { - return new Promise((resolve) => { - const url = new URL("/v1/responses", config.gatewayUrl); - const isHttps = url.protocol === "https:"; - const transport = isHttps ? https : http; - - const bodyStr = JSON.stringify(requestBody); - const bodyBytes = Buffer.byteLength(bodyStr, "utf-8"); - const timeoutMs = config.timeoutMs ?? 120_000; - - const options: http.RequestOptions = { - hostname: url.hostname, - port: url.port || (isHttps ? 443 : 80), - path: url.pathname + url.search, - method: "POST", - timeout: timeoutMs, - headers: { - "Content-Type": "application/json; charset=utf-8", - "Content-Length": bodyBytes, - Authorization: `Bearer ${config.gatewayToken}`, - Accept: "text/event-stream", - "X-OpenClaw-Session-Key": `agent:${config.agentId ?? "sixerr-default"}:subagent:${crypto.randomUUID()}`, - }, - }; - - const req = transport.request(options, (res) => { - // On HTTP error response: collect body, call onError, resolve - if (res.statusCode !== undefined && res.statusCode >= 400) { - const chunks: Buffer[] = []; - res.on("data", (chunk: Buffer) => chunks.push(chunk)); - res.on("end", () => { - const body = Buffer.concat(chunks).toString("utf-8"); - callbacks.onError( - new Error( - `OpenClaw Gateway error (status ${res.statusCode}): ${body.slice(0, 500)}`, - ), - ); - resolve(); - }); - return; - } - - // Parse SSE from the IncomingMessage readable stream - const decoder = new TextDecoder("utf-8", { fatal: false }); - let buffer = ""; - - res.on("data", (chunk: Buffer) => { - buffer += decoder.decode(chunk, { stream: true }); - - // Split on double newline to find complete SSE events - const parts = buffer.split("\n\n"); - buffer = parts.pop() ?? ""; // Keep the last incomplete part - - for (const part of parts) { - if (!part.trim()) continue; - - // Detect [DONE] sentinel -- skip it (do NOT JSON.parse) - if (part.trim() === "data: [DONE]") { - continue; - } - - // Parse event: and data: fields from lines - let dataStr = ""; - for (const line of part.split("\n")) { - if (line.startsWith("event: ")) { - // eventType consumed but not needed for callback -- caller gets full parsed object - } else if (line.startsWith("data: ")) { - dataStr += (dataStr ? "\n" : "") + line.slice(6); - } - } - - if (dataStr) { - try { - const parsed = JSON.parse(dataStr); - callbacks.onEvent(parsed); - } catch { - console.warn( - `[OpenClaw SSE] Failed to parse event data: ${dataStr.slice(0, 100)}`, - ); - } - } - } - }); - - res.on("end", () => { - callbacks.onDone(); - resolve(); - }); - - res.on("error", (err) => { - callbacks.onError(err); - resolve(); - }); - }); - - req.on("timeout", () => { - req.destroy(new Error("OpenClaw Gateway streaming request timed out")); - }); - - req.on("error", (err) => { - callbacks.onError(err); - resolve(); - }); - - req.write(bodyStr); - req.end(); - }); -} diff --git a/src/relay/request-forwarder.ts b/src/relay/request-forwarder.ts deleted file mode 100644 index 116dc94..0000000 --- a/src/relay/request-forwarder.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { forwardToOpenClaw, streamFromOpenClaw, type OpenClawClientConfig } from "./openclaw-client.js"; - -// --------------------------------------------------------------------------- -// handleIncomingRequest -// --------------------------------------------------------------------------- - -/** - * Handle an incoming request from the Sixerr server. - * - * 1. Clones the body to avoid mutation - * 2. Converts tools to clientTools format (RELAY-03 defense-in-depth) - * 3. Branches on stream: true vs stream: false - * - Streaming: calls streamFromOpenClaw, forwards events as stream_event WS messages - * - Non-streaming: calls forwardToOpenClaw, sends response WS message - * 4. Sends error WS message on failure - */ -export async function handleIncomingRequest( - requestId: string, - body: unknown, - openClawConfig: OpenClawClientConfig, - sendMessage: (msg: unknown) => void, -): Promise { - try { - // Clone the body to avoid mutating the original - const forwardBody = { ...(body as Record) }; - - // Override model to the agent identifier — the plugin owner's OpenClaw - // agent config determines which LLM to use, not the client request. - // This satisfies the required schema field and routes to the correct agent. - forwardBody.model = `openclaw/${openClawConfig.agentId ?? "sixerr-default"}`; - - const isStreaming = forwardBody.stream === true; - - // NOTE: tools are passed through as-is. The sixerr-default agent has - // tools deny [*] configured in OpenClaw, which prevents execution on - // the plugin owner's machine. clientTools conversion is handled by - // the OpenClaw gateway based on agent config. - - if (isStreaming) { - // Streaming path: consume SSE from OpenClaw, forward events over WS - let usage = { input_tokens: 0, output_tokens: 0, total_tokens: 0 }; - - await streamFromOpenClaw(openClawConfig, forwardBody, { - onEvent(event: unknown) { - sendMessage({ type: "stream_event", id: requestId, event }); - - // Extract usage from response.completed event - const evt = event as { type?: string; response?: { usage?: typeof usage } }; - if (evt.type === "response.completed" && evt.response?.usage) { - usage = evt.response.usage; - } - }, - onError(err: Error) { - sendMessage({ - type: "error", - id: requestId, - code: "plugin_error", - message: err.message, - }); - }, - onDone() { - sendMessage({ type: "stream_end", id: requestId, usage }); - }, - }); - } else { - // Non-streaming path (existing behavior) - forwardBody.stream = false; - - // Forward to OpenClaw Gateway - const response = await forwardToOpenClaw(openClawConfig, forwardBody); - - // Send success response back to server - sendMessage({ - type: "response", - id: requestId, - body: response, - }); - } - } catch (err) { - // Send error back to server - sendMessage({ - type: "error", - id: requestId, - code: "plugin_error", - message: (err as Error).message || String(err), - }); - } -} diff --git a/src/start-programmatic.ts b/src/start-programmatic.ts index 364a25f..0768ceb 100644 --- a/src/start-programmatic.ts +++ b/src/start-programmatic.ts @@ -15,6 +15,7 @@ import { import { createHttpProxy } from "./proxy/http-proxy.js"; import type { PaymentSigner } from "./client/consumer/types.js"; import type { SixerrConfig } from "./config/schema.js"; +import { resolveInferenceConfig } from "./client/provider/inference/model-resolver.js"; // --------------------------------------------------------------------------- // Types @@ -56,7 +57,13 @@ export async function startProgrammatic( } // ------------------------------------------------------------------------- - // 2. Resolve wallet signer + // 2. Resolve LLM inference configuration (fail fast before auth/connect) + // ------------------------------------------------------------------------- + + const inferenceConfig = resolveInferenceConfig(); + + // ------------------------------------------------------------------------- + // 3. Resolve wallet signer // ------------------------------------------------------------------------- let signer: WalletSigner; @@ -131,8 +138,7 @@ export async function startProgrammatic( const handle = startPlugin({ serverUrl: wsUrl, jwt: authResult.jwt, - openClawToken: config.openClawToken, - openClawUrl: config.openClawUrl, + inferenceConfig, pricing: config.pricing, agentName: config.agentCard?.name, agentDescription: config.agentCard?.description, From 5a9a85d1db158272a875f7afdfb9c589a2625372 Mon Sep 17 00:00:00 2001 From: Nick Barry Date: Sun, 22 Feb 2026 06:33:03 +0000 Subject: [PATCH 3/3] refactor: rename marketplace "provider" to "supplier" Standardize terminology: "supplier" for the marketplace role that sells inference, "provider" reserved for LLM providers (e.g. anthropic) and the OpenClaw plugin API which uses its own "provider" terminology. Co-Authored-By: Claude Opus 4.6 --- src/cli/setup-non-interactive.ts | 4 +-- src/cli/setup.ts | 4 +-- src/cli/start.ts | 4 +-- src/client/consumer/sixerr-client.ts | 8 +++--- .../{provider => supplier}/inference/index.ts | 0 .../inference/inference-handler.ts | 0 .../inference/model-resolver.ts | 0 .../{provider => supplier}/inference/types.ts | 0 .../{provider => supplier}/schemas/errors.ts | 0 .../{provider => supplier}/schemas/index.ts | 0 .../schemas/openresponses.ts | 0 .../schemas/protocol.ts | 0 .../schemas/schemas.test.ts | 0 .../{provider => supplier}/ws/display.ts | 0 .../{provider => supplier}/ws/raw-data.ts | 0 .../ws/reconnect.test.ts | 0 .../{provider => supplier}/ws/reconnect.ts | 0 .../ws/ws-client.test.ts | 10 +++---- .../{provider => supplier}/ws/ws-client.ts | 8 +++--- src/config/schema.ts | 2 +- src/config/setup-programmatic.ts | 2 +- src/openclaw/discovery.ts | 26 +++++++++---------- src/openclaw/index.ts | 4 +-- src/openclaw/provider.ts | 8 +++--- src/plugin.ts | 10 +++---- src/proxy/http-proxy.ts | 8 +++--- src/start-programmatic.ts | 4 +-- 27 files changed, 51 insertions(+), 51 deletions(-) rename src/client/{provider => supplier}/inference/index.ts (100%) rename src/client/{provider => supplier}/inference/inference-handler.ts (100%) rename src/client/{provider => supplier}/inference/model-resolver.ts (100%) rename src/client/{provider => supplier}/inference/types.ts (100%) rename src/client/{provider => supplier}/schemas/errors.ts (100%) rename src/client/{provider => supplier}/schemas/index.ts (100%) rename src/client/{provider => supplier}/schemas/openresponses.ts (100%) rename src/client/{provider => supplier}/schemas/protocol.ts (100%) rename src/client/{provider => supplier}/schemas/schemas.test.ts (100%) rename src/client/{provider => supplier}/ws/display.ts (100%) rename src/client/{provider => supplier}/ws/raw-data.ts (100%) rename src/client/{provider => supplier}/ws/reconnect.test.ts (100%) rename src/client/{provider => supplier}/ws/reconnect.ts (100%) rename src/client/{provider => supplier}/ws/ws-client.test.ts (97%) rename src/client/{provider => supplier}/ws/ws-client.ts (98%) diff --git a/src/cli/setup-non-interactive.ts b/src/cli/setup-non-interactive.ts index c559e55..4953e65 100644 --- a/src/cli/setup-non-interactive.ts +++ b/src/cli/setup-non-interactive.ts @@ -12,7 +12,7 @@ import { * * Required env vars: * SIXERR_WALLET_TYPE — "coinbase" | "local" | "imported" - * SIXERR_AGENT_NAME — Display name for the provider + * SIXERR_AGENT_NAME — Display name for the supplier * * Conditional env vars: * CDP_API_KEY_ID — Required when walletType=coinbase @@ -22,7 +22,7 @@ import { * SIXERR_KEYSTORE_PASSWORD — Required when walletType=local|imported * * Optional env vars: - * SIXERR_AGENT_DESCRIPTION — Provider description + * SIXERR_AGENT_DESCRIPTION — Supplier description * SIXERR_AGENT_ID — Explicit agentId (defaults to wallet address) * SIXERR_IDENTITY_SOURCE — "erc8004" | "local" (default: "local") * SIXERR_INPUT_TOKEN_PRICE — Atomic USDC per input token (default: "1") diff --git a/src/cli/setup.ts b/src/cli/setup.ts index a1c6139..af358d6 100644 --- a/src/cli/setup.ts +++ b/src/cli/setup.ts @@ -241,7 +241,7 @@ export async function runSetup(): Promise { const nameInput = await text({ message: "Agent display name:", - placeholder: "My Sixerr Provider", + placeholder: "My Sixerr Supplier", validate: (v) => (!v ? "Name is required" : undefined), }); handleCancel(nameInput); @@ -249,7 +249,7 @@ export async function runSetup(): Promise { const descInput = await text({ message: "Agent description:", - placeholder: "Fast inference provider running Claude", + placeholder: "Fast inference supplier running Claude", }); handleCancel(descInput); agentDescription = descInput; diff --git a/src/cli/start.ts b/src/cli/start.ts index cd71862..e303031 100644 --- a/src/cli/start.ts +++ b/src/cli/start.ts @@ -18,7 +18,7 @@ import type { WalletSigner } from "../wallet/types.js"; import { SixerrClient, createLocalPaymentSigner, createCdpPaymentSigner } from "../client/consumer/index.js"; import { createHttpProxy } from "../proxy/http-proxy.js"; import type { PaymentSigner } from "../client/consumer/types.js"; -import { resolveInferenceConfig } from "../client/provider/inference/model-resolver.js"; +import { resolveInferenceConfig } from "../client/supplier/inference/model-resolver.js"; // --------------------------------------------------------------------------- // Start Command @@ -132,7 +132,7 @@ export async function runStart(): Promise { log.info(`Agent ID: ${authResult.agentId}`); } - // Persist JWT to config for OpenClaw provider registration + // Persist JWT to config for OpenClaw supplier registration await saveConfig({ ...config, jwt: authJwt }); } catch (err) { authSpinner.stop("Authentication failed"); diff --git a/src/client/consumer/sixerr-client.ts b/src/client/consumer/sixerr-client.ts index c874f1d..5dcabd3 100644 --- a/src/client/consumer/sixerr-client.ts +++ b/src/client/consumer/sixerr-client.ts @@ -139,12 +139,12 @@ export class SixerrClient { } /** - * List available providers from the server catalog. + * List available suppliers from the server catalog. */ - async listProviders(): Promise { - const res = await fetch(`${this.serverUrl}/v1/providers`); + async listSuppliers(): Promise { + const res = await fetch(`${this.serverUrl}/v1/suppliers`); if (!res.ok) { - throw new Error(`Failed to fetch providers (${res.status})`); + throw new Error(`Failed to fetch suppliers (${res.status})`); } return res.json(); } diff --git a/src/client/provider/inference/index.ts b/src/client/supplier/inference/index.ts similarity index 100% rename from src/client/provider/inference/index.ts rename to src/client/supplier/inference/index.ts diff --git a/src/client/provider/inference/inference-handler.ts b/src/client/supplier/inference/inference-handler.ts similarity index 100% rename from src/client/provider/inference/inference-handler.ts rename to src/client/supplier/inference/inference-handler.ts diff --git a/src/client/provider/inference/model-resolver.ts b/src/client/supplier/inference/model-resolver.ts similarity index 100% rename from src/client/provider/inference/model-resolver.ts rename to src/client/supplier/inference/model-resolver.ts diff --git a/src/client/provider/inference/types.ts b/src/client/supplier/inference/types.ts similarity index 100% rename from src/client/provider/inference/types.ts rename to src/client/supplier/inference/types.ts diff --git a/src/client/provider/schemas/errors.ts b/src/client/supplier/schemas/errors.ts similarity index 100% rename from src/client/provider/schemas/errors.ts rename to src/client/supplier/schemas/errors.ts diff --git a/src/client/provider/schemas/index.ts b/src/client/supplier/schemas/index.ts similarity index 100% rename from src/client/provider/schemas/index.ts rename to src/client/supplier/schemas/index.ts diff --git a/src/client/provider/schemas/openresponses.ts b/src/client/supplier/schemas/openresponses.ts similarity index 100% rename from src/client/provider/schemas/openresponses.ts rename to src/client/supplier/schemas/openresponses.ts diff --git a/src/client/provider/schemas/protocol.ts b/src/client/supplier/schemas/protocol.ts similarity index 100% rename from src/client/provider/schemas/protocol.ts rename to src/client/supplier/schemas/protocol.ts diff --git a/src/client/provider/schemas/schemas.test.ts b/src/client/supplier/schemas/schemas.test.ts similarity index 100% rename from src/client/provider/schemas/schemas.test.ts rename to src/client/supplier/schemas/schemas.test.ts diff --git a/src/client/provider/ws/display.ts b/src/client/supplier/ws/display.ts similarity index 100% rename from src/client/provider/ws/display.ts rename to src/client/supplier/ws/display.ts diff --git a/src/client/provider/ws/raw-data.ts b/src/client/supplier/ws/raw-data.ts similarity index 100% rename from src/client/provider/ws/raw-data.ts rename to src/client/supplier/ws/raw-data.ts diff --git a/src/client/provider/ws/reconnect.test.ts b/src/client/supplier/ws/reconnect.test.ts similarity index 100% rename from src/client/provider/ws/reconnect.test.ts rename to src/client/supplier/ws/reconnect.test.ts diff --git a/src/client/provider/ws/reconnect.ts b/src/client/supplier/ws/reconnect.ts similarity index 100% rename from src/client/provider/ws/reconnect.ts rename to src/client/supplier/ws/reconnect.ts diff --git a/src/client/provider/ws/ws-client.test.ts b/src/client/supplier/ws/ws-client.test.ts similarity index 97% rename from src/client/provider/ws/ws-client.test.ts rename to src/client/supplier/ws/ws-client.test.ts index 05e4ffc..44b30f4 100644 --- a/src/client/provider/ws/ws-client.test.ts +++ b/src/client/supplier/ws/ws-client.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, afterEach, vi, beforeEach } from "vitest"; import { WebSocketServer, WebSocket as WsWebSocket } from "ws"; -import { PluginClient, type ConnectionStatus, type PluginClientConfig } from "./ws-client.js"; +import { SupplierClient, type ConnectionStatus, type SupplierClientConfig } from "./ws-client.js"; import { SIXERR_PROTOCOL_VERSION } from "../schemas/protocol.js"; // --------------------------------------------------------------------------- @@ -66,11 +66,11 @@ function delay(ms: number): Promise { // Tests // --------------------------------------------------------------------------- -describe("PluginClient", () => { +describe("SupplierClient", () => { let wss: WebSocketServer; let port: number; let url: string; - let client: PluginClient; + let client: SupplierClient; let statusChanges: Array<{ status: ConnectionStatus; pluginId: string | null; requestCount: number }>; beforeEach(async () => { @@ -88,8 +88,8 @@ describe("PluginClient", () => { await new Promise((resolve) => wss.close(() => resolve())); }); - function createClient(overrides?: Partial): PluginClient { - client = new PluginClient({ + function createClient(overrides?: Partial): SupplierClient { + client = new SupplierClient({ serverUrl: url, jwt: "eyJhbGciOiJFUzI1NiJ9.test-token", onStatusChange: (status, pluginId, requestCount) => { diff --git a/src/client/provider/ws/ws-client.ts b/src/client/supplier/ws/ws-client.ts similarity index 98% rename from src/client/provider/ws/ws-client.ts rename to src/client/supplier/ws/ws-client.ts index 6236875..4507cc9 100644 --- a/src/client/provider/ws/ws-client.ts +++ b/src/client/supplier/ws/ws-client.ts @@ -11,7 +11,7 @@ import { computeBackoff, DEFAULT_RECONNECT_POLICY, type BackoffPolicy } from "./ export type ConnectionStatus = "connecting" | "authenticating" | "connected" | "reconnecting" | "disconnected"; -export interface PluginClientConfig { +export interface SupplierClientConfig { serverUrl: string; // ws://host:port jwt: string; // JWT token for auth onStatusChange: (status: ConnectionStatus, pluginId: string | null, requestCount: number) => void; @@ -31,10 +31,10 @@ export interface PluginClientConfig { } // --------------------------------------------------------------------------- -// PluginClient +// SupplierClient // --------------------------------------------------------------------------- -export class PluginClient { +export class SupplierClient { private ws: WebSocket | null = null; private status: ConnectionStatus = "disconnected"; private reconnectAttempt = 0; @@ -44,7 +44,7 @@ export class PluginClient { private reconnectTimer: ReturnType | null = null; private readonly policy: BackoffPolicy; - constructor(private config: PluginClientConfig) { + constructor(private config: SupplierClientConfig) { this.policy = config.reconnectPolicy ?? DEFAULT_RECONNECT_POLICY; } diff --git a/src/config/schema.ts b/src/config/schema.ts index 6887668..cfa9049 100644 --- a/src/config/schema.ts +++ b/src/config/schema.ts @@ -27,7 +27,7 @@ export const ConfigSchema = z.object({ openClawToken: z.string().min(1), openClawUrl: z.string().url().default("http://localhost:18789"), - // JWT for OpenClaw provider registration (persisted after auth) + // JWT for OpenClaw supplier registration (persisted after auth) jwt: z.string().optional(), // Agent identity card (set during setup wizard) diff --git a/src/config/setup-programmatic.ts b/src/config/setup-programmatic.ts index b27ea52..adfe431 100644 --- a/src/config/setup-programmatic.ts +++ b/src/config/setup-programmatic.ts @@ -62,7 +62,7 @@ export interface ProgrammaticSetupResult { * Non-interactive plugin setup. Creates wallet, writes config to * ~/.sixerr/config.json, and returns the result. * - * Designed for agents that need to self-provision as Sixerr providers + * Designed for agents that need to self-provision as Sixerr suppliers * without human interaction. */ export async function setupProgrammatic( diff --git a/src/openclaw/discovery.ts b/src/openclaw/discovery.ts index d00581a..c4f0fda 100644 --- a/src/openclaw/discovery.ts +++ b/src/openclaw/discovery.ts @@ -1,8 +1,8 @@ // --------------------------------------------------------------------------- -// Provider catalog client — fetches connected providers from the server +// Supplier catalog client — fetches connected suppliers from the server // --------------------------------------------------------------------------- -export interface DiscoveredProvider { +export interface DiscoveredSupplier { agentId: string; available: boolean; pricing: { @@ -17,37 +17,37 @@ export interface ModelEntry { } /** - * Fetch the list of connected providers from the Sixerr server. + * Fetch the list of connected suppliers from the Sixerr server. * Best-effort: returns empty array on network/parse errors. */ -export async function fetchProviderCatalog( +export async function fetchSupplierCatalog( serverHttpUrl: string, -): Promise { +): Promise { try { - const url = `${serverHttpUrl.replace(/\/$/, "")}/v1/providers`; + const url = `${serverHttpUrl.replace(/\/$/, "")}/v1/suppliers`; const res = await fetch(url); if (!res.ok) return []; - const data = (await res.json()) as { providers?: DiscoveredProvider[] }; - return data.providers ?? []; + const data = (await res.json()) as { suppliers?: DiscoveredSupplier[] }; + return data.suppliers ?? []; } catch { return []; } } /** - * Build OpenClaw model entries from discovered providers. + * Build OpenClaw model entries from discovered suppliers. * Always includes "auto" as the first entry. */ -export function buildModelList(providers: DiscoveredProvider[]): ModelEntry[] { +export function buildModelList(suppliers: DiscoveredSupplier[]): ModelEntry[] { const models: ModelEntry[] = [ { id: "auto", name: "Auto (cheapest available)" }, ]; - for (const provider of providers) { + for (const supplier of suppliers) { models.push({ - id: provider.agentId, - name: provider.agentId, + id: supplier.agentId, + name: supplier.agentId, }); } diff --git a/src/openclaw/index.ts b/src/openclaw/index.ts index 9e70d81..9442eb3 100644 --- a/src/openclaw/index.ts +++ b/src/openclaw/index.ts @@ -1,4 +1,4 @@ export { register } from "./provider.js"; -export { fetchProviderCatalog, buildModelList } from "./discovery.js"; -export type { DiscoveredProvider, ModelEntry } from "./discovery.js"; +export { fetchSupplierCatalog, buildModelList } from "./discovery.js"; +export type { DiscoveredSupplier, ModelEntry } from "./discovery.js"; export type { OpenClawPluginApi, OpenClawProviderRegistration } from "./provider.js"; diff --git a/src/openclaw/provider.ts b/src/openclaw/provider.ts index 16be5da..d1e5921 100644 --- a/src/openclaw/provider.ts +++ b/src/openclaw/provider.ts @@ -3,7 +3,7 @@ // --------------------------------------------------------------------------- import { loadConfig } from "../config/store.js"; -import { fetchProviderCatalog, buildModelList } from "./discovery.js"; +import { fetchSupplierCatalog, buildModelList } from "./discovery.js"; // --------------------------------------------------------------------------- // Types (minimal OpenClaw plugin API surface) @@ -52,7 +52,7 @@ function httpUrlFromConfig(serverUrl: string): string { * Reads config from ~/.sixerr/config.json. If no JWT is present * (plugin hasn't authenticated yet), silently skips registration. * - * Model list is fetched best-effort from GET /v1/providers. Stale data + * Model list is fetched best-effort from GET /v1/suppliers. Stale data * only affects autocomplete — OpenClaw sends any model string and the * server returns 404 for unknown agents. */ @@ -61,8 +61,8 @@ export async function register(api: OpenClawPluginApi): Promise { if (!config?.jwt) return; const serverUrl = httpUrlFromConfig(config.serverUrl); - const providers = await fetchProviderCatalog(serverUrl); - const models = buildModelList(providers); + const suppliers = await fetchSupplierCatalog(serverUrl); + const models = buildModelList(suppliers); // Point OpenClaw at the local proxy which handles x402 payment signing // transparently. The server URL would return 402s that OpenClaw can't handle. diff --git a/src/plugin.ts b/src/plugin.ts index d1fd383..b44960c 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,8 +1,8 @@ import * as http from "node:http"; import { fileURLToPath } from "node:url"; -import { PluginClient } from "./client/provider/ws/ws-client.js"; -import { createStatusDisplay } from "./client/provider/ws/display.js"; -import type { InferenceConfig } from "./client/provider/inference/types.js"; +import { SupplierClient } from "./client/supplier/ws/ws-client.js"; +import { createStatusDisplay } from "./client/supplier/ws/display.js"; +import type { InferenceConfig } from "./client/supplier/inference/types.js"; // --------------------------------------------------------------------------- // Types @@ -25,7 +25,7 @@ export interface PluginConfig { } export interface PluginHandle { - client: PluginClient; + client: SupplierClient; proxyServer?: http.Server; stop: () => void; } @@ -44,7 +44,7 @@ export function startPlugin(config: PluginConfig): PluginHandle { const display = createStatusDisplay(); - const client = new PluginClient({ + const client = new SupplierClient({ serverUrl: config.serverUrl, jwt: config.jwt, onStatusChange: display.update, diff --git a/src/proxy/http-proxy.ts b/src/proxy/http-proxy.ts index 201a2e2..459cf6c 100644 --- a/src/proxy/http-proxy.ts +++ b/src/proxy/http-proxy.ts @@ -52,12 +52,12 @@ async function handleRequest( const url = req.url ?? "/"; const method = req.method ?? "GET"; - // GET /v1/providers - if (method === "GET" && url === "/v1/providers") { + // GET /v1/suppliers + if (method === "GET" && url === "/v1/suppliers") { try { - const providers = await client.listProviders(); + const suppliers = await client.listSuppliers(); res.writeHead(200, { "Content-Type": "application/json" }); - res.end(JSON.stringify(providers)); + res.end(JSON.stringify(suppliers)); } catch (err) { res.writeHead(502, { "Content-Type": "application/json" }); res.end(JSON.stringify({ error: (err as Error).message })); diff --git a/src/start-programmatic.ts b/src/start-programmatic.ts index 0768ceb..0bd76b5 100644 --- a/src/start-programmatic.ts +++ b/src/start-programmatic.ts @@ -15,7 +15,7 @@ import { import { createHttpProxy } from "./proxy/http-proxy.js"; import type { PaymentSigner } from "./client/consumer/types.js"; import type { SixerrConfig } from "./config/schema.js"; -import { resolveInferenceConfig } from "./client/provider/inference/model-resolver.js"; +import { resolveInferenceConfig } from "./client/supplier/inference/model-resolver.js"; // --------------------------------------------------------------------------- // Types @@ -39,7 +39,7 @@ export interface StartProgrammaticOptions { * Loads config, resolves wallet, authenticates with the server, starts * the HTTP proxy and WebSocket client, and returns a PluginHandle. * - * Designed for agents that need to self-start as Sixerr providers + * Designed for agents that need to self-start as Sixerr suppliers * without a TTY or human interaction. */ export async function startProgrammatic(