diff --git a/.env.example b/.env.example index d5273290cd..2f4957a2b5 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,11 @@ DISCORD_VOICE_CHANNEL_ID= # The ID of the voice channel the bot should join (opt # AI Model API Keys OPENAI_API_KEY= # OpenAI API key, starting with sk- +SMALL_OPENAI_MODEL= # Default: gpt-4o-mini +MEDIUM_OPENAI_MODEL= # Default: gpt-4o +LARGE_OPENAI_MODEL= # Default: gpt-4o +EMBEDDING_OPENAI_MODEL= # Default: text-embedding-3-small +IMAGE_OPENAI_MODEL= # Default: dall-e-3 # Eternal AI's Decentralized Inference API ETERNALAI_URL= @@ -18,8 +23,14 @@ GOOGLE_GENERATIVE_AI_API_KEY= # Gemini API key ALI_BAILIAN_API_KEY= # Ali Bailian API Key VOLENGINE_API_KEY= # VolEngine API Key +NANOGPT_API_KEY= # NanoGPT API Key HYPERBOLIC_API_KEY= # Hyperbolic API Key +HYPERBOLIC_MODEL= +IMAGE_HYPERBOLIC_MODEL= # Default: FLUX.1-dev +SMALL_HYPERBOLIC_MODEL= # Default: meta-llama/Llama-3.2-3B-Instruct +MEDIUM_HYPERBOLIC_MODEL= # Default: meta-llama/Meta-Llama-3.1-70B-Instruct +LARGE_HYPERBOLIC_MODEL= # Default: meta-llama/Meta-Llama-3.1-405-Instruct # Speech Synthesis ELEVENLABS_XI_API_KEY= # API key from elevenlabs @@ -91,11 +102,20 @@ MEDIUM_GROQ_MODEL= # Default: llama-3.3-70b-versatile LARGE_GROQ_MODEL= # Default: llama-3.2-90b-vision-preview EMBEDDING_GROQ_MODEL= # Default: llama-3.1-8b-instant +# NanoGPT Configuration +SMALL_NANOGPT_MODEL= # Default: gpt-4o-mini +MEDIUM_NANOGPT_MODEL= # Default: gpt-4o +LARGE_NANOGPT_MODEL= # Default: gpt-4o + #LlamaLocal Configuration LLAMALOCAL_PATH= # Default: "" which is the current directory in plugin-node/dist/ which gets destroyed and recreated on every build # API Keys ANTHROPIC_API_KEY= # For Claude +SMALL_ANTHROPIC_MODEL= # Default: claude-3-haiku-20240307 +MEDIUM_ANTHROPIC_MODEL= # Default: claude-3-5-sonnet-20241022 +LARGE_ANTHROPIC_MODEL= # Default: claude-3-5-sonnet-20241022 + HEURIST_API_KEY= # Get from https://heurist.ai/dev-access # Heurist Models @@ -188,7 +208,12 @@ ZEROG_PRIVATE_KEY= ZEROG_FLOW_ADDRESS= # TEE Configuration -DSTACK_SIMULATOR_ENDPOINT= +# TEE_MODE options: +# - LOCAL: Uses simulator at localhost:8090 (for local development) +# - DOCKER: Uses simulator at host.docker.internal:8090 (for docker development) +# - PRODUCTION: No simulator, uses production endpoints +# Defaults to OFF if not specified +TEE_MODE=OFF #LOCAL|DOCKER|PRODUCTION WALLET_SECRET_SALT= # ONLY DEFINE IF YOU WANT TO USE TEE Plugin, otherwise it will throw errors # Galadriel Configuration diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml new file mode 100644 index 0000000000..ddd543b0b9 --- /dev/null +++ b/.github/workflows/image.yaml @@ -0,0 +1,61 @@ +# +name: Create and publish a Docker image + +# Configures this workflow to run every time a change is pushed to the branch called `release`. +on: + release: + types: [created] + workflow_dispatch: + +# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds. +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu. +jobs: + build-and-push-image: + runs-on: ubuntu-latest + # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. + permissions: + contents: read + packages: write + attestations: write + id-token: write + # + steps: + - name: Checkout repository + uses: actions/checkout@v4 + # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. + # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository. + # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. + - name: Build and push Docker image + id: push + uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)." + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true + diff --git a/.github/workflows/require-develop.yml b/.github/workflows/require-develop.yml new file mode 100644 index 0000000000..4519a3b5ca --- /dev/null +++ b/.github/workflows/require-develop.yml @@ -0,0 +1,18 @@ +name: Check pull request source branch +on: + pull_request_target: + types: + - opened + - reopened + - synchronize + - edited +jobs: + check-branches: + runs-on: ubuntu-latest + steps: + - name: Check branches + run: | + if [ ${{ github.head_ref }} != "develop" ] && [ ${{ github.base_ref }} == "main" ]; then + echo "Merge requests to main branch are only allowed from dev branch." + exit 1 + fi diff --git a/Dockerfile b/Dockerfile index a16b33ac0c..d97ed212cb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ COPY characters ./characters # Install dependencies and build the project RUN pnpm install \ - && pnpm build \ + && pnpm build-docker \ && pnpm prune --prod # Create a new stage for the final image diff --git a/README.md b/README.md index 96c287cafd..b87419cfad 100644 --- a/README.md +++ b/README.md @@ -1,133 +1,133 @@ -# Eliza 🤖 - -
- Eliza Banner -
- -
- - 📖 [Documentation](https://ai16z.github.io/eliza/) | 🎯 [Examples](https://github.com/thejoven/awesome-eliza) - -
- -## 🌍 README Translations - -[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) - -## ✨ Features - -- 🛠️ Full-featured Discord, Twitter and Telegram connectors -- 🔗 Support for every model (Llama, Grok, OpenAI, Anthropic, etc.) -- 👥 Multi-agent and room support -- 📚 Easily ingest and interact with your documents -- 💾 Retrievable memory and document store -- 🚀 Highly extensible - create your own actions and clients -- ☁️ Supports many models (local Llama, OpenAI, Anthropic, Groq, etc.) -- 📦 Just works! - -## 🎯 Use Cases - -- 🤖 Chatbots -- 🕵️ Autonomous Agents -- 📈 Business Process Handling -- 🎮 Video Game NPCs -- 🧠 Trading - -## 🚀 Quick Start - -### Prerequisites - -- [Python 2.7+](https://www.python.org/downloads/) -- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -- [pnpm](https://pnpm.io/installation) - -> **Note for Windows Users:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual) is required. - -### Use the Starter (Recommended) - -```bash -git clone https://github.com/ai16z/eliza-starter.git - -cp .env.example .env - -pnpm i && pnpm start -``` - -Then read the [Documentation](https://ai16z.github.io/eliza/) to learn how to customize your Eliza. - -### Manually Start Eliza (Only recommended if you know what you are doing) - -```bash -# Clone the repository -git clone https://github.com/ai16z/eliza.git - -# Checkout the latest release -# This project iterates fast, so we recommend checking out the latest release -git checkout $(git describe --tags --abbrev=0) -``` - -### Start Eliza with Gitpod - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/ai16z/eliza/tree/main) - -### Edit the .env file - -Copy .env.example to .env and fill in the appropriate values. - -``` -cp .env.example .env -``` - -Note: .env is optional. If your planning to run multiple distinct agents, you can pass secrets through the character JSON - -### Automatically Start Eliza - -This will run everything to setup the project and start the bot with the default character. - -```bash -sh scripts/start.sh -``` - -### Edit the character file - -1. Open `agent/src/character.ts` to modify the default character. Uncomment and edit. - -2. To load custom characters: - - Use `pnpm start --characters="path/to/your/character.json"` - - Multiple character files can be loaded simultaneously -3. Connect with X (Twitter) - - change `"clients": []` to `"clients": ["twitter"]` in the character file to connect with X - -### Manually Start Eliza - -```bash -pnpm i -pnpm build -pnpm start - -# The project iterates fast, sometimes you need to clean the project if you are coming back to the project -pnpm clean -``` - -#### Additional Requirements - -You may need to install Sharp. If you see an error when starting up, try installing it with the following command: - -``` -pnpm install --include=optional sharp -``` - -### Community & contact - -- [GitHub Issues](https://github.com/ai16z/eliza/issues). Best for: bugs you encounter using Eliza, and feature proposals. -- [Discord](https://discord.gg/ai16z). Best for: sharing your applications and hanging out with the community. - -## Contributors - - - - - -## Star History - -[![Star History Chart](https://api.star-history.com/svg?repos=ai16z/eliza&type=Date)](https://star-history.com/#ai16z/eliza&Date) +# Eliza 🤖 + +
+ Eliza Banner +
+ +
+ + 📖 [Documentation](https://ai16z.github.io/eliza/) | 🎯 [Examples](https://github.com/thejoven/awesome-eliza) + +
+ +## 🌍 README Translations + +[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) + +## ✨ Features + +- 🛠️ Full-featured Discord, Twitter and Telegram connectors +- 🔗 Support for every model (Llama, Grok, OpenAI, Anthropic, etc.) +- 👥 Multi-agent and room support +- 📚 Easily ingest and interact with your documents +- 💾 Retrievable memory and document store +- 🚀 Highly extensible - create your own actions and clients +- ☁️ Supports many models (local Llama, OpenAI, Anthropic, Groq, etc.) +- 📦 Just works! + +## 🎯 Use Cases + +- 🤖 Chatbots +- 🕵️ Autonomous Agents +- 📈 Business Process Handling +- 🎮 Video Game NPCs +- 🧠 Trading + +## 🚀 Quick Start + +### Prerequisites + +- [Python 2.7+](https://www.python.org/downloads/) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) + +> **Note for Windows Users:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual) is required. + +### Use the Starter (Recommended) + +```bash +git clone https://github.com/ai16z/eliza-starter.git + +cp .env.example .env + +pnpm i && pnpm start +``` + +Then read the [Documentation](https://ai16z.github.io/eliza/) to learn how to customize your Eliza. + +### Manually Start Eliza (Only recommended if you know what you are doing) + +```bash +# Clone the repository +git clone https://github.com/ai16z/eliza.git + +# Checkout the latest release +# This project iterates fast, so we recommend checking out the latest release +git checkout $(git describe --tags --abbrev=0) +``` + +### Start Eliza with Gitpod + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/ai16z/eliza/tree/main) + +### Edit the .env file + +Copy .env.example to .env and fill in the appropriate values. + +``` +cp .env.example .env +``` + +Note: .env is optional. If your planning to run multiple distinct agents, you can pass secrets through the character JSON + +### Automatically Start Eliza + +This will run everything to setup the project and start the bot with the default character. + +```bash +sh scripts/start.sh +``` + +### Edit the character file + +1. Open `agent/src/character.ts` to modify the default character. Uncomment and edit. + +2. To load custom characters: + - Use `pnpm start --characters="path/to/your/character.json"` + - Multiple character files can be loaded simultaneously +3. Connect with X (Twitter) + - change `"clients": []` to `"clients": ["twitter"]` in the character file to connect with X + +### Manually Start Eliza + +```bash +pnpm i +pnpm build +pnpm start + +# The project iterates fast, sometimes you need to clean the project if you are coming back to the project +pnpm clean +``` + +#### Additional Requirements + +You may need to install Sharp. If you see an error when starting up, try installing it with the following command: + +``` +pnpm install --include=optional sharp +``` + +### Community & contact + +- [GitHub Issues](https://github.com/ai16z/eliza/issues). Best for: bugs you encounter using Eliza, and feature proposals. +- [Discord](https://discord.gg/ai16z). Best for: sharing your applications and hanging out with the community. + +## Contributors + + + + + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=ai16z/eliza&type=Date)](https://star-history.com/#ai16z/eliza&Date) diff --git a/README_DE.md b/README_DE.md new file mode 100644 index 0000000000..c6db5476a2 --- /dev/null +++ b/README_DE.md @@ -0,0 +1,128 @@ +# Eliza 🤖 + +
+ Eliza Banner +
+ +
+ + 📖 [Dokumentation](https://ai16z.github.io/eliza/) | 🎯 [Beispiele](https://github.com/thejoven/awesome-eliza) + +
+ +## ✨ Funktionen + +- 🛠️ Voll ausgestattete Konnektoren für Discord, Twitter und Telegram +- 👥 Multi-Agenten- und Raumunterstützung +- 📚 Einfache Verarbeitung und Interaktion mit deinen Dokumenten +- 💾 Abrufbarer Speicher und Dokumentenspeicher +- 🚀 Hochgradig erweiterbar – erstelle deine eigenen Aktionen und Clients +- ☁️ Unterstützt viele Modelle (lokales Llama, OpenAI, Anthropic, Groq usw.) +- 📦 Einfach funktionsfähig! + +## 🎯 Anwendungsfälle + +- 🤖 Chatbots +- 🕵️ Autonome Agenten +- 📈 Geschäftsprozessmanagement +- 🎮 NPCs in Videospielen +- 🧠 Handel + +## 🚀 Schnelleinstieg + +### Voraussetzungen + +- [Python 2.7+](https://www.python.org/downloads/) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) + +> **Hinweis für Windows-Benutzer:** [WSL 2](https://learn.microsoft.com/de-de/windows/wsl/install-manual) ist erforderlich. + +### Nutzung des Starters (Empfohlen) + +```bash +git clone https://github.com/ai16z/eliza-starter.git + +cp .env.example .env + +pnpm i && pnpm start +``` + +Lies dann die [Dokumentation](https://ai16z.github.io/eliza/), um zu erfahren, wie du Eliza anpassen kannst. + +### Manuelles Starten von Eliza (Nur empfohlen, wenn du genau weißt, was du tust) + +```bash +# Repository klonen +git clone https://github.com/ai16z/eliza.git + +# Wechsle zur neuesten Version +# Dieses Projekt entwickelt sich schnell weiter, daher empfehlen wir, die neueste Version zu verwenden +git checkout $(git describe --tags --abbrev=0) +``` + +### Eliza mit Gitpod starten + +[![In Gitpod öffnen](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/ai16z/eliza/tree/main) + +### Bearbeite die .env-Datei + +Kopiere .env.example nach .env und fülle die entsprechenden Werte aus. + +``` +cp .env.example .env +``` + +Hinweis: .env ist optional. Wenn du vorhast, mehrere unterschiedliche Agenten auszuführen, kannst du Geheimnisse über die Charakter-JSON übergeben. + +### Eliza automatisch starten + +Dies führt alle notwendigen Schritte aus, um das Projekt einzurichten und den Bot mit dem Standardcharakter zu starten. + +```bash +sh scripts/start.sh +``` + +### Charakterdatei bearbeiten + +1. Öffne `agent/src/character.ts`, um den Standardcharakter zu bearbeiten. Kommentiere und bearbeite ihn. + +2. Um benutzerdefinierte Charaktere zu laden: + - Verwende `pnpm start --characters="path/to/your/character.json"` + - Mehrere Charakterdateien können gleichzeitig geladen werden. +3. Verbinde mit X (Twitter) + - Ändere `"clients": []` zu `"clients": ["twitter"]` in der Charakterdatei, um eine Verbindung mit X herzustellen. + +### Eliza manuell starten + +```bash +pnpm i +pnpm build +pnpm start + +# Das Projekt entwickelt sich schnell weiter. Manchmal musst du das Projekt bereinigen, wenn du es nach einiger Zeit erneut aufrufst. +pnpm clean +``` + +#### Zusätzliche Anforderungen + +Möglicherweise musst du Sharp installieren. Wenn beim Starten ein Fehler auftritt, versuche es mit folgendem Befehl: + +``` +pnpm install --include=optional sharp +``` + +### Community & Kontakt + +- [GitHub Issues](https://github.com/ai16z/eliza/issues). Am besten geeignet für: Bugs, die du bei der Nutzung von Eliza findest, und Feature-Vorschläge. +- [Discord](https://discord.gg/ai16z). Am besten geeignet für: das Teilen deiner Anwendungen und den Austausch mit der Community. + +## Contributors + + + + + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=ai16z/eliza&type=Date)](https://star-history.com/#ai16z/eliza&Date) diff --git a/agent/package.json b/agent/package.json index 6724b5a5d2..e27d4aa5ee 100644 --- a/agent/package.json +++ b/agent/package.json @@ -29,7 +29,7 @@ "@ai16z/plugin-0g": "workspace:*", "@ai16z/plugin-aptos": "workspace:*", "@ai16z/plugin-bootstrap": "workspace:*", - "@ai16z/plugin-buttplug": "workspace:*", + "@ai16z/plugin-intiface": "workspace:*", "@ai16z/plugin-coinbase": "workspace:*", "@ai16z/plugin-conflux": "workspace:*", "@ai16z/plugin-evm": "workspace:*", diff --git a/agent/src/index.ts b/agent/src/index.ts index 5756309554..8aab1b5d38 100644 --- a/agent/src/index.ts +++ b/agent/src/index.ts @@ -25,9 +25,9 @@ import { validateCharacterConfig, } from "@ai16z/eliza"; import { zgPlugin } from "@ai16z/plugin-0g"; -import { goatPlugin } from "@ai16z/plugin-goat"; +import createGoatPlugin from "@ai16z/plugin-goat"; import { bootstrapPlugin } from "@ai16z/plugin-bootstrap"; -// import { buttplugPlugin } from "@ai16z/plugin-buttplug"; +// import { intifacePlugin } from "@ai16z/plugin-intiface"; import { coinbaseCommercePlugin, coinbaseMassPaymentsPlugin, @@ -41,9 +41,9 @@ import { imageGenerationPlugin } from "@ai16z/plugin-image-generation"; import { evmPlugin } from "@ai16z/plugin-evm"; import { createNodePlugin } from "@ai16z/plugin-node"; import { solanaPlugin } from "@ai16z/plugin-solana"; +import { teePlugin, TEEMode } from "@ai16z/plugin-tee"; import { aptosPlugin, TransferAptosToken } from "@ai16z/plugin-aptos"; import { flowPlugin } from "@ai16z/plugin-flow"; -import { teePlugin } from "@ai16z/plugin-tee"; import Database from "better-sqlite3"; import fs from "fs"; import path from "path"; @@ -270,6 +270,11 @@ export function getTokenForProvider( character.settings?.secrets?.VOLENGINE_API_KEY || settings.VOLENGINE_API_KEY ); + case ModelProviderName.NANOGPT: + return ( + character.settings?.secrets?.NANOGPT_API_KEY || + settings.NANOGPT_API_KEY + ); case ModelProviderName.HYPERBOLIC: return ( character.settings?.secrets?.HYPERBOLIC_API_KEY || @@ -359,7 +364,7 @@ function getSecret(character: Character, secret: string) { let nodePlugin: any | undefined; -export function createAgent( +export async function createAgent( character: Character, db: IDatabaseAdapter, cache: ICacheManager, @@ -373,6 +378,24 @@ export function createAgent( nodePlugin ??= createNodePlugin(); + const teeMode = getSecret(character, "TEE_MODE") || "OFF"; + const walletSecretSalt = getSecret(character, "WALLET_SECRET_SALT"); + + // Validate TEE configuration + if (teeMode !== TEEMode.OFF && !walletSecretSalt) { + elizaLogger.error( + "WALLET_SECRET_SALT required when TEE_MODE is enabled" + ); + throw new Error("Invalid TEE configuration"); + } + + let goatPlugin: any | undefined; + if (getSecret(character, "ALCHEMY_API_KEY")) { + goatPlugin = await createGoatPlugin((secret) => + getSecret(character, secret) + ); + } + return new AgentRuntime({ databaseAdapter: db, token, @@ -406,14 +429,21 @@ export function createAgent( : null, ...(getSecret(character, "COINBASE_API_KEY") && getSecret(character, "COINBASE_PRIVATE_KEY") - ? [coinbaseMassPaymentsPlugin, tradePlugin, tokenContractPlugin, advancedTradePlugin] + ? [ + coinbaseMassPaymentsPlugin, + tradePlugin, + tokenContractPlugin, + advancedTradePlugin, + ] + : []), + ...(teeMode !== TEEMode.OFF && walletSecretSalt + ? [teePlugin, solanaPlugin] : []), getSecret(character, "COINBASE_API_KEY") && getSecret(character, "COINBASE_PRIVATE_KEY") && getSecret(character, "COINBASE_NOTIFICATION_URI") ? webhookPlugin : null, - getSecret(character, "WALLET_SECRET_SALT") ? teePlugin : null, getSecret(character, "ALCHEMY_API_KEY") ? goatPlugin : null, getSecret(character, "FLOW_ADDRESS") && getSecret(character, "FLOW_PRIVATE_KEY") @@ -429,14 +459,14 @@ export function createAgent( }); } -function intializeFsCache(baseDir: string, character: Character) { +function initializeFsCache(baseDir: string, character: Character) { const cacheDir = path.resolve(baseDir, character.id, "cache"); const cache = new CacheManager(new FsCacheAdapter(cacheDir)); return cache; } -function intializeDbCache(character: Character, db: IDatabaseCacheAdapter) { +function initializeDbCache(character: Character, db: IDatabaseCacheAdapter) { const cache = new CacheManager(new DbCacheAdapter(db, character.id)); return cache; } @@ -459,8 +489,8 @@ async function startAgent(character: Character, directClient) { await db.init(); - const cache = intializeDbCache(character, db); - const runtime = createAgent(character, db, cache, token); + const cache = initializeDbCache(character, db); + const runtime = await createAgent(character, db, cache, token); await runtime.initialize(); diff --git a/docs/api/enumerations/ModelProviderName.md b/docs/api/enumerations/ModelProviderName.md index 2b1e09cdee..8a117db0e1 100644 --- a/docs/api/enumerations/ModelProviderName.md +++ b/docs/api/enumerations/ModelProviderName.md @@ -14,7 +14,7 @@ Available model providers [packages/core/src/types.ts:215](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L215) -*** +--- ### ETERNALAI @@ -24,7 +24,7 @@ Available model providers [packages/core/src/types.ts:216](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L216) -*** +--- ### ANTHROPIC @@ -34,7 +34,7 @@ Available model providers [packages/core/src/types.ts:217](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L217) -*** +--- ### GROK @@ -44,7 +44,7 @@ Available model providers [packages/core/src/types.ts:218](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L218) -*** +--- ### GROQ @@ -54,7 +54,7 @@ Available model providers [packages/core/src/types.ts:219](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L219) -*** +--- ### LLAMACLOUD @@ -64,7 +64,7 @@ Available model providers [packages/core/src/types.ts:220](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L220) -*** +--- ### TOGETHER @@ -74,7 +74,7 @@ Available model providers [packages/core/src/types.ts:221](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L221) -*** +--- ### LLAMALOCAL @@ -84,7 +84,7 @@ Available model providers [packages/core/src/types.ts:222](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L222) -*** +--- ### GOOGLE @@ -94,17 +94,17 @@ Available model providers [packages/core/src/types.ts:223](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L223) -*** +--- -### CLAUDE\_VERTEX +### CLAUDE_VERTEX -> **CLAUDE\_VERTEX**: `"claude_vertex"` +> **CLAUDE_VERTEX**: `"claude_vertex"` #### Defined in [packages/core/src/types.ts:224](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L224) -*** +--- ### REDPILL @@ -114,7 +114,7 @@ Available model providers [packages/core/src/types.ts:225](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L225) -*** +--- ### OPENROUTER @@ -124,7 +124,7 @@ Available model providers [packages/core/src/types.ts:226](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L226) -*** +--- ### OLLAMA @@ -134,7 +134,7 @@ Available model providers [packages/core/src/types.ts:227](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L227) -*** +--- ### HEURIST @@ -144,17 +144,17 @@ Available model providers [packages/core/src/types.ts:228](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L228) -*** +--- ### GALADRIEL -> **GALADRIEL**: `"galadriel"` +**GALADRIEL**: `"galadriel"` #### Defined in [packages/core/src/types.ts:229](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L229) -*** +--- ### FAL @@ -164,7 +164,7 @@ Available model providers [packages/core/src/types.ts:230](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L230) -*** +--- ### GAIANET @@ -174,17 +174,17 @@ Available model providers [packages/core/src/types.ts:231](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L231) -*** +--- -### ALI\_BAILIAN +### ALI_BAILIAN -> **ALI\_BAILIAN**: `"ali_bailian"` +> **ALI_BAILIAN**: `"ali_bailian"` #### Defined in [packages/core/src/types.ts:232](https://github.com/ai16z/eliza/blob/main/packages/core/src/types.ts#L232) -*** +--- ### VOLENGINE diff --git a/docs/api/type-aliases/Models.md b/docs/api/type-aliases/Models.md index d9d65de634..198887ec94 100644 --- a/docs/api/type-aliases/Models.md +++ b/docs/api/type-aliases/Models.md @@ -36,6 +36,10 @@ Model configurations by provider > **together**: [`Model`](Model.md) +### together + +> **together**: [`Model`](Model.md) + ### llama\_local > **llama\_local**: [`Model`](Model.md) diff --git a/docs/docs/advanced/eliza-in-tee.md b/docs/docs/advanced/eliza-in-tee.md new file mode 100644 index 0000000000..3763005ae7 --- /dev/null +++ b/docs/docs/advanced/eliza-in-tee.md @@ -0,0 +1,314 @@ +--- +sidebar_position: 17 +--- + +# 🫖 Eliza in TEE + +![](/img/eliza_in_tee.jpg) + +## Overview + +The Eliza agent can be deployed in a TEE environment to ensure the security and privacy of the agent's data. This guide will walk you through the process of setting up and running an Eliza agent in a TEE environment by utilizing the TEE Plugin in the Eliza Framework. + +### Background + +The TEE Plugin in the Eliza Framework is built on top of the [Dstack SDK](https://github.com/Dstack-TEE/dstack), which is designed to simplify the steps for developers to deploy programs to CVM (Confidential VM), and to follow the security best practices by default. The main features include: + +- Convert any docker container to a CVM image to deploy on supported TEEs +- Remote Attestation API and a chain-of-trust visualization on Web UI +- Automatic RA-HTTPS wrapping with content addressing domain on 0xABCD.dstack.host +- Decouple the app execution and state persistent from specific hardware with decentralized Root-of-Trust + +--- + +## Core Components + +Eliza's TEE implementation consists of two primary providers that handle secure key managementoperations and remote attestations. + +These components work together to provide: + +1. Secure key derivation within the TEE +2. Verifiable proof of TEE execution +3. Support for both development (simulator) and production environments + +The providers are typically used together, as seen in the wallet key derivation process where each derived key includes an attestation quote to prove it was generated within the TEE environment. + +--- + +### Derive Key Provider + +The DeriveKeyProvider enables secure key derivation within TEE environments. It supports: + +- Multiple TEE modes: + - `LOCAL`: Connects to simulator at `localhost:8090` for local development on Mac/Windows + - `DOCKER`: Connects to simulator via `host.docker.internal:8090` for local development on Linux + - `PRODUCTION`: Connects to actual TEE environment when deployed to the [TEE Cloud](https://teehouse.vercel.app) + +Key features: + +- Support to deriveEd25519 (Solana) and ECDSA (EVM) keypairs +- Generates deterministic keys based on a secret salt and agent ID +- Includes remote attestation for each derived key +- Supports raw key derivation for custom use cases + +Example usage: + +```typescript +const provider = new DeriveKeyProvider(teeMode); +// For Solana +const { keypair, attestation } = await provider.deriveEd25519Keypair( + "/", + secretSalt, + agentId +); +// For EVM +const { keypair, attestation } = await provider.deriveEcdsaKeypair( + "/", + secretSalt, + agentId +); +``` + +--- + +### Remote Attestation Provider + +The RemoteAttestationProvider handles TEE environment verification and quote generation. It: + +- Connects to the same TEE modes as DeriveKeyProvider +- Generates TDX quotes with replay protection (RTMRs) +- Provides attestation data that can be verified by third parties + +Key features: + +- Generates attestation quotes with custom report data +- Includes timestamp for quote verification +- Supports both simulator and production environments + +Example usage: + +```typescript +const provider = new RemoteAttestationProvider(teeMode); +const quote = await provider.generateAttestation(reportData); +``` + +## Tutorial + +--- + +### Prerequisites + +Before getting started with Eliza, ensure you have: + +- [Docker Desktop](https://www.docker.com/products/docker-desktop/) or [Orbstack](https://orbstack.dev/) (Orbstack is recommended) +- For Mac/Windows: Check the prerequisites from [Quickstart Guide](./quickstart.md) +- For Linux: You just need Docker + +--- + +### Environment Setup + +To set up your environment for TEE development: + +1. **Configure TEE Mode** + + Set the `TEE_MODE` environment variable to one of: + + ```env + # For Mac/Windows local development + TEE_MODE=LOCAL + + # For Linux/Docker local development + TEE_MODE=DOCKER + + # For production deployment + TEE_MODE=PRODUCTION + ``` + +2. **Set Required Environment Variables** + + ```env + # Required for key derivation + WALLET_SECRET_SALT=your_secret_salt + ``` + +3. **Start the TEE Simulator** + + ```bash + docker pull phalanetwork/tappd-simulator:latest + # by default the simulator is available in localhost:8090 + docker run --rm -p 8090:8090 phalanetwork/tappd-simulator:latest + ``` + +### Run an Eliza Agent Locally with TEE Simulator + +1. **Configure Eliza Agent** + + Go through the [configuration guide](./configuration.md) to set up your Eliza agent. +2. **Start the TEE Simulator** + Follow the simulator setup instructions above based on your TEE mode. + +3. **For Mac/Windows** + + Make sure to set the `TEE_MODE` environment variable to `LOCAL`. Then you can install the dependencies and run the agent locally: + + ```bash + pnpm i + pnpm build + pnpm start --character=./characters/yourcharacter.character.json + ``` + +4. **Verify TEE Attestation** + + You can verify the TEE attestation quote by going to the [TEE RA Explorer](https://ra-quote-explorer.vercel.app/) and pasting the attestation quote from the agent logs. Here's an example of interacting with the Eliza agent to ask for the agent's wallet address: + + ```bash + You: what's your wallet address? + ``` + + Log output from the agent: + + ```bash + Generating attestation for: {"agentId":"025e0996-69d7-0dce-8189-390e354fd1c1","publicKey":"9yZBmCRRFEBtA3KYokxC24igv1ijFp6tyvzKxRs3khTE"} + rtmr0: a4a17452e7868f62f77ea2039bd2840e7611a928c26e87541481256f57bfbe3647f596abf6e8f6b5a0e7108acccc6e89 + rtmr1: db6bcc74a3ac251a6398eca56b2fcdc8c00a9a0b36bc6299e06fb4bb766cb9ecc96de7e367c56032c7feff586f9e557e + rtmr2: 2cbe156e110b0cc4b2418600dfa9fb33fc60b3f04b794ec1b8d154b48f07ba8c001cd31f75ca0d0fb516016552500d07 + rtmr3: eb7110de9956d7b4b1a3397f843b39d92df4caac263f5083e34e3161e4d6686c46c3239e7fbf61241a159d8da6dc6bd1f + Remote attestation quote: { + quote: '0x0400030081000000736940f888442c8ca8cb432d7a87145f9b7aeab1c5d129ce901716a7506375426ea8741ca69be68e92c5df29f539f103eb60ab6780c56953b0d81af523a031617b32d5e8436cceb019177103f4aceedbf114a846baf8e8e2b8e6d3956e96d6b89d94a0f1a366e6c309d77c77c095a13d2d5e2f8e2d7f51ece4ae5ffc5fe8683a37387bfdb9acb8528f37342360abb64ec05ff438f7e4fad73c69a627de245a31168f69823883ed8ba590c454914690946b7b07918ded5b89dc663c70941f8704978b91a24b54d88038c30d20d14d85016a524f7176c7a7cff7233a2a4405da9c31c8569ac3adfe5147bdb92faee0f075b36e8ce794aaf596facd881588167fbcf5a7d059474c1e4abff645bba8a813f3083c5a425fcc88cd706b19494dedc04be2bc3ab1d71b2a062ddf62d0393d8cb421393cccc932a19d43e315a18a10d216aea4a1752cf3f3b0b2fb36bea655822e2b27c6156970d18e345930a4a589e1850fe84277e0913ad863dffb1950fbeb03a4a17452e7868f62f77ea2039bd2840e7611a928c26e87541481256f57bfbe3647f596abf6e8f6b5a0e7108acccc6e89db6bcc74a3ac251a6398eca56b2fcdc8c00a9a0b36bc6299e06fb4bb766cb9ecc96de7e367c56032c7feff586f9e557e2cbe156e110b0cc4b2418600dfa9fb33fc60b3f04b794ec1b8d154b48f07ba8c001cd31f75ca0d0fb516016552500d07eb7110de9956d7b4b1a3397f843b39d92df4caac263f5083e34e3161e4d6686c46c3239e7fbf61241a159d8da6dc6bd13df734883d4d0d78d670a1d17e28ef09dffbbfbd15063b73113cb5bed692d68cc30c38cb9389403fe6a1c32c35dbac75464b77597e27b854839db51dfde0885462020000530678b9eb99d1b9e08a6231ef00055560f7d3345f54ce355da68725bb38cab0caf84757ddb93db87577758bb06de7923c4ee3583453f284c8b377a1ec2ef613491e051c801a63da5cb42b9c12e26679fcf489f3b14bd5e8f551227b09d976975e0fbd68dcdf129110a5ca8ed8d163dafb60e1ec4831d5285a7fbae81d0e39580000dc010000ebb282d5c6aca9053a21814e9d65a1516ebeaacf6fc88503e794d75cfc5682e86aa04e9d6e58346e013c5c1203afc5c72861e2a7052afcdcb3ddcccd102dd0daeb595968edb6a6c513db8e2155fc302eeca7a34c9ba81289d6941c4c813db9bf7bd0981d188ab131e5ae9c4bb831e4243b20edb7829a6a7a9cf0eae1214b450109d990e2c824c2a60a47faf90c24992583bc5c3da3b58bd8830a4f0ad5c650aa08ae0e067d4251d251e56d70972ad901038082ee9340f103fd687ec7d91a9b8b8652b1a2b7befb4cbfdb6863f00142e0b2e67198ddc8ddbe96dc02762d935594394f173114215cb5abcf55b9815eb545683528c990bfae34c34358dbb19dfc1426f56cba12af325d7a2941c0d45d0ea4334155b790554d3829e3be618eb1bfc6f3a06f488bbeb910b33533c6741bff6c8a0ca43eb2417eec5ecc2f50f65c3b40d26174376202915337c7992cdd44471dee7a7b2038605415a7af593fd9066661e594b26f4298baf6d001906aa8fc1c460966fbc17b2c35e0973f613399936173802cf0453a4e7d8487b6113a77947eef190ea8d47ba531ce51abf5166448c24a54de09d671fd57cbd68154f5995aee6c2ccfd6738387cf3ad9f0ad5e8c7d46fb0a0000000000000000000000bd920a00000000000000000000000000', + timestamp: 1733606453433 + } + ``` + + Take the `quote` field and paste it into the [TEE RA Explorer](https://ra-quote-explorer.vercel.app/) to verify the attestation. **Note**: The verification will be unverified since the quote is generated from the TEE simulator. + + ![](https://i.imgur.com/xYGMeP4.png) + + ![](https://i.imgur.com/BugdNUy.png) + +### Build, Test, and Publish an Eliza Agent Docker Image + +Now that we have run the Eliza agent in the TEE simulator, we can build and publish an Eliza agent Docker image to prepare for deployment to a real TEE environment. + +First, you need to create a Docker account and publish your image to a container registry. Here we will use [Docker Hub](https://hub.docker.com/) as an example. + +Login to Docker Hub: + +```bash +docker login +``` + +Build the Docker image: + +```bash +# For Linux/AMD64 machines run +docker build -t username/eliza-agent:latest . + +# For architecture other than AMD64, run +docker buildx build --platform=linux/amd64 -t username/eliza-agent:latest . +``` + +For Linux/AMD64 machines, you can now test the agent locally by updating the `TEE_MODE` environment variable to `DOCKER` and setting the environment variables in the [docker-compose.yaml](https://github.com/ai16z/eliza/blob/main/docker-compose.yaml) file. Once you have done that, you can start the agent by running: + +> **Note**: Make sure the TEE simulator is running before starting the agent through docker compose. + +```bash +docker compose up +``` + +Publish the Docker image to a container registry: + +```bash +docker push username/eliza-agent:latest +``` + +Now we are ready to deploy the Eliza agent to a real TEE environment. + +### Run an Eliza Agent in a Real TEE Environment + +Before deploying the Eliza agent to a real TEE environment, you need to create a new TEE account on the [TEE Cloud](https://teehouse.vercel.app). Reach out to Phala Network on [Discord](https://discord.gg/phalanetwork) if you need help. + +Next, you will need to take the docker-compose.yaml file in the root folder of the project and edit it based on your agent configuration. + +> **Note**: The API Keys and other secret environment variables should be set in your secret environment variables configuration in the TEE Cloud dashboard. + +```yaml +# docker-compose.yaml +services: + tee: + command: ["pnpm", "start", "--character=./characters/yourcharacter.character.json"] + image: username/eliza-agent:latest + stdin_open: true + tty: true + volumes: + - /var/run/tappd.sock:/var/run/tappd.sock + - tee:/app/packages/client-twitter/src/tweetcache + - tee:/app/db.sqlite + environment: + - REDPILL_API_KEY=$REDPILL_API_KEY + - SMALL_REDPILL_MODEL=anthropic/claude-3-5-sonnet + - MEDIUM_REDPILL_MODEL=anthropic/claude-3-5-sonnet + - LARGE_REDPILL_MODEL=anthropic/claude-3-opus + - ELEVENLABS_XI_API_KEY=$ELEVENLABS_XI_API_KEY + - ELEVENLABS_MODEL_ID=eleven_multilingual_v2 + - ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM + - ELEVENLABS_VOICE_STABILITY=0.5 + - ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 + - ELEVENLABS_VOICE_STYLE=0.66 + - ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false + - ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 + - ELEVENLABS_OUTPUT_FORMAT=pcm_16000 + - TWITTER_DRY_RUN=false + - TWITTER_USERNAME=$TWITTER_USERNAME + - TWITTER_PASSWORD=$TWITTER_PASSWORD + - TWITTER_EMAIL=$TWITTER_EMAIL + - X_SERVER_URL=$X_SERVER_URL + - BIRDEYE_API_KEY=$BIRDEYE_API_KEY + - SOL_ADDRESS=So11111111111111111111111111111111111111112 + - SLIPPAGE=1 + - RPC_URL=https://api.mainnet-beta.solana.com + - HELIUS_API_KEY=$HELIUS_API_KEY + - SERVER_PORT=3000 + - WALLET_SECRET_SALT=$WALLET_SECRET_SALT + - TEE_MODE=PRODUCTION + ports: + - "3000:80" + restart: always + +volumes: + tee: +``` + +Now you can deploy the Eliza agent to a real TEE environment. Go to the [TEE Cloud](https://teehouse.vercel.app) and click on the `Create VM` button to configure your Eliza agent deployment. + +Click on the `Compose Manifest Mode` tab and paste the docker-compose.yaml file content into the `Compose Manifest` field. + +![Compose Manifest](https://i.imgur.com/wl6pddX.png) + +Next, go to the `Resources` tab and configure your VM resources. + +> **Note**: The `CPU` and `Memory` resources should be greater than the minimum requirements for your agent configuration (Recommended: 2 CPU, 4GB Memory, 50GB Disk). + +![Resources](https://i.imgur.com/HsmupO1.png) + +Finally, click on the `Submit` button to deploy your Eliza agent. + +This will take a few minutes to complete. Once the deployment is complete, you can click on the `View` button to view your Eliza agent. + +Here is an example of a deployed agent named `vitailik2077`: + +![Deployed Agent](https://i.imgur.com/ie8gpg9.png) + +I can go to the dashboard and view the remote attestation info: + +![Agent Dashboard](https://i.imgur.com/vUqHGjF.png) + +Click on the `Logs` tab to view the agent logs. + +![Agent Logs](https://i.imgur.com/aU3i0Dv.png) + +Now we can verify the REAL TEE attestation quote by going to the [TEE RA Explorer](https://ra-quote-explorer.vercel.app/) and pasting the attestation quote from the agent logs. + +![TEE RA Explorer](https://i.imgur.com/TJ5299l.png) + +Congratulations! You have successfully run an Eliza agent in a real TEE environment. diff --git a/docs/docs/core/characterfile.md b/docs/docs/core/characterfile.md index a57e5318d1..e25fe58348 100644 --- a/docs/docs/core/characterfile.md +++ b/docs/docs/core/characterfile.md @@ -272,7 +272,7 @@ The `settings` object defines additional configurations like secrets and voice m Use the provided tools to convert documents into knowledge: - [folder2knowledge](https://github.com/ai16z/characterfile/blob/main/scripts/folder2knowledge.js) -- [knowledge2folder](https://github.com/ai16z/characterfile/blob/main/scripts/knowledge2character.js) +- [knowledge2character](https://github.com/ai16z/characterfile/blob/main/scripts/knowledge2character.js) - [tweets2character](https://github.com/ai16z/characterfile/blob/main/scripts/tweets2character.js) Example: diff --git a/docs/docs/guides/advanced.md b/docs/docs/guides/advanced.md index 5b9ec91a64..a75cbb0a59 100644 --- a/docs/docs/guides/advanced.md +++ b/docs/docs/guides/advanced.md @@ -399,3 +399,4 @@ debug("Detailed operation info: %O", { - [Trust Engine Documentation](../advanced/trust-engine.md) for scoring system - [Autonomous Trading Guide](../advanced/autonomous-trading.md) for trading features - [Fine-tuning Guide](../advanced/fine-tuning.md) for model optimization +- [Eliza in TEE](../advanced/eliza-in-tee.md) for TEE integration diff --git a/docs/docs/guides/local-development.md b/docs/docs/guides/local-development.md index ca871c4b0e..26f66dec59 100644 --- a/docs/docs/guides/local-development.md +++ b/docs/docs/guides/local-development.md @@ -94,6 +94,22 @@ pnpm run test:watch # Run tests in watch mode pnpm run lint # Lint code ``` +### Direct Client Chat UI + +``` +# Open a terminal and Start with specific character +pnpm run dev --characters="characters/my-character.json" +``` +``` +# Open a 2nd terminal and start the client +pnpm start:client +``` + +Look for the message: +` ➜ Local: http://localhost:5173/` +Click on that link or open a browser window to that location. Once you do that you should see the chat interface connect with the system and you can start interacting with your character. + + ## Database Development ### SQLite (Recommended for Development) diff --git a/docs/docs/guides/wsl.md b/docs/docs/guides/wsl.md new file mode 100644 index 0000000000..3945e3a030 --- /dev/null +++ b/docs/docs/guides/wsl.md @@ -0,0 +1,84 @@ +--- +sidebar_position: 5 +title: WSL Setup Guide +description: Guide for setting up Eliza on Windows using WSL (Windows Subsystem for Linux) +--- + +# WSL Setup Guide +Steps to run Eliza on Windows computer using WSL. +[AI Dev School Tutorial](https://www.youtube.com/watch?v=ArptLpQiKfI) + + +## Install WSL + +1. Open PowerShell as Administrator and run: +```powershell +wsl --install +``` + +2. Restart your computer +3. Launch Ubuntu from the Start menu and create your Linux username/password + +## Install Dependencies + +1. Update Ubuntu packages: +```bash +sudo apt update && sudo apt upgrade -y +``` + +2. Install system dependencies: +```bash +sudo apt install -y \ + build-essential \ + python3 \ + python3-pip \ + git \ + curl \ + ffmpeg \ + libtool-bin \ + autoconf \ + automake \ + libopus-dev +``` + +3. Install Node.js via nvm: +```bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash +source ~/.bashrc +nvm install 23 +nvm use 23 +``` + +4. Install pnpm: +```bash +curl -fsSL https://get.pnpm.io/install.sh | sh - +source ~/.bashrc +``` + +## Optional: CUDA Support + +If you have an NVIDIA GPU and want CUDA support: + +1. Install CUDA Toolkit on Windows from [NVIDIA's website](https://developer.nvidia.com/cuda-downloads) +2. WSL will automatically detect and use the Windows CUDA installation + +## Clone and Setup Eliza + +Follow the [Quickstart Guide](../quickstart.md) starting from the "Installation" section. + +## Troubleshooting + +- If you encounter `node-gyp` errors, ensure build tools are installed: +```bash +sudo apt install -y nodejs-dev node-gyp +``` + +- For audio-related issues, verify ffmpeg installation: +```bash +ffmpeg -version +``` + +- For permission issues, ensure your user owns the project directory: +```bash +sudo chown -R $USER:$USER ~/path/to/eliza +``` \ No newline at end of file diff --git a/docs/docs/quickstart.md b/docs/docs/quickstart.md index 8e1a676ed3..206e148602 100644 --- a/docs/docs/quickstart.md +++ b/docs/docs/quickstart.md @@ -7,8 +7,6 @@ sidebar_position: 2 ## Prerequisites Before getting started with Eliza, ensure you have: - -- [Python 2.7+](https://www.python.org/downloads/) - [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - [pnpm 9+](https://pnpm.io/installation) - Git for version control @@ -125,6 +123,22 @@ You set which model to use inside the character JSON file pnpm start --characters="characters/trump.character.json,characters/tate.character.json" ``` +3. **Interact with the Agent** + + Now you're ready to start a conversation with your agent! + Open a new terminal window + + ```bash + pnpm start:client + ``` + + Once the client is running, you'll see a message like this: +``` +➜ Local: http://localhost:5173/ +``` + + Simply click the link or open your browser to `http://localhost:5173/`. You'll see the chat interface connect to the system, and you can begin interacting with your character. + ## Platform Integration ### Discord Bot Setup diff --git a/docs/sidebars.js b/docs/sidebars.js index 680b8fef40..841fa896a5 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -80,6 +80,11 @@ const sidebars = { id: "guides/local-development", label: "Local Development", }, + { + type: "doc", + id: "guides/wsl", + label: "WSL Setup", + }, ], }, { @@ -107,6 +112,11 @@ const sidebars = { id: "advanced/autonomous-trading", label: "Autonomous Trading", }, + { + type: "doc", + id: "advanced/eliza-in-tee", + label: "Eliza in TEE", + }, ], }, { diff --git a/docs/sidebars.js.bak b/docs/sidebars.js.bak index 13b55a0f76..d1b16db730 100644 --- a/docs/sidebars.js.bak +++ b/docs/sidebars.js.bak @@ -102,6 +102,11 @@ const sidebars = { id: "advanced/autonomous-trading", label: "Autonomous Trading", }, + { + type: "doc", + id: "advanced/eliza-in-tee", + label: "Eliza in TEE", + }, ], }, { diff --git a/docs/static/img/eliza_in_tee.jpg b/docs/static/img/eliza_in_tee.jpg new file mode 100644 index 0000000000..507afc6f6a Binary files /dev/null and b/docs/static/img/eliza_in_tee.jpg differ diff --git a/package.json b/package.json index 7e9b1a9194..8c8886662a 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,9 @@ "scripts": { "preinstall": "npx only-allow pnpm", "build": "turbo run build --filter=!eliza-docs", + "build-docker": "turbo run build", "start": "pnpm --filter \"@ai16z/agent\" start --isRoot", - "start:client": "pnpm --dir client start --isRoot", + "start:client": "pnpm --dir client dev", "start:debug": "cross-env NODE_ENV=development VERBOSE=true DEBUG=eliza:* pnpm --filter \"@ai16z/agent\" start --isRoot", "dev": "bash ./scripts/dev.sh", "lint": "bash ./scripts/lint.sh", diff --git a/packages/client-farcaster/pnpm-lock.yaml b/packages/client-farcaster/pnpm-lock.yaml deleted file mode 100644 index 3ed01a948f..0000000000 --- a/packages/client-farcaster/pnpm-lock.yaml +++ /dev/null @@ -1,1478 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@farcaster/hub-nodejs': - specifier: ^0.12.7 - version: 0.12.7(zod@3.23.8) - viem: - specifier: ^2.21.47 - version: 2.21.49(zod@3.23.8) - devDependencies: - tsup: - specifier: ^8.3.5 - version: 8.3.5(postcss@8.4.49)(yaml@2.6.1) - -packages: - - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@faker-js/faker@7.6.0': - resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} - engines: {node: '>=14.0.0', npm: '>=6.0.0'} - - '@farcaster/core@0.15.6': - resolution: {integrity: sha512-Vxq2JhqdZYEMjH4PIwPXQkalY46S4Mol2oCSHUafXenDx6WSoQJqF/4an4KyxGQbmA7Cf8+hl6zuNzkkHXEUyQ==} - - '@farcaster/hub-nodejs@0.12.7': - resolution: {integrity: sha512-05zXNqnHRBSbOkHl0KDh6l60nHK5MiKFky0JBGbdOZXdkFCk4FIiHv9AGLxjFXr/FxA3jSTHUJfvRRe5TonjRw==} - - '@grpc/grpc-js@1.11.3': - resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} - engines: {node: '>=12.10.0'} - - '@grpc/proto-loader@0.7.13': - resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} - engines: {node: '>=6'} - hasBin: true - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@js-sdsl/ordered-map@4.4.2': - resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - - '@noble/curves@1.6.0': - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.7.0': - resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.5.0': - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.6.0': - resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} - 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.27.4': - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.27.4': - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.27.4': - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.27.4': - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.27.4': - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.27.4': - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.27.4': - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.27.4': - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.27.4': - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.27.4': - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.27.4': - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.27.4': - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.27.4': - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.27.4': - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.27.4': - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.27.4': - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} - cpu: [x64] - os: [win32] - - '@scure/base@1.1.9': - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - - '@scure/bip32@1.5.0': - resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} - - '@scure/bip39@1.4.0': - resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/node@22.9.3': - resolution: {integrity: sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==} - - abitype@1.0.6: - resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@4.0.0: - resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - - bundle-require@5.0.0: - resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} - engines: {node: '>= 14.16.0'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - 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==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isows@1.0.6: - resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} - peerDependencies: - ws: '*' - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - 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.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - neverthrow@6.2.2: - resolution: {integrity: sha512-POR1FACqdK9jH0S2kRPzaZEvzT11wsOxLW520PQV/+vKi9dQe+hXq19EiOvYx7lSRaF5VB9lYGsPInynrnN05w==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - ox@0.1.2: - resolution: {integrity: sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - 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'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} - engines: {node: ^10 || ^12 || >=14} - - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} - engines: {node: '>=12.0.0'} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - - 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.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - 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==} - - tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} - - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} - - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tsup@8.3.5: - resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - viem@2.21.49: - resolution: {integrity: sha512-NNItYfTv4+yGE5DDKc+S/g2S7KeJn047GwgEYG60FAJlK0FzwuP6lQKSeQ8k7Y4VasfuKPqiT+XiilcCtTRiDQ==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - webauthn-p256@0.0.10: - resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - 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@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} - engines: {node: '>= 14'} - hasBin: true - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - -snapshots: - - '@adraffy/ens-normalize@1.11.0': {} - - '@esbuild/aix-ppc64@0.24.0': - optional: true - - '@esbuild/android-arm64@0.24.0': - optional: true - - '@esbuild/android-arm@0.24.0': - optional: true - - '@esbuild/android-x64@0.24.0': - optional: true - - '@esbuild/darwin-arm64@0.24.0': - optional: true - - '@esbuild/darwin-x64@0.24.0': - optional: true - - '@esbuild/freebsd-arm64@0.24.0': - optional: true - - '@esbuild/freebsd-x64@0.24.0': - optional: true - - '@esbuild/linux-arm64@0.24.0': - optional: true - - '@esbuild/linux-arm@0.24.0': - optional: true - - '@esbuild/linux-ia32@0.24.0': - optional: true - - '@esbuild/linux-loong64@0.24.0': - optional: true - - '@esbuild/linux-mips64el@0.24.0': - optional: true - - '@esbuild/linux-ppc64@0.24.0': - optional: true - - '@esbuild/linux-riscv64@0.24.0': - optional: true - - '@esbuild/linux-s390x@0.24.0': - optional: true - - '@esbuild/linux-x64@0.24.0': - optional: true - - '@esbuild/netbsd-x64@0.24.0': - optional: true - - '@esbuild/openbsd-arm64@0.24.0': - optional: true - - '@esbuild/openbsd-x64@0.24.0': - optional: true - - '@esbuild/sunos-x64@0.24.0': - optional: true - - '@esbuild/win32-arm64@0.24.0': - optional: true - - '@esbuild/win32-ia32@0.24.0': - optional: true - - '@esbuild/win32-x64@0.24.0': - optional: true - - '@faker-js/faker@7.6.0': {} - - '@farcaster/core@0.15.6(zod@3.23.8)': - dependencies: - '@faker-js/faker': 7.6.0 - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.0 - bs58: 5.0.0 - neverthrow: 6.2.2 - viem: 2.21.49(zod@3.23.8) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@farcaster/hub-nodejs@0.12.7(zod@3.23.8)': - dependencies: - '@farcaster/core': 0.15.6(zod@3.23.8) - '@grpc/grpc-js': 1.11.3 - '@noble/hashes': 1.6.0 - neverthrow: 6.2.2 - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod - - '@grpc/grpc-js@1.11.3': - dependencies: - '@grpc/proto-loader': 0.7.13 - '@js-sdsl/ordered-map': 4.4.2 - - '@grpc/proto-loader@0.7.13': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.4.0 - yargs: 17.7.2 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@js-sdsl/ordered-map@4.4.2': {} - - '@noble/curves@1.6.0': - dependencies: - '@noble/hashes': 1.5.0 - - '@noble/curves@1.7.0': - dependencies: - '@noble/hashes': 1.6.0 - - '@noble/hashes@1.5.0': {} - - '@noble/hashes@1.6.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.27.4': - optional: true - - '@rollup/rollup-android-arm64@4.27.4': - optional: true - - '@rollup/rollup-darwin-arm64@4.27.4': - optional: true - - '@rollup/rollup-darwin-x64@4.27.4': - optional: true - - '@rollup/rollup-freebsd-arm64@4.27.4': - optional: true - - '@rollup/rollup-freebsd-x64@4.27.4': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.27.4': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.27.4': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.27.4': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.27.4': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.27.4': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.27.4': - optional: true - - '@rollup/rollup-linux-x64-musl@4.27.4': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.27.4': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.27.4': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.27.4': - optional: true - - '@scure/base@1.1.9': {} - - '@scure/bip32@1.5.0': - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 - - '@scure/bip39@1.4.0': - dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 - - '@types/estree@1.0.6': {} - - '@types/node@22.9.3': - dependencies: - undici-types: 6.19.8 - - abitype@1.0.6(zod@3.23.8): - optionalDependencies: - zod: 3.23.8 - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - balanced-match@1.0.2: {} - - base-x@4.0.0: {} - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - bs58@5.0.0: - dependencies: - base-x: 4.0.0 - - bundle-require@5.0.0(esbuild@0.24.0): - dependencies: - esbuild: 0.24.0 - load-tsconfig: 0.2.5 - - cac@6.7.14: {} - - chokidar@4.0.1: - dependencies: - readdirp: 4.0.2 - - cliui@8.0.1: - 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: {} - - commander@4.1.1: {} - - consola@3.2.3: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - - escalade@3.2.0: {} - - eventemitter3@5.0.1: {} - - fdir@6.4.2(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - is-fullwidth-code-point@3.0.0: {} - - isexe@2.0.0: {} - - isows@1.0.6(ws@8.18.0): - dependencies: - ws: 8.18.0 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - joycon@3.1.1: {} - - lilconfig@3.1.2: {} - - lines-and-columns@1.2.4: {} - - load-tsconfig@0.2.5: {} - - lodash.camelcase@4.3.0: {} - - lodash.sortby@4.7.0: {} - - long@5.2.3: {} - - lru-cache@10.4.3: {} - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minipass@7.1.2: {} - - 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.7: - optional: true - - neverthrow@6.2.2: {} - - object-assign@4.1.1: {} - - ox@0.1.2(zod@3.23.8): - dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/bip32': 1.5.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.6(zod@3.23.8) - eventemitter3: 5.0.1 - transitivePeerDependencies: - - zod - - package-json-from-dist@1.0.1: {} - - path-key@3.1.1: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - picocolors@1.1.1: {} - - picomatch@4.0.2: {} - - pirates@4.0.6: {} - - postcss-load-config@6.0.1(postcss@8.4.49)(yaml@2.6.1): - dependencies: - lilconfig: 3.1.2 - optionalDependencies: - postcss: 8.4.49 - yaml: 2.6.1 - - postcss@8.4.49: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.1 - optional: true - - protobufjs@7.4.0: - 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': 22.9.3 - long: 5.2.3 - - punycode@2.3.1: {} - - readdirp@4.0.2: {} - - require-directory@2.1.1: {} - - resolve-from@5.0.0: {} - - rollup@4.27.4: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.27.4 - '@rollup/rollup-android-arm64': 4.27.4 - '@rollup/rollup-darwin-arm64': 4.27.4 - '@rollup/rollup-darwin-x64': 4.27.4 - '@rollup/rollup-freebsd-arm64': 4.27.4 - '@rollup/rollup-freebsd-x64': 4.27.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 - '@rollup/rollup-linux-arm-musleabihf': 4.27.4 - '@rollup/rollup-linux-arm64-gnu': 4.27.4 - '@rollup/rollup-linux-arm64-musl': 4.27.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 - '@rollup/rollup-linux-riscv64-gnu': 4.27.4 - '@rollup/rollup-linux-s390x-gnu': 4.27.4 - '@rollup/rollup-linux-x64-gnu': 4.27.4 - '@rollup/rollup-linux-x64-musl': 4.27.4 - '@rollup/rollup-win32-arm64-msvc': 4.27.4 - '@rollup/rollup-win32-ia32-msvc': 4.27.4 - '@rollup/rollup-win32-x64-msvc': 4.27.4 - fsevents: 2.3.3 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - signal-exit@4.1.0: {} - - source-map-js@1.2.1: - optional: true - - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - 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.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - tinyexec@0.3.1: {} - - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.2(picomatch@4.0.2) - picomatch: 4.0.2 - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tree-kill@1.2.2: {} - - ts-interface-checker@0.1.13: {} - - tsup@8.3.5(postcss@8.4.49)(yaml@2.6.1): - dependencies: - bundle-require: 5.0.0(esbuild@0.24.0) - cac: 6.7.14 - chokidar: 4.0.1 - consola: 3.2.3 - debug: 4.3.7 - esbuild: 0.24.0 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.4.49)(yaml@2.6.1) - resolve-from: 5.0.0 - rollup: 4.27.4 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyexec: 0.3.1 - tinyglobby: 0.2.10 - tree-kill: 1.2.2 - optionalDependencies: - postcss: 8.4.49 - transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml - - undici-types@6.19.8: {} - - viem@2.21.49(zod@3.23.8): - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/bip32': 1.5.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.6(zod@3.23.8) - isows: 1.0.6(ws@8.18.0) - ox: 0.1.2(zod@3.23.8) - webauthn-p256: 0.0.10 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - webauthn-p256@0.0.10: - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - - webidl-conversions@4.0.2: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - 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.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - ws@8.18.0: {} - - y18n@5.0.8: {} - - yaml@2.6.1: - optional: true - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - 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: 21.1.1 - - zod@3.23.8: - optional: true diff --git a/packages/client-farcaster/src/interactions.ts b/packages/client-farcaster/src/interactions.ts index 56bcce6d34..6e71e1f45e 100644 --- a/packages/client-farcaster/src/interactions.ts +++ b/packages/client-farcaster/src/interactions.ts @@ -6,6 +6,8 @@ import { ModelClass, stringToUuid, elizaLogger, + HandlerCallback, + Content, type IAgentRuntime, } from "@ai16z/eliza"; import type { FarcasterClient } from "./client"; @@ -219,56 +221,65 @@ export class FarcasterInteractionManager { messageHandlerTemplate, }); - const response = await generateMessageResponse({ + const responseContent = await generateMessageResponse({ runtime: this.runtime, context, modelClass: ModelClass.LARGE, }); - response.inReplyTo = memoryId; + responseContent.inReplyTo = memoryId; - if (!response.text) return; + if (!responseContent.text) return; if (this.runtime.getSetting("FARCASTER_DRY_RUN") === "true") { elizaLogger.info( - `Dry run: would have responded to cast ${cast.hash} with ${response.text}` + `Dry run: would have responded to cast ${cast.hash} with ${responseContent.text}` ); return; } - try { - elizaLogger.info(`Replying to cast ${cast.hash}.`); - - const results = await sendCast({ - runtime: this.runtime, - client: this.client, - signerUuid: this.signerUuid, - profile: cast.profile, - content: response, - roomId: memory.roomId, - inReplyTo: { - fid: cast.authorFid, - hash: cast.hash, - }, - }); - // sendCast lost response action, so we need to add it back here - results[0].memory.content.action = response.action; - - const newState = await this.runtime.updateRecentMessageState(state); - - for (const { memory } of results) { - await this.runtime.messageManager.createMemory(memory); + const callback: HandlerCallback = async ( + content: Content, + files: any[] + ) => { + try { + if (memoryId && !content.inReplyTo) { + content.inReplyTo = memoryId; + } + const results = await sendCast({ + runtime: this.runtime, + client: this.client, + signerUuid: this.signerUuid, + profile: cast.profile, + content: content, + roomId: memory.roomId, + inReplyTo: { + fid: cast.authorFid, + hash: cast.hash, + }, + }); + // sendCast lost response action, so we need to add it back here + results[0].memory.content.action = content.action; + + for (const { memory } of results) { + await this.runtime.messageManager.createMemory(memory); + } + return results.map((result) => result.memory); + } catch (error) { + console.error("Error sending response cast:", error); + return []; } + }; - await this.runtime.evaluate(memory, newState); + const responseMessages = await callback(responseContent); - await this.runtime.processActions( - memory, - results.map((result) => result.memory), - newState - ); - } catch (error) { - elizaLogger.error(`Error sending response cast: ${error}`); - } + const newState = await this.runtime.updateRecentMessageState(state); + + await this.runtime.processActions( + memory, + responseMessages, + newState, + callback + ); } } diff --git a/packages/client-linkedin/README.md b/packages/client-linkedin/README.md new file mode 100644 index 0000000000..ec43d8c5cc --- /dev/null +++ b/packages/client-linkedin/README.md @@ -0,0 +1,55 @@ +# @ai16z/client-linkedin + +LinkedIn client integration for AI16Z agents. This package provides functionality for AI agents to interact with LinkedIn, including: + +- Automated post creation and scheduling +- Professional interaction management +- Message and comment handling +- Connection management +- Activity tracking + +## Installation + +```bash +pnpm add @ai16z/client-linkedin +``` + +## Configuration + +Set the following environment variables: + +```env +LINKEDIN_USERNAME=your.email@example.com +LINKEDIN_PASSWORD=your_password +LINKEDIN_DRY_RUN=false +POST_INTERVAL_MIN=24 +POST_INTERVAL_MAX=72 +``` + +## Usage + +```typescript +import { LinkedInClientInterface } from '@ai16z/client-linkedin'; + +// Initialize the client +const manager = await LinkedInClientInterface.start(runtime); + +// The client will automatically: +// - Generate and schedule posts +// - Respond to messages and comments +// - Manage connections +// - Track activities +``` + +## Features + +- Professional content generation +- Rate-limited API interactions +- Conversation history tracking +- Connection management +- Activity monitoring +- Cache management + +## License + +MIT diff --git a/packages/client-linkedin/package.json b/packages/client-linkedin/package.json new file mode 100644 index 0000000000..eb120b215e --- /dev/null +++ b/packages/client-linkedin/package.json @@ -0,0 +1,27 @@ +{ + "name": "@ai16z/client-linkedin", + "version": "0.1.0-alpha.1", + "description": "LinkedIn client integration for AI16Z agents", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "test": "jest" + }, + "dependencies": { + "@ai16z/eliza": "workspace:*", + "linkedin-api": "0.0.1", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "eslint": "^8.0.0", + "jest": "^29.0.0", + "typescript": "^5.0.0" + }, + "peerDependencies": { + "@ai16z/eliza": "workspace:*" + } +} diff --git a/packages/client-linkedin/src/base.ts b/packages/client-linkedin/src/base.ts new file mode 100644 index 0000000000..cbf2f5e162 --- /dev/null +++ b/packages/client-linkedin/src/base.ts @@ -0,0 +1,205 @@ +import { EventEmitter } from "events"; +// @ts-ignore +import { Client as LinkedInClient } from "linkedin-api"; +import { elizaLogger } from "@ai16z/eliza"; +import { stringToUuid, getEmbeddingZeroVector } from "@ai16z/eliza"; + +class RequestQueue { + private queue: (() => Promise)[] = []; + private processing = false; + + async add(request: () => Promise): Promise { + return new Promise((resolve, reject) => { + this.queue.push(async () => { + try { + const result = await request(); + resolve(result); + } catch (error) { + reject(error); + } + }); + this.processQueue(); + }); + } + + private async processQueue() { + if (this.processing || this.queue.length === 0) { + return; + } + + this.processing = true; + while (this.queue.length > 0) { + const request = this.queue.shift(); + if (!request) continue; + try { + await request(); + } catch (error) { + console.error("Error processing request:", error); + this.queue.unshift(request); + await this.exponentialBackoff(this.queue.length); + } + await this.randomDelay(); + } + this.processing = false; + } + + private async exponentialBackoff(retryCount: number) { + const delay = Math.pow(2, retryCount) * 1000; + await new Promise((resolve) => setTimeout(resolve, delay)); + } + + private async randomDelay() { + const delay = Math.floor(Math.random() * 2000) + 1500; + await new Promise((resolve) => setTimeout(resolve, delay)); + } +} + +export class ClientBase extends EventEmitter { + private static _linkedInClient: LinkedInClient; + protected linkedInClient: LinkedInClient; + protected runtime: any; + protected profile: any; + protected requestQueue: RequestQueue = new RequestQueue(); + + constructor(runtime: any) { + super(); + this.runtime = runtime; + + if (ClientBase._linkedInClient) { + this.linkedInClient = ClientBase._linkedInClient; + } else { + this.linkedInClient = new LinkedInClient(); + ClientBase._linkedInClient = this.linkedInClient; + } + } + + async init() { + const username = this.runtime.getSetting("LINKEDIN_USERNAME"); + const password = this.runtime.getSetting("LINKEDIN_PASSWORD"); + + if (!username || !password) { + throw new Error("LinkedIn credentials not configured"); + } + + elizaLogger.log("Logging into LinkedIn..."); + + try { + await this.linkedInClient.login(username, password); + this.profile = await this.fetchProfile(); + + if (this.profile) { + elizaLogger.log( + "LinkedIn profile loaded:", + JSON.stringify(this.profile, null, 2) + ); + this.runtime.character.linkedInProfile = { + id: this.profile.id, + username: this.profile.username, + fullName: this.profile.fullName, + headline: this.profile.headline, + summary: this.profile.summary, + }; + } else { + throw new Error("Failed to load LinkedIn profile"); + } + + await this.loadInitialState(); + } catch (error) { + elizaLogger.error("LinkedIn login failed:", error); + throw error; + } + } + + async fetchProfile() { + const cachedProfile = await this.getCachedProfile(); + if (cachedProfile) return cachedProfile; + + try { + const profile = await this.requestQueue.add(async () => { + const profileData = await this.linkedInClient.getProfile(); + return { + id: profileData.id, + username: profileData.username, + fullName: + profileData.firstName + " " + profileData.lastName, + headline: profileData.headline, + summary: profileData.summary, + }; + }); + + await this.cacheProfile(profile); + return profile; + } catch (error) { + console.error("Error fetching LinkedIn profile:", error); + return undefined; + } + } + + async loadInitialState() { + await this.populateConnections(); + await this.populateRecentActivity(); + } + + async populateConnections() { + const connections = await this.requestQueue.add(async () => { + return await this.linkedInClient.getConnections(); + }); + + for (const connection of connections) { + const roomId = stringToUuid(`linkedin-connection-${connection.id}`); + await this.runtime.ensureConnection( + stringToUuid(connection.id), + roomId, + connection.username, + connection.fullName, + "linkedin" + ); + } + } + + async populateRecentActivity() { + const activities = await this.requestQueue.add(async () => { + return await this.linkedInClient.getFeedPosts(); + }); + + for (const activity of activities) { + const roomId = stringToUuid(`linkedin-post-${activity.id}`); + await this.saveActivity(activity, roomId); + } + } + + private async saveActivity(activity: any, roomId: string) { + const content = { + text: activity.text, + url: activity.url, + source: "linkedin", + type: activity.type, + }; + + await this.runtime.messageManager.createMemory({ + id: stringToUuid(`${activity.id}-${this.runtime.agentId}`), + userId: + activity.authorId === this.profile.id + ? this.runtime.agentId + : stringToUuid(activity.authorId), + content, + agentId: this.runtime.agentId, + roomId, + embedding: getEmbeddingZeroVector(), + createdAt: activity.timestamp, + }); + } + + private async getCachedProfile() { + return await this.runtime.cacheManager.get( + `linkedin/${this.runtime.getSetting("LINKEDIN_USERNAME")}/profile` + ); + } + + private async cacheProfile(profile: any) { + await this.runtime.cacheManager.set( + `linkedin/${profile.username}/profile`, + profile + ); + } +} diff --git a/packages/client-linkedin/src/environment.ts b/packages/client-linkedin/src/environment.ts new file mode 100644 index 0000000000..8386953b80 --- /dev/null +++ b/packages/client-linkedin/src/environment.ts @@ -0,0 +1,33 @@ +import { z } from 'zod'; + +export const linkedInEnvSchema = z.object({ + LINKEDIN_USERNAME: z.string().min(1, 'LinkedIn username is required'), + LINKEDIN_PASSWORD: z.string().min(1, 'LinkedIn password is required'), + LINKEDIN_DRY_RUN: z.string().transform(val => val.toLowerCase() === 'true'), + POST_INTERVAL_MIN: z.string().optional(), + POST_INTERVAL_MAX: z.string().optional() +}); + +export async function validateLinkedInConfig(runtime: any) { + try { + const config = { + LINKEDIN_USERNAME: runtime.getSetting('LINKEDIN_USERNAME') || process.env.LINKEDIN_USERNAME, + LINKEDIN_PASSWORD: runtime.getSetting('LINKEDIN_PASSWORD') || process.env.LINKEDIN_PASSWORD, + LINKEDIN_DRY_RUN: runtime.getSetting('LINKEDIN_DRY_RUN') || process.env.LINKEDIN_DRY_RUN, + POST_INTERVAL_MIN: runtime.getSetting('POST_INTERVAL_MIN') || process.env.POST_INTERVAL_MIN, + POST_INTERVAL_MAX: runtime.getSetting('POST_INTERVAL_MAX') || process.env.POST_INTERVAL_MAX + }; + + return linkedInEnvSchema.parse(config); + } catch (error) { + if (error instanceof z.ZodError) { + const errorMessages = error.errors + .map(err => `${err.path.join('.')}: ${err.message}`) + .join('\n'); + throw new Error( + `LinkedIn configuration validation failed:\n${errorMessages}` + ); + } + throw error; + } +} \ No newline at end of file diff --git a/packages/client-linkedin/src/index.ts b/packages/client-linkedin/src/index.ts new file mode 100644 index 0000000000..6e1fe400de --- /dev/null +++ b/packages/client-linkedin/src/index.ts @@ -0,0 +1,37 @@ +import { elizaLogger } from '@ai16z/eliza'; +import { ClientBase } from './base'; +import { LinkedInPostClient } from './post'; +import { LinkedInInteractionClient } from './interactions'; +import { validateLinkedInConfig } from './environment'; + +class LinkedInManager { + client: ClientBase; + post: LinkedInPostClient; + interaction: LinkedInInteractionClient; + + constructor(runtime: any) { + this.client = new ClientBase(runtime); + this.post = new LinkedInPostClient(this.client, runtime); + this.interaction = new LinkedInInteractionClient(this.client, runtime); + } +} + +export const LinkedInClientInterface = { + async start(runtime: any) { + await validateLinkedInConfig(runtime); + elizaLogger.log('LinkedIn client started'); + + const manager = new LinkedInManager(runtime); + await manager.client.init(); + await manager.post.start(); + await manager.interaction.start(); + + return manager; + }, + + async stop(runtime: any) { + elizaLogger.warn('LinkedIn client stop not implemented yet'); + } +}; + +export default LinkedInClientInterface; \ No newline at end of file diff --git a/packages/client-linkedin/src/interactions.ts b/packages/client-linkedin/src/interactions.ts new file mode 100644 index 0000000000..1c6b6654bd --- /dev/null +++ b/packages/client-linkedin/src/interactions.ts @@ -0,0 +1,264 @@ +import { + composeContext, + generateMessageResponse, + generateShouldRespond, + messageCompletionFooter, + shouldRespondFooter, + ModelClass, + stringToUuid, + elizaLogger +} from '@ai16z/eliza'; + +const linkedInMessageTemplate = `{{timeline}} + +# Knowledge +{{knowledge}} + +About {{agentName}} (LinkedIn Profile): +{{bio}} +{{headline}} +{{summary}} +{{postDirections}} + +{{providers}} + +Recent interactions: +{{recentInteractions}} + +# Task: Generate a professional response in the voice and style of {{agentName}} +Current Message: +{{currentMessage}} + +Conversation History: +{{conversationHistory}} + +{{actions}} + +# Task: Generate a response in the voice and style of {{agentName}}. Include an action, if appropriate. {{actionNames}}:` + messageCompletionFooter; + +const linkedInShouldRespondTemplate = `# INSTRUCTIONS: Determine if {{agentName}} should respond to the message and participate in the conversation. + +Response options are RESPOND, IGNORE and STOP. + +{{agentName}} should: +- RESPOND to messages that are directly addressed to them +- RESPOND to professional networking opportunities +- RESPOND to industry-relevant discussions +- IGNORE messages that are irrelevant to their professional focus +- IGNORE spam or promotional content +- STOP if the conversation is concluded +- STOP if asked to stop + +Recent interactions: +{{recentInteractions}} + +Current Message: +{{currentMessage}} + +Conversation History: +{{conversationHistory}} + +# INSTRUCTIONS: Respond with [RESPOND] if {{agentName}} should respond, [IGNORE] if {{agentName}} should not respond, or [STOP] if {{agentName}} should end the conversation.` + shouldRespondFooter; + +export class LinkedInInteractionClient { + private client: any; + private runtime: any; + + constructor(client: any, runtime: any) { + this.client = client; + this.runtime = runtime; + } + + async start() { + const handleLinkedInInteractionsLoop = () => { + this.handleLinkedInInteractions(); + setTimeout( + handleLinkedInInteractionsLoop, + (Math.floor(Math.random() * (15 - 5 + 1)) + 5) * 60 * 1000 + ); + }; + + handleLinkedInInteractionsLoop(); + } + + async handleLinkedInInteractions() { + elizaLogger.log('Checking LinkedIn interactions'); + + try { + // Check messages + const messages = await this.client.linkedInClient.getMessages(); + for (const message of messages) { + await this.handleMessage(message); + } + + // Check post comments + const posts = await this.client.linkedInClient.getFeedPosts(); + for (const post of posts) { + if (post.authorId === this.client.profile.id) { + const comments = await this.client.linkedInClient.getPostComments(post.id); + for (const comment of comments) { + await this.handleComment(comment, post); + } + } + } + } catch (error) { + elizaLogger.error('Error handling LinkedIn interactions:', error); + } + } + + private async handleMessage(message: any) { + if (message.senderId === this.client.profile.id) { + return; + } + + const roomId = stringToUuid(`linkedin-conversation-${message.conversationId}`); + const state = await this.runtime.composeState( + { + userId: stringToUuid(message.senderId), + roomId, + agentId: this.runtime.agentId, + content: { + text: message.text, + action: '' + } + }, + { + currentMessage: message.text, + conversationHistory: await this.getConversationHistory(message.conversationId) + } + ); + + const shouldRespondContext = composeContext({ + state, + template: this.runtime.character.templates?.linkedInShouldRespondTemplate || linkedInShouldRespondTemplate + }); + + const shouldRespond = await generateShouldRespond({ + runtime: this.runtime, + context: shouldRespondContext, + modelClass: ModelClass.MEDIUM + }); + + if (shouldRespond !== 'RESPOND') { + elizaLogger.log('Not responding to message'); + return; + } + + const responseContext = composeContext({ + state, + template: this.runtime.character.templates?.linkedInMessageTemplate || linkedInMessageTemplate + }); + + const response = await generateMessageResponse({ + runtime: this.runtime, + context: responseContext, + modelClass: ModelClass.MEDIUM + }); + + if (response.text) { + try { + await this.client.linkedInClient.sendMessage(message.conversationId, response.text); + + await this.runtime.messageManager.createMemory({ + id: stringToUuid(`${Date.now()}-${this.runtime.agentId}`), + userId: this.runtime.agentId, + content: { + text: response.text, + source: 'linkedin', + action: response.action + }, + agentId: this.runtime.agentId, + roomId, + createdAt: Date.now() + }); + } catch (error) { + elizaLogger.error('Error sending LinkedIn message:', error); + } + } + } + + private async handleComment(comment: any, post: any) { + if (comment.authorId === this.client.profile.id) { + return; + } + + const roomId = stringToUuid(`linkedin-post-${post.id}`); + const state = await this.runtime.composeState( + { + userId: stringToUuid(comment.authorId), + roomId, + agentId: this.runtime.agentId, + content: { + text: comment.text, + action: '' + } + }, + { + currentMessage: comment.text, + conversationHistory: await this.getPostCommentHistory(post.id) + } + ); + + const shouldRespondContext = composeContext({ + state, + template: this.runtime.character.templates?.linkedInShouldRespondTemplate || linkedInShouldRespondTemplate + }); + + const shouldRespond = await generateShouldRespond({ + runtime: this.runtime, + context: shouldRespondContext, + modelClass: ModelClass.MEDIUM + }); + + if (shouldRespond !== 'RESPOND') { + elizaLogger.log('Not responding to comment'); + return; + } + + const responseContext = composeContext({ + state, + template: this.runtime.character.templates?.linkedInMessageTemplate || linkedInMessageTemplate + }); + + const response = await generateMessageResponse({ + runtime: this.runtime, + context: responseContext, + modelClass: ModelClass.MEDIUM + }); + + if (response.text) { + try { + await this.client.linkedInClient.replyToComment(post.id, comment.id, response.text); + + await this.runtime.messageManager.createMemory({ + id: stringToUuid(`${Date.now()}-${this.runtime.agentId}`), + userId: this.runtime.agentId, + content: { + text: response.text, + source: 'linkedin', + action: response.action + }, + agentId: this.runtime.agentId, + roomId, + createdAt: Date.now() + }); + } catch (error) { + elizaLogger.error('Error replying to LinkedIn comment:', error); + } + } + } + + private async getConversationHistory(conversationId: string): Promise { + const messages = await this.client.linkedInClient.getConversationMessages(conversationId); + return messages.map((msg: any) => + `${msg.senderName} (${new Date(msg.timestamp).toLocaleString()}): ${msg.text}` + ).join('\n\n'); + } + + private async getPostCommentHistory(postId: string): Promise { + const comments = await this.client.linkedInClient.getPostComments(postId); + return comments.map((comment: any) => + `${comment.authorName} (${new Date(comment.timestamp).toLocaleString()}): ${comment.text}` + ).join('\n\n'); + } +} \ No newline at end of file diff --git a/packages/client-linkedin/src/post.ts b/packages/client-linkedin/src/post.ts new file mode 100644 index 0000000000..f3159faadc --- /dev/null +++ b/packages/client-linkedin/src/post.ts @@ -0,0 +1,161 @@ +import { + composeContext, + generateText, + ModelClass, + stringToUuid, + elizaLogger +} from '@ai16z/eliza'; + +const linkedInPostTemplate = `{{timeline}} + +# Knowledge +{{knowledge}} + +About {{agentName}} (LinkedIn Profile): +{{bio}} +{{headline}} +{{summary}} +{{postDirections}} + +{{providers}} + +{{recentPosts}} + +{{characterPostExamples}} + +# Task: Generate a professional LinkedIn post in the voice and style of {{agentName}} +Write a post that is {{adjective}} about {{topic}}, from the perspective of {{agentName}}. +The post should be professional and industry-relevant. +Do not add commentary or acknowledge this request, just write the post. +Keep the tone professional but engaging.`; + +export class LinkedInPostClient { + private client: any; + private runtime: any; + + constructor(client: any, runtime: any) { + this.client = client; + this.runtime = runtime; + } + + async start(postImmediately = false) { + if (!this.client.profile) { + await this.client.init(); + } + + const generateNewPostLoop = async () => { + const lastPost = await this.runtime.cacheManager.get( + `linkedin/${this.runtime.getSetting('LINKEDIN_USERNAME')}/lastPost` + ); + const lastPostTimestamp = lastPost?.timestamp ?? 0; + const minHours = parseInt(this.runtime.getSetting('POST_INTERVAL_MIN')) || 24; + const maxHours = parseInt(this.runtime.getSetting('POST_INTERVAL_MAX')) || 72; + const randomHours = Math.floor(Math.random() * (maxHours - minHours + 1)) + minHours; + const delay = randomHours * 60 * 60 * 1000; + + if (Date.now() > lastPostTimestamp + delay) { + await this.generateNewPost(); + } + + setTimeout(() => { + generateNewPostLoop(); + }, delay); + + elizaLogger.log(`Next LinkedIn post scheduled in ${randomHours} hours`); + }; + + if (postImmediately) { + await this.generateNewPost(); + } + + generateNewPostLoop(); + } + + async generateNewPost() { + elizaLogger.log('Generating new LinkedIn post'); + + try { + const recentPosts = await this.client.linkedInClient.getFeedPosts(); + const formattedPosts = recentPosts.map((post: any) => { + return `Post ID: ${post.id} +Author: ${post.author.name} +Date: ${new Date(post.timestamp).toDateString()} + +${post.text} +---`; + }).join('\n\n'); + + const topics = this.runtime.character.topics.join(', '); + const state = await this.runtime.composeState( + { + userId: this.runtime.agentId, + roomId: stringToUuid('linkedin_generate_room'), + agentId: this.runtime.agentId, + content: { + text: topics, + action: '' + } + }, + { + timeline: formattedPosts, + headline: this.client.profile.headline, + summary: this.client.profile.summary + } + ); + + const context = composeContext({ + state, + template: this.runtime.character.templates?.linkedInPostTemplate || linkedInPostTemplate + }); + + elizaLogger.debug('Generate post prompt:\n' + context); + + const newPostContent = await generateText({ + runtime: this.runtime, + context, + modelClass: ModelClass.SMALL + }); + + if (this.runtime.getSetting('LINKEDIN_DRY_RUN') === 'true') { + elizaLogger.info(`Dry run: would have posted: ${newPostContent}`); + return; + } + + try { + elizaLogger.log(`Posting new LinkedIn post:\n${newPostContent}`); + + const result = await this.client.requestQueue.add( + async () => await this.client.linkedInClient.createPost(newPostContent) + ); + + await this.runtime.cacheManager.set( + `linkedin/${this.client.profile.username}/lastPost`, + { + id: result.id, + timestamp: Date.now() + } + ); + + const roomId = stringToUuid(`linkedin-post-${result.id}`); + await this.runtime.messageManager.createMemory({ + id: stringToUuid(`${result.id}-${this.runtime.agentId}`), + userId: this.runtime.agentId, + content: { + text: newPostContent, + url: result.url, + source: 'linkedin' + }, + agentId: this.runtime.agentId, + roomId, + createdAt: Date.now() + }); + + elizaLogger.log(`LinkedIn post created: ${result.url}`); + } catch (error) { + elizaLogger.error('Error creating LinkedIn post:', error); + } + } catch (error) { + elizaLogger.error('Error generating new LinkedIn post:', error); + } + } +} \ No newline at end of file diff --git a/packages/client-linkedin/tsconfig.json b/packages/client-linkedin/tsconfig.json new file mode 100644 index 0000000000..22414fda08 --- /dev/null +++ b/packages/client-linkedin/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "lib": [ + "ES2020" + ], + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node" + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules", + "dist", + "test" + ] +} \ No newline at end of file diff --git a/packages/client-twitter/src/index.ts b/packages/client-twitter/src/index.ts index c15e994c7e..553d96822c 100644 --- a/packages/client-twitter/src/index.ts +++ b/packages/client-twitter/src/index.ts @@ -13,7 +13,7 @@ class TwitterManager { constructor(runtime: IAgentRuntime) { this.client = new ClientBase(runtime); this.post = new TwitterPostClient(this.client, runtime); - // this.search = new TwitterSearchClient(runtime); // don't start the search client by default + //this.search = new TwitterSearchClient(this.client, runtime); // don't start the search client by default // this searches topics from character file, but kind of violates consent of random users // burns your rate limit and can get your account banned // use at your own risk @@ -35,6 +35,8 @@ export const TwitterClientInterface: Client = { await manager.interaction.start(); + //await manager.search.start(); // don't run the search by default + return manager; }, async stop(_runtime: IAgentRuntime) { diff --git a/packages/client-twitter/src/search.ts b/packages/client-twitter/src/search.ts index b12d1d4bfb..8cfeef8dc7 100644 --- a/packages/client-twitter/src/search.ts +++ b/packages/client-twitter/src/search.ts @@ -42,17 +42,17 @@ Your response should not contain any questions. Brief, concise statements only. ` + messageCompletionFooter; -export class TwitterSearchClient extends ClientBase { +export class TwitterSearchClient { + client: ClientBase; + runtime: IAgentRuntime; private respondedTweets: Set = new Set(); - constructor(runtime: IAgentRuntime) { - // Initialize the client and pass an optional callback to be called when the client is ready - super({ - runtime, - }); + constructor(client: ClientBase, runtime: IAgentRuntime) { + this.client = client; + this.runtime = runtime; } - async onReady() { + async start() { this.engageWithSearchTermsLoop(); } @@ -74,16 +74,16 @@ export class TwitterSearchClient extends ClientBase { console.log("Fetching search tweets"); // TODO: we wait 5 seconds here to avoid getting rate limited on startup, but we should queue await new Promise((resolve) => setTimeout(resolve, 5000)); - const recentTweets = await this.fetchSearchTweets( + const recentTweets = await this.client.fetchSearchTweets( searchTerm, 20, SearchMode.Top ); console.log("Search tweets fetched"); - const homeTimeline = await this.fetchHomeTimeline(50); + const homeTimeline = await this.client.fetchHomeTimeline(50); - await this.cacheTimeline(homeTimeline); + await this.client.cacheTimeline(homeTimeline); const formattedHomeTimeline = `# ${this.runtime.character.name}'s Home Timeline\n\n` + @@ -179,7 +179,7 @@ export class TwitterSearchClient extends ClientBase { ); // crawl additional conversation tweets, if there are any - await buildConversationThread(selectedTweet, this); + await buildConversationThread(selectedTweet, this.client); const message = { id: stringToUuid(selectedTweet.id + "-" + this.runtime.agentId), @@ -218,8 +218,8 @@ export class TwitterSearchClient extends ClientBase { let tweetBackground = ""; if (selectedTweet.isRetweet) { - const originalTweet = await this.requestQueue.add(() => - this.twitterClient.getTweet(selectedTweet.id) + const originalTweet = await this.client.requestQueue.add(() => + this.client.twitterClient.getTweet(selectedTweet.id) ); tweetBackground = `Retweeting @${originalTweet.username}: ${originalTweet.text}`; } @@ -231,13 +231,12 @@ export class TwitterSearchClient extends ClientBase { .getService( ServiceType.IMAGE_DESCRIPTION ) - .getInstance() .describeImage(photo.url); imageDescriptions.push(description); } let state = await this.runtime.composeState(message, { - twitterClient: this.twitterClient, + twitterClient: this.client.twitterClient, twitterUserName: this.runtime.getSetting("TWITTER_USERNAME"), timeline: formattedHomeTimeline, tweetContext: `${tweetBackground} @@ -250,7 +249,7 @@ export class TwitterSearchClient extends ClientBase { `, }); - await this.saveRequestMessage(message, state as State); + await this.client.saveRequestMessage(message, state as State); const context = composeContext({ state, @@ -280,7 +279,7 @@ export class TwitterSearchClient extends ClientBase { try { const callback: HandlerCallback = async (response: Content) => { const memories = await sendTweet( - this, + this.client, response, message.roomId, this.runtime.getSetting("TWITTER_USERNAME"), diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index fdc5082ca5..12ef211a65 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -76,27 +76,49 @@ export async function generateText({ runtime.character.modelEndpointOverride || models[provider].endpoint; let model = models[provider].model[modelClass]; - // if runtime.getSetting("LLAMACLOUD_MODEL_LARGE") is true and modelProvider is LLAMACLOUD, then use the large model - if ( - (runtime.getSetting("LLAMACLOUD_MODEL_LARGE") && - provider === ModelProviderName.LLAMACLOUD) || - (runtime.getSetting("TOGETHER_MODEL_LARGE") && - provider === ModelProviderName.TOGETHER) - ) { - model = - runtime.getSetting("LLAMACLOUD_MODEL_LARGE") || - runtime.getSetting("TOGETHER_MODEL_LARGE"); - } - - if ( - (runtime.getSetting("LLAMACLOUD_MODEL_SMALL") && - provider === ModelProviderName.LLAMACLOUD) || - (runtime.getSetting("TOGETHER_MODEL_SMALL") && - provider === ModelProviderName.TOGETHER) - ) { - model = - runtime.getSetting("LLAMACLOUD_MODEL_SMALL") || - runtime.getSetting("TOGETHER_MODEL_SMALL"); + // allow character.json settings => secrets to override models + // FIXME: add MODEL_MEDIUM support + switch(provider) { + // if runtime.getSetting("LLAMACLOUD_MODEL_LARGE") is true and modelProvider is LLAMACLOUD, then use the large model + case ModelProviderName.LLAMACLOUD: { + switch(modelClass) { + case ModelClass.LARGE: { + model = runtime.getSetting("LLAMACLOUD_MODEL_LARGE") || model; + } + break; + case ModelClass.SMALL: { + model = runtime.getSetting("LLAMACLOUD_MODEL_SMALL") || model; + } + break; + } + } + break; + case ModelProviderName.TOGETHER: { + switch(modelClass) { + case ModelClass.LARGE: { + model = runtime.getSetting("TOGETHER_MODEL_LARGE") || model; + } + break; + case ModelClass.SMALL: { + model = runtime.getSetting("TOGETHER_MODEL_SMALL") || model; + } + break; + } + } + break; + case ModelProviderName.OPENROUTER: { + switch(modelClass) { + case ModelClass.LARGE: { + model = runtime.getSetting("LARGE_OPENROUTER_MODEL") || model; + } + break; + case ModelClass.SMALL: { + model = runtime.getSetting("SMALL_OPENROUTER_MODEL") || model; + } + break; + } + } + break; } elizaLogger.info("Selected model:", model); @@ -129,6 +151,7 @@ export async function generateText({ case ModelProviderName.ALI_BAILIAN: case ModelProviderName.VOLENGINE: case ModelProviderName.LLAMACLOUD: + case ModelProviderName.NANOGPT: case ModelProviderName.HYPERBOLIC: case ModelProviderName.TOGETHER: { elizaLogger.debug("Initializing OpenAI model."); @@ -389,16 +412,22 @@ export async function generateText({ elizaLogger.debug("Initializing GAIANET model."); var baseURL = models[provider].endpoint; - if(!baseURL){ - switch(modelClass){ + if (!baseURL) { + switch (modelClass) { case ModelClass.SMALL: - baseURL = settings.SMALL_GAIANET_SERVER_URL || "https://llama3b.gaia.domains/v1"; + baseURL = + settings.SMALL_GAIANET_SERVER_URL || + "https://llama3b.gaia.domains/v1"; break; case ModelClass.MEDIUM: - baseURL = settings.MEDIUM_GAIANET_SERVER_URL || "https://llama8b.gaia.domains/v1"; + baseURL = + settings.MEDIUM_GAIANET_SERVER_URL || + "https://llama8b.gaia.domains/v1"; break; case ModelClass.LARGE: - baseURL = settings.LARGE_GAIANET_SERVER_URL || "https://qwen72b.gaia.domains/v1"; + baseURL = + settings.LARGE_GAIANET_SERVER_URL || + "https://qwen72b.gaia.domains/v1"; break; } } @@ -1215,6 +1244,7 @@ export async function handleProvider( case ModelProviderName.VOLENGINE: case ModelProviderName.LLAMACLOUD: case ModelProviderName.TOGETHER: + case ModelProviderName.NANOGPT: return await handleOpenAI(options); case ModelProviderName.ANTHROPIC: return await handleAnthropic(options); diff --git a/packages/core/src/models.ts b/packages/core/src/models.ts index 13a91e7b9d..a705f4f204 100644 --- a/packages/core/src/models.ts +++ b/packages/core/src/models.ts @@ -13,11 +13,11 @@ export const models: Models = { temperature: 0.6, }, model: { - [ModelClass.SMALL]: "gpt-4o-mini", - [ModelClass.MEDIUM]: "gpt-4o", - [ModelClass.LARGE]: "gpt-4o", - [ModelClass.EMBEDDING]: "text-embedding-3-small", - [ModelClass.IMAGE]: "dall-e-3", + [ModelClass.SMALL]: settings.SMALL_OPENAI_MODEL || "gpt-4o-mini", + [ModelClass.MEDIUM]: settings.MEDIUM_OPENAI_MODEL || "gpt-4o", + [ModelClass.LARGE]: settings.LARGE_OPENAI_MODEL || "gpt-4o", + [ModelClass.EMBEDDING]: settings.EMBEDDING_OPENAI_MODEL || "text-embedding-3-small", + [ModelClass.IMAGE]: settings.IMAGE_OPENAI_MODEL || "dall-e-3", }, }, [ModelProviderName.ETERNALAI]: { @@ -31,9 +31,15 @@ export const models: Models = { temperature: 0.6, }, model: { - [ModelClass.SMALL]: settings.ETERNALAI_MODEL || "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", - [ModelClass.MEDIUM]: settings.ETERNALAI_MODEL || "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", - [ModelClass.LARGE]: settings.ETERNALAI_MODEL || "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", + [ModelClass.SMALL]: + settings.ETERNALAI_MODEL || + "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", + [ModelClass.MEDIUM]: + settings.ETERNALAI_MODEL || + "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", + [ModelClass.LARGE]: + settings.ETERNALAI_MODEL || + "neuralmagic/Meta-Llama-3.1-405B-Instruct-quantized.w4a16", [ModelClass.EMBEDDING]: "", [ModelClass.IMAGE]: "", }, @@ -49,9 +55,9 @@ export const models: Models = { }, endpoint: "https://api.anthropic.com/v1", model: { - [ModelClass.SMALL]: "claude-3-haiku-20240307", - [ModelClass.MEDIUM]: "claude-3-5-sonnet-20241022", - [ModelClass.LARGE]: "claude-3-5-sonnet-20241022", + [ModelClass.SMALL]: settings.SMALL_ANTHROPIC_MODEL || "claude-3-haiku-20240307", + [ModelClass.MEDIUM]: settings.MEDIUM_ANTHROPIC_MODEL || "claude-3-5-sonnet-20241022", + [ModelClass.LARGE]: settings.LARGE_ANTHROPIC_MODEL || "claude-3-5-sonnet-20241022", }, }, [ModelProviderName.CLAUDE_VERTEX]: { @@ -98,10 +104,14 @@ export const models: Models = { temperature: 0.7, }, model: { - [ModelClass.SMALL]: settings.SMALL_GROQ_MODEL || "llama-3.1-8b-instant", - [ModelClass.MEDIUM]: settings.MEDIUM_GROQ_MODEL || "llama-3.3-70b-versatile", - [ModelClass.LARGE]: settings.LARGE_GROQ_MODEL || "llama-3.2-90b-vision-preview", - [ModelClass.EMBEDDING]: settings.EMBEDDING_GROQ_MODEL || "llama-3.1-8b-instant", + [ModelClass.SMALL]: + settings.SMALL_GROQ_MODEL || "llama-3.1-8b-instant", + [ModelClass.MEDIUM]: + settings.MEDIUM_GROQ_MODEL || "llama-3.3-70b-versatile", + [ModelClass.LARGE]: + settings.LARGE_GROQ_MODEL || "llama-3.2-90b-vision-preview", + [ModelClass.EMBEDDING]: + settings.EMBEDDING_GROQ_MODEL || "llama-3.1-8b-instant", }, }, [ModelProviderName.LLAMACLOUD]: { @@ -115,7 +125,7 @@ export const models: Models = { imageSettings: { steps: 4, }, - endpoint: "https://api.together.ai/v1", + endpoint: "https://api.llamacloud.com/v1", model: { [ModelClass.SMALL]: "meta-llama/Llama-3.2-3B-Instruct-Turbo", [ModelClass.MEDIUM]: "meta-llama-3.1-8b-instruct", @@ -176,18 +186,22 @@ export const models: Models = { temperature: 0.7, }, model: { - [ModelClass.SMALL]: settings.SMALL_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "gemini-1.5-flash-latest", - [ModelClass.MEDIUM]: settings.MEDIUM_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "gemini-1.5-flash-latest", - [ModelClass.LARGE]: settings.LARGE_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "gemini-1.5-pro-latest", - [ModelClass.EMBEDDING]: settings.EMBEDDING_GOOGLE_MODEL || - settings.GOOGLE_MODEL || - "text-embedding-004", + [ModelClass.SMALL]: + settings.SMALL_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "gemini-1.5-flash-latest", + [ModelClass.MEDIUM]: + settings.MEDIUM_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "gemini-1.5-flash-latest", + [ModelClass.LARGE]: + settings.LARGE_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "gemini-1.5-pro-latest", + [ModelClass.EMBEDDING]: + settings.EMBEDDING_GOOGLE_MODEL || + settings.GOOGLE_MODEL || + "text-embedding-004", }, }, [ModelProviderName.REDPILL]: { @@ -204,17 +218,17 @@ export const models: Models = { // To test other models, change the models below model: { [ModelClass.SMALL]: - settings.SMALL_REDPILL_MODEL || - settings.REDPILL_MODEL || - "gpt-4o-mini", + settings.SMALL_REDPILL_MODEL || + settings.REDPILL_MODEL || + "gpt-4o-mini", [ModelClass.MEDIUM]: - settings.MEDIUM_REDPILL_MODEL || - settings.REDPILL_MODEL || - "gpt-4o", + settings.MEDIUM_REDPILL_MODEL || + settings.REDPILL_MODEL || + "gpt-4o", [ModelClass.LARGE]: - settings.LARGE_REDPILL_MODEL || - settings.REDPILL_MODEL || - "gpt-4o", + settings.LARGE_REDPILL_MODEL || + settings.REDPILL_MODEL || + "gpt-4o", [ModelClass.EMBEDDING]: "text-embedding-3-small", }, }, @@ -232,17 +246,17 @@ export const models: Models = { // To test other models, change the models below model: { [ModelClass.SMALL]: - settings.SMALL_OPENROUTER_MODEL || - settings.OPENROUTER_MODEL || - "nousresearch/hermes-3-llama-3.1-405b", + settings.SMALL_OPENROUTER_MODEL || + settings.OPENROUTER_MODEL || + "nousresearch/hermes-3-llama-3.1-405b", [ModelClass.MEDIUM]: - settings.MEDIUM_OPENROUTER_MODEL || - settings.OPENROUTER_MODEL || - "nousresearch/hermes-3-llama-3.1-405b", + settings.MEDIUM_OPENROUTER_MODEL || + settings.OPENROUTER_MODEL || + "nousresearch/hermes-3-llama-3.1-405b", [ModelClass.LARGE]: - settings.LARGE_OPENROUTER_MODEL || - settings.OPENROUTER_MODEL || - "nousresearch/hermes-3-llama-3.1-405b", + settings.LARGE_OPENROUTER_MODEL || + settings.OPENROUTER_MODEL || + "nousresearch/hermes-3-llama-3.1-405b", [ModelClass.EMBEDDING]: "text-embedding-3-small", }, }, @@ -258,19 +272,19 @@ export const models: Models = { endpoint: settings.OLLAMA_SERVER_URL || "http://localhost:11434", model: { [ModelClass.SMALL]: - settings.SMALL_OLLAMA_MODEL || - settings.OLLAMA_MODEL || - "llama3.2", + settings.SMALL_OLLAMA_MODEL || + settings.OLLAMA_MODEL || + "llama3.2", [ModelClass.MEDIUM]: - settings.MEDIUM_OLLAMA_MODEL || - settings.OLLAMA_MODEL || - "hermes3", + settings.MEDIUM_OLLAMA_MODEL || + settings.OLLAMA_MODEL || + "hermes3", [ModelClass.LARGE]: - settings.LARGE_OLLAMA_MODEL || - settings.OLLAMA_MODEL || - "hermes3:70b", + settings.LARGE_OLLAMA_MODEL || + settings.OLLAMA_MODEL || + "hermes3:70b", [ModelClass.EMBEDDING]: - settings.OLLAMA_EMBEDDING_MODEL || "mxbai-embed-large", + settings.OLLAMA_EMBEDDING_MODEL || "mxbai-embed-large", }, }, [ModelProviderName.HEURIST]: { @@ -286,9 +300,15 @@ export const models: Models = { }, endpoint: "https://llm-gateway.heurist.xyz", model: { - [ModelClass.SMALL]: settings.SMALL_HEURIST_MODEL || "meta-llama/llama-3-70b-instruct", - [ModelClass.MEDIUM]: settings.MEDIUM_HEURIST_MODEL || "meta-llama/llama-3-70b-instruct", - [ModelClass.LARGE]: settings.LARGE_HEURIST_MODEL || "meta-llama/llama-3.1-405b-instruct", + [ModelClass.SMALL]: + settings.SMALL_HEURIST_MODEL || + "meta-llama/llama-3-70b-instruct", + [ModelClass.MEDIUM]: + settings.MEDIUM_HEURIST_MODEL || + "meta-llama/llama-3-70b-instruct", + [ModelClass.LARGE]: + settings.LARGE_HEURIST_MODEL || + "meta-llama/llama-3.1-405b-instruct", [ModelClass.EMBEDDING]: "", //Add later, [ModelClass.IMAGE]: settings.HEURIST_IMAGE_MODEL || "PepeXL", }, @@ -308,6 +328,7 @@ export const models: Models = { [ModelClass.MEDIUM]: "llama3.1:70b", [ModelClass.LARGE]: "llama3.1:405b", [ModelClass.EMBEDDING]: "gte-large-en-v1.5", + [ModelClass.IMAGE]: "stabilityai/stable-diffusion-xl-base-1.0", }, }, [ModelProviderName.FAL]: { @@ -340,11 +361,20 @@ export const models: Models = { }, endpoint: settings.GAIANET_SERVER_URL, model: { - [ModelClass.SMALL]: settings.GAIANET_MODEL || settings.SMALL_GAIANET_MODEL || "llama3b", - [ModelClass.MEDIUM]: settings.GAIANET_MODEL || settings.MEDIUM_GAIANET_MODEL || "llama", - [ModelClass.LARGE]: settings.GAIANET_MODEL || settings.LARGE_GAIANET_MODEL || "qwen72b", + [ModelClass.SMALL]: + settings.GAIANET_MODEL || + settings.SMALL_GAIANET_MODEL || + "llama3b", + [ModelClass.MEDIUM]: + settings.GAIANET_MODEL || + settings.MEDIUM_GAIANET_MODEL || + "llama", + [ModelClass.LARGE]: + settings.GAIANET_MODEL || + settings.LARGE_GAIANET_MODEL || + "qwen72b", [ModelClass.EMBEDDING]: - settings.GAIANET_EMBEDDING_MODEL || "nomic-embed", + settings.GAIANET_EMBEDDING_MODEL || "nomic-embed", }, }, [ModelProviderName.ALI_BAILIAN]: { @@ -381,6 +411,22 @@ export const models: Models = { [ModelClass.EMBEDDING]: "doubao-embedding", }, }, + [ModelProviderName.NANOGPT]: { + endpoint: "https://nano-gpt.com/api/v1", + settings: { + stop: [], + maxInputTokens: 128000, + maxOutputTokens: 8192, + frequency_penalty: 0.0, + presence_penalty: 0.0, + temperature: 0.6, + }, + model: { + [ModelClass.SMALL]: settings.SMALL_NANOGPT_MODEL || "gpt-4o-mini", + [ModelClass.MEDIUM]: settings.MEDIUM_NANOGPT_MODEL || "gpt-4o", + [ModelClass.LARGE]: settings.LARGE_NANOGPT_MODEL || "gpt-4o", + } + }, [ModelProviderName.HYPERBOLIC]: { endpoint: "https://api.hyperbolic.xyz/v1", settings: { @@ -390,10 +436,19 @@ export const models: Models = { temperature: 0.6, }, model: { - [ModelClass.SMALL]: "meta-llama/Llama-3.2-3B-Instruct", - [ModelClass.MEDIUM]: "meta-llama/Meta-Llama-3.1-70B-Instruct", - [ModelClass.LARGE]: "meta-llama/Meta-Llama-3.1-405-Instruct", - [ModelClass.IMAGE]: "FLUX.1-dev", + [ModelClass.SMALL]: + settings.SMALL_HYPERBOLIC_MODEL || + settings.HYPERBOLIC_MODEL || + "meta-llama/Llama-3.2-3B-Instruct", + [ModelClass.MEDIUM]: + settings.MEDIUM_HYPERBOLIC_MODEL || + settings.HYPERBOLIC_MODEL || + "meta-llama/Meta-Llama-3.1-70B-Instruct", + [ModelClass.LARGE]: + settings.LARGE_HYPERBOLIC_MODEL || + settings.HYPERBOLIC_MODEL || + "meta-llama/Meta-Llama-3.1-405-Instruct", + [ModelClass.IMAGE]: settings.IMAGE_HYPERBOLIC_MODEL || "FLUX.1-dev", }, }, }; diff --git a/packages/core/src/runtime.ts b/packages/core/src/runtime.ts index 54d2d8f6b1..ca6c0b18ab 100644 --- a/packages/core/src/runtime.ts +++ b/packages/core/src/runtime.ts @@ -572,10 +572,16 @@ export class AgentRuntime implements IAgentRuntime { * Evaluate the message and state using the registered evaluators. * @param message The message to evaluate. * @param state The state of the agent. - * @param didRespond Whether the agent responded to the message. + * @param didRespond Whether the agent responded to the message.~ + * @param callback The handler callback * @returns The results of the evaluation. */ - async evaluate(message: Memory, state?: State, didRespond?: boolean) { + async evaluate( + message: Memory, + state?: State, + didRespond?: boolean, + callback?: HandlerCallback + ) { const evaluatorPromises = this.evaluators.map( async (evaluator: Evaluator) => { elizaLogger.log("Evaluating", evaluator.name); @@ -601,17 +607,12 @@ export class AgentRuntime implements IAgentRuntime { return []; } - const evaluators = formatEvaluators(evaluatorsData as Evaluator[]); - const evaluatorNames = formatEvaluatorNames( - evaluatorsData as Evaluator[] - ); - const context = composeContext({ state: { ...state, - evaluators, - evaluatorNames, - } as State, + evaluators: formatEvaluators(evaluatorsData), + evaluatorNames: formatEvaluatorNames(evaluatorsData), + }, template: this.character.templates?.evaluationTemplate || evaluationTemplate, @@ -623,21 +624,18 @@ export class AgentRuntime implements IAgentRuntime { modelClass: ModelClass.SMALL, }); - const parsedResult = parseJsonArrayFromText( + const evaluators = parseJsonArrayFromText( result ) as unknown as string[]; - this.evaluators - .filter((evaluator: Evaluator) => - parsedResult?.includes(evaluator.name) - ) - .forEach((evaluator: Evaluator) => { - if (!evaluator?.handler) return; + for (const evaluator of this.evaluators) { + if (!evaluators.includes(evaluator.name)) continue; - evaluator.handler(this, message); - }); + if (evaluator.handler) + await evaluator.handler(this, message, state, {}, callback); + } - return parsedResult; + return evaluators; } /** diff --git a/packages/core/src/tests/parsing.test.ts b/packages/core/src/tests/parsing.test.ts new file mode 100644 index 0000000000..636f0b00af --- /dev/null +++ b/packages/core/src/tests/parsing.test.ts @@ -0,0 +1,94 @@ +import { describe, it, expect } from 'vitest'; +import { + parseShouldRespondFromText, + parseBooleanFromText, + parseJsonArrayFromText, + parseJSONObjectFromText, +} from '../parsing'; + +describe('Parsing Module', () => { + describe('parseShouldRespondFromText', () => { + it('should parse exact matches', () => { + expect(parseShouldRespondFromText('[RESPOND]')).toBe('RESPOND'); + expect(parseShouldRespondFromText('[IGNORE]')).toBe('IGNORE'); + expect(parseShouldRespondFromText('[STOP]')).toBe('STOP'); + }); + + it('should handle case insensitive input', () => { + expect(parseShouldRespondFromText('[respond]')).toBe('RESPOND'); + expect(parseShouldRespondFromText('[ignore]')).toBe('IGNORE'); + expect(parseShouldRespondFromText('[stop]')).toBe('STOP'); + }); + + it('should handle text containing keywords', () => { + expect(parseShouldRespondFromText('I think we should RESPOND here')).toBe('RESPOND'); + expect(parseShouldRespondFromText('Better to IGNORE this one')).toBe('IGNORE'); + expect(parseShouldRespondFromText('We need to STOP now')).toBe('STOP'); + }); + + it('should return null for invalid input', () => { + expect(parseShouldRespondFromText('')).toBe(null); + expect(parseShouldRespondFromText('invalid')).toBe(null); + expect(parseShouldRespondFromText('[INVALID]')).toBe(null); + }); + }); + + describe('parseBooleanFromText', () => { + it('should parse exact YES/NO matches', () => { + expect(parseBooleanFromText('YES')).toBe(true); + expect(parseBooleanFromText('NO')).toBe(false); + }); + + it('should handle case insensitive input', () => { + expect(parseBooleanFromText('yes')).toBe(true); + expect(parseBooleanFromText('no')).toBe(false); + }); + + it('should return null for invalid input', () => { + expect(parseBooleanFromText('')).toBe(null); + expect(parseBooleanFromText('maybe')).toBe(null); + expect(parseBooleanFromText('YES NO')).toBe(null); + }); + }); + + describe('parseJsonArrayFromText', () => { + it('should parse JSON array from code block', () => { + const input = '```json\n["item1", "item2", "item3"]\n```'; + expect(parseJsonArrayFromText(input)).toEqual(['item1', 'item2', 'item3']); + }); + + it('should handle empty arrays', () => { + expect(parseJsonArrayFromText('```json\n[]\n```')).toEqual([]); + expect(parseJsonArrayFromText('[]')).toEqual(null); + }); + + it('should return null for invalid JSON', () => { + expect(parseJsonArrayFromText('invalid')).toBe(null); + expect(parseJsonArrayFromText('[invalid]')).toBe(null); + expect(parseJsonArrayFromText('```json\n[invalid]\n```')).toBe(null); + }); + }); + + describe('parseJSONObjectFromText', () => { + it('should parse JSON object from code block', () => { + const input = '```json\n{"key": "value", "number": 42}\n```'; + expect(parseJSONObjectFromText(input)).toEqual({ key: 'value', number: 42 }); + }); + + it('should parse JSON object without code block', () => { + const input = '{"key": "value", "number": 42}'; + expect(parseJSONObjectFromText(input)).toEqual({ key: 'value', number: 42 }); + }); + + it('should handle empty objects', () => { + expect(parseJSONObjectFromText('```json\n{}\n```')).toEqual({}); + expect(parseJSONObjectFromText('{}')).toEqual({}); + }); + + it('should return null for invalid JSON', () => { + expect(parseJSONObjectFromText('invalid')).toBe(null); + expect(parseJSONObjectFromText('{invalid}')).toBe(null); + expect(parseJSONObjectFromText('```json\n{invalid}\n```')).toBe(null); + }); + }); +}); diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 4e973858f1..d29d0b9805 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -205,6 +205,7 @@ export type Models = { [ModelProviderName.GAIANET]: Model; [ModelProviderName.ALI_BAILIAN]: Model; [ModelProviderName.VOLENGINE]: Model; + [ModelProviderName.NANOGPT]: Model; [ModelProviderName.HYPERBOLIC]: Model; }; @@ -231,6 +232,7 @@ export enum ModelProviderName { GAIANET = "gaianet", ALI_BAILIAN = "ali_bailian", VOLENGINE = "volengine", + NANOGPT = "nanogpt", HYPERBOLIC = "hyperbolic", } @@ -683,7 +685,7 @@ export type Character = { /** Optional configuration */ settings?: { secrets?: { [key: string]: string }; - buttplug?: boolean; + intiface?: boolean; voice?: { model?: string; // For VITS url?: string; // Legacy VITS support @@ -1025,7 +1027,8 @@ export interface IAgentRuntime { evaluate( message: Memory, state?: State, - didRespond?: boolean + didRespond?: boolean, + callback?: HandlerCallback ): Promise; ensureParticipantExists(userId: UUID, roomId: UUID): Promise; @@ -1154,7 +1157,7 @@ export enum ServiceType { BROWSER = "browser", SPEECH_GENERATION = "speech_generation", PDF = "pdf", - BUTTPLUG = "buttplug", + INTIFACE = "intiface", AWS_S3 = "aws_s3", } diff --git a/packages/plugin-flow/src/actions/transfer.ts b/packages/plugin-flow/src/actions/transfer.ts index 88366028b5..bc04dcfec3 100644 --- a/packages/plugin-flow/src/actions/transfer.ts +++ b/packages/plugin-flow/src/actions/transfer.ts @@ -2,7 +2,7 @@ import { composeContext, Content, elizaLogger, - generateObjectDEPRECATED, + generateObjectArray, ModelClass, type Action, type ActionExample, @@ -87,12 +87,17 @@ export class TransferAction { }); // Generate transfer content - const content = await generateObjectDEPRECATED({ + const recommendations = await generateObjectArray({ runtime, context: transferContext, - modelClass: ModelClass.SMALL, + modelClass: ModelClass.MEDIUM, }); + elizaLogger.debug("Recommendations", recommendations); + + // Convert array to object + const content = recommendations[recommendations.length - 1]; + // Validate transfer content if (!isTransferContent(runtime, content)) { elizaLogger.error("Invalid content for SEND_COIN action."); diff --git a/packages/plugin-flow/src/assets/cadence/transactions/evm/call.cdc b/packages/plugin-flow/src/assets/cadence/transactions/evm/call.cdc index 1f7c60143b..44fffbcf7f 100644 --- a/packages/plugin-flow/src/assets/cadence/transactions/evm/call.cdc +++ b/packages/plugin-flow/src/assets/cadence/transactions/evm/call.cdc @@ -10,7 +10,20 @@ transaction(evmContractAddressHex: String, calldata: String, gasLimit: UInt64, v prepare(signer: auth(BorrowValue) &Account) { self.evmAddress = EVM.addressFromString(evmContractAddressHex) - self.coa = signer.storage.borrow(from: /storage/evm) + let storagePath = StoragePath(identifier: "evm")! + let publicPath = PublicPath(identifier: "evm")! + + // Reference signer's COA if one exists + let coa = signer.storage.borrow(from: storagePath) + if coa == nil { + let coa <- EVM.createCadenceOwnedAccount() + signer.storage.save<@EVM.CadenceOwnedAccount>(<-coa, to: storagePath) + let addressableCap = signer.capabilities.storage.issue<&EVM.CadenceOwnedAccount>(storagePath) + signer.capabilities.unpublish(publicPath) + signer.capabilities.publish(addressableCap, at: publicPath) + } + + self.coa = signer.storage.borrow(from: storagePath) ?? panic("Could not borrow COA from provided gateway address") } diff --git a/packages/plugin-flow/src/providers/connector.provider.ts b/packages/plugin-flow/src/providers/connector.provider.ts index f0a7e3913d..7d81fe3c87 100644 --- a/packages/plugin-flow/src/providers/connector.provider.ts +++ b/packages/plugin-flow/src/providers/connector.provider.ts @@ -72,7 +72,7 @@ export class FlowConnectorProvider { constructor(private readonly instance: FlowConnector) {} getConnectorStatus(runtime: IAgentRuntime): string { - let output = `${runtime.character.name}[${runtime.character.id ?? 0}] Connected to\n`; + let output = `Now user<${runtime.character.name}> connected to\n`; output += `Flow network: ${this.instance.network}\n`; output += `Flow Endpoint: ${this.instance.rpcEndpoint}\n`; return output; diff --git a/packages/plugin-flow/src/providers/wallet.provider.ts b/packages/plugin-flow/src/providers/wallet.provider.ts index 7e6ba65bf0..1d300bafa7 100644 --- a/packages/plugin-flow/src/providers/wallet.provider.ts +++ b/packages/plugin-flow/src/providers/wallet.provider.ts @@ -232,7 +232,12 @@ const flowWalletProvider: Provider = { elizaLogger.error("Invalid account info"); return null; } - return `Flow Wallet Address: ${walletProvider.address}\nBalance: ${info.balance} FLOW\nFlow COA(EVM) Address: ${info.coaAddress || "unknown"}\nFLOW COA(EVM) Balance: ${info.coaBalance ?? 0} FLOW`; + let output = `Here is user<${runtime.character.name}>'s wallet status:\n`; + output += `Flow wallet address: ${walletProvider.address}\n`; + output += `FLOW balance: ${info.balance} FLOW\n`; + output += `Flow wallet's COA(EVM) address: ${info.coaAddress || "unknown"}\n`; + output += `FLOW balance in COA(EVM) address: ${info.coaBalance ?? 0} FLOW`; + return output; } catch (error) { elizaLogger.error("Error in Flow wallet provider:", error.message); return null; diff --git a/packages/plugin-flow/src/templates/index.ts b/packages/plugin-flow/src/templates/index.ts index 1f6a3878e0..66b27b1854 100644 --- a/packages/plugin-flow/src/templates/index.ts +++ b/packages/plugin-flow/src/templates/index.ts @@ -8,7 +8,9 @@ Extract the following information about the requested transfer: - Field "token": Cadence Resource Identifier or ERC20 contract address (if not native token). this field should be null if the token is native token: $FLOW or FLOW. Examples for this field: 1. For Cadence resource identifier, the field should be "A.1654653399040a61.ContractName" 2. For ERC20 contract address, the field should be "0xe6ffc15a5bde7dd33c127670ba2b9fcb82db971a" -- Field "amount": Amount to transfer +- Field "amount": Amount to transfer, it should be a number or a string. Examples for this field: + 1. "1000" + 2. 1000 - Field "to": Recipient wallet address, can be EVM address or Cadence address. Examples for this field: 1. Cadence address: "0x1654653399040a61" 2. EVM address: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e" @@ -21,7 +23,7 @@ Respond with a JSON markdown block containing only the extracted values. Use nul \`\`\`json { "token": string | null - "amount": string | null, + "amount": number | string | null, "to": string | null, "matched": boolean } diff --git a/packages/plugin-goat/README.md b/packages/plugin-goat/README.md index fcac78c573..4baa1bd150 100644 --- a/packages/plugin-goat/README.md +++ b/packages/plugin-goat/README.md @@ -1,12 +1,39 @@ -# Goat Plugin -Example plugin setup of how you can integrate [Goat](https://ohmygoat.dev/) tools and plugins with Eliza. - -Adds onchain capabilities to your agent to send and check balances of ETH and USDC. Add all the capabilities you need by adding more plugins! - -## Setup -1. Configure your wallet (key pair, smart wallet, etc. see all available wallets at [https://ohmygoat.dev/wallets](https://ohmygoat.dev/wallets)) -2. Add the plugins you need (uniswap, zora, polymarket, etc. see all available plugins at [https://ohmygoat.dev/chains-wallets-plugins](https://ohmygoat.dev/chains-wallets-plugins)) -3. Select a chain (see all available chains at [https://ohmygoat.dev/chains](https://ohmygoat.dev/chains)) -4. Import and add the plugin to your Eliza agent -5. Build the project -6. Add the necessary environment variables to set up your wallet and plugins +# GOAT Plugin +[GOAT](https://ohmygoat.dev/) 🐐 (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain tools such as wallets, being able to hold or trade tokens, or interacting with blockchain smart contracts, to your AI agent. + +This plugin integrates GOAT with Eliza, giving your agent the ability to interact with many different protocols. The current setup adds onchain capabilities to your agent to send and check balances of ETH and USDC. Add all the capabilities you need by adding more plugins (read below for more information)! + +## Configure GOAT for your use case +1. Configure the chain you want to use by updating the `wallet.ts` file (see all available chains at [https://ohmygoat.dev/chains](https://ohmygoat.dev/chains)) +2. Add the plugins you need to your `getOnChainActions` function (uniswap, polymarket, etc. see all available plugins at [https://ohmygoat.dev/chains-wallets-plugins](https://ohmygoat.dev/chains-wallets-plugins)) +3. Build the project running `pnpm build` +4. Add the necessary environment variables to set up your wallet and plugins +5. Run your agent! + +## Common Issues +1. **Agent not executing an action**: + - If you are also using the EVM Plugin, sometimes the agent might confuse the action name with an EVM Plugin action name instead of the GOAT Plugin action. Removing the EVM Plugin should fix this issue. There is no need for you to use both plugins at the same time. + - If you are using Trump as a character it might be tricky to get them to perform any action since the character is full of prompts that aim to change the topic of the conversation. To fix this try using a different character or create your own with prompts that are more suitable to what the agent is supposed to do. + +## Plugins +GOAT itself has several plugins for interacting with different protocols such as Polymarket, Uniswap, and more. (see all available plugins at [https://ohmygoat.dev/chains-wallets-plugins](https://ohmygoat.dev/chains-wallets-plugins)) + +You can easily add them by installing them and adding them to the `getOnChainActions` function: + +```typescript +const tools = getOnChainActions({ + wallet: walletClient, + plugins: [ + sendETH(), + erc20({ tokens: [USDC, PEPE] }), + polymarket(), + uniswap(), + // ... + ], +}) +``` + +## Wallets +GOAT supports many different wallets from key pairs to [Crossmint Smart Wallets](https://docs.crossmint.com/wallets/smart-wallets/overview) and Coinbase. + +Read more about wallets at [https://ohmygoat.dev/wallets](https://ohmygoat.dev/wallets). diff --git a/packages/plugin-goat/src/actions.ts b/packages/plugin-goat/src/actions.ts index d58f124926..df4f1c906b 100644 --- a/packages/plugin-goat/src/actions.ts +++ b/packages/plugin-goat/src/actions.ts @@ -1,10 +1,9 @@ import { type WalletClient, type Plugin, - getDeferredTools, addParametersToDescription, - type ChainForWalletClient, - type DeferredTool, + type Tool, + getTools, } from "@goat-sdk/core"; import { type Action, @@ -19,10 +18,8 @@ import { } from "@ai16z/eliza"; type GetOnChainActionsParams = { - chain: ChainForWalletClient; - getWalletClient: (runtime: IAgentRuntime) => Promise; + wallet: TWalletClient; plugins: Plugin[]; - supportsSmartWallets?: boolean; }; /** @@ -32,16 +29,13 @@ type GetOnChainActionsParams = { * @returns */ export async function getOnChainActions({ - getWalletClient, + wallet, plugins, - chain, - supportsSmartWallets, }: GetOnChainActionsParams): Promise { - const tools = await getDeferredTools({ + const tools = await getTools({ + wallet, plugins, wordForTool: "action", - chain, - supportsSmartWallets, }); return tools @@ -49,13 +43,10 @@ export async function getOnChainActions({ ...action, name: action.name.toUpperCase(), })) - .map((tool) => createAction(tool, getWalletClient)); + .map((tool) => createAction(tool)); } -function createAction( - tool: DeferredTool, - getWalletClient: (runtime: IAgentRuntime) => Promise -): Action { +function createAction(tool: Tool): Action { return { name: tool.name, similes: [], @@ -69,7 +60,6 @@ function createAction( callback?: HandlerCallback ): Promise => { try { - const walletClient = await getWalletClient(runtime); let currentState = state ?? (await runtime.composeState(message)); currentState = @@ -94,10 +84,7 @@ function createAction( return false; } - const result = await tool.method( - walletClient, - parsedParameters.data - ); + const result = await tool.method(parsedParameters.data); const responseContext = composeResponseContext( tool, result, @@ -124,10 +111,7 @@ function createAction( }; } -function composeParameterContext( - tool: DeferredTool, - state: State -): string { +function composeParameterContext(tool: Tool, state: State): string { const contextTemplate = `{{recentMessages}} Given the recent messages, extract the following information for the action "${tool.name}": @@ -136,10 +120,10 @@ ${addParametersToDescription("", tool.parameters)} return composeContext({ state, template: contextTemplate }); } -async function generateParameters( +async function generateParameters( runtime: IAgentRuntime, context: string, - tool: DeferredTool + tool: Tool ): Promise { const { object } = await generateObjectV2({ runtime, @@ -151,8 +135,8 @@ async function generateParameters( return object; } -function composeResponseContext( - tool: DeferredTool, +function composeResponseContext( + tool: Tool, result: unknown, state: State ): string { diff --git a/packages/plugin-goat/src/index.ts b/packages/plugin-goat/src/index.ts index 281d95a162..10e8583c3f 100644 --- a/packages/plugin-goat/src/index.ts +++ b/packages/plugin-goat/src/index.ts @@ -1,27 +1,31 @@ -import type { Plugin } from '@ai16z/eliza' -import { getOnChainActions } from './actions'; -import { erc20, USDC } from '@goat-sdk/plugin-erc20'; -import { chain, getWalletClient, walletProvider } from './provider'; -import { sendETH } from '@goat-sdk/core'; +import type { Plugin } from "@ai16z/eliza"; +import { getOnChainActions } from "./actions"; +import { erc20, USDC } from "@goat-sdk/plugin-erc20"; +import { sendETH } from "@goat-sdk/core"; +import { getWalletClient, getWalletProvider } from "./wallet"; -export const goatPlugin: Plugin = { - name: "[GOAT] Onchain Actions", - description: "Base integration plugin", - providers: [walletProvider], - evaluators: [], - services: [], - actions: [ - ...(await getOnChainActions({ - getWalletClient, - // Add plugins here based on what actions you want to use - // See all available plugins at https://ohmygoat.dev/chains-wallets-plugins#plugins - plugins: [sendETH(), erc20({ tokens: [USDC] })], - chain: { - type: "evm", - id: chain.id, - }, - })), - ], -}; +async function createGoatPlugin( + getSetting: (key: string) => string | undefined +): Promise { + const walletClient = getWalletClient(getSetting); + const actions = await getOnChainActions({ + wallet: walletClient, + // Add plugins here based on what actions you want to use + // See all available plugins at https://ohmygoat.dev/chains-wallets-plugins#plugins + plugins: [ + sendETH(), + erc20({ tokens: [USDC] }), + ], + }); -export default goatPlugin + return { + name: "[GOAT] Onchain Actions", + description: "Base integration plugin", + providers: [getWalletProvider(walletClient)], + evaluators: [], + services: [], + actions: actions, + }; +} + +export default createGoatPlugin; diff --git a/packages/plugin-goat/src/provider.ts b/packages/plugin-goat/src/provider.ts deleted file mode 100644 index 20b4356b6f..0000000000 --- a/packages/plugin-goat/src/provider.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { createWalletClient, http } from "viem"; -import { privateKeyToAccount } from "viem/accounts"; -import { base } from "viem/chains"; - -import { Memory, Provider, State, type IAgentRuntime } from "@ai16z/eliza"; -import { viem } from "@goat-sdk/wallet-viem"; - - -// Add the chain you want to use, remember to update also -// the EVM_PROVIDER_URL to the correct one for the chain -export const chain = base; - -/** - * Create a wallet client for the given runtime. - * - * You can change it to use a different wallet client such as Crossmint smart wallets or others. - * - * See all available wallet clients at https://ohmygoat.dev/wallets - * - * @param runtime - * @returns Wallet client - */ -export async function getWalletClient(runtime: IAgentRuntime) { - const privateKey = runtime.getSetting("EVM_PRIVATE_KEY"); - if (!privateKey) throw new Error("EVM_PRIVATE_KEY not configured"); - - const provider = runtime.getSetting("EVM_PROVIDER_URL"); - if (!provider) throw new Error("EVM_PROVIDER_URL not configured"); - - const walletClient = createWalletClient({ - account: privateKeyToAccount(privateKey as `0x${string}`), - chain: chain, - transport: http(provider), - }); - return viem(walletClient); -} - -export const walletProvider: Provider = { - async get( - runtime: IAgentRuntime, - message: Memory, - state?: State - ): Promise { - try { - const walletClient = await getWalletClient(runtime); - const address = walletClient.getAddress(); - const balance = await walletClient.balanceOf(address); - return `EVM Wallet Address: ${address}\nBalance: ${balance} ETH`; - } catch (error) { - console.error("Error in EVM wallet provider:", error); - return null; - } - }, -}; diff --git a/packages/plugin-goat/src/wallet.ts b/packages/plugin-goat/src/wallet.ts new file mode 100644 index 0000000000..6492c95af7 --- /dev/null +++ b/packages/plugin-goat/src/wallet.ts @@ -0,0 +1,42 @@ +import { WalletClient } from "@goat-sdk/core"; +import { viem } from "@goat-sdk/wallet-viem"; +import { createWalletClient, http } from "viem"; +import { privateKeyToAccount } from "viem/accounts"; +import { base } from "viem/chains"; + +// Add the chain you want to use, remember to update also +// the EVM_PROVIDER_URL to the correct one for the chain +export const chain = base; + +export function getWalletClient( + getSetting: (key: string) => string | undefined +) { + const privateKey = getSetting("EVM_PRIVATE_KEY"); + if (!privateKey) return null; + + const provider = getSetting("EVM_PROVIDER_URL"); + if (!provider) throw new Error("EVM_PROVIDER_URL not configured"); + + const wallet = createWalletClient({ + account: privateKeyToAccount(privateKey as `0x${string}`), + chain: chain, + transport: http(provider), + }); + + return viem(wallet); +} + +export function getWalletProvider(walletClient: WalletClient) { + return { + async get(): Promise { + try { + const address = walletClient.getAddress(); + const balance = await walletClient.balanceOf(address); + return `EVM Wallet Address: ${address}\nBalance: ${balance} ETH`; + } catch (error) { + console.error("Error in EVM wallet provider:", error); + return null; + } + }, + }; +} diff --git a/packages/plugin-buttplug/.npmignore b/packages/plugin-intiface/.npmignore similarity index 100% rename from packages/plugin-buttplug/.npmignore rename to packages/plugin-intiface/.npmignore diff --git a/packages/plugin-buttplug/intiface-engine/CHANGELOG.md b/packages/plugin-intiface/intiface-engine/CHANGELOG.md similarity index 100% rename from packages/plugin-buttplug/intiface-engine/CHANGELOG.md rename to packages/plugin-intiface/intiface-engine/CHANGELOG.md diff --git a/packages/plugin-buttplug/intiface-engine/README.md b/packages/plugin-intiface/intiface-engine/README.md similarity index 100% rename from packages/plugin-buttplug/intiface-engine/README.md rename to packages/plugin-intiface/intiface-engine/README.md diff --git a/packages/plugin-buttplug/intiface-engine/intiface-engine b/packages/plugin-intiface/intiface-engine/intiface-engine similarity index 100% rename from packages/plugin-buttplug/intiface-engine/intiface-engine rename to packages/plugin-intiface/intiface-engine/intiface-engine diff --git a/packages/plugin-buttplug/package.json b/packages/plugin-intiface/package.json similarity index 92% rename from packages/plugin-buttplug/package.json rename to packages/plugin-intiface/package.json index e00b348aad..16cc574f3e 100644 --- a/packages/plugin-buttplug/package.json +++ b/packages/plugin-intiface/package.json @@ -1,5 +1,5 @@ { - "name": "@ai16z/plugin-buttplug", + "name": "@ai16z/plugin-intiface", "version": "0.1.5-alpha.5", "main": "dist/index.js", "type": "module", diff --git a/packages/plugin-buttplug/src/environment.ts b/packages/plugin-intiface/src/environment.ts similarity index 78% rename from packages/plugin-buttplug/src/environment.ts rename to packages/plugin-intiface/src/environment.ts index 47ba5c0cd5..9359952df7 100644 --- a/packages/plugin-buttplug/src/environment.ts +++ b/packages/plugin-intiface/src/environment.ts @@ -1,10 +1,10 @@ import { IAgentRuntime } from "@ai16z/eliza"; import { z } from "zod"; -export const buttplugEnvSchema = z +export const intifaceEnvSchema = z .object({ INTIFACE_URL: z.string().default("ws://localhost:12345"), - INTIFACE_NAME: z.string().default("Eliza Buttplug Client"), + INTIFACE_NAME: z.string().default("Eliza Intiface Client"), DEVICE_NAME: z.string().default("Lovense Nora"), }) .refine( @@ -20,11 +20,11 @@ export const buttplugEnvSchema = z } ); -export type ButtplugConfig = z.infer; +export type IntifaceConfig = z.infer; -export async function validateButtplugConfig( +export async function validateIntifaceConfig( runtime: IAgentRuntime -): Promise { +): Promise { try { const config = { INTIFACE_URL: @@ -36,14 +36,14 @@ export async function validateButtplugConfig( runtime.getSetting("DEVICE_NAME") || process.env.DEVICE_NAME, }; - return buttplugEnvSchema.parse(config); + return intifaceEnvSchema.parse(config); } catch (error) { if (error instanceof z.ZodError) { const errorMessages = error.errors .map((err) => `${err.path.join(".")}: ${err.message}`) .join("\n"); throw new Error( - `Buttplug configuration validation failed:\n${errorMessages}` + `Intiface configuration validation failed:\n${errorMessages}` ); } throw error; diff --git a/packages/plugin-buttplug/src/index.ts b/packages/plugin-intiface/src/index.ts similarity index 93% rename from packages/plugin-buttplug/src/index.ts rename to packages/plugin-intiface/src/index.ts index b9da82b015..3cf09276e9 100644 --- a/packages/plugin-buttplug/src/index.ts +++ b/packages/plugin-intiface/src/index.ts @@ -1,5 +1,5 @@ import { ButtplugClient, ButtplugNodeWebsocketClientConnector } from "buttplug"; -import { validateButtplugConfig, type ButtplugConfig } from "./environment"; +import { validateIntifaceConfig, type IntifaceConfig } from "./environment"; import type { Action, HandlerCallback, @@ -15,7 +15,7 @@ import { shutdownIntifaceEngine, } from "./utils"; -export interface IButtplugService extends Service { +export interface IIntifaceService extends Service { vibrate(strength: number, duration: number): Promise; rotate?(strength: number, duration: number): Promise; getBatteryLevel?(): Promise; @@ -23,14 +23,14 @@ export interface IButtplugService extends Service { getDevices(): any[]; } -export class ButtplugService extends Service implements IButtplugService { - static serviceType: ServiceType = ServiceType.BUTTPLUG; +export class IntifaceService extends Service implements IIntifaceService { + static serviceType: ServiceType = ServiceType.INTIFACE; private client: ButtplugClient; private connected = false; private devices: Map = new Map(); private vibrateQueue: VibrateEvent[] = []; private isProcessingQueue = false; - private config: ButtplugConfig | null = null; + private config: IntifaceConfig | null = null; private maxVibrationIntensity = 1; private rampUpAndDown = false; private rampSteps = 20; @@ -62,16 +62,16 @@ export class ButtplugService extends Service implements IButtplugService { } await shutdownIntifaceEngine(); } catch (error) { - console.error("[ButtplugService] Cleanup error:", error); + console.error("[IntifaceService] Cleanup error:", error); } } - getInstance(): IButtplugService { + getInstance(): IIntifaceService { return this; } async initialize(runtime: IAgentRuntime): Promise { - this.config = await validateButtplugConfig(runtime); + this.config = await validateIntifaceConfig(runtime); this.preferredDeviceName = this.config.DEVICE_NAME; this.client = new ButtplugClient(this.config.INTIFACE_NAME); @@ -118,7 +118,7 @@ export class ButtplugService extends Service implements IButtplugService { await new Promise((r) => setTimeout(r, 2000)); } else { console.error( - "Failed to connect to Buttplug server after all retries:", + "Failed to connect to Intiface server after all retries:", error ); throw error; @@ -144,7 +144,7 @@ export class ButtplugService extends Service implements IButtplugService { private async ensureDeviceAvailable() { if (!this.connected) { - throw new Error("Not connected to Buttplug server"); + throw new Error("Not connected to Intiface server"); } if (this.devices.size === 0) { @@ -325,7 +325,7 @@ const vibrateAction: Action = { description: "Control vibration intensity of connected devices", validate: async (runtime: IAgentRuntime, _message: Memory) => { try { - await validateButtplugConfig(runtime); + await validateIntifaceConfig(runtime); return true; } catch { return false; @@ -338,11 +338,11 @@ const vibrateAction: Action = { options: any, callback: HandlerCallback ) => { - const service = runtime.getService( - ServiceType.BUTTPLUG + const service = runtime.getService( + ServiceType.INTIFACE ); if (!service) { - throw new Error("Buttplug service not available"); + throw new Error("Intiface service not available"); } // Extract intensity and duration from message @@ -435,7 +435,7 @@ const rotateAction: Action = { description: "Control rotation intensity of connected devices", validate: async (runtime: IAgentRuntime, _message: Memory) => { try { - await validateButtplugConfig(runtime); + await validateIntifaceConfig(runtime); return true; } catch { return false; @@ -448,8 +448,8 @@ const rotateAction: Action = { options: any, callback: HandlerCallback ) => { - const service = runtime.getService( - ServiceType.BUTTPLUG + const service = runtime.getService( + ServiceType.INTIFACE ); if (!service || !service.rotate) { throw new Error("Rotation not supported"); @@ -493,7 +493,7 @@ const batteryAction: Action = { description: "Check battery level of connected devices", validate: async (runtime: IAgentRuntime, _message: Memory) => { try { - await validateButtplugConfig(runtime); + await validateIntifaceConfig(runtime); return true; } catch { return false; @@ -506,8 +506,8 @@ const batteryAction: Action = { options: any, callback: HandlerCallback ) => { - const service = runtime.getService( - ServiceType.BUTTPLUG + const service = runtime.getService( + ServiceType.INTIFACE ); if (!service || !service.getBatteryLevel) { throw new Error("Battery level check not supported"); @@ -573,13 +573,13 @@ interface VibrateEvent { deviceId?: number; } -export const buttplugPlugin: Plugin = { - name: "buttplug", +export const intifacePlugin: Plugin = { + name: "intiface", description: "Controls intimate hardware devices", actions: [vibrateAction, rotateAction, batteryAction], evaluators: [], providers: [], - services: [new ButtplugService()], + services: [new IntifaceService()], }; -export default buttplugPlugin; +export default intifacePlugin; diff --git a/packages/plugin-buttplug/src/buttplug-user-device-config.json b/packages/plugin-intiface/src/intiface-user-device-config.json similarity index 100% rename from packages/plugin-buttplug/src/buttplug-user-device-config.json rename to packages/plugin-intiface/src/intiface-user-device-config.json diff --git a/packages/plugin-buttplug/src/utils.ts b/packages/plugin-intiface/src/utils.ts similarity index 97% rename from packages/plugin-buttplug/src/utils.ts rename to packages/plugin-intiface/src/utils.ts index 43e930dbf4..12019898d9 100644 --- a/packages/plugin-buttplug/src/utils.ts +++ b/packages/plugin-intiface/src/utils.ts @@ -24,7 +24,7 @@ export async function isPortAvailable(port: number): Promise { export async function startIntifaceEngine(): Promise { const configPath = path.join( __dirname, - "../src/buttplug-user-device-config.json" + "../src/intiface-user-device-config.json" ); try { const child = spawn( @@ -34,7 +34,7 @@ export async function startIntifaceEngine(): Promise { "12345", "--use-bluetooth-le", "--server-name", - "Eliza Buttplugin Server", + "Eliza Intiface Server", "--use-device-websocket-server", "--user-device-config-file", configPath, diff --git a/packages/plugin-buttplug/test/buttplug-user-device-config-test.json b/packages/plugin-intiface/test/buttplug-user-device-config-test.json similarity index 100% rename from packages/plugin-buttplug/test/buttplug-user-device-config-test.json rename to packages/plugin-intiface/test/buttplug-user-device-config-test.json diff --git a/packages/plugin-buttplug/test/fake-buttplug.ts b/packages/plugin-intiface/test/fake-buttplug.ts similarity index 100% rename from packages/plugin-buttplug/test/fake-buttplug.ts rename to packages/plugin-intiface/test/fake-buttplug.ts diff --git a/packages/plugin-buttplug/test/simulate.ts b/packages/plugin-intiface/test/simulate.ts similarity index 100% rename from packages/plugin-buttplug/test/simulate.ts rename to packages/plugin-intiface/test/simulate.ts diff --git a/packages/plugin-buttplug/tsconfig.json b/packages/plugin-intiface/tsconfig.json similarity index 100% rename from packages/plugin-buttplug/tsconfig.json rename to packages/plugin-intiface/tsconfig.json diff --git a/packages/plugin-buttplug/tsup.config.ts b/packages/plugin-intiface/tsup.config.ts similarity index 100% rename from packages/plugin-buttplug/tsup.config.ts rename to packages/plugin-intiface/tsup.config.ts diff --git a/packages/plugin-node/src/environment.ts b/packages/plugin-node/src/environment.ts index 5d30bb93ed..ef524d03a3 100644 --- a/packages/plugin-node/src/environment.ts +++ b/packages/plugin-node/src/environment.ts @@ -71,6 +71,15 @@ export async function validateNodeConfig( // VITS settings VITS_VOICE: voiceSettings?.model || process.env.VITS_VOICE, VITS_MODEL: process.env.VITS_MODEL, + + // AWS settings (only include if present) + ...(runtime.getSetting("AWS_ACCESS_KEY_ID") && { + AWS_ACCESS_KEY_ID: runtime.getSetting("AWS_ACCESS_KEY_ID"), + AWS_SECRET_ACCESS_KEY: runtime.getSetting("AWS_SECRET_ACCESS_KEY"), + AWS_REGION: runtime.getSetting("AWS_REGION"), + AWS_S3_BUCKET: runtime.getSetting("AWS_S3_BUCKET"), + AWS_S3_UPLOAD_PATH: runtime.getSetting("AWS_S3_UPLOAD_PATH"), + }), }; return nodeEnvSchema.parse(config); diff --git a/packages/plugin-node/src/services/awsS3.ts b/packages/plugin-node/src/services/awsS3.ts index 16a50e13a3..57600ada5b 100644 --- a/packages/plugin-node/src/services/awsS3.ts +++ b/packages/plugin-node/src/services/awsS3.ts @@ -26,32 +26,28 @@ interface JsonUploadResult extends UploadResult { export class AwsS3Service extends Service implements IAwsS3Service { static serviceType: ServiceType = ServiceType.AWS_S3; - private s3Client: S3Client; - private bucket: string; - private fileUploadPath: string; - getInstance(): IAwsS3Service { - return AwsS3Service.getInstance(); - } + private s3Client: S3Client | null = null; + private bucket: string = ''; + private fileUploadPath: string = ''; private runtime: IAgentRuntime | null = null; async initialize(runtime: IAgentRuntime): Promise { console.log("Initializing AwsS3Service"); this.runtime = runtime; - const AWS_ACCESS_KEY_ID = runtime.getSetting("AWS_ACCESS_KEY_ID"); - const AWS_SECRET_ACCESS_KEY = runtime.getSetting( - "AWS_SECRET_ACCESS_KEY" - ); - const AWS_REGION = runtime.getSetting("AWS_REGION"); - const AWS_S3_BUCKET = runtime.getSetting("AWS_S3_BUCKET"); - if ( - !AWS_ACCESS_KEY_ID || - !AWS_SECRET_ACCESS_KEY || - !AWS_REGION || - !AWS_S3_BUCKET - ) { - throw new Error( - "Missing required AWS credentials in environment variables" - ); + this.fileUploadPath = runtime.getSetting("AWS_S3_UPLOAD_PATH") ?? ""; + } + + private async initializeS3Client(): Promise { + if (this.s3Client) return true; + if (!this.runtime) return false; + + const AWS_ACCESS_KEY_ID = this.runtime.getSetting("AWS_ACCESS_KEY_ID"); + const AWS_SECRET_ACCESS_KEY = this.runtime.getSetting("AWS_SECRET_ACCESS_KEY"); + const AWS_REGION = this.runtime.getSetting("AWS_REGION"); + const AWS_S3_BUCKET = this.runtime.getSetting("AWS_S3_BUCKET"); + + if (!AWS_ACCESS_KEY_ID || !AWS_SECRET_ACCESS_KEY || !AWS_REGION || !AWS_S3_BUCKET) { + return false; } this.s3Client = new S3Client({ @@ -61,8 +57,8 @@ export class AwsS3Service extends Service implements IAwsS3Service { secretAccessKey: AWS_SECRET_ACCESS_KEY, }, }); - this.fileUploadPath = runtime.getSetting("AWS_S3_UPLOAD_PATH") ?? ""; this.bucket = AWS_S3_BUCKET; + return true; } async uploadFile( @@ -71,6 +67,13 @@ export class AwsS3Service extends Service implements IAwsS3Service { expiresIn: number = 900 ): Promise { try { + if (!await this.initializeS3Client()) { + return { + success: false, + error: "AWS S3 credentials not configured", + }; + } + if (!fs.existsSync(filePath)) { return { success: false, @@ -120,10 +123,7 @@ export class AwsS3Service extends Service implements IAwsS3Service { } catch (error) { return { success: false, - error: - error instanceof Error - ? error.message - : "Unknown error occurred", + error: error instanceof Error ? error.message : "Unknown error occurred", }; } } @@ -135,6 +135,10 @@ export class AwsS3Service extends Service implements IAwsS3Service { fileName: string, expiresIn: number = 900 ): Promise { + if (!await this.initializeS3Client()) { + throw new Error("AWS S3 credentials not configured"); + } + const command = new GetObjectCommand({ Bucket: this.bucket, Key: fileName, @@ -171,6 +175,13 @@ export class AwsS3Service extends Service implements IAwsS3Service { expiresIn: number = 900 ): Promise { try { + if (!await this.initializeS3Client()) { + return { + success: false, + error: "AWS S3 credentials not configured", + }; + } + // Validate input if (!jsonData) { return { diff --git a/packages/plugin-solana/package.json b/packages/plugin-solana/package.json index 057246e23a..2aa671fb7a 100644 --- a/packages/plugin-solana/package.json +++ b/packages/plugin-solana/package.json @@ -7,6 +7,7 @@ "dependencies": { "@ai16z/eliza": "workspace:*", "@ai16z/plugin-trustdb": "workspace:*", + "@ai16z/plugin-tee": "workspace:*", "@coral-xyz/anchor": "0.30.1", "@solana/spl-token": "0.4.9", "@solana/web3.js": "1.95.8", diff --git a/packages/plugin-solana/src/actions/pumpfun.ts b/packages/plugin-solana/src/actions/pumpfun.ts index 06858e0022..5cc1ebca18 100644 --- a/packages/plugin-solana/src/actions/pumpfun.ts +++ b/packages/plugin-solana/src/actions/pumpfun.ts @@ -5,7 +5,6 @@ import { Connection, Keypair, PublicKey } from "@solana/web3.js"; import { CreateTokenMetadata, PriorityFee, PumpFunSDK } from "pumpdotfun-sdk"; import { getAssociatedTokenAddressSync } from "@solana/spl-token"; -import bs58 from "bs58"; import { settings, ActionExample, @@ -241,6 +240,7 @@ const promptConfirmation = async (): Promise => { // Save the base64 data to a file import * as fs from "fs"; import * as path from "path"; +import { getWalletKey } from "../keypairUtils.ts"; const pumpfunTemplate = `Respond with a JSON markdown block containing only the extracted values. Use null for any values that cannot be determined. @@ -387,11 +387,10 @@ export default { const slippage = "2000"; try { // Get private key from settings and create deployer keypair - const privateKeyString = - runtime.getSetting("SOLANA_PRIVATE_KEY") ?? - runtime.getSetting("WALLET_PRIVATE_KEY"); - const secretKey = bs58.decode(privateKeyString); - const deployerKeypair = Keypair.fromSecretKey(secretKey); + const { keypair: deployerKeypair } = await getWalletKey( + runtime, + true + ); // Generate new mint keypair const mintKeypair = Keypair.generate(); diff --git a/packages/plugin-solana/src/actions/swap.ts b/packages/plugin-solana/src/actions/swap.ts index 4fe2f311a8..434e2cb816 100644 --- a/packages/plugin-solana/src/actions/swap.ts +++ b/packages/plugin-solana/src/actions/swap.ts @@ -1,7 +1,5 @@ -import bs58 from "bs58"; import { Connection, - Keypair, PublicKey, VersionedTransaction, } from "@solana/web3.js"; @@ -24,6 +22,7 @@ import { TokenProvider } from "../providers/token.ts"; import { TrustScoreManager } from "../providers/trustScoreProvider.ts"; import { walletProvider, WalletProvider } from "../providers/wallet.ts"; import { getTokenDecimals } from "./swapUtils.ts"; +import { getWalletKey } from "../keypairUtils.ts"; async function swapToken( connection: Connection, @@ -145,12 +144,10 @@ Respond with a JSON markdown block containing only the extracted values. Use nul // get all the tokens in the wallet using the wallet provider async function getTokensInWallet(runtime: IAgentRuntime) { + const { publicKey } = await getWalletKey(runtime, false); const walletProvider = new WalletProvider( new Connection("https://api.mainnet-beta.solana.com"), - new PublicKey( - runtime.getSetting("SOLANA_PUBLIC_KEY") ?? - runtime.getSetting("WALLET_PUBLIC_KEY") - ) + publicKey ); const walletInfo = await walletProvider.fetchPortfolioValue(runtime); @@ -293,9 +290,9 @@ export const executeSwap: Action = { const connection = new Connection( "https://api.mainnet-beta.solana.com" ); - const walletPublicKey = new PublicKey( - runtime.getSetting("SOLANA_PUBLIC_KEY") ?? - runtime.getSetting("WALLET_PUBLIC_KEY") + const { publicKey: walletPublicKey } = await getWalletKey( + runtime, + false ); const provider = new WalletProvider(connection, walletPublicKey); @@ -322,44 +319,11 @@ export const executeSwap: Action = { VersionedTransaction.deserialize(transactionBuf); console.log("Preparing to sign transaction..."); - const privateKeyString = - runtime.getSetting("SOLANA_PRIVATE_KEY") ?? - runtime.getSetting("WALLET_PRIVATE_KEY"); - - // Handle different private key formats - let secretKey: Uint8Array; - try { - // First try to decode as base58 - secretKey = bs58.decode(privateKeyString); - // eslint-disable-next-line - } catch (e) { - try { - // If that fails, try base64 - secretKey = Uint8Array.from( - Buffer.from(privateKeyString, "base64") - ); - // eslint-disable-next-line - } catch (e2) { - throw new Error("Invalid private key format"); - } - } - - // Verify the key length - if (secretKey.length !== 64) { - console.error("Invalid key length:", secretKey.length); - throw new Error( - `Invalid private key length: ${secretKey.length}. Expected 64 bytes.` - ); - } console.log("Creating keypair..."); - const keypair = Keypair.fromSecretKey(secretKey); - + const { keypair } = await getWalletKey(runtime, true); // Verify the public key matches what we expect - const expectedPublicKey = - runtime.getSetting("SOLANA_PUBLIC_KEY") ?? - runtime.getSetting("WALLET_PUBLIC_KEY"); - if (keypair.publicKey.toBase58() !== expectedPublicKey) { + if (keypair.publicKey.toBase58() !== walletPublicKey.toBase58()) { throw new Error( "Generated public key doesn't match expected public key" ); diff --git a/packages/plugin-solana/src/actions/swapDao.ts b/packages/plugin-solana/src/actions/swapDao.ts index e2928c7441..2cadb4f78f 100644 --- a/packages/plugin-solana/src/actions/swapDao.ts +++ b/packages/plugin-solana/src/actions/swapDao.ts @@ -6,6 +6,7 @@ import { } from "@ai16z/eliza"; import { Connection, Keypair, PublicKey, Transaction } from "@solana/web3.js"; import { getQuote } from "./swapUtils.ts"; +import { getWalletKey } from "../keypairUtils.ts"; async function invokeSwapDao( connection: Connection, @@ -66,15 +67,9 @@ export const executeSwapForDAO: Action = { const connection = new Connection( runtime.getSetting("RPC_URL") as string ); - const authority = Keypair.fromSecretKey( - Uint8Array.from( - Buffer.from( - runtime.getSetting("SOLANA_PRIVATE_KEY") ?? - runtime.getSetting("WALLET_PRIVATE_KEY"), // should be the authority private key - "base64" - ) - ) - ); + + const { keypair: authority } = await getWalletKey(runtime, true); + const daoMint = new PublicKey(runtime.getSetting("DAO_MINT")); // DAO mint address // Derive PDAs diff --git a/packages/plugin-solana/src/actions/transfer.ts b/packages/plugin-solana/src/actions/transfer.ts index 13403be7a3..b8b0d12aec 100644 --- a/packages/plugin-solana/src/actions/transfer.ts +++ b/packages/plugin-solana/src/actions/transfer.ts @@ -2,12 +2,10 @@ import { getAssociatedTokenAddressSync, createTransferInstruction, } from "@solana/spl-token"; -import bs58 from "bs58"; import { elizaLogger, settings } from "@ai16z/eliza"; import { Connection, - Keypair, PublicKey, TransactionMessage, VersionedTransaction, @@ -24,6 +22,7 @@ import { type Action, } from "@ai16z/eliza"; import { composeContext } from "@ai16z/eliza"; +import { getWalletKey } from "../keypairUtils"; import { generateObjectDEPRECATED } from "@ai16z/eliza"; export interface TransferContent extends Content { @@ -138,11 +137,10 @@ export default { } try { - const privateKeyString = - runtime.getSetting("SOLANA_PRIVATE_KEY") ?? - runtime.getSetting("WALLET_PRIVATE_KEY"); - const secretKey = bs58.decode(privateKeyString); - const senderKeypair = Keypair.fromSecretKey(secretKey); + const { keypair: senderKeypair } = await getWalletKey( + runtime, + true + ); const connection = new Connection(settings.RPC_URL!); diff --git a/packages/plugin-solana/src/environment.ts b/packages/plugin-solana/src/environment.ts index b20f375ec3..995f5979f0 100644 --- a/packages/plugin-solana/src/environment.ts +++ b/packages/plugin-solana/src/environment.ts @@ -2,14 +2,26 @@ import { IAgentRuntime } from "@ai16z/eliza"; import { z } from "zod"; export const solanaEnvSchema = z.object({ - WALLET_SECRET_KEY: z.string().min(1, "Wallet secret key is required"), - WALLET_PUBLIC_KEY: z.string().min(1, "Wallet public key is required"), - SOL_ADDRESS: z.string().min(1, "SOL address is required"), - SLIPPAGE: z.string().min(1, "Slippage is required"), - RPC_URL: z.string().min(1, "RPC URL is required"), - HELIUS_API_KEY: z.string().min(1, "Helius API key is required"), - BIRDEYE_API_KEY: z.string().min(1, "Birdeye API key is required"), -}); + WALLET_SECRET_SALT: z.string().optional(), + }).and( + z.union([ + z.object({ + WALLET_SECRET_KEY: z.string().min(1, "Wallet secret key is required"), + WALLET_PUBLIC_KEY: z.string().min(1, "Wallet public key is required"), + }), + z.object({ + WALLET_SECRET_SALT: z.string().min(1, "Wallet secret salt is required"), + }) + ]) + ).and( + z.object({ + SOL_ADDRESS: z.string().min(1, "SOL address is required"), + SLIPPAGE: z.string().min(1, "Slippage is required"), + RPC_URL: z.string().min(1, "RPC URL is required"), + HELIUS_API_KEY: z.string().min(1, "Helius API key is required"), + BIRDEYE_API_KEY: z.string().min(1, "Birdeye API key is required"), + }) +); export type SolanaConfig = z.infer; @@ -18,6 +30,9 @@ export async function validateSolanaConfig( ): Promise { try { const config = { + WALLET_SECRET_SALT: + runtime.getSetting("WALLET_SECRET_SALT") || + process.env.WALLET_SECRET_SALT, WALLET_SECRET_KEY: runtime.getSetting("WALLET_SECRET_KEY") || process.env.WALLET_SECRET_KEY, diff --git a/packages/plugin-solana/src/evaluators/trust.ts b/packages/plugin-solana/src/evaluators/trust.ts index 2d04eaab02..d98282206b 100644 --- a/packages/plugin-solana/src/evaluators/trust.ts +++ b/packages/plugin-solana/src/evaluators/trust.ts @@ -15,7 +15,8 @@ import { TrustScoreManager } from "../providers/trustScoreProvider.ts"; import { TokenProvider } from "../providers/token.ts"; import { WalletProvider } from "../providers/wallet.ts"; import { TrustScoreDatabase } from "@ai16z/plugin-trustdb"; -import { Connection, PublicKey } from "@solana/web3.js"; +import { Connection } from "@solana/web3.js"; +import { getWalletKey } from "../keypairUtils.ts"; const shouldProcessTemplate = `# Task: Decide if the recent messages should be processed for token recommendations. @@ -144,6 +145,8 @@ async function handler(runtime: IAgentRuntime, message: Memory) { ); }); + const { publicKey } = await getWalletKey(runtime, false); + for (const rec of filteredRecommendations) { // create the wallet provider and token provider const walletProvider = new WalletProvider( @@ -151,10 +154,7 @@ async function handler(runtime: IAgentRuntime, message: Memory) { runtime.getSetting("RPC_URL") || "https://api.mainnet-beta.solana.com" ), - new PublicKey( - runtime.getSetting("SOLANA_PUBLIC_KEY") ?? - runtime.getSetting("WALLET_PUBLIC_KEY") - ) + publicKey ); const tokenProvider = new TokenProvider( rec.contractAddress, diff --git a/packages/plugin-solana/src/keypairUtils.ts b/packages/plugin-solana/src/keypairUtils.ts new file mode 100644 index 0000000000..53885ec05a --- /dev/null +++ b/packages/plugin-solana/src/keypairUtils.ts @@ -0,0 +1,80 @@ +import { Keypair, PublicKey } from "@solana/web3.js"; +import { DeriveKeyProvider, TEEMode } from "@ai16z/plugin-tee"; +import bs58 from "bs58"; +import { IAgentRuntime } from "@ai16z/eliza"; + +export interface KeypairResult { + keypair?: Keypair; + publicKey?: PublicKey; +} + +/** + * Gets either a keypair or public key based on TEE mode and runtime settings + * @param runtime The agent runtime + * @param requirePrivateKey Whether to return a full keypair (true) or just public key (false) + * @returns KeypairResult containing either keypair or public key + */ +export async function getWalletKey( + runtime: IAgentRuntime, + requirePrivateKey: boolean = true +): Promise { + const teeMode = runtime.getSetting("TEE_MODE") || TEEMode.OFF; + + if (teeMode !== TEEMode.OFF) { + const walletSecretSalt = runtime.getSetting("WALLET_SECRET_SALT"); + if (!walletSecretSalt) { + throw new Error("WALLET_SECRET_SALT required when TEE_MODE is enabled"); + } + + const deriveKeyProvider = new DeriveKeyProvider(teeMode); + const deriveKeyResult = await deriveKeyProvider.deriveEd25519Keypair( + "/", + walletSecretSalt, + runtime.agentId + ); + + return requirePrivateKey + ? { keypair: deriveKeyResult.keypair } + : { publicKey: deriveKeyResult.keypair.publicKey }; + } + + // TEE mode is OFF + if (requirePrivateKey) { + const privateKeyString = + runtime.getSetting("SOLANA_PRIVATE_KEY") ?? + runtime.getSetting("WALLET_PRIVATE_KEY"); + + if (!privateKeyString) { + throw new Error("Private key not found in settings"); + } + + try { + // First try base58 + const secretKey = bs58.decode(privateKeyString); + return { keypair: Keypair.fromSecretKey(secretKey) }; + } catch (e) { + console.log("Error decoding base58 private key:", e); + try { + // Then try base64 + console.log("Try decoding base64 instead"); + const secretKey = Uint8Array.from( + Buffer.from(privateKeyString, "base64") + ); + return { keypair: Keypair.fromSecretKey(secretKey) }; + } catch (e2) { + console.error("Error decoding private key: ", e2); + throw new Error("Invalid private key format"); + } + } + } else { + const publicKeyString = + runtime.getSetting("SOLANA_PUBLIC_KEY") ?? + runtime.getSetting("WALLET_PUBLIC_KEY"); + + if (!publicKeyString) { + throw new Error("Public key not found in settings"); + } + + return { publicKey: new PublicKey(publicKeyString) }; + } +} \ No newline at end of file diff --git a/packages/plugin-solana/src/providers/simulationSellingService.ts b/packages/plugin-solana/src/providers/simulationSellingService.ts index f77a2c8e19..39d5e5b08d 100644 --- a/packages/plugin-solana/src/providers/simulationSellingService.ts +++ b/packages/plugin-solana/src/providers/simulationSellingService.ts @@ -12,6 +12,7 @@ import { IAgentRuntime } from "@ai16z/eliza"; import { WalletProvider } from "./wallet.ts"; import * as amqp from "amqplib"; import { ProcessedTokenData } from "../types/token.ts"; +import { getWalletKey } from "../keypairUtils.ts"; interface SellDetails { sell_amount: number; @@ -39,13 +40,7 @@ export class SimulationSellingService { this.trustScoreDb = trustScoreDb; this.connection = new Connection(runtime.getSetting("RPC_URL")); - this.walletProvider = new WalletProvider( - this.connection, - new PublicKey( - runtime.getSetting("SOLANA_PUBLIC_KEY") ?? - runtime.getSetting("WALLET_PUBLIC_KEY") - ) - ); + this.initializeWalletProvider(); this.baseMint = new PublicKey( runtime.getSetting("BASE_MINT") || "So11111111111111111111111111111111111111112" @@ -175,6 +170,17 @@ export class SimulationSellingService { } } + /** + * Derives the public key based on the TEE (Trusted Execution Environment) mode and initializes the wallet provider. + * If TEE mode is enabled, derives a keypair using the DeriveKeyProvider with the wallet secret salt and agent ID. + * If TEE mode is disabled, uses the provided Solana public key or wallet public key from settings. + */ + private async initializeWalletProvider(): Promise { + const { publicKey } = await getWalletKey(this.runtime, false); + + this.walletProvider = new WalletProvider(this.connection, publicKey); + } + public async startService() { // starting the service console.log("Starting SellingService..."); diff --git a/packages/plugin-solana/src/providers/token.ts b/packages/plugin-solana/src/providers/token.ts index 802b4c3f0a..a854cf392d 100644 --- a/packages/plugin-solana/src/providers/token.ts +++ b/packages/plugin-solana/src/providers/token.ts @@ -15,7 +15,8 @@ import NodeCache from "node-cache"; import * as path from "path"; import { toBN } from "../bignumber.ts"; import { WalletProvider, Item } from "./wallet.ts"; -import { Connection, PublicKey } from "@solana/web3.js"; +import { Connection } from "@solana/web3.js"; +import { getWalletKey } from "../keypairUtils.ts"; const PROVIDER_CONFIG = { BIRDEYE_API: "https://public-api.birdeye.so", @@ -1102,9 +1103,11 @@ const tokenProvider: Provider = { _state?: State ): Promise => { try { + const { publicKey } = await getWalletKey(runtime, false); + const walletProvider = new WalletProvider( connection, - new PublicKey(PROVIDER_CONFIG.MAIN_WALLET) + publicKey ); const provider = new TokenProvider( diff --git a/packages/plugin-solana/src/providers/wallet.ts b/packages/plugin-solana/src/providers/wallet.ts index 65c4e14938..e712aabe69 100644 --- a/packages/plugin-solana/src/providers/wallet.ts +++ b/packages/plugin-solana/src/providers/wallet.ts @@ -2,6 +2,7 @@ import { IAgentRuntime, Memory, Provider, State } from "@ai16z/eliza"; import { Connection, PublicKey } from "@solana/web3.js"; import BigNumber from "bignumber.js"; import NodeCache from "node-cache"; +import { getWalletKey } from "../keypairUtils"; // Provider configuration const PROVIDER_CONFIG = { @@ -370,13 +371,7 @@ const walletProvider: Provider = { _state?: State ): Promise => { try { - const publicKey = runtime.getSetting("SOLANA_PUBLIC_KEY"); - if (!publicKey) { - console.error( - "SOLANA_PUBLIC_KEY not configured, skipping wallet injection" - ); - return ""; - } + const { publicKey } = await getWalletKey(runtime, false); const connection = new Connection( runtime.getSetting("RPC_URL") || PROVIDER_CONFIG.DEFAULT_RPC @@ -384,7 +379,7 @@ const walletProvider: Provider = { const provider = new WalletProvider( connection, - new PublicKey(publicKey) + publicKey ); return await provider.getFormattedPortfolio(runtime); diff --git a/packages/plugin-tee/eslint.config.mjs b/packages/plugin-tee/eslint.config.mjs new file mode 100644 index 0000000000..92fe5bbebe --- /dev/null +++ b/packages/plugin-tee/eslint.config.mjs @@ -0,0 +1,3 @@ +import eslintGlobalConfig from "../../eslint.config.mjs"; + +export default [...eslintGlobalConfig]; diff --git a/packages/plugin-tee/package.json b/packages/plugin-tee/package.json index 92719d7e90..6793587c8c 100644 --- a/packages/plugin-tee/package.json +++ b/packages/plugin-tee/package.json @@ -6,7 +6,7 @@ "types": "dist/index.d.ts", "dependencies": { "@ai16z/eliza": "workspace:*", - "@phala/dstack-sdk": "0.1.4", + "@phala/dstack-sdk": "0.1.6", "@solana/spl-token": "0.4.9", "@solana/web3.js": "1.95.8", "bignumber": "1.1.0", @@ -19,7 +19,8 @@ }, "scripts": { "build": "tsup --format esm --dts", - "dev": "tsup --format esm --dts --watch" + "dev": "tsup --format esm --dts --watch", + "lint": "eslint . --fix" }, "peerDependencies": { "whatwg-url": "7.1.0" diff --git a/packages/plugin-tee/src/index.ts b/packages/plugin-tee/src/index.ts index dc8dd8d6ff..7f0225b0be 100644 --- a/packages/plugin-tee/src/index.ts +++ b/packages/plugin-tee/src/index.ts @@ -2,6 +2,10 @@ import { Plugin } from "@ai16z/eliza"; import { remoteAttestationProvider } from "./providers/remoteAttestationProvider"; import { deriveKeyProvider } from "./providers/deriveKeyProvider"; +export { DeriveKeyProvider } from "./providers/deriveKeyProvider"; +export { RemoteAttestationProvider } from "./providers/remoteAttestationProvider"; +export { RemoteAttestationQuote, TEEMode } from "./types/tee"; + export const teePlugin: Plugin = { name: "tee", description: diff --git a/packages/plugin-tee/src/providers/deriveKeyProvider.ts b/packages/plugin-tee/src/providers/deriveKeyProvider.ts index 26c4a71efa..65b6e83676 100644 --- a/packages/plugin-tee/src/providers/deriveKeyProvider.ts +++ b/packages/plugin-tee/src/providers/deriveKeyProvider.ts @@ -4,14 +4,56 @@ import crypto from "crypto"; import { DeriveKeyResponse, TappdClient } from "@phala/dstack-sdk"; import { privateKeyToAccount } from "viem/accounts"; import { PrivateKeyAccount, keccak256 } from "viem"; +import { RemoteAttestationProvider } from "./remoteAttestationProvider"; +import { TEEMode, RemoteAttestationQuote } from "../types/tee"; + +interface DeriveKeyAttestationData { + agentId: string; + publicKey: string; +} class DeriveKeyProvider { private client: TappdClient; + private raProvider: RemoteAttestationProvider; + + constructor(teeMode?: string) { + let endpoint: string | undefined; + + // Both LOCAL and DOCKER modes use the simulator, just with different endpoints + switch(teeMode) { + case TEEMode.LOCAL: + endpoint = "http://localhost:8090"; + console.log("TEE: Connecting to local simulator at localhost:8090"); + break; + case TEEMode.DOCKER: + endpoint = "http://host.docker.internal:8090"; + console.log("TEE: Connecting to simulator via Docker at host.docker.internal:8090"); + break; + case TEEMode.PRODUCTION: + endpoint = undefined; + console.log("TEE: Running in production mode without simulator"); + break; + default: + throw new Error(`Invalid TEE_MODE: ${teeMode}. Must be one of: LOCAL, DOCKER, PRODUCTION`); + } - constructor(endpoint?: string) { this.client = endpoint ? new TappdClient(endpoint) : new TappdClient(); + this.raProvider = new RemoteAttestationProvider(teeMode); + } + + private async generateDeriveKeyAttestation(agentId: string, publicKey: string): Promise { + const deriveKeyData: DeriveKeyAttestationData = { + agentId, + publicKey + } + const reportdata = JSON.stringify(deriveKeyData); + console.log("Generating Remote Attestation Quote for Derive Key..."); + const quote = await this.raProvider.generateAttestation(reportdata); + console.log("Remote Attestation Quote generated successfully!"); + return quote; } + async rawDeriveKey( path: string, subject: string @@ -36,8 +78,9 @@ class DeriveKeyProvider { async deriveEd25519Keypair( path: string, - subject: string - ): Promise { + subject: string, + agentId: string + ): Promise<{ keypair: Keypair, attestation: RemoteAttestationQuote }> { try { if (!path || !subject) { console.error( @@ -55,8 +98,14 @@ class DeriveKeyProvider { const seedArray = new Uint8Array(seed); const keypair = Keypair.fromSeed(seedArray.slice(0, 32)); + // Generate an attestation for the derived key data for public to verify + const attestation = await this.generateDeriveKeyAttestation( + agentId, + keypair.publicKey.toBase58() + ); console.log("Key Derived Successfully!"); - return keypair; + + return { keypair, attestation }; } catch (error) { console.error("Error deriving key:", error); throw error; @@ -65,8 +114,9 @@ class DeriveKeyProvider { async deriveEcdsaKeypair( path: string, - subject: string - ): Promise { + subject: string, + agentId: string + ): Promise<{ keypair: PrivateKeyAccount, attestation: RemoteAttestationQuote }> { try { if (!path || !subject) { console.error( @@ -79,8 +129,15 @@ class DeriveKeyProvider { await this.client.deriveKey(path, subject); const hex = keccak256(deriveKeyResponse.asUint8Array()); const keypair: PrivateKeyAccount = privateKeyToAccount(hex); + + // Generate an attestation for the derived key data for public to verify + const attestation = await this.generateDeriveKeyAttestation( + agentId, + keypair.address + ); console.log("ECDSA Key Derived Successfully!"); - return keypair; + + return { keypair, attestation }; } catch (error) { console.error("Error deriving ecdsa key:", error); throw error; @@ -90,8 +147,9 @@ class DeriveKeyProvider { const deriveKeyProvider: Provider = { get: async (runtime: IAgentRuntime, _message?: Memory, _state?: State) => { - const endpoint = runtime.getSetting("DSTACK_SIMULATOR_ENDPOINT"); - const provider = new DeriveKeyProvider(endpoint); + const teeMode = runtime.getSetting("TEE_MODE"); + const provider = new DeriveKeyProvider(teeMode); + const agentId = runtime.agentId; try { // Validate wallet configuration if (!runtime.getSetting("WALLET_SECRET_SALT")) { @@ -101,28 +159,27 @@ const deriveKeyProvider: Provider = { return ""; } - let keypair: Keypair; try { const secretSalt = runtime.getSetting("WALLET_SECRET_SALT") || "secret_salt"; const solanaKeypair = await provider.deriveEd25519Keypair( "/", - secretSalt + secretSalt, + agentId ); const evmKeypair = await provider.deriveEcdsaKeypair( "/", - secretSalt + secretSalt, + agentId ); return JSON.stringify({ - solana: solanaKeypair.publicKey, - evm: evmKeypair.address, + solana: solanaKeypair.keypair.publicKey, + evm: evmKeypair.keypair.address, }); } catch (error) { console.error("Error creating PublicKey:", error); return ""; } - - return keypair; } catch (error) { console.error("Error in derive key provider:", error.message); return `Failed to fetch derive key information: ${error instanceof Error ? error.message : "Unknown error"}`; diff --git a/packages/plugin-tee/src/providers/remoteAttestationProvider.ts b/packages/plugin-tee/src/providers/remoteAttestationProvider.ts index c41ae9bc1f..a5024b6a28 100644 --- a/packages/plugin-tee/src/providers/remoteAttestationProvider.ts +++ b/packages/plugin-tee/src/providers/remoteAttestationProvider.ts @@ -1,22 +1,53 @@ import { IAgentRuntime, Memory, Provider, State } from "@ai16z/eliza"; -import { TappdClient } from "@phala/dstack-sdk"; +import { TdxQuoteResponse, TappdClient } from "@phala/dstack-sdk"; +import { RemoteAttestationQuote, TEEMode } from "../types/tee"; class RemoteAttestationProvider { private client: TappdClient; - constructor(endpoint?: string) { + constructor(teeMode?: string) { + let endpoint: string | undefined; + + // Both LOCAL and DOCKER modes use the simulator, just with different endpoints + switch(teeMode) { + case TEEMode.LOCAL: + endpoint = "http://localhost:8090"; + console.log("TEE: Connecting to local simulator at localhost:8090"); + break; + case TEEMode.DOCKER: + endpoint = "http://host.docker.internal:8090"; + console.log("TEE: Connecting to simulator via Docker at host.docker.internal:8090"); + break; + case TEEMode.PRODUCTION: + endpoint = undefined; + console.log("TEE: Running in production mode without simulator"); + break; + default: + throw new Error(`Invalid TEE_MODE: ${teeMode}. Must be one of: LOCAL, DOCKER, PRODUCTION`); + } + this.client = endpoint ? new TappdClient(endpoint) : new TappdClient(); } - async generateAttestation(reportData: string): Promise { + async generateAttestation(reportData: string): Promise { try { - console.log("Generating remote attestation..."); - const tdxQuote = await this.client.tdxQuote(reportData); - console.log("Remote attestation generated successfully!"); - return JSON.stringify(tdxQuote); + console.log("Generating attestation for: ", reportData); + const tdxQuote: TdxQuoteResponse = await this.client.tdxQuote(reportData); + const rtmrs = tdxQuote.replayRtmrs(); + console.log(`rtmr0: ${rtmrs[0]}\nrtmr1: ${rtmrs[1]}\nrtmr2: ${rtmrs[2]}\nrtmr3: ${rtmrs[3]}f`); + const quote: RemoteAttestationQuote = { + quote: tdxQuote.quote, + timestamp: Date.now(), + }; + console.log("Remote attestation quote: ", quote); + return quote; } catch (error) { console.error("Error generating remote attestation:", error); - return `Failed to generate TDX Quote: ${error instanceof Error ? error.message : "Unknown error"}`; + throw new Error( + `Failed to generate TDX Quote: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); } } } @@ -24,16 +55,21 @@ class RemoteAttestationProvider { // Keep the original provider for backwards compatibility const remoteAttestationProvider: Provider = { get: async (runtime: IAgentRuntime, _message: Memory, _state?: State) => { - const endpoint = runtime.getSetting("DSTACK_SIMULATOR_ENDPOINT"); - const provider = new RemoteAttestationProvider(endpoint); + const teeMode = runtime.getSetting("TEE_MODE"); + const provider = new RemoteAttestationProvider(teeMode); const agentId = runtime.agentId; try { + console.log("Generating attestation for: ", agentId); const attestation = await provider.generateAttestation(agentId); - return `Your Agent's remote attestation is: ${attestation}`; + return `Your Agent's remote attestation is: ${JSON.stringify(attestation)}`; } catch (error) { console.error("Error in remote attestation provider:", error); - return ""; + throw new Error( + `Failed to generate TDX Quote: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); } }, }; diff --git a/packages/plugin-tee/src/providers/walletProvider.ts b/packages/plugin-tee/src/providers/walletProvider.ts index 44ea2d163f..a12ad71192 100644 --- a/packages/plugin-tee/src/providers/walletProvider.ts +++ b/packages/plugin-tee/src/providers/walletProvider.ts @@ -4,6 +4,7 @@ import { Connection, Keypair, PublicKey } from "@solana/web3.js"; import BigNumber from "bignumber.js"; import NodeCache from "node-cache"; import { DeriveKeyProvider } from "./deriveKeyProvider"; +import { RemoteAttestationQuote } from "../types/tee"; // Provider configuration const PROVIDER_CONFIG = { BIRDEYE_API: "https://public-api.birdeye.so", @@ -35,7 +36,7 @@ interface WalletPortfolio { items: Array; } -interface BirdEyePriceData { +interface _BirdEyePriceData { data: { [key: string]: { price: number; @@ -272,6 +273,9 @@ const walletProvider: Provider = { _message: Memory, _state?: State ): Promise => { + const agentId = runtime.agentId; + const teeMode = runtime.getSetting("TEE_MODE"); + const deriveKeyProvider = new DeriveKeyProvider(teeMode); try { // Validate wallet configuration if (!runtime.getSetting("WALLET_SECRET_SALT")) { @@ -283,13 +287,13 @@ const walletProvider: Provider = { let publicKey: PublicKey; try { - const deriveKeyProvider = new DeriveKeyProvider(); - const derivedKeyPair: Keypair = + const derivedKeyPair: { keypair: Keypair, attestation: RemoteAttestationQuote } = await deriveKeyProvider.deriveEd25519Keypair( "/", - runtime.getSetting("WALLET_SECRET_SALT") + runtime.getSetting("WALLET_SECRET_SALT"), + agentId ); - publicKey = derivedKeyPair.publicKey; + publicKey = derivedKeyPair.keypair.publicKey; console.log("Wallet Public Key: ", publicKey.toBase58()); } catch (error) { console.error("Error creating PublicKey:", error); diff --git a/packages/plugin-tee/src/types/tee.ts b/packages/plugin-tee/src/types/tee.ts index 0cda39740f..8cdcae0b93 100644 --- a/packages/plugin-tee/src/types/tee.ts +++ b/packages/plugin-tee/src/types/tee.ts @@ -1,12 +1,11 @@ -export interface DeriveKeyResponse { - key: string; - certificate_chain: string[]; - asUint8Array: (max_length?: number) => Uint8Array; +export enum TEEMode { + OFF = "OFF", + LOCAL = "LOCAL", // For local development with simulator + DOCKER = "DOCKER", // For docker development with simulator + PRODUCTION = "PRODUCTION" // For production without simulator } -export type Hex = `0x${string}`; - -export interface TdxQuoteResponse { - quote: Hex; - event_log: string; -} +export interface RemoteAttestationQuote { + quote: string; + timestamp: number; +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 931c0d95e6..bd6e2535fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,9 +132,6 @@ importers: '@ai16z/plugin-bootstrap': specifier: workspace:* version: link:../packages/plugin-bootstrap - '@ai16z/plugin-buttplug': - specifier: workspace:* - version: link:../packages/plugin-buttplug '@ai16z/plugin-coinbase': specifier: workspace:* version: link:../packages/plugin-coinbase @@ -156,6 +153,9 @@ importers: '@ai16z/plugin-image-generation': specifier: workspace:* version: link:../packages/plugin-image-generation + '@ai16z/plugin-intiface': + specifier: workspace:* + version: link:../packages/plugin-intiface '@ai16z/plugin-node': specifier: workspace:* version: link:../packages/plugin-node @@ -295,7 +295,7 @@ importers: version: 3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/preset-classic': specifier: 3.6.3 - version: 3.6.3(@algolia/client-search@5.16.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10) + version: 3.6.3(@algolia/client-search@5.17.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/theme-mermaid': specifier: 3.6.3 version: 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) @@ -528,7 +528,7 @@ importers: version: link:../core '@neynar/nodejs-sdk': specifier: ^2.0.3 - version: 2.0.6(bufferutil@4.0.8)(class-transformer@0.5.1)(encoding@0.1.13)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) + version: 2.2.0(bufferutil@4.0.8)(class-transformer@0.5.1)(encoding@0.1.13)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) devDependencies: tsup: specifier: ^8.3.5 @@ -559,6 +559,37 @@ importers: specifier: 8.3.5 version: 8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@2.4.0)(postcss@8.4.49)(typescript@5.6.3)(yaml@2.6.1) + packages/client-linkedin: + dependencies: + '@ai16z/eliza': + specifier: workspace:* + version: link:../core + linkedin-api: + specifier: 0.0.1 + version: 0.0.1 + zod: + specifier: ^3.22.4 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.17.9 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.6.3) + eslint: + specifier: ^8.0.0 + version: 8.57.1 + jest: + specifier: ^29.0.0 + version: 29.7.0(@types/node@20.17.9) + typescript: + specifier: ^5.0.0 + version: 5.6.3 + packages/client-telegram: dependencies: '@ai16z/eliza': @@ -628,7 +659,7 @@ importers: version: 10.0.0 ai: specifier: 3.4.33 - version: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.9.1))(svelte@5.9.1)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) + version: 3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.11.0))(svelte@5.11.0)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) anthropic-vertex-ai: specifier: 1.0.2 version: 1.0.2(encoding@0.1.13)(zod@3.23.8) @@ -652,7 +683,7 @@ importers: version: 1.0.15 langchain: specifier: 0.3.6 - version: 0.3.6(@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.8)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + version: 0.3.6(@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.8)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) ollama-ai-provider: specifier: 0.16.1 version: 0.16.1(zod@3.23.8) @@ -845,24 +876,6 @@ importers: specifier: 7.1.0 version: 7.1.0 - packages/plugin-buttplug: - dependencies: - '@ai16z/eliza': - specifier: workspace:* - version: link:../core - buttplug: - specifier: 3.2.2 - version: 3.2.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - net: - specifier: 1.0.2 - version: 1.0.2 - tsup: - specifier: 8.3.5 - version: 8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@2.4.0)(postcss@8.4.49)(typescript@5.6.3)(yaml@2.6.1) - whatwg-url: - specifier: 7.1.0 - version: 7.1.0 - packages/plugin-coinbase: dependencies: '@ai16z/eliza': @@ -1049,6 +1062,24 @@ importers: specifier: 7.1.0 version: 7.1.0 + packages/plugin-intiface: + dependencies: + '@ai16z/eliza': + specifier: workspace:* + version: link:../core + buttplug: + specifier: 3.2.2 + version: 3.2.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + net: + specifier: 1.0.2 + version: 1.0.2 + tsup: + specifier: 8.3.5 + version: 8.3.5(@swc/core@1.10.1(@swc/helpers@0.5.15))(jiti@2.4.0)(postcss@8.4.49)(typescript@5.6.3)(yaml@2.6.1) + whatwg-url: + specifier: 7.1.0 + version: 7.1.0 + packages/plugin-node: dependencies: '@ai16z/eliza': @@ -1056,10 +1087,10 @@ importers: version: link:../core '@aws-sdk/client-s3': specifier: ^3.705.0 - version: 3.705.0 + version: 3.709.0 '@aws-sdk/s3-request-presigner': specifier: ^3.705.0 - version: 3.705.0 + version: 3.709.0 '@cliqz/adblocker-playwright': specifier: 1.34.0 version: 1.34.0(playwright@1.48.2) @@ -1232,6 +1263,9 @@ importers: '@ai16z/eliza': specifier: workspace:* version: link:../core + '@ai16z/plugin-tee': + specifier: workspace:* + version: link:../plugin-tee '@ai16z/plugin-trustdb': specifier: workspace:* version: link:../plugin-trustdb @@ -1308,8 +1342,8 @@ importers: specifier: workspace:* version: link:../core '@phala/dstack-sdk': - specifier: 0.1.4 - version: 0.1.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) + specifier: 0.1.6 + version: 0.1.6(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) '@solana/spl-token': specifier: 0.4.9 version: 0.4.9(@solana/web3.js@1.95.8(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) @@ -1585,8 +1619,8 @@ packages: '@algolia/cache-in-memory@4.24.0': resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==} - '@algolia/client-abtesting@5.16.0': - resolution: {integrity: sha512-fqQ2Szc6zxqXyQF8Vr64QMVoqFHHDsR5gEr/Eki+q+lgERvGr3YXruiB7Xs8rDTXP6+NC3tM2sZjdaEXW/P+6Q==} + '@algolia/client-abtesting@5.17.0': + resolution: {integrity: sha512-6+7hPdOEPfJqjWNYPRaVcttLLAtVqQyp1U7xBA1e1uSya1ivIr9FtS/GBr31mfvwk2N2yxV4W7itxuBtST8SWg==} engines: {node: '>= 14.0.0'} '@algolia/client-account@4.24.0': @@ -1595,44 +1629,44 @@ packages: '@algolia/client-analytics@4.24.0': resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==} - '@algolia/client-analytics@5.16.0': - resolution: {integrity: sha512-8HqIoGUwjc/XqjA+AjpRvtB40QzQ067qHuJujkR0k6WBLEM3OiB30FOfLZLabxnPIZgU55zmQ8exe+0WpgyKqA==} + '@algolia/client-analytics@5.17.0': + resolution: {integrity: sha512-nhJ+elL8h0Fts3xD9261zE2NvTs7nPMe9/SfAgMnWnbvxmuhJn7ZymnBsfm2VkTDb4Dy810ZAdBfzYEk7PjlAw==} engines: {node: '>= 14.0.0'} '@algolia/client-common@4.24.0': resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==} - '@algolia/client-common@5.16.0': - resolution: {integrity: sha512-4Bzvs5cdZ2MTMQvDlsmruZfyEk/NhSdsc+tA3vH9iMGIRzOj7Y9mwITpJM+hLFhbSE9Q0p0ojTF03RoDVclsZA==} + '@algolia/client-common@5.17.0': + resolution: {integrity: sha512-9eC8i41/4xcQ/wI6fVM4LwC/ZGcDl3mToqjM0wTZzePWhXgRrdzOzqy/XgP+L1yYCDfkMFBZZsruNL5U8aEOag==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.16.0': - resolution: {integrity: sha512-vIiOK8+exA0AOlR9mRDUr148Rx3WNU73whaJtciYoqeHoy/utib+m3Lw1+6s0o7OuPb/wGRoJ1l5vQuVezVHgA==} + '@algolia/client-insights@5.17.0': + resolution: {integrity: sha512-JL/vWNPUIuScsJubyC4aPHkpMftlK2qGqMiR2gy0rGvrh8v0w+ec6Ebq+efoFgE8wO55HJPTxiKeerE1DaQgvA==} engines: {node: '>= 14.0.0'} '@algolia/client-personalization@4.24.0': resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==} - '@algolia/client-personalization@5.16.0': - resolution: {integrity: sha512-psAzXJgzqPMCID31wrWVRg19K+h5TsLKSv6YfzQhB5munnj4IAE2lxEet2hDkji7vPA0WWpXGAW5Tx0scyMvkA==} + '@algolia/client-personalization@5.17.0': + resolution: {integrity: sha512-PkMUfww8QiRpyLkW4kzmc7IJDcW90sfUpnTgUOVlug5zEE2iv1ruHrJxdcNRTXkA0fgVpHu3oxXmCQL/ie2p7A==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.16.0': - resolution: {integrity: sha512-ygek1jdrAbw/tUIyHkK4YrH3uQoRmBbSUvZl8NBbz0S0GxjR6bhPbDZT8ny1INIMCA3KlYHPZAlCS+02RtvDyg==} + '@algolia/client-query-suggestions@5.17.0': + resolution: {integrity: sha512-bokfgPN2whetLuiX9NB6C6d7Eke+dvHuASOPiB+jdI8Z6hacLHkcJjYeZY4Mppj0/oJ1KlyNivj+8WNpZeGhYA==} engines: {node: '>= 14.0.0'} '@algolia/client-search@4.24.0': resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==} - '@algolia/client-search@5.16.0': - resolution: {integrity: sha512-mVnkDZjpbiqdXRz0NrQlx6+QsnKYENuruYyjTJNcG3qAe015tvGAHcvvzRT78ZxETS7WjruWSlXBcL5llycNsQ==} + '@algolia/client-search@5.17.0': + resolution: {integrity: sha512-alY3U79fiEvlR/0optgt1LZp9MfthXFnuEA4GYS81svozDOF61gdvxgBjt6SYtmskmTQQZDWVgakvUvvHrDzMw==} engines: {node: '>= 14.0.0'} '@algolia/events@4.0.1': resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} - '@algolia/ingestion@1.16.0': - resolution: {integrity: sha512-nmLcQYeG1YYRDAv2U+ebBD23mBSfkmhSwdDx2DBzqupStNrYWqYHsNgATLTMtMUTfgD0nSgBl5c+03yXg5WpiQ==} + '@algolia/ingestion@1.17.0': + resolution: {integrity: sha512-9+mO+FbIpWz6izh1lXzON9BcenBKx4K3qVjSWiFFmL8nv+7b7zpGq++LXWr/Lxv/bZ9+D71Go6QVL6AZQhFOmg==} engines: {node: '>= 14.0.0'} '@algolia/logger-common@4.24.0': @@ -1641,36 +1675,36 @@ packages: '@algolia/logger-console@4.24.0': resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==} - '@algolia/monitoring@1.16.0': - resolution: {integrity: sha512-tiDkoQOO/d4o8W6dEnpCIMCWp6mwdjqZ+Q51QiCKvz1vcYU/YEx4lleY9oadjAMoOVWZHL6ItEF1LbQHvVNogQ==} + '@algolia/monitoring@1.17.0': + resolution: {integrity: sha512-Db7Qh51zVchmHa8d9nQFzTz2Ta6H2D4dpCnPj1giC/LE6UG/6e3iOnRxUzV+9ZR7etHKIrri2hbnkyNrvbqA9A==} engines: {node: '>= 14.0.0'} '@algolia/recommend@4.24.0': resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==} - '@algolia/recommend@5.16.0': - resolution: {integrity: sha512-hehiMLsDnXnnZGXXKdeXUsvP3PwqAKL/rT4XutkYXsqQ1Jnv4EFrMOY8morUT8nlPv7d1bHPF+bTiNaKvkbBbA==} + '@algolia/recommend@5.17.0': + resolution: {integrity: sha512-7vM4+mfuLYbslj8+RNsP/ISwY7izu5HcQqQhA0l+q3EZRHF+PBeRaJXc3S1N0fTRxj8ystvwXWZPmjssB/xMLw==} engines: {node: '>= 14.0.0'} '@algolia/requester-browser-xhr@4.24.0': resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==} - '@algolia/requester-browser-xhr@5.16.0': - resolution: {integrity: sha512-s/ty3lN0Bk9EC6VId/JO+AMOy6s0Hb3IpXUIa4iKKrH7p3n+lTEtwltVjFVW0fq9JfvQdECoaM951K23G/nRtQ==} + '@algolia/requester-browser-xhr@5.17.0': + resolution: {integrity: sha512-bXSiPL2R08s4e9qvNZsJA0bXZeyWH2A5D4shS8kRT22b8GgjtnGTuoZmi6MxtKOEaN0lpHPbjvjXAO7UIOhDog==} engines: {node: '>= 14.0.0'} '@algolia/requester-common@4.24.0': resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==} - '@algolia/requester-fetch@5.16.0': - resolution: {integrity: sha512-E8euSKDkljYpv5QHOZQrBCMZ4W98PKHRp5Cx8JxMYyyPWQ0xkD9b1c5yvOtJJ1lufqDvcuxvrF4eRBwW+BP3QA==} + '@algolia/requester-fetch@5.17.0': + resolution: {integrity: sha512-mjJ6Xv7TlDDoZ6RLKrEzH1ved3g2GAq3YJjb94bA639INfxK1HM8A/wCAFSZ8ye+QM/jppwauDXe1PENkuareQ==} engines: {node: '>= 14.0.0'} '@algolia/requester-node-http@4.24.0': resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==} - '@algolia/requester-node-http@5.16.0': - resolution: {integrity: sha512-gzLIQlgvvXzGExBC8xFVtsiDbenGgANQ+p/lcPO5ERs1ZNGXIqLnyqwP8amZl6YwXJEt4PPXL/p4IytBWs0jUw==} + '@algolia/requester-node-http@5.17.0': + resolution: {integrity: sha512-Z2BXTR7BctlGPNig21k2wf/5nlH+96lU2UElzXTKiptyn2iM8lDU8zdO+dRll0AxQUxUGWEnkBysst9xL3S2cg==} engines: {node: '>= 14.0.0'} '@algolia/transporter@4.24.0': @@ -1757,171 +1791,171 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-polly@3.699.0': - resolution: {integrity: sha512-qQzFojyGEE8HmlotxClXSOhPuGluAQp+K7PtkuGNGZk91C6BF6TQAzIBqCnHMTbUGyJUqkt3Rp3A/Hj29fG4fg==} + '@aws-sdk/client-polly@3.709.0': + resolution: {integrity: sha512-3pW0qqABd26t2wzzFcSxj26KszAK8F+FYmYmc5gnm+CNXbothXKRFh6g+7AejIIIcuK/79W/ui+IWHH6WtCzFw==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-s3@3.705.0': - resolution: {integrity: sha512-Fm0Cbc4zr0yG0DnNycz7ywlL5tQFdLSb7xCIPfzrxJb3YQiTXWxH5eu61SSsP/Z6RBNRolmRPvst/iNgX0fWvA==} + '@aws-sdk/client-s3@3.709.0': + resolution: {integrity: sha512-IvC7coELoQ4YenTdULArVdL5yk6jNRVUALX1aqv9JlPdrXxb3Om6YrM9e7AlSTLxrULTsAe1ubm8i/DmcSY/Ng==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sso-oidc@3.699.0': - resolution: {integrity: sha512-u8a1GorY5D1l+4FQAf4XBUC1T10/t7neuwT21r0ymrtMFSK2a9QqVHKMoLkvavAwyhJnARSBM9/UQC797PFOFw==} + '@aws-sdk/client-sso-oidc@3.709.0': + resolution: {integrity: sha512-1w6egz17QQy661lNCRmZZlqIANEbD6g2VFAQIJbVwSiu7brg+GUns+mT1eLLLHAMQc1sL0Ds8/ybSK2SrgGgIA==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.699.0 + '@aws-sdk/client-sts': ^3.709.0 - '@aws-sdk/client-sso@3.696.0': - resolution: {integrity: sha512-q5TTkd08JS0DOkHfUL853tuArf7NrPeqoS5UOvqJho8ibV9Ak/a/HO4kNvy9Nj3cib/toHYHsQIEtecUPSUUrQ==} + '@aws-sdk/client-sso@3.709.0': + resolution: {integrity: sha512-Qxeo8cN0jNy6Wnbqq4wucffAGJM6sJjofoTgNtPA6cC7sPYx7aYC6OAAAo6NaMRY+WywOKdS9Wgjx2QYRxKx7w==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-sts@3.699.0': - resolution: {integrity: sha512-++lsn4x2YXsZPIzFVwv3fSUVM55ZT0WRFmPeNilYIhZClxHLmVAWKH4I55cY9ry60/aTKYjzOXkWwyBKGsGvQg==} + '@aws-sdk/client-sts@3.709.0': + resolution: {integrity: sha512-cBAvlPg6yslXNL385UUGFPw+XY+lA9BzioNdIFkMo3fEUlTShogTtiWz4LsyLHoN6LhKojssP9DSmmWKWjCZIw==} engines: {node: '>=16.0.0'} - '@aws-sdk/client-transcribe-streaming@3.699.0': - resolution: {integrity: sha512-yYmUMsFRkuuorNk275Ps1qGSP91AF5/G0m/ZLJw9sAd75sT8yCm4ChOQI19A35o3r0jWzGtGHV3bUEW6BcdlFg==} + '@aws-sdk/client-transcribe-streaming@3.709.0': + resolution: {integrity: sha512-LeL8e7+3EQz3awPW/3e7Aq+ypcguNci0zleOrXXDCtfzLy0qsIxzsrHGXxucA+p9v4XiwUmwNHtKjbztxkhfrg==} engines: {node: '>=16.0.0'} - '@aws-sdk/core@3.696.0': - resolution: {integrity: sha512-3c9III1k03DgvRZWg8vhVmfIXPG6hAciN9MzQTzqGngzWAELZF/WONRTRQuDFixVtarQatmLHYVw/atGeA2Byw==} + '@aws-sdk/core@3.709.0': + resolution: {integrity: sha512-7kuSpzdOTAE026j85wq/fN9UDZ70n0OHw81vFqMWwlEFtm5IQ/MRCLKcC4HkXxTdfy1PqFlmoXxWqeBa15tujw==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-env@3.696.0': - resolution: {integrity: sha512-T9iMFnJL7YTlESLpVFT3fg1Lkb1lD+oiaIC8KMpepb01gDUBIpj9+Y+pA/cgRWW0yRxmkDXNazAE2qQTVFGJzA==} + '@aws-sdk/credential-provider-env@3.709.0': + resolution: {integrity: sha512-ZMAp9LSikvHDFVa84dKpQmow6wsg956Um20cKuioPpX2GGreJFur7oduD+tRJT6FtIOHn+64YH+0MwiXLhsaIQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-http@3.696.0': - resolution: {integrity: sha512-GV6EbvPi2eq1+WgY/o2RFA3P7HGmnkIzCNmhwtALFlqMroLYWKE7PSeHw66Uh1dFQeVESn0/+hiUNhu1mB0emA==} + '@aws-sdk/credential-provider-http@3.709.0': + resolution: {integrity: sha512-lIS7XLwCOyJnLD70f+VIRr8DNV1HPQe9oN6aguYrhoczqz7vDiVZLe3lh714cJqq9rdxzFypK5DqKHmcscMEPQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-ini@3.699.0': - resolution: {integrity: sha512-dXmCqjJnKmG37Q+nLjPVu22mNkrGHY8hYoOt3Jo9R2zr5MYV7s/NHsCHr+7E+BZ+tfZYLRPeB1wkpTeHiEcdRw==} + '@aws-sdk/credential-provider-ini@3.709.0': + resolution: {integrity: sha512-qCF8IIGcPoUp+Ib3ANhbF5gElxFd+kIrtv2/1tKdvhudMANstQbMiWV0LTH47ZZR6c3as4iSrm09NZnpEoD/pA==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.699.0 + '@aws-sdk/client-sts': ^3.709.0 - '@aws-sdk/credential-provider-node@3.699.0': - resolution: {integrity: sha512-MmEmNDo1bBtTgRmdNfdQksXu4uXe66s0p1hi1YPrn1h59Q605eq/xiWbGL6/3KdkViH6eGUuABeV2ODld86ylg==} + '@aws-sdk/credential-provider-node@3.709.0': + resolution: {integrity: sha512-4HRX9KYWPSjO5O/Vg03YAsebKpvTjTvpK1n7zHYBmlLMBLxUrVsL1nNKKC5p2/7OW3RL8XR1ki3QkoV7kGRxUQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-process@3.696.0': - resolution: {integrity: sha512-mL1RcFDe9sfmyU5K1nuFkO8UiJXXxLX4JO1gVaDIOvPqwStpUAwi3A1BoeZhWZZNQsiKI810RnYGo0E0WB/hUA==} + '@aws-sdk/credential-provider-process@3.709.0': + resolution: {integrity: sha512-IAC+jPlGQII6jhIylHOwh3RgSobqlgL59nw2qYTURr8hMCI0Z1p5y2ee646HTVt4WeCYyzUAXfxr6YI/Vitv+Q==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-sso@3.699.0': - resolution: {integrity: sha512-Ekp2cZG4pl9D8+uKWm4qO1xcm8/MeiI8f+dnlZm8aQzizeC+aXYy9GyoclSf6daK8KfRPiRfM7ZHBBL5dAfdMA==} + '@aws-sdk/credential-provider-sso@3.709.0': + resolution: {integrity: sha512-rYdTDOxazS2GdGScelsRK5CAkktRLCCdRjlwXaxrcW57j749hEqxcF5uTv9RD6WBwInfedcSywErNZB+hylQlg==} engines: {node: '>=16.0.0'} - '@aws-sdk/credential-provider-web-identity@3.696.0': - resolution: {integrity: sha512-XJ/CVlWChM0VCoc259vWguFUjJDn/QwDqHwbx+K9cg3v6yrqXfK5ai+p/6lx0nQpnk4JzPVeYYxWRpaTsGC9rg==} + '@aws-sdk/credential-provider-web-identity@3.709.0': + resolution: {integrity: sha512-2lbDfE0IQ6gma/7BB2JpkjW5G0wGe4AS0x80oybYAYYviJmUtIR3Cn2pXun6bnAWElt4wYKl4su7oC36rs5rNA==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.696.0 + '@aws-sdk/client-sts': ^3.709.0 - '@aws-sdk/eventstream-handler-node@3.696.0': - resolution: {integrity: sha512-wK5o8Ziucz6s5jWIG6weHLsSE9qIAfeepoAdiuEvoJLhxNCJUkxF25NNidzhqxRfGDUzJIa+itSdD8vdP60qyA==} + '@aws-sdk/eventstream-handler-node@3.709.0': + resolution: {integrity: sha512-/UsV2H/MofSJa8GlY88o1ptMLfCNUxiovYBlYefkaCF6yA3+91rJ78kQfsL9bCXEBP1J0lUJWZBNWQI+fqC76w==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.696.0': - resolution: {integrity: sha512-V07jishKHUS5heRNGFpCWCSTjRJyQLynS/ncUeE8ZYtG66StOOQWftTwDfFOSoXlIqrXgb4oT9atryzXq7Z4LQ==} + '@aws-sdk/middleware-bucket-endpoint@3.709.0': + resolution: {integrity: sha512-03+tJOd7KIZOiqWH7Z8BOfQIWkKJgjcpKOJKZ6FR2KjWGUOE1G+bo11wF4UuHQ0RmpKnApt+pQghZmSnE7WEeg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-eventstream@3.696.0': - resolution: {integrity: sha512-ZbyKX1L+moB7Gid8332XaxA6uA2aMz9V5mmdEeOYRDEPXxf6VZYAOFZ6koSqThDuekxOuXunXw90BwiXz9/DEg==} + '@aws-sdk/middleware-eventstream@3.709.0': + resolution: {integrity: sha512-TSggXRaC8fd35AK8pAH6CTG800U9mKn3gGtMOn/6RzBbcx35KJ7xqR8MrOyIwGFSuRj+BggCdJRfUtcFWcaIhg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-expect-continue@3.696.0': - resolution: {integrity: sha512-vpVukqY3U2pb+ULeX0shs6L0aadNep6kKzjme/MyulPjtUDJpD3AekHsXRrCCGLmOqSKqRgQn5zhV9pQhHsb6Q==} + '@aws-sdk/middleware-expect-continue@3.709.0': + resolution: {integrity: sha512-Tbl/DFvE4rHl8lMb9IzetwK4tf5R3VeHZkvEXQalsWoK0tbEQ8kXWi7wAYO4qbE7bFVvaxKX+irjJjTxf3BrCQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.701.0': - resolution: {integrity: sha512-adNaPCyTT+CiVM0ufDiO1Fe7nlRmJdI9Hcgj0M9S6zR7Dw70Ra5z8Lslkd7syAccYvZaqxLklGjPQH/7GNxwTA==} + '@aws-sdk/middleware-flexible-checksums@3.709.0': + resolution: {integrity: sha512-wbYm9tkyCaqMeU82yjaXw7V5BxCSlSLNupENW63LC7Fvyo/aQzj6LjSMHcBpR2QwjBEhXCtF47L7aQ8SPTNhdw==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-host-header@3.696.0': - resolution: {integrity: sha512-zELJp9Ta2zkX7ELggMN9qMCgekqZhFC5V2rOr4hJDEb/Tte7gpfKSObAnw/3AYiVqt36sjHKfdkoTsuwGdEoDg==} + '@aws-sdk/middleware-host-header@3.709.0': + resolution: {integrity: sha512-8gQYCYAaIw4lOCd5WYdf15Y/61MgRsAnrb2eiTl+icMlUOOzl8aOl5iDwm/Idp0oHZTflwxM4XSvGXO83PRWcw==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-location-constraint@3.696.0': - resolution: {integrity: sha512-FgH12OB0q+DtTrP2aiDBddDKwL4BPOrm7w3VV9BJrSdkqQCNBPz8S1lb0y5eVH4tBG+2j7gKPlOv1wde4jF/iw==} + '@aws-sdk/middleware-location-constraint@3.709.0': + resolution: {integrity: sha512-5YQWPXfZq7OE0jB2G0PP8K10GBod/YPJXb+1CfJS6FbQaglRoIm8KZmVEvJNnptSKyGtE62veeCcCQcfAUfFig==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-logger@3.696.0': - resolution: {integrity: sha512-KhkHt+8AjCxcR/5Zp3++YPJPpFQzxpr+jmONiT/Jw2yqnSngZ0Yspm5wGoRx2hS1HJbyZNuaOWEGuJoxLeBKfA==} + '@aws-sdk/middleware-logger@3.709.0': + resolution: {integrity: sha512-jDoGSccXv9zebnpUoisjWd5u5ZPIalrmm6TjvPzZ8UqzQt3Beiz0tnQwmxQD6KRc7ADweWP5Ntiqzbw9xpVajg==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-recursion-detection@3.696.0': - resolution: {integrity: sha512-si/maV3Z0hH7qa99f9ru2xpS5HlfSVcasRlNUXKSDm611i7jFMWwGNLUOXFAOLhXotPX5G3Z6BLwL34oDeBMug==} + '@aws-sdk/middleware-recursion-detection@3.709.0': + resolution: {integrity: sha512-PObL/wLr4lkfbQ0yXUWaoCWu/jcwfwZzCjsUiXW/H6hW9b/00enZxmx7OhtJYaR6xmh/Lcx5wbhIoDCbzdv0tw==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-sdk-s3@3.696.0': - resolution: {integrity: sha512-M7fEiAiN7DBMHflzOFzh1I2MNSlLpbiH2ubs87bdRc2wZsDPSbs4l3v6h3WLhxoQK0bq6vcfroudrLBgvCuX3Q==} + '@aws-sdk/middleware-sdk-s3@3.709.0': + resolution: {integrity: sha512-FwtOG9t9xsLoLOQZ6qAdsWOjx9dsO6t28IjIDV1l6Ixiu2oC0Yks7goONjJUH0IDE4pDDDGzmuq0sn1XtHhheA==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-sdk-transcribe-streaming@3.696.0': - resolution: {integrity: sha512-WToGtHGaRWIQFkjqPaXShokTH1LZMFjoSX0CPT1I9OZhyy95FYyibJbnQLiSGY9zQN45jcUA8PtQZwbR/EfuTw==} + '@aws-sdk/middleware-sdk-transcribe-streaming@3.709.0': + resolution: {integrity: sha512-WR+QZ7vHZLhFWm2RUPDCy1X3FvDFydWfeR0sRDKXPlV8nUtbZk5cTNPNhghE8MlJVaSkFwC/J2cr30th7FOHAQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-signing@3.696.0': - resolution: {integrity: sha512-7ooWYsX+QgFEphNxOZrkZlWFLoDyLQgayf/JvFZ6qnO550K6H9Z2w7vEySoChRDoLjYs6omEHW6A8YLIK3r8rw==} + '@aws-sdk/middleware-signing@3.709.0': + resolution: {integrity: sha512-v9gxV9xKkQBRVh3ERA5ktvqAfh9FZilA3BkuTXLesIYBQqhhjilm3A/pRoHPsLqSCgsGzM6Swa3Q7VsqaqsLUQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-ssec@3.696.0': - resolution: {integrity: sha512-w/d6O7AOZ7Pg3w2d3BxnX5RmGNWb5X4RNxF19rJqcgu/xqxxE/QwZTNd5a7eTsqLXAUIfbbR8hh0czVfC1pJLA==} + '@aws-sdk/middleware-ssec@3.709.0': + resolution: {integrity: sha512-2muiLe7YkmlwZp2SKz+goZrDThGfRq3o0FcJF3Puc0XGmcEPEDjih537mCoTrGgcXNFlBc7YChd84r3t72ySaQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-user-agent@3.696.0': - resolution: {integrity: sha512-Lvyj8CTyxrHI6GHd2YVZKIRI5Fmnugt3cpJo0VrKKEgK5zMySwEZ1n4dqPK6czYRWKd5+WnYHYAuU+Wdk6Jsjw==} + '@aws-sdk/middleware-user-agent@3.709.0': + resolution: {integrity: sha512-ooc9ZJvgkjPhi9q05XwSfNTXkEBEIfL4hleo5rQBKwHG3aTHvwOM7LLzhdX56QZVa6sorPBp6fwULuRDSqiQHw==} engines: {node: '>=16.0.0'} - '@aws-sdk/middleware-websocket@3.696.0': - resolution: {integrity: sha512-8CaCtg08JZx7KtOepIMOUde2KsBk2UJ85h3LKGdmXXnWnmT+Jv3Q5LYbs+VowW/04OXcaYmua7Q3XbnRPw6qgw==} + '@aws-sdk/middleware-websocket@3.709.0': + resolution: {integrity: sha512-GmjczWYCppdXPsHV7CodU3JVWE1tq+rn/q1rMFXpEyVKjFhg9RwbytxL0+x3ep+x4z13y2nV5GfQWmNW6X1l5w==} engines: {node: '>= 14.0.0'} - '@aws-sdk/region-config-resolver@3.696.0': - resolution: {integrity: sha512-7EuH142lBXjI8yH6dVS/CZeiK/WZsmb/8zP6bQbVYpMrppSTgB3MzZZdxVZGzL5r8zPQOU10wLC4kIMy0qdBVQ==} + '@aws-sdk/region-config-resolver@3.709.0': + resolution: {integrity: sha512-/NoCAMEVKAg3kBKOrNtgOfL+ECt6nrl+L7q2SyYmrcY4tVCmwuECVqewQaHc03fTnJijfKLccw0Fj+6wOCnB6w==} engines: {node: '>=16.0.0'} - '@aws-sdk/s3-request-presigner@3.705.0': - resolution: {integrity: sha512-dAQiXv/TqjEUCoEeiKqQGI8LJ3g8Xv+XJL4W9CwsB6ZHHDq0Q05ulpDSkhhCf52ySXf5dJ33e1o/VeUDY3q0pw==} + '@aws-sdk/s3-request-presigner@3.709.0': + resolution: {integrity: sha512-WYmXU2ur/z6xBX9TcGwSWlSiS8rxrRl2f1HJXZzgSu9FWZ7fJssoQGvrk/w64wjNq1tEzKbd1iWXw9s9qexT3g==} engines: {node: '>=16.0.0'} - '@aws-sdk/signature-v4-multi-region@3.696.0': - resolution: {integrity: sha512-ijPkoLjXuPtgxAYlDoYls8UaG/VKigROn9ebbvPL/orEY5umedd3iZTcS9T+uAf4Ur3GELLxMQiERZpfDKaz3g==} + '@aws-sdk/signature-v4-multi-region@3.709.0': + resolution: {integrity: sha512-m0vhJEy6SLbjL11K9cHzX/ZhCIj//1GkTbYk2d4tTQFSuPyJEkjmoeHk9dYm2mJy0wH48j29OJadI1JUsR5bOw==} engines: {node: '>=16.0.0'} - '@aws-sdk/token-providers@3.699.0': - resolution: {integrity: sha512-kuiEW9DWs7fNos/SM+y58HCPhcIzm1nEZLhe2/7/6+TvAYLuEWURYsbK48gzsxXlaJ2k/jGY3nIsA7RptbMOwA==} + '@aws-sdk/token-providers@3.709.0': + resolution: {integrity: sha512-q5Ar6k71nci43IbULFgC8a89d/3EHpmd7HvBzqVGRcHnoPwh8eZDBfbBXKH83NGwcS1qPSRYiDbVfeWPm4/1jA==} engines: {node: '>=16.0.0'} peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.699.0 + '@aws-sdk/client-sso-oidc': ^3.709.0 - '@aws-sdk/types@3.696.0': - resolution: {integrity: sha512-9rTvUJIAj5d3//U5FDPWGJ1nFJLuWb30vugGOrWk7aNZ6y9tuA3PI7Cc9dP8WEXKVyK1vuuk8rSFP2iqXnlgrw==} + '@aws-sdk/types@3.709.0': + resolution: {integrity: sha512-ArtLTMxgjf13Kfu3gWH3Ez9Q5TkDdcRZUofpKH3pMGB/C6KAbeSCtIIDKfoRTUABzyGlPyCrZdnFjKyH+ypIpg==} engines: {node: '>=16.0.0'} '@aws-sdk/util-arn-parser@3.693.0': resolution: {integrity: sha512-WC8x6ca+NRrtpAH64rWu+ryDZI3HuLwlEr8EU6/dbC/pt+r/zC0PBoC15VEygUaBA+isppCikQpGyEDu0Yj7gQ==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-endpoints@3.696.0': - resolution: {integrity: sha512-T5s0IlBVX+gkb9g/I6CLt4yAZVzMSiGnbUqWihWsHvQR1WOoIcndQy/Oz/IJXT9T2ipoy7a80gzV6a5mglrioA==} + '@aws-sdk/util-endpoints@3.709.0': + resolution: {integrity: sha512-Mbc7AtL5WGCTKC16IGeUTz+sjpC3ptBda2t0CcK0kMVw3THDdcSq6ZlNKO747cNqdbwUvW34oHteUiHv4/z88Q==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-format-url@3.696.0': - resolution: {integrity: sha512-R6yK1LozUD1GdAZRPhNsIow6VNFJUTyyoIar1OCWaknlucBMcq7musF3DN3TlORBwfFMj5buHc2ET9OtMtzvuA==} + '@aws-sdk/util-format-url@3.709.0': + resolution: {integrity: sha512-HGR11hx1KeFfoub/TACf+Yyal37lR85791Di2QPaElQThaqztLlppxale3EohKboOFf7Q/zvslJyM0fmgrlpQw==} engines: {node: '>=16.0.0'} '@aws-sdk/util-locate-window@3.693.0': resolution: {integrity: sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==} engines: {node: '>=16.0.0'} - '@aws-sdk/util-user-agent-browser@3.696.0': - resolution: {integrity: sha512-Z5rVNDdmPOe6ELoM5AhF/ja5tSjbe6ctSctDPb0JdDf4dT0v2MfwhJKzXju2RzX8Es/77Glh7MlaXLE0kCB9+Q==} + '@aws-sdk/util-user-agent-browser@3.709.0': + resolution: {integrity: sha512-/rL2GasJzdTWUURCQKFldw2wqBtY4k4kCiA2tVZSKg3y4Ey7zO34SW8ebaeCE2/xoWOyLR2/etdKyphoo4Zrtg==} - '@aws-sdk/util-user-agent-node@3.696.0': - resolution: {integrity: sha512-KhKqcfyXIB0SCCt+qsu4eJjsfiOrNzK5dCV7RAW2YIpp+msxGUUX0NdRE9rkzjiv+3EMktgJm3eEIS+yxtlVdQ==} + '@aws-sdk/util-user-agent-node@3.709.0': + resolution: {integrity: sha512-trBfzSCVWy7ILgqhEXgiuM7hfRCw4F4a8IK90tjk9YL0jgoJ6eJuOp7+DfCtHJaygoBxD3cdMFkOu+lluFmGBA==} engines: {node: '>=16.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -1929,8 +1963,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.696.0': - resolution: {integrity: sha512-dn1mX+EeqivoLYnY7p2qLrir0waPnCgS/0YdRCAVU2x14FgfUYCH6Im3w3oi2dMwhxfKY5lYVB5NKvZu7uI9lQ==} + '@aws-sdk/xml-builder@3.709.0': + resolution: {integrity: sha512-2GPCwlNxeHspoK/Mc8nbk9cBOkSpp3j2SJUQmFnyQK6V/pR6II2oPRyZkMomug1Rc10hqlBHByMecq4zhV2uUw==} engines: {node: '>=16.0.0'} '@babel/code-frame@7.26.2': @@ -2595,6 +2629,9 @@ packages: '@braintree/sanitize-url@7.1.0': resolution: {integrity: sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==} + '@cfworker/json-schema@4.0.3': + resolution: {integrity: sha512-ZykIcDTVv5UNmKWSTLAs3VukO6NDJkkSKxrgUTDPBkAlORVT3H9n5DbRjRl8xIotklscHdbLIa0b9+y3mQq73g==} + '@chevrotain/cst-dts-gen@11.0.3': resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} @@ -4161,8 +4198,8 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@langchain/core@0.3.22': - resolution: {integrity: sha512-9rwEbxJi3Fgs8XuealNYxB6s0FCOnvXLnpiV5/oKgmEJtCRS91IqgJCWA8d59s4YkaEply/EsZVc2azNPK6Wjw==} + '@langchain/core@0.3.23': + resolution: {integrity: sha512-Aut43dEJYH/ibccSErFOLQzymkBG4emlN16P0OHWwx02bDosOR9ilZly4JJiCSYcprn2X2H8nee6P/4VMg1oQA==} engines: {node: '>=18'} '@langchain/openai@0.3.14': @@ -4296,8 +4333,8 @@ packages: '@nestjs/websockets': optional: true - '@neynar/nodejs-sdk@2.0.6': - resolution: {integrity: sha512-fEpuwyp14cyKQbZYo8LbKuwJXQqqEQlZEto4ptOd+qUyD97vmS0u4xXRr7kXeOvhSXoqFTZVnFzthHToItul5w==} + '@neynar/nodejs-sdk@2.2.0': + resolution: {integrity: sha512-+vCC4hNWJwhsj0JmhhomgbW+wul1XyVQiceFGXE6weW//vpIfVSm8TwcYk8FWHsEPZyyry0IHctIW0Y8qjLx4w==} engines: {node: '>=19.9.0'} '@noble/curves@1.2.0': @@ -4939,8 +4976,8 @@ packages: resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} engines: {node: '>=10.12.0'} - '@phala/dstack-sdk@0.1.4': - resolution: {integrity: sha512-slh2ltTrq2cgMztapvTFFRHtO4Ilx3NMhXYh3+ypSO2T2ANWgoqEzEoTT69OctyzMOTgYcyfla7uH8A3cLPaTQ==} + '@phala/dstack-sdk@0.1.6': + resolution: {integrity: sha512-/JNlCDvgQmqAs+3N9qbRjqQdm4UCd1iYmkjH7cE7ejwWcoF4b4bSikiQdMK+fQ3be8T7FJupjWw52ysHWsnwmQ==} engines: {node: '>=18.0.0'} '@pkgjs/parseargs@0.11.0': @@ -5567,20 +5604,20 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@shikijs/core@1.24.1': - resolution: {integrity: sha512-3q/9oarMVcLqJ+NQOdKL40dJVq/UKCsiWXz3QRQPBglHqa8dDJ0p6TuMuk2gHphy5FZcvFtg4UHBgpW0JtZ8+A==} + '@shikijs/core@1.24.2': + resolution: {integrity: sha512-BpbNUSKIwbKrRRA+BQj0BEWSw+8kOPKDJevWeSE/xIqGX7K0xrCZQ9kK0nnEQyrzsUoka1l81ZtJ2mGaCA32HQ==} - '@shikijs/engine-javascript@1.24.1': - resolution: {integrity: sha512-lNgUSHYDYaQ6daj4lJJqcY2Ru9LgHwpFoposJkRVRPh21Yg4kaPFRhzaWoSg3PliwcDOpDuMy3xsmQaJp201Fg==} + '@shikijs/engine-javascript@1.24.2': + resolution: {integrity: sha512-EqsmYBJdLEwEiO4H+oExz34a5GhhnVp+jH9Q/XjPjmBPc6TE/x4/gD0X3i0EbkKKNqXYHHJTJUpOLRQNkEzS9Q==} - '@shikijs/engine-oniguruma@1.24.1': - resolution: {integrity: sha512-KdrTIBIONWd+Xs61eh8HdIpfigtrseat9dpARvaOe2x0g/FNTbwbkGr3y92VSOVD1XotzEskh3v/nCzyWjkf7g==} + '@shikijs/engine-oniguruma@1.24.2': + resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} - '@shikijs/types@1.24.1': - resolution: {integrity: sha512-ZwZFbShFY/APfKNt3s9Gv8rhTm29GodSKsOW66X6N+HGsZuaHalE1VUEX4fv93UXHTZTLjb3uxn63F96RhGfXw==} + '@shikijs/types@1.24.2': + resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@shikijs/vscode-textmate@9.3.1': + resolution: {integrity: sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==} '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -5727,8 +5764,8 @@ packages: resolution: {integrity: sha512-VhJNs/s/lyx4weiZdXSloBgoLoS8osV0dKIain8nGmx7of3QFKu5BSdEuk1z/U8x9iwes1i+XCiNusEvuK1ijg==} engines: {node: '>=16.0.0'} - '@smithy/middleware-retry@3.0.29': - resolution: {integrity: sha512-/FfI/N2tIVCG9escHYLLABJlNHbO1gWFSdMlvbPOTV+Y+Aa8Q1FuS7Yaghb8NUfFmGYjkbeIu3bnbta6KbarsA==} + '@smithy/middleware-retry@3.0.30': + resolution: {integrity: sha512-6323RL2BvAR3VQpTjHpa52kH/iSHyxd/G9ohb2MkBk2Ucu+oMtRXT8yi7KTSIS9nb58aupG6nO0OlXnQOAcvmQ==} engines: {node: '>=16.0.0'} '@smithy/middleware-serde@3.0.11': @@ -5775,8 +5812,8 @@ packages: resolution: {integrity: sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==} engines: {node: '>=16.0.0'} - '@smithy/smithy-client@3.4.6': - resolution: {integrity: sha512-j/WYdfzdx4asqb0YZch1rb6Y5OQcuTdXY7xnEMtc05diB5jfLQQtys9J/2lzmGKri9m9mUBrcnNTv3jbXvtk7A==} + '@smithy/smithy-client@3.5.0': + resolution: {integrity: sha512-Y8FeOa7gbDfCWf7njrkoRATPa5eNLUEjlJS5z5rXatYuGkCb80LbHcu8AQR8qgAZZaNHCLyo2N+pxPsV7l+ivg==} engines: {node: '>=16.0.0'} '@smithy/types@3.7.2': @@ -5809,12 +5846,12 @@ packages: resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} - '@smithy/util-defaults-mode-browser@3.0.29': - resolution: {integrity: sha512-7k0kOfDjnSM44GG74UnjEixtHmtF/do6pCNEvp1DQlFjktEz8pv06p9RSjxp2J3Lv6I3+Ba9FLfurpFeBv+Pvw==} + '@smithy/util-defaults-mode-browser@3.0.30': + resolution: {integrity: sha512-nLuGmgfcr0gzm64pqF2UT4SGWVG8UGviAdayDlVzJPNa6Z4lqvpDzdRXmLxtOdEjVlTOEdpZ9dd3ZMMu488mzg==} engines: {node: '>= 10.0.0'} - '@smithy/util-defaults-mode-node@3.0.29': - resolution: {integrity: sha512-lu8jaXAt1TIVkTAKMuGdZwWQ1L03iV/n8WPbY5hdjcNqLg2ysp5DqiINmtuLL8EgzDv1TXvKDaBAN+9bGH4sEQ==} + '@smithy/util-defaults-mode-node@3.0.30': + resolution: {integrity: sha512-OD63eWoH68vp75mYcfYyuVH+p7Li/mY4sYOROnauDrtObo1cS4uWfsy/zhOTW8F8ZPxQC1ZXZKVxoxvMGUv2Ow==} engines: {node: '>= 10.0.0'} '@smithy/util-endpoints@2.1.7': @@ -6546,8 +6583,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@18.19.67': - resolution: {integrity: sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==} + '@types/node@18.19.68': + resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==} '@types/node@20.17.9': resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==} @@ -6616,6 +6653,9 @@ packages: '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -6673,6 +6713,17 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/eslint-plugin@8.11.0': resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6695,6 +6746,16 @@ packages: typescript: optional: true + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@8.11.0': resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6715,6 +6776,10 @@ packages: typescript: optional: true + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@8.11.0': resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6723,6 +6788,16 @@ packages: resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/type-utils@8.11.0': resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6742,6 +6817,10 @@ packages: typescript: optional: true + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@8.11.0': resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6750,6 +6829,15 @@ packages: resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@8.11.0': resolution: {integrity: sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6768,6 +6856,12 @@ packages: typescript: optional: true + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@8.11.0': resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6784,6 +6878,10 @@ packages: typescript: optional: true + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@8.11.0': resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7228,8 +7326,8 @@ packages: algoliasearch@4.24.0: resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} - algoliasearch@5.16.0: - resolution: {integrity: sha512-0zWz0LGfB0MLrhcnyGDpvVWPSsZnECNU6V/GPtNkHHSgaUj/7i+j36bZm6HClCvo8GvuxbN+ccbFREWUouHlfg==} + algoliasearch@5.17.0: + resolution: {integrity: sha512-BpuFprDFc3Pe9a1ZXLzLeqZ+l8Ur37AfzBswkOB4LwikqnRPbIGdluT/nFc/Xk+u/QMxMzUlTN+izqQJVb5vYA==} engines: {node: '>= 14.0.0'} amp-message@0.1.2: @@ -7537,8 +7635,8 @@ packages: bare-path@2.1.3: resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - bare-stream@2.4.2: - resolution: {integrity: sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==} + bare-stream@2.5.2: + resolution: {integrity: sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==} base-x@3.0.10: resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} @@ -7829,6 +7927,10 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} + call-bound@1.0.2: + resolution: {integrity: sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -9194,8 +9296,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.71: - resolution: {integrity: sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==} + electron-to-chromium@1.5.72: + resolution: {integrity: sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -11191,6 +11293,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -11289,8 +11396,8 @@ packages: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} - katex@0.16.14: - resolution: {integrity: sha512-tnUUAL/S+f/w8KrRpCFcCW/msuIlBkOmVnTmvdEK6WCkx6uDPRj3d9SBAP+qB5x0MCeOyUbdbIMtT5cUJD8aRw==} + katex@0.16.15: + resolution: {integrity: sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==} hasBin: true keyv@4.5.4: @@ -11374,8 +11481,8 @@ packages: resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==} engines: {node: '>=16.0.0'} - langsmith@0.2.11: - resolution: {integrity: sha512-rVPUN/jQEHjTuYaoVKGjfb3NsYNLGTQT9LXcgJvka5M0EDcXciC598A+DsAQrl6McdfSJCFJDelgRPqVoF2xNA==} + langsmith@0.2.12: + resolution: {integrity: sha512-FP1eMcM/ckocagtzKsD6WEjkSOZKImOmKK83hOgULa3pNGnc3nWRvCRIniZVLjCaXw9SOFR3K2ah0o3FvQhM5A==} peerDependencies: openai: '*' peerDependenciesMeta: @@ -11455,6 +11562,9 @@ packages: resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + linkedin-api@0.0.1: + resolution: {integrity: sha512-Rz1yk1Qg3Ogo++C+2j4n5AzqYHI4o8Z/QMHCrvnS/uXlI1iVGF31wIjUmyobWuhEwHKDD39crtTl5G/EbmBEVA==} + linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -11685,8 +11795,8 @@ packages: magic-bytes.js@1.10.0: resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} - magic-string@0.30.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.15: + resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -12411,8 +12521,8 @@ packages: node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} nodejs-whisper@0.1.18: resolution: {integrity: sha512-2FETHL/Ur46jIEh3H4bhJ0WAdPJxWBcaLPcdHCy6oDAXfD7ZGomQAiIL+musqtY1G1IV6/5+zUZJNxdZIsfy6A==} @@ -13504,8 +13614,8 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-modules-local-by-default@4.1.0: - resolution: {integrity: sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==} + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -14818,14 +14928,26 @@ packages: engines: {node: '>=4'} hasBin: true - shiki@1.24.1: - resolution: {integrity: sha512-/qByWMg05+POb63c/OvnrU17FcCUa34WU4F6FCrd/mjDPEDPl8YUNRkRMbo8l3iYMLydfCgxi1r37JFoSw8A4A==} + shiki@1.24.2: + resolution: {integrity: sha512-TR1fi6mkRrzW+SKT5G6uKuc32Dj2EEa7Kj0k8kGqiBINb+C1TiflVOiT9ta6GqOJtC4fraxO5SLUaKBcSY38Fg==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} siginfo@2.0.0: @@ -15249,8 +15371,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte@5.9.1: - resolution: {integrity: sha512-2iWB8J9j/tZqEfuplxSt7gi/iA0Fg7VFwWATxDmG/efttLI05hwLWAKIx4ltv+FtvJIhRGs28rJ0e8uY8e3LWg==} + svelte@5.11.0: + resolution: {integrity: sha512-w4FYvEY1eKbgBZo8RY2iegaOe9sZu9yhDa70cAyW9gkPJc87w6/1rrfNI4uu985s/7U+4CggQDE7CPIbrPsnXw==} engines: {node: '>=18'} svg-parser@2.0.4: @@ -16721,10 +16843,10 @@ packages: zlibjs@0.3.1: resolution: {integrity: sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==} - zod-to-json-schema@3.23.5: - resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} peerDependencies: - zod: ^3.23.3 + zod: ^3.24.1 zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -16848,13 +16970,13 @@ snapshots: transitivePeerDependencies: - zod - '@ai-sdk/svelte@0.0.57(svelte@5.9.1)(zod@3.23.8)': + '@ai-sdk/svelte@0.0.57(svelte@5.11.0)(zod@3.23.8)': dependencies: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) - sswr: 2.1.0(svelte@5.9.1) + sswr: 2.1.0(svelte@5.11.0) optionalDependencies: - svelte: 5.9.1 + svelte: 5.11.0 transitivePeerDependencies: - zod @@ -16864,7 +16986,7 @@ snapshots: '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) json-schema: 0.4.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) optionalDependencies: zod: 3.23.8 @@ -16878,33 +17000,33 @@ snapshots: transitivePeerDependencies: - zod - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0)(search-insights@2.17.3)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0)(search-insights@2.17.3)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0) search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0) - '@algolia/client-search': 5.16.0 - algoliasearch: 5.16.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0) + '@algolia/client-search': 5.17.0 + algoliasearch: 5.17.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0)': dependencies: - '@algolia/client-search': 5.16.0 - algoliasearch: 5.16.0 + '@algolia/client-search': 5.17.0 + algoliasearch: 5.17.0 '@algolia/cache-browser-local-storage@4.24.0': dependencies: @@ -16916,12 +17038,12 @@ snapshots: dependencies: '@algolia/cache-common': 4.24.0 - '@algolia/client-abtesting@5.16.0': + '@algolia/client-abtesting@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/client-account@4.24.0': dependencies: @@ -16936,26 +17058,26 @@ snapshots: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-analytics@5.16.0': + '@algolia/client-analytics@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/client-common@4.24.0': dependencies: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-common@5.16.0': {} + '@algolia/client-common@5.17.0': {} - '@algolia/client-insights@5.16.0': + '@algolia/client-insights@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/client-personalization@4.24.0': dependencies: @@ -16963,19 +17085,19 @@ snapshots: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-personalization@5.16.0': + '@algolia/client-personalization@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 - '@algolia/client-query-suggestions@5.16.0': + '@algolia/client-query-suggestions@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/client-search@4.24.0': dependencies: @@ -16983,21 +17105,21 @@ snapshots: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-search@5.16.0': + '@algolia/client-search@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/events@4.0.1': {} - '@algolia/ingestion@1.16.0': + '@algolia/ingestion@1.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/logger-common@4.24.0': {} @@ -17005,12 +17127,12 @@ snapshots: dependencies: '@algolia/logger-common': 4.24.0 - '@algolia/monitoring@1.16.0': + '@algolia/monitoring@1.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/recommend@4.24.0': dependencies: @@ -17026,34 +17148,34 @@ snapshots: '@algolia/requester-node-http': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/recommend@5.16.0': + '@algolia/recommend@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + '@algolia/client-common': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 '@algolia/requester-browser-xhr@4.24.0': dependencies: '@algolia/requester-common': 4.24.0 - '@algolia/requester-browser-xhr@5.16.0': + '@algolia/requester-browser-xhr@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 + '@algolia/client-common': 5.17.0 '@algolia/requester-common@4.24.0': {} - '@algolia/requester-fetch@5.16.0': + '@algolia/requester-fetch@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 + '@algolia/client-common': 5.17.0 '@algolia/requester-node-http@4.24.0': dependencies: '@algolia/requester-common': 4.24.0 - '@algolia/requester-node-http@5.16.0': + '@algolia/requester-node-http@5.17.0': dependencies: - '@algolia/client-common': 5.16.0 + '@algolia/client-common': 5.17.0 '@algolia/transporter@4.24.0': dependencies: @@ -17077,7 +17199,7 @@ snapshots: '@anthropic-ai/sdk@0.30.1(encoding@0.1.13)': dependencies: - '@types/node': 18.19.67 + '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -17138,20 +17260,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@aws-sdk/util-locate-window': 3.693.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -17161,7 +17283,7 @@ snapshots: '@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.696.0 + '@aws-sdk/types': 3.709.0 '@aws-sdk/util-locate-window': 3.693.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -17169,7 +17291,7 @@ snapshots: '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -17178,27 +17300,27 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-polly@3.699.0': + '@aws-sdk/client-polly@3.709.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.699.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/client-sts': 3.699.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/credential-provider-node': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/middleware-host-header': 3.696.0 - '@aws-sdk/middleware-logger': 3.696.0 - '@aws-sdk/middleware-recursion-detection': 3.696.0 - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/region-config-resolver': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 - '@aws-sdk/util-user-agent-browser': 3.696.0 - '@aws-sdk/util-user-agent-node': 3.696.0 + '@aws-sdk/client-sso-oidc': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/client-sts': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/credential-provider-node': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/middleware-host-header': 3.709.0 + '@aws-sdk/middleware-logger': 3.709.0 + '@aws-sdk/middleware-recursion-detection': 3.709.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/region-config-resolver': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 + '@aws-sdk/util-user-agent-browser': 3.709.0 + '@aws-sdk/util-user-agent-node': 3.709.0 '@smithy/config-resolver': 3.0.13 '@smithy/core': 2.5.5 '@smithy/fetch-http-handler': 4.1.2 @@ -17206,20 +17328,20 @@ snapshots: '@smithy/invalid-dependency': 3.0.11 '@smithy/middleware-content-length': 3.0.13 '@smithy/middleware-endpoint': 3.2.5 - '@smithy/middleware-retry': 3.0.29 + '@smithy/middleware-retry': 3.0.30 '@smithy/middleware-serde': 3.0.11 '@smithy/middleware-stack': 3.0.11 '@smithy/node-config-provider': 3.1.12 '@smithy/node-http-handler': 3.3.2 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.29 - '@smithy/util-defaults-mode-node': 3.0.29 + '@smithy/util-defaults-mode-browser': 3.0.30 + '@smithy/util-defaults-mode-node': 3.0.30 '@smithy/util-endpoints': 2.1.7 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -17229,32 +17351,32 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.705.0': + '@aws-sdk/client-s3@3.709.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.699.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/client-sts': 3.699.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/credential-provider-node': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/middleware-bucket-endpoint': 3.696.0 - '@aws-sdk/middleware-expect-continue': 3.696.0 - '@aws-sdk/middleware-flexible-checksums': 3.701.0 - '@aws-sdk/middleware-host-header': 3.696.0 - '@aws-sdk/middleware-location-constraint': 3.696.0 - '@aws-sdk/middleware-logger': 3.696.0 - '@aws-sdk/middleware-recursion-detection': 3.696.0 - '@aws-sdk/middleware-sdk-s3': 3.696.0 - '@aws-sdk/middleware-ssec': 3.696.0 - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/region-config-resolver': 3.696.0 - '@aws-sdk/signature-v4-multi-region': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 - '@aws-sdk/util-user-agent-browser': 3.696.0 - '@aws-sdk/util-user-agent-node': 3.696.0 - '@aws-sdk/xml-builder': 3.696.0 + '@aws-sdk/client-sso-oidc': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/client-sts': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/credential-provider-node': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/middleware-bucket-endpoint': 3.709.0 + '@aws-sdk/middleware-expect-continue': 3.709.0 + '@aws-sdk/middleware-flexible-checksums': 3.709.0 + '@aws-sdk/middleware-host-header': 3.709.0 + '@aws-sdk/middleware-location-constraint': 3.709.0 + '@aws-sdk/middleware-logger': 3.709.0 + '@aws-sdk/middleware-recursion-detection': 3.709.0 + '@aws-sdk/middleware-sdk-s3': 3.709.0 + '@aws-sdk/middleware-ssec': 3.709.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/region-config-resolver': 3.709.0 + '@aws-sdk/signature-v4-multi-region': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 + '@aws-sdk/util-user-agent-browser': 3.709.0 + '@aws-sdk/util-user-agent-node': 3.709.0 + '@aws-sdk/xml-builder': 3.709.0 '@smithy/config-resolver': 3.0.13 '@smithy/core': 2.5.5 '@smithy/eventstream-serde-browser': 3.0.14 @@ -17268,20 +17390,20 @@ snapshots: '@smithy/md5-js': 3.0.11 '@smithy/middleware-content-length': 3.0.13 '@smithy/middleware-endpoint': 3.2.5 - '@smithy/middleware-retry': 3.0.29 + '@smithy/middleware-retry': 3.0.30 '@smithy/middleware-serde': 3.0.11 '@smithy/middleware-stack': 3.0.11 '@smithy/node-config-provider': 3.1.12 '@smithy/node-http-handler': 3.3.2 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.29 - '@smithy/util-defaults-mode-node': 3.0.29 + '@smithy/util-defaults-mode-browser': 3.0.30 + '@smithy/util-defaults-mode-node': 3.0.30 '@smithy/util-endpoints': 2.1.7 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -17292,22 +17414,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0)': + '@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0)': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.699.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/credential-provider-node': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/middleware-host-header': 3.696.0 - '@aws-sdk/middleware-logger': 3.696.0 - '@aws-sdk/middleware-recursion-detection': 3.696.0 - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/region-config-resolver': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 - '@aws-sdk/util-user-agent-browser': 3.696.0 - '@aws-sdk/util-user-agent-node': 3.696.0 + '@aws-sdk/client-sts': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/credential-provider-node': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/middleware-host-header': 3.709.0 + '@aws-sdk/middleware-logger': 3.709.0 + '@aws-sdk/middleware-recursion-detection': 3.709.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/region-config-resolver': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 + '@aws-sdk/util-user-agent-browser': 3.709.0 + '@aws-sdk/util-user-agent-node': 3.709.0 '@smithy/config-resolver': 3.0.13 '@smithy/core': 2.5.5 '@smithy/fetch-http-handler': 4.1.2 @@ -17315,20 +17437,20 @@ snapshots: '@smithy/invalid-dependency': 3.0.11 '@smithy/middleware-content-length': 3.0.13 '@smithy/middleware-endpoint': 3.2.5 - '@smithy/middleware-retry': 3.0.29 + '@smithy/middleware-retry': 3.0.30 '@smithy/middleware-serde': 3.0.11 '@smithy/middleware-stack': 3.0.11 '@smithy/node-config-provider': 3.1.12 '@smithy/node-http-handler': 3.3.2 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.29 - '@smithy/util-defaults-mode-node': 3.0.29 + '@smithy/util-defaults-mode-browser': 3.0.30 + '@smithy/util-defaults-mode-node': 3.0.30 '@smithy/util-endpoints': 2.1.7 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -17337,20 +17459,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.696.0': + '@aws-sdk/client-sso@3.709.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/middleware-host-header': 3.696.0 - '@aws-sdk/middleware-logger': 3.696.0 - '@aws-sdk/middleware-recursion-detection': 3.696.0 - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/region-config-resolver': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 - '@aws-sdk/util-user-agent-browser': 3.696.0 - '@aws-sdk/util-user-agent-node': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/middleware-host-header': 3.709.0 + '@aws-sdk/middleware-logger': 3.709.0 + '@aws-sdk/middleware-recursion-detection': 3.709.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/region-config-resolver': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 + '@aws-sdk/util-user-agent-browser': 3.709.0 + '@aws-sdk/util-user-agent-node': 3.709.0 '@smithy/config-resolver': 3.0.13 '@smithy/core': 2.5.5 '@smithy/fetch-http-handler': 4.1.2 @@ -17358,20 +17480,20 @@ snapshots: '@smithy/invalid-dependency': 3.0.11 '@smithy/middleware-content-length': 3.0.13 '@smithy/middleware-endpoint': 3.2.5 - '@smithy/middleware-retry': 3.0.29 + '@smithy/middleware-retry': 3.0.30 '@smithy/middleware-serde': 3.0.11 '@smithy/middleware-stack': 3.0.11 '@smithy/node-config-provider': 3.1.12 '@smithy/node-http-handler': 3.3.2 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.29 - '@smithy/util-defaults-mode-node': 3.0.29 + '@smithy/util-defaults-mode-browser': 3.0.30 + '@smithy/util-defaults-mode-node': 3.0.30 '@smithy/util-endpoints': 2.1.7 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -17380,22 +17502,22 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.699.0': + '@aws-sdk/client-sts@3.709.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.699.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/core': 3.696.0 - '@aws-sdk/credential-provider-node': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/middleware-host-header': 3.696.0 - '@aws-sdk/middleware-logger': 3.696.0 - '@aws-sdk/middleware-recursion-detection': 3.696.0 - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/region-config-resolver': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 - '@aws-sdk/util-user-agent-browser': 3.696.0 - '@aws-sdk/util-user-agent-node': 3.696.0 + '@aws-sdk/client-sso-oidc': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/core': 3.709.0 + '@aws-sdk/credential-provider-node': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/middleware-host-header': 3.709.0 + '@aws-sdk/middleware-logger': 3.709.0 + '@aws-sdk/middleware-recursion-detection': 3.709.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/region-config-resolver': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 + '@aws-sdk/util-user-agent-browser': 3.709.0 + '@aws-sdk/util-user-agent-node': 3.709.0 '@smithy/config-resolver': 3.0.13 '@smithy/core': 2.5.5 '@smithy/fetch-http-handler': 4.1.2 @@ -17403,20 +17525,20 @@ snapshots: '@smithy/invalid-dependency': 3.0.11 '@smithy/middleware-content-length': 3.0.13 '@smithy/middleware-endpoint': 3.2.5 - '@smithy/middleware-retry': 3.0.29 + '@smithy/middleware-retry': 3.0.30 '@smithy/middleware-serde': 3.0.11 '@smithy/middleware-stack': 3.0.11 '@smithy/node-config-provider': 3.1.12 '@smithy/node-http-handler': 3.3.2 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.29 - '@smithy/util-defaults-mode-node': 3.0.29 + '@smithy/util-defaults-mode-browser': 3.0.30 + '@smithy/util-defaults-mode-node': 3.0.30 '@smithy/util-endpoints': 2.1.7 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -17425,27 +17547,27 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-transcribe-streaming@3.699.0': + '@aws-sdk/client-transcribe-streaming@3.709.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.699.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/client-sts': 3.699.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/credential-provider-node': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/eventstream-handler-node': 3.696.0 - '@aws-sdk/middleware-eventstream': 3.696.0 - '@aws-sdk/middleware-host-header': 3.696.0 - '@aws-sdk/middleware-logger': 3.696.0 - '@aws-sdk/middleware-recursion-detection': 3.696.0 - '@aws-sdk/middleware-sdk-transcribe-streaming': 3.696.0 - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/middleware-websocket': 3.696.0 - '@aws-sdk/region-config-resolver': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 - '@aws-sdk/util-user-agent-browser': 3.696.0 - '@aws-sdk/util-user-agent-node': 3.696.0 + '@aws-sdk/client-sso-oidc': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/client-sts': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/credential-provider-node': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/eventstream-handler-node': 3.709.0 + '@aws-sdk/middleware-eventstream': 3.709.0 + '@aws-sdk/middleware-host-header': 3.709.0 + '@aws-sdk/middleware-logger': 3.709.0 + '@aws-sdk/middleware-recursion-detection': 3.709.0 + '@aws-sdk/middleware-sdk-transcribe-streaming': 3.709.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/middleware-websocket': 3.709.0 + '@aws-sdk/region-config-resolver': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 + '@aws-sdk/util-user-agent-browser': 3.709.0 + '@aws-sdk/util-user-agent-node': 3.709.0 '@smithy/config-resolver': 3.0.13 '@smithy/core': 2.5.5 '@smithy/eventstream-serde-browser': 3.0.14 @@ -17456,20 +17578,20 @@ snapshots: '@smithy/invalid-dependency': 3.0.11 '@smithy/middleware-content-length': 3.0.13 '@smithy/middleware-endpoint': 3.2.5 - '@smithy/middleware-retry': 3.0.29 + '@smithy/middleware-retry': 3.0.30 '@smithy/middleware-serde': 3.0.11 '@smithy/middleware-stack': 3.0.11 '@smithy/node-config-provider': 3.1.12 '@smithy/node-http-handler': 3.3.2 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-base64': 3.0.0 '@smithy/util-body-length-browser': 3.0.0 '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.29 - '@smithy/util-defaults-mode-node': 3.0.29 + '@smithy/util-defaults-mode-browser': 3.0.30 + '@smithy/util-defaults-mode-node': 3.0.30 '@smithy/util-endpoints': 2.1.7 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -17478,51 +17600,51 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.696.0': + '@aws-sdk/core@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/core': 2.5.5 '@smithy/node-config-provider': 3.1.12 '@smithy/property-provider': 3.1.11 '@smithy/protocol-http': 4.1.8 '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/util-middleware': 3.0.11 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.696.0': + '@aws-sdk/credential-provider-env@3.709.0': dependencies: - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/property-provider': 3.1.11 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.696.0': + '@aws-sdk/credential-provider-http@3.709.0': dependencies: - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/fetch-http-handler': 4.1.2 '@smithy/node-http-handler': 3.3.2 '@smithy/property-provider': 3.1.11 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/util-stream': 3.3.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0)': + '@aws-sdk/credential-provider-ini@3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0)': dependencies: - '@aws-sdk/client-sts': 3.699.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/credential-provider-env': 3.696.0 - '@aws-sdk/credential-provider-http': 3.696.0 - '@aws-sdk/credential-provider-process': 3.696.0 - '@aws-sdk/credential-provider-sso': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0)) - '@aws-sdk/credential-provider-web-identity': 3.696.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/types': 3.696.0 + '@aws-sdk/client-sts': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/credential-provider-env': 3.709.0 + '@aws-sdk/credential-provider-http': 3.709.0 + '@aws-sdk/credential-provider-process': 3.709.0 + '@aws-sdk/credential-provider-sso': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0)) + '@aws-sdk/credential-provider-web-identity': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/types': 3.709.0 '@smithy/credential-provider-imds': 3.2.8 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 @@ -17532,15 +17654,15 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0)': + '@aws-sdk/credential-provider-node@3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0)': dependencies: - '@aws-sdk/credential-provider-env': 3.696.0 - '@aws-sdk/credential-provider-http': 3.696.0 - '@aws-sdk/credential-provider-ini': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/credential-provider-process': 3.696.0 - '@aws-sdk/credential-provider-sso': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0)) - '@aws-sdk/credential-provider-web-identity': 3.696.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/types': 3.696.0 + '@aws-sdk/credential-provider-env': 3.709.0 + '@aws-sdk/credential-provider-http': 3.709.0 + '@aws-sdk/credential-provider-ini': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/credential-provider-process': 3.709.0 + '@aws-sdk/credential-provider-sso': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0)) + '@aws-sdk/credential-provider-web-identity': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/types': 3.709.0 '@smithy/credential-provider-imds': 3.2.8 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 @@ -17551,21 +17673,21 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-process@3.696.0': + '@aws-sdk/credential-provider-process@3.709.0': dependencies: - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))': + '@aws-sdk/credential-provider-sso@3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))': dependencies: - '@aws-sdk/client-sso': 3.696.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/token-providers': 3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0)) - '@aws-sdk/types': 3.696.0 + '@aws-sdk/client-sso': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/token-providers': 3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0)) + '@aws-sdk/types': 3.709.0 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 @@ -17574,25 +17696,25 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.696.0(@aws-sdk/client-sts@3.699.0)': + '@aws-sdk/credential-provider-web-identity@3.709.0(@aws-sdk/client-sts@3.709.0)': dependencies: - '@aws-sdk/client-sts': 3.699.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/client-sts': 3.709.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/property-provider': 3.1.11 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/eventstream-handler-node@3.696.0': + '@aws-sdk/eventstream-handler-node@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/eventstream-codec': 3.1.10 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.696.0': + '@aws-sdk/middleware-bucket-endpoint@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@aws-sdk/util-arn-parser': 3.693.0 '@smithy/node-config-provider': 3.1.12 '@smithy/protocol-http': 4.1.8 @@ -17600,27 +17722,27 @@ snapshots: '@smithy/util-config-provider': 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-eventstream@3.696.0': + '@aws-sdk/middleware-eventstream@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.696.0': + '@aws-sdk/middleware-expect-continue@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.701.0': + '@aws-sdk/middleware-flexible-checksums@3.709.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/is-array-buffer': 3.0.0 '@smithy/node-config-provider': 3.1.12 '@smithy/protocol-http': 4.1.8 @@ -17630,42 +17752,42 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.696.0': + '@aws-sdk/middleware-host-header@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.696.0': + '@aws-sdk/middleware-location-constraint@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.696.0': + '@aws-sdk/middleware-logger@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.696.0': + '@aws-sdk/middleware-recursion-detection@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.696.0': + '@aws-sdk/middleware-sdk-s3@3.709.0': dependencies: - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 '@aws-sdk/util-arn-parser': 3.693.0 '@smithy/core': 2.5.5 '@smithy/node-config-provider': 3.1.12 '@smithy/protocol-http': 4.1.8 '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.11 @@ -17673,10 +17795,10 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-transcribe-streaming@3.696.0': + '@aws-sdk/middleware-sdk-transcribe-streaming@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-format-url': 3.696.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-format-url': 3.709.0 '@smithy/eventstream-serde-browser': 3.0.14 '@smithy/protocol-http': 4.1.8 '@smithy/signature-v4': 4.2.4 @@ -17684,9 +17806,9 @@ snapshots: tslib: 2.8.1 uuid: 9.0.1 - '@aws-sdk/middleware-signing@3.696.0': + '@aws-sdk/middleware-signing@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/property-provider': 3.1.11 '@smithy/protocol-http': 4.1.8 '@smithy/signature-v4': 4.2.4 @@ -17694,27 +17816,27 @@ snapshots: '@smithy/util-middleware': 3.0.11 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.696.0': + '@aws-sdk/middleware-ssec@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.696.0': + '@aws-sdk/middleware-user-agent@3.709.0': dependencies: - '@aws-sdk/core': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-endpoints': 3.696.0 + '@aws-sdk/core': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-endpoints': 3.709.0 '@smithy/core': 2.5.5 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/middleware-websocket@3.696.0': + '@aws-sdk/middleware-websocket@3.709.0': dependencies: - '@aws-sdk/middleware-signing': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-format-url': 3.696.0 + '@aws-sdk/middleware-signing': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-format-url': 3.709.0 '@smithy/eventstream-codec': 3.1.10 '@smithy/eventstream-serde-browser': 3.0.14 '@smithy/fetch-http-handler': 4.1.2 @@ -17724,45 +17846,45 @@ snapshots: '@smithy/util-hex-encoding': 3.0.0 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.696.0': + '@aws-sdk/region-config-resolver@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/node-config-provider': 3.1.12 '@smithy/types': 3.7.2 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.11 tslib: 2.8.1 - '@aws-sdk/s3-request-presigner@3.705.0': + '@aws-sdk/s3-request-presigner@3.709.0': dependencies: - '@aws-sdk/signature-v4-multi-region': 3.696.0 - '@aws-sdk/types': 3.696.0 - '@aws-sdk/util-format-url': 3.696.0 + '@aws-sdk/signature-v4-multi-region': 3.709.0 + '@aws-sdk/types': 3.709.0 + '@aws-sdk/util-format-url': 3.709.0 '@smithy/middleware-endpoint': 3.2.5 '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.696.0': + '@aws-sdk/signature-v4-multi-region@3.709.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/middleware-sdk-s3': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/protocol-http': 4.1.8 '@smithy/signature-v4': 4.2.4 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/token-providers@3.699.0(@aws-sdk/client-sso-oidc@3.699.0(@aws-sdk/client-sts@3.699.0))': + '@aws-sdk/token-providers@3.709.0(@aws-sdk/client-sso-oidc@3.709.0(@aws-sdk/client-sts@3.709.0))': dependencies: - '@aws-sdk/client-sso-oidc': 3.699.0(@aws-sdk/client-sts@3.699.0) - '@aws-sdk/types': 3.696.0 + '@aws-sdk/client-sso-oidc': 3.709.0(@aws-sdk/client-sts@3.709.0) + '@aws-sdk/types': 3.709.0 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/types@3.696.0': + '@aws-sdk/types@3.709.0': dependencies: '@smithy/types': 3.7.2 tslib: 2.8.1 @@ -17771,16 +17893,16 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.696.0': + '@aws-sdk/util-endpoints@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/types': 3.7.2 '@smithy/util-endpoints': 2.1.7 tslib: 2.8.1 - '@aws-sdk/util-format-url@3.696.0': + '@aws-sdk/util-format-url@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/querystring-builder': 3.0.11 '@smithy/types': 3.7.2 tslib: 2.8.1 @@ -17789,22 +17911,22 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.696.0': + '@aws-sdk/util-user-agent-browser@3.709.0': dependencies: - '@aws-sdk/types': 3.696.0 + '@aws-sdk/types': 3.709.0 '@smithy/types': 3.7.2 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.696.0': + '@aws-sdk/util-user-agent-node@3.709.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.696.0 - '@aws-sdk/types': 3.696.0 + '@aws-sdk/middleware-user-agent': 3.709.0 + '@aws-sdk/types': 3.709.0 '@smithy/node-config-provider': 3.1.12 '@smithy/types': 3.7.2 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.696.0': + '@aws-sdk/xml-builder@3.709.0': dependencies: '@smithy/types': 3.7.2 tslib: 2.8.1 @@ -17843,7 +17965,7 @@ snapshots: '@babel/types': 7.26.3 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.9': dependencies: @@ -18642,6 +18764,8 @@ snapshots: '@braintree/sanitize-url@7.1.0': {} + '@cfworker/json-schema@4.0.3': {} + '@chevrotain/cst-dts-gen@11.0.3': dependencies: '@chevrotain/gast': 11.0.3 @@ -19238,12 +19362,12 @@ snapshots: '@docsearch/css@3.8.0': {} - '@docsearch/react@3.8.0(@algolia/client-search@5.16.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': + '@docsearch/react@3.8.0(@algolia/client-search@5.17.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.16.0)(algoliasearch@5.16.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.17.0)(algoliasearch@5.17.0) '@docsearch/css': 3.8.0 - algoliasearch: 5.16.0 + algoliasearch: 5.17.0 optionalDependencies: '@types/react': 18.3.12 react: 18.3.1 @@ -19780,7 +19904,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/preset-classic@3.6.3(@algolia/client-search@5.16.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@docusaurus/preset-classic@3.6.3(@algolia/client-search@5.17.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: '@docusaurus/core': 3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/plugin-content-blog': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10))(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) @@ -19793,7 +19917,7 @@ snapshots: '@docusaurus/plugin-sitemap': 3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/theme-classic': 3.6.3(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-search-algolia': 3.6.3(@algolia/client-search@5.16.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@docusaurus/theme-search-algolia': 3.6.3(@algolia/client-search@5.17.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/types': 3.6.3(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -19942,9 +20066,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@docusaurus/theme-search-algolia@3.6.3(@algolia/client-search@5.16.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@docusaurus/theme-search-algolia@3.6.3(@algolia/client-search@5.17.0)(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/react@18.3.12)(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: - '@docsearch/react': 3.8.0(@algolia/client-search@5.16.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) + '@docsearch/react': 3.8.0(@algolia/client-search@5.17.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@docusaurus/core': 3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) '@docusaurus/logger': 3.6.3 '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.3.1))(@swc/core@1.10.1(@swc/helpers@0.5.15))(acorn@8.14.0)(bufferutil@4.0.8)(eslint@9.16.0(jiti@2.4.0))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(utf-8-validate@5.0.10) @@ -20930,35 +21054,36 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))': + '@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))': dependencies: + '@cfworker/json-schema': 4.0.3 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.15 - langsmith: 0.2.11(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + langsmith: 0.2.12(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 uuid: 10.0.0 zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) transitivePeerDependencies: - openai - '@langchain/openai@0.3.14(@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)': + '@langchain/openai@0.3.14(@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)': dependencies: - '@langchain/core': 0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + '@langchain/core': 0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) transitivePeerDependencies: - encoding - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))': + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))': dependencies: - '@langchain/core': 0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + '@langchain/core': 0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) js-tiktoken: 1.0.15 '@leichtgewicht/ip-codec@2.0.5': {} @@ -21214,7 +21339,7 @@ snapshots: transitivePeerDependencies: - encoding - '@neynar/nodejs-sdk@2.0.6(bufferutil@4.0.8)(class-transformer@0.5.1)(encoding@0.1.13)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@neynar/nodejs-sdk@2.2.0(bufferutil@4.0.8)(class-transformer@0.5.1)(encoding@0.1.13)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@openapitools/openapi-generator-cli': 2.15.3(class-transformer@0.5.1)(encoding@0.1.13) semver: 7.6.3 @@ -22140,7 +22265,7 @@ snapshots: tslib: 2.8.1 webcrypto-core: 1.8.1 - '@phala/dstack-sdk@0.1.4(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@phala/dstack-sdk@0.1.6(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8)': optionalDependencies: viem: 2.21.53(bufferutil@4.0.8)(typescript@5.6.3)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -22543,7 +22668,7 @@ snapshots: estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: rollup: 2.79.2 @@ -22554,7 +22679,7 @@ snapshots: estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: rollup: 3.29.5 @@ -22599,14 +22724,14 @@ snapshots: '@rollup/plugin-replace@5.0.7(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 5.1.3(rollup@2.79.2) - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: rollup: 2.79.2 '@rollup/plugin-replace@5.0.7(rollup@3.29.5)': dependencies: '@rollup/pluginutils': 5.1.3(rollup@3.29.5) - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: rollup: 3.29.5 @@ -22757,32 +22882,32 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@shikijs/core@1.24.1': + '@shikijs/core@1.24.2': dependencies: - '@shikijs/engine-javascript': 1.24.1 - '@shikijs/engine-oniguruma': 1.24.1 - '@shikijs/types': 1.24.1 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.24.1': + '@shikijs/engine-javascript@1.24.2': dependencies: - '@shikijs/types': 1.24.1 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 oniguruma-to-es: 0.7.0 - '@shikijs/engine-oniguruma@1.24.1': + '@shikijs/engine-oniguruma@1.24.2': dependencies: - '@shikijs/types': 1.24.1 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 - '@shikijs/types@1.24.1': + '@shikijs/types@1.24.2': dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/vscode-textmate@9.3.1': {} '@sideway/address@4.1.5': dependencies: @@ -22989,12 +23114,12 @@ snapshots: '@smithy/util-middleware': 3.0.11 tslib: 2.8.1 - '@smithy/middleware-retry@3.0.29': + '@smithy/middleware-retry@3.0.30': dependencies: '@smithy/node-config-provider': 3.1.12 '@smithy/protocol-http': 4.1.8 '@smithy/service-error-classification': 3.0.11 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 @@ -23067,7 +23192,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 - '@smithy/smithy-client@3.4.6': + '@smithy/smithy-client@3.5.0': dependencies: '@smithy/core': 2.5.5 '@smithy/middleware-endpoint': 3.2.5 @@ -23115,21 +23240,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@3.0.29': + '@smithy/util-defaults-mode-browser@3.0.30': dependencies: '@smithy/property-provider': 3.1.11 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.29': + '@smithy/util-defaults-mode-node@3.0.30': dependencies: '@smithy/config-resolver': 3.0.13 '@smithy/credential-provider-imds': 3.2.8 '@smithy/node-config-provider': 3.1.12 '@smithy/property-provider': 3.1.11 - '@smithy/smithy-client': 3.4.6 + '@smithy/smithy-client': 3.5.0 '@smithy/types': 3.7.2 tslib: 2.8.1 @@ -24078,7 +24203,7 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@18.19.67': + '@types/node@18.19.68': dependencies: undici-types: 5.26.5 @@ -24161,6 +24286,8 @@ snapshots: dependencies: '@types/node': 20.17.9 + '@types/semver@7.5.8': {} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -24225,6 +24352,26 @@ snapshots: '@types/node': 20.17.9 optional: true + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.16.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -24261,6 +24408,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.11.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.11.0 @@ -24287,6 +24447,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + '@typescript-eslint/scope-manager@8.11.0': dependencies: '@typescript-eslint/types': 8.11.0 @@ -24297,6 +24462,18 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.6.3) + debug: 4.4.0(supports-color@5.5.0) + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/type-utils@8.11.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.3) @@ -24321,10 +24498,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/types@8.11.0': {} '@typescript-eslint/types@8.16.0': {} + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.0(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.11.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.11.0 @@ -24355,6 +24549,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) + eslint: 8.57.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@8.11.0(eslint@9.16.0(jiti@2.4.0))(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.0)) @@ -24378,6 +24586,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.11.0': dependencies: '@typescript-eslint/types': 8.11.0 @@ -24437,7 +24650,7 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.14 + magic-string: 0.30.15 magicast: 0.3.5 std-env: 3.8.0 test-exclude: 7.0.1 @@ -24472,7 +24685,7 @@ snapshots: dependencies: '@vitest/spy': 2.1.4 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: vite: 5.4.11(@types/node@22.8.4)(terser@5.37.0) @@ -24480,7 +24693,7 @@ snapshots: dependencies: '@vitest/spy': 2.1.5 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: vite: 5.4.11(@types/node@22.8.4)(terser@5.37.0) @@ -24509,13 +24722,13 @@ snapshots: '@vitest/snapshot@2.1.4': dependencies: '@vitest/pretty-format': 2.1.4 - magic-string: 0.30.14 + magic-string: 0.30.15 pathe: 1.1.2 '@vitest/snapshot@2.1.5': dependencies: '@vitest/pretty-format': 2.1.5 - magic-string: 0.30.14 + magic-string: 0.30.15 pathe: 1.1.2 '@vitest/spy@2.1.4': @@ -24561,7 +24774,7 @@ snapshots: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 - magic-string: 0.30.14 + magic-string: 0.30.15 postcss: 8.4.49 source-map-js: 1.2.1 @@ -25022,13 +25235,13 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.9.1))(svelte@5.9.1)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8): + ai@3.4.33(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.11.0))(svelte@5.11.0)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8): dependencies: '@ai-sdk/provider': 0.0.26 '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) '@ai-sdk/react': 0.0.70(react@18.3.1)(zod@3.23.8) '@ai-sdk/solid': 0.0.54(zod@3.23.8) - '@ai-sdk/svelte': 0.0.57(svelte@5.9.1)(zod@3.23.8) + '@ai-sdk/svelte': 0.0.57(svelte@5.11.0)(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) '@ai-sdk/vue': 0.0.59(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) '@opentelemetry/api': 1.9.0 @@ -25036,12 +25249,12 @@ snapshots: json-schema: 0.4.0 jsondiffpatch: 0.6.0 secure-json-parse: 2.7.0 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) optionalDependencies: openai: 4.73.0(encoding@0.1.13)(zod@3.23.8) react: 18.3.1 - sswr: 2.1.0(svelte@5.9.1) - svelte: 5.9.1 + sswr: 2.1.0(svelte@5.11.0) + svelte: 5.11.0 zod: 3.23.8 transitivePeerDependencies: - solid-js @@ -25099,21 +25312,21 @@ snapshots: '@algolia/requester-node-http': 4.24.0 '@algolia/transporter': 4.24.0 - algoliasearch@5.16.0: - dependencies: - '@algolia/client-abtesting': 5.16.0 - '@algolia/client-analytics': 5.16.0 - '@algolia/client-common': 5.16.0 - '@algolia/client-insights': 5.16.0 - '@algolia/client-personalization': 5.16.0 - '@algolia/client-query-suggestions': 5.16.0 - '@algolia/client-search': 5.16.0 - '@algolia/ingestion': 1.16.0 - '@algolia/monitoring': 1.16.0 - '@algolia/recommend': 5.16.0 - '@algolia/requester-browser-xhr': 5.16.0 - '@algolia/requester-fetch': 5.16.0 - '@algolia/requester-node-http': 5.16.0 + algoliasearch@5.17.0: + dependencies: + '@algolia/client-abtesting': 5.17.0 + '@algolia/client-analytics': 5.17.0 + '@algolia/client-common': 5.17.0 + '@algolia/client-insights': 5.17.0 + '@algolia/client-personalization': 5.17.0 + '@algolia/client-query-suggestions': 5.17.0 + '@algolia/client-search': 5.17.0 + '@algolia/ingestion': 1.17.0 + '@algolia/monitoring': 1.17.0 + '@algolia/recommend': 5.17.0 + '@algolia/requester-browser-xhr': 5.17.0 + '@algolia/requester-fetch': 5.17.0 + '@algolia/requester-node-http': 5.17.0 amp-message@0.1.2: dependencies: @@ -25278,7 +25491,7 @@ snapshots: destr: 2.0.3 didyoumean2: 7.0.4 globby: 14.0.2 - magic-string: 0.30.14 + magic-string: 0.30.15 mdbox: 0.1.1 mlly: 1.7.3 ofetch: 1.4.1 @@ -25454,7 +25667,7 @@ snapshots: dependencies: bare-events: 2.5.0 bare-path: 2.1.3 - bare-stream: 2.4.2 + bare-stream: 2.5.2 optional: true bare-os@2.4.4: @@ -25465,7 +25678,7 @@ snapshots: bare-os: 2.4.4 optional: true - bare-stream@2.4.2: + bare-stream@2.5.2: dependencies: streamx: 2.21.0 optional: true @@ -25671,8 +25884,8 @@ snapshots: browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001687 - electron-to-chromium: 1.5.71 - node-releases: 2.0.18 + electron-to-chromium: 1.5.72 + node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.2) bs-logger@0.2.6: @@ -25834,6 +26047,11 @@ snapshots: get-intrinsic: 1.2.5 set-function-length: 1.2.2 + call-bound@1.0.2: + dependencies: + call-bind: 1.0.8 + get-intrinsic: 1.2.5 + callsites@3.1.0: {} camel-case@4.1.2: @@ -26579,7 +26797,7 @@ snapshots: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.1.0(postcss@8.4.49) + postcss-modules-local-by-default: 4.2.0(postcss@8.4.49) postcss-modules-scope: 3.2.1(postcss@8.4.49) postcss-modules-values: 4.0.0(postcss@8.4.49) postcss-value-parser: 4.2.0 @@ -27328,8 +27546,8 @@ snapshots: echogarden@2.0.7(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(encoding@0.1.13)(utf-8-validate@5.0.10)(zod@3.23.8): dependencies: - '@aws-sdk/client-polly': 3.699.0 - '@aws-sdk/client-transcribe-streaming': 3.699.0 + '@aws-sdk/client-polly': 3.709.0 + '@aws-sdk/client-transcribe-streaming': 3.709.0 '@echogarden/audio-io': 0.2.3 '@echogarden/espeak-ng-emscripten': 0.3.3 '@echogarden/fasttext-wasm': 0.1.0 @@ -27386,7 +27604,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.71: {} + electron-to-chromium@1.5.72: {} elliptic@6.5.4: dependencies: @@ -30074,6 +30292,8 @@ snapshots: jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 @@ -30179,7 +30399,7 @@ snapshots: jwt-decode@4.0.0: {} - katex@0.16.14: + katex@0.16.15: dependencies: commander: 8.3.0 @@ -30211,21 +30431,21 @@ snapshots: doublearray: 0.0.2 zlibjs: 0.3.1 - langchain@0.3.6(@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.8)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): + langchain@0.3.6(@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.8)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): dependencies: - '@langchain/core': 0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) - '@langchain/openai': 0.3.14(@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.22(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))) + '@langchain/core': 0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + '@langchain/openai': 0.3.14(@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.23(openai@4.73.0(encoding@0.1.13)(zod@3.23.8))) js-tiktoken: 1.0.15 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.2.11(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) + langsmith: 0.2.12(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 yaml: 2.6.1 zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) optionalDependencies: axios: 1.7.8(debug@4.4.0) handlebars: 4.7.8 @@ -30241,7 +30461,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - langsmith@0.2.11(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): + langsmith@0.2.12(openai@4.73.0(encoding@0.1.13)(zod@3.23.8)): dependencies: '@types/uuid': 10.0.0 commander: 10.0.1 @@ -30406,6 +30626,8 @@ snapshots: lines-and-columns@2.0.3: {} + linkedin-api@0.0.1: {} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -30576,7 +30798,7 @@ snapshots: log-symbols@4.1.0: dependencies: - chalk: 4.1.2 + chalk: 4.1.0 is-unicode-supported: 0.1.0 log-symbols@6.0.0: @@ -30649,7 +30871,7 @@ snapshots: magic-bytes.js@1.10.0: {} - magic-string@0.30.14: + magic-string@0.30.15: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -31003,7 +31225,7 @@ snapshots: dagre-d3-es: 7.0.11 dayjs: 1.11.13 dompurify: 3.2.2 - katex: 0.16.14 + katex: 0.16.15 khroma: 2.1.0 lodash-es: 4.17.21 marked: 13.0.3 @@ -31755,7 +31977,7 @@ snapshots: node-machine-id@1.1.12: {} - node-releases@2.0.18: {} + node-releases@2.0.19: {} nodejs-whisper@0.1.18: dependencies: @@ -32081,7 +32303,7 @@ snapshots: openai@4.73.0(encoding@0.1.13)(zod@3.23.8): dependencies: - '@types/node': 18.19.67 + '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -33001,7 +33223,7 @@ snapshots: dependencies: postcss: 8.4.49 - postcss-modules-local-by-default@4.1.0(postcss@8.4.49): + postcss-modules-local-by-default@4.2.0(postcss@8.4.49): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -33631,7 +33853,7 @@ snapshots: qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.5.3: {} @@ -34266,7 +34488,7 @@ snapshots: rollup-plugin-dts@6.1.1(rollup@3.29.5)(typescript@5.6.3): dependencies: - magic-string: 0.30.14 + magic-string: 0.30.15 rollup: 3.29.5 typescript: 5.6.3 optionalDependencies: @@ -34604,24 +34826,45 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki@1.24.1: + shiki@1.24.2: dependencies: - '@shikijs/core': 1.24.1 - '@shikijs/engine-javascript': 1.24.1 - '@shikijs/engine-oniguruma': 1.24.1 - '@shikijs/types': 1.24.1 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/core': 1.24.2 + '@shikijs/engine-javascript': 1.24.2 + '@shikijs/engine-oniguruma': 1.24.2 + '@shikijs/types': 1.24.2 + '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 shimmer@1.2.1: {} - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.8 + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.2 es-errors: 1.3.0 get-intrinsic: 1.2.5 object-inspect: 1.13.3 + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.2 + es-errors: 1.3.0 + get-intrinsic: 1.2.5 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -34872,9 +35115,9 @@ snapshots: dependencies: minipass: 7.1.2 - sswr@2.1.0(svelte@5.9.1): + sswr@2.1.0(svelte@5.11.0): dependencies: - svelte: 5.9.1 + svelte: 5.11.0 swrev: 4.0.0 stack-utils@2.0.6: @@ -35077,7 +35320,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte@5.9.1: + svelte@5.11.0: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -35090,7 +35333,7 @@ snapshots: esrap: 1.2.3 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.14 + magic-string: 0.30.15 zimmerframe: 1.1.2 svg-parser@2.0.4: {} @@ -35361,7 +35604,7 @@ snapshots: together-ai@0.7.0(encoding@0.1.13): dependencies: - '@types/node': 18.19.67 + '@types/node': 18.19.68 '@types/node-fetch': 2.6.12 abort-controller: 3.0.0 agentkeepalive: 4.5.0 @@ -35625,7 +35868,7 @@ snapshots: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.24.1 + shiki: 1.24.2 typescript: 5.6.3 yaml: 2.6.1 @@ -35679,7 +35922,7 @@ snapshots: globby: 13.2.2 hookable: 5.5.3 jiti: 1.21.6 - magic-string: 0.30.14 + magic-string: 0.30.15 mkdist: 1.6.0(typescript@5.6.3) mlly: 1.7.3 pathe: 1.1.2 @@ -36118,7 +36361,7 @@ snapshots: chai: 5.1.2 debug: 4.4.0(supports-color@5.5.0) expect-type: 1.1.0 - magic-string: 0.30.14 + magic-string: 0.30.15 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 @@ -36154,7 +36397,7 @@ snapshots: chai: 5.1.2 debug: 4.4.0(supports-color@5.5.0) expect-type: 1.1.0 - magic-string: 0.30.14 + magic-string: 0.30.15 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 @@ -36684,7 +36927,7 @@ snapshots: zlibjs@0.3.1: {} - zod-to-json-schema@3.23.5(zod@3.23.8): + zod-to-json-schema@3.24.1(zod@3.23.8): dependencies: zod: 3.23.8